blob: f1a74d7655306c2724ae6192816bca2cb19d663f [file] [log] [blame]
Gael Guennebaudcb71dc42009-01-07 22:20:03 +00001// This file is part of Eigen, a lightweight C++ template library
Benoit Jacob6347b1d2009-05-22 20:25:33 +02002// for linear algebra.
Gael Guennebaudcb71dc42009-01-07 22:20:03 +00003//
Gael Guennebaud836da912015-12-11 10:06:28 +01004// Copyright (C) 2015 Gael Guennebaud <gael.guennebaud@inria.fr>
Gael Guennebaudcb71dc42009-01-07 22:20:03 +00005//
Benoit Jacob69124cf2012-07-13 14:42:47 -04006// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
Gael Guennebaudcb71dc42009-01-07 22:20:03 +00009
Gael Guennebaud836da912015-12-11 10:06:28 +010010#ifdef EIGEN_DEFAULT_TO_ROW_MAJOR
11#undef EIGEN_DEFAULT_TO_ROW_MAJOR
12#endif
Benoit Jacob27f52502010-02-27 19:04:22 -050013#define EIGEN_DEBUG_ASSIGN
Gael Guennebaudcb71dc42009-01-07 22:20:03 +000014#include "main.h"
15#include <typeinfo>
16
Gael Guennebaud0fc89542015-10-27 10:38:49 +010017using internal::demangle_flags;
18using internal::demangle_traversal;
19using internal::demangle_unrolling;
Gael Guennebaud51ec1882010-07-08 23:30:16 +020020
Gael Guennebaudcb71dc42009-01-07 22:20:03 +000021template<typename Dst, typename Src>
Benoit Jacob94c706d2009-11-18 11:57:07 -050022bool test_assign(const Dst&, const Src&, int traversal, int unrolling)
Gael Guennebaudcb71dc42009-01-07 22:20:03 +000023{
Gael Guennebauda3950242014-03-12 18:14:58 +010024 typedef internal::copy_using_evaluator_traits<internal::evaluator<Dst>,internal::evaluator<Src>, internal::assign_op<typename Dst::Scalar> > traits;
Gael Guennebaud512ba0a2016-04-13 18:16:35 +020025 bool res = traits::Traversal==traversal;
26 if(unrolling==InnerUnrolling+CompleteUnrolling)
27 res = res && (traits::Unrolling==InnerUnrolling || traits::Unrolling==CompleteUnrolling);
28 else
29 res = res && traits::Unrolling==unrolling;
Gael Guennebaud51ec1882010-07-08 23:30:16 +020030 if(!res)
31 {
Gael Guennebauda3950242014-03-12 18:14:58 +010032 std::cerr << "Src: " << demangle_flags(Src::Flags) << std::endl;
Gael Guennebauda3950242014-03-12 18:14:58 +010033 std::cerr << " " << demangle_flags(internal::evaluator<Src>::Flags) << std::endl;
Gael Guennebauda3950242014-03-12 18:14:58 +010034 std::cerr << "Dst: " << demangle_flags(Dst::Flags) << std::endl;
Gael Guennebauda3950242014-03-12 18:14:58 +010035 std::cerr << " " << demangle_flags(internal::evaluator<Dst>::Flags) << std::endl;
Gael Guennebauda3950242014-03-12 18:14:58 +010036 traits::debug();
Gael Guennebaud51ec1882010-07-08 23:30:16 +020037 std::cerr << " Expected Traversal == " << demangle_traversal(traversal)
Gael Guennebauda3950242014-03-12 18:14:58 +010038 << " got " << demangle_traversal(traits::Traversal) << "\n";
Gael Guennebaud51ec1882010-07-08 23:30:16 +020039 std::cerr << " Expected Unrolling == " << demangle_unrolling(unrolling)
Gael Guennebauda3950242014-03-12 18:14:58 +010040 << " got " << demangle_unrolling(traits::Unrolling) << "\n";
Gael Guennebaud51ec1882010-07-08 23:30:16 +020041 }
42 return res;
Gael Guennebaudcb71dc42009-01-07 22:20:03 +000043}
44
Benoit Jacobb1f666d2010-02-26 20:12:51 -050045template<typename Dst, typename Src>
46bool test_assign(int traversal, int unrolling)
47{
Gael Guennebauda3950242014-03-12 18:14:58 +010048 typedef internal::copy_using_evaluator_traits<internal::evaluator<Dst>,internal::evaluator<Src>, internal::assign_op<typename Dst::Scalar> > traits;
Gael Guennebauda3950242014-03-12 18:14:58 +010049 bool res = traits::Traversal==traversal && traits::Unrolling==unrolling;
Gael Guennebaud51ec1882010-07-08 23:30:16 +020050 if(!res)
51 {
Gael Guennebauda3950242014-03-12 18:14:58 +010052 std::cerr << "Src: " << demangle_flags(Src::Flags) << std::endl;
Gael Guennebauda3950242014-03-12 18:14:58 +010053 std::cerr << " " << demangle_flags(internal::evaluator<Src>::Flags) << std::endl;
Gael Guennebauda3950242014-03-12 18:14:58 +010054 std::cerr << "Dst: " << demangle_flags(Dst::Flags) << std::endl;
Gael Guennebauda3950242014-03-12 18:14:58 +010055 std::cerr << " " << demangle_flags(internal::evaluator<Dst>::Flags) << std::endl;
Gael Guennebauda3950242014-03-12 18:14:58 +010056 traits::debug();
Gael Guennebaud51ec1882010-07-08 23:30:16 +020057 std::cerr << " Expected Traversal == " << demangle_traversal(traversal)
Gael Guennebauda3950242014-03-12 18:14:58 +010058 << " got " << demangle_traversal(traits::Traversal) << "\n";
Gael Guennebaud51ec1882010-07-08 23:30:16 +020059 std::cerr << " Expected Unrolling == " << demangle_unrolling(unrolling)
Gael Guennebauda3950242014-03-12 18:14:58 +010060 << " got " << demangle_unrolling(traits::Unrolling) << "\n";
Gael Guennebaud51ec1882010-07-08 23:30:16 +020061 }
62 return res;
Benoit Jacobb1f666d2010-02-26 20:12:51 -050063}
64
Gael Guennebaudcb71dc42009-01-07 22:20:03 +000065template<typename Xpr>
Benoit Jacob94c706d2009-11-18 11:57:07 -050066bool test_redux(const Xpr&, int traversal, int unrolling)
Gael Guennebaudcb71dc42009-01-07 22:20:03 +000067{
Gael Guennebauda3950242014-03-12 18:14:58 +010068 typedef internal::redux_traits<internal::scalar_sum_op<typename Xpr::Scalar>,internal::redux_evaluator<Xpr> > traits;
Gael Guennebauda3950242014-03-12 18:14:58 +010069
Gael Guennebaud51ec1882010-07-08 23:30:16 +020070 bool res = traits::Traversal==traversal && traits::Unrolling==unrolling;
71 if(!res)
72 {
Gael Guennebauda3950242014-03-12 18:14:58 +010073 std::cerr << demangle_flags(Xpr::Flags) << std::endl;
Gael Guennebauda3950242014-03-12 18:14:58 +010074 std::cerr << demangle_flags(internal::evaluator<Xpr>::Flags) << std::endl;
Gael Guennebauda3950242014-03-12 18:14:58 +010075 traits::debug();
76
Gael Guennebaud51ec1882010-07-08 23:30:16 +020077 std::cerr << " Expected Traversal == " << demangle_traversal(traversal)
78 << " got " << demangle_traversal(traits::Traversal) << "\n";
79 std::cerr << " Expected Unrolling == " << demangle_unrolling(unrolling)
80 << " got " << demangle_unrolling(traits::Unrolling) << "\n";
81 }
82 return res;
Gael Guennebaudcb71dc42009-01-07 22:20:03 +000083}
84
Gael Guennebaudfebcce32015-08-07 20:05:31 +020085template<typename Scalar, bool Enable = internal::packet_traits<Scalar>::Vectorizable>
86struct vectorization_logic
Gael Guennebaud51ec1882010-07-08 23:30:16 +020087{
Christoph Hertzberg4f440b82014-07-14 14:36:20 +020088 typedef internal::packet_traits<Scalar> PacketTraits;
Gael Guennebaudfebcce32015-08-07 20:05:31 +020089
90 typedef typename internal::packet_traits<Scalar>::type PacketType;
91 typedef typename internal::unpacket_traits<PacketType>::half HalfPacketType;
Gael Guennebaud51ec1882010-07-08 23:30:16 +020092 enum {
Gael Guennebaudfebcce32015-08-07 20:05:31 +020093 PacketSize = internal::unpacket_traits<PacketType>::size,
94 HalfPacketSize = internal::unpacket_traits<HalfPacketType>::size
Gael Guennebaud51ec1882010-07-08 23:30:16 +020095 };
96 static void run()
97 {
98
99 typedef Matrix<Scalar,PacketSize,1> Vector1;
100 typedef Matrix<Scalar,Dynamic,1> VectorX;
101 typedef Matrix<Scalar,Dynamic,Dynamic> MatrixXX;
102 typedef Matrix<Scalar,PacketSize,PacketSize> Matrix11;
103 typedef Matrix<Scalar,2*PacketSize,2*PacketSize> Matrix22;
Gael Guennebaud64356a62011-01-04 14:18:07 +0100104 typedef Matrix<Scalar,(Matrix11::Flags&RowMajorBit)?16:4*PacketSize,(Matrix11::Flags&RowMajorBit)?4*PacketSize:16> Matrix44;
105 typedef Matrix<Scalar,(Matrix11::Flags&RowMajorBit)?16:4*PacketSize,(Matrix11::Flags&RowMajorBit)?4*PacketSize:16,DontAlign|EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION> Matrix44u;
Gael Guennebaud2606abe2014-04-18 21:14:40 +0200106 typedef Matrix<Scalar,4*PacketSize,4*PacketSize,ColMajor> Matrix44c;
107 typedef Matrix<Scalar,4*PacketSize,4*PacketSize,RowMajor> Matrix44r;
Gael Guennebaud51ec1882010-07-08 23:30:16 +0200108
109 typedef Matrix<Scalar,
110 (PacketSize==8 ? 4 : PacketSize==4 ? 2 : PacketSize==2 ? 1 : /*PacketSize==1 ?*/ 1),
111 (PacketSize==8 ? 2 : PacketSize==4 ? 2 : PacketSize==2 ? 2 : /*PacketSize==1 ?*/ 1)
112 > Matrix1;
113
114 typedef Matrix<Scalar,
115 (PacketSize==8 ? 4 : PacketSize==4 ? 2 : PacketSize==2 ? 1 : /*PacketSize==1 ?*/ 1),
116 (PacketSize==8 ? 2 : PacketSize==4 ? 2 : PacketSize==2 ? 2 : /*PacketSize==1 ?*/ 1),
117 DontAlign|((Matrix1::Flags&RowMajorBit)?RowMajor:ColMajor)> Matrix1u;
118
Gael Guennebaud64356a62011-01-04 14:18:07 +0100119 // this type is made such that it can only be vectorized when viewed as a linear 1D vector
Gael Guennebaud51ec1882010-07-08 23:30:16 +0200120 typedef Matrix<Scalar,
Gael Guennebaud64356a62011-01-04 14:18:07 +0100121 (PacketSize==8 ? 4 : PacketSize==4 ? 6 : PacketSize==2 ? ((Matrix11::Flags&RowMajorBit)?2:3) : /*PacketSize==1 ?*/ 1),
122 (PacketSize==8 ? 6 : PacketSize==4 ? 2 : PacketSize==2 ? ((Matrix11::Flags&RowMajorBit)?3:2) : /*PacketSize==1 ?*/ 3)
Gael Guennebaud51ec1882010-07-08 23:30:16 +0200123 > Matrix3;
Gael Guennebaud501bc602011-05-19 21:52:40 +0200124
125 #if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT
Gael Guennebaud51ec1882010-07-08 23:30:16 +0200126 VERIFY(test_assign(Vector1(),Vector1(),
127 InnerVectorizedTraversal,CompleteUnrolling));
128 VERIFY(test_assign(Vector1(),Vector1()+Vector1(),
129 InnerVectorizedTraversal,CompleteUnrolling));
130 VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()),
131 InnerVectorizedTraversal,CompleteUnrolling));
132 VERIFY(test_assign(Vector1(),Vector1().template cast<Scalar>(),
133 InnerVectorizedTraversal,CompleteUnrolling));
134
135
136 VERIFY(test_assign(Vector1(),Vector1(),
137 InnerVectorizedTraversal,CompleteUnrolling));
138 VERIFY(test_assign(Vector1(),Vector1()+Vector1(),
139 InnerVectorizedTraversal,CompleteUnrolling));
140 VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()),
141 InnerVectorizedTraversal,CompleteUnrolling));
142
143 VERIFY(test_assign(Matrix44(),Matrix44()+Matrix44(),
144 InnerVectorizedTraversal,InnerUnrolling));
145
146 VERIFY(test_assign(Matrix44u(),Matrix44()+Matrix44(),
147 LinearTraversal,NoUnrolling));
148
149 VERIFY(test_assign(Matrix1u(),Matrix1()+Matrix1(),
150 LinearTraversal,CompleteUnrolling));
151
Gael Guennebaudaa2b46a2010-07-23 16:29:29 +0200152 VERIFY(test_assign(Matrix44c().col(1),Matrix44c().col(2)+Matrix44c().col(3),
153 InnerVectorizedTraversal,CompleteUnrolling));
Benoit Steiner25d05c42016-04-12 14:13:25 -0700154
Gael Guennebaudaa2b46a2010-07-23 16:29:29 +0200155 VERIFY(test_assign(Matrix44r().row(2),Matrix44r().row(1)+Matrix44r().row(1),
156 InnerVectorizedTraversal,CompleteUnrolling));
Benoit Steiner25d05c42016-04-12 14:13:25 -0700157
Gael Guennebaud51ec1882010-07-08 23:30:16 +0200158 if(PacketSize>1)
159 {
Gael Guennebaudaa2b46a2010-07-23 16:29:29 +0200160 typedef Matrix<Scalar,3,3,ColMajor> Matrix33c;
161 VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1),
162 LinearTraversal,CompleteUnrolling));
163 VERIFY(test_assign(Matrix33c().col(0),Matrix33c().col(1)+Matrix33c().col(1),
164 LinearTraversal,CompleteUnrolling));
Benoit Steiner25d05c42016-04-12 14:13:25 -0700165
166 VERIFY(test_assign(Matrix3(),Matrix3().cwiseProduct(Matrix3()),
167 LinearVectorizedTraversal,CompleteUnrolling));
168
Gael Guennebaud51ec1882010-07-08 23:30:16 +0200169 VERIFY(test_assign(Matrix<Scalar,17,17>(),Matrix<Scalar,17,17>()+Matrix<Scalar,17,17>(),
Gael Guennebaudfebcce32015-08-07 20:05:31 +0200170 HalfPacketSize==1 ? InnerVectorizedTraversal : LinearTraversal,NoUnrolling));
Benoit Steiner25d05c42016-04-12 14:13:25 -0700171
Gael Guennebaud2606abe2014-04-18 21:14:40 +0200172 VERIFY(test_assign(Matrix11(),Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(2,3)+Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(8,4),
173 DefaultTraversal,PacketSize>4?InnerUnrolling:CompleteUnrolling));
Gael Guennebaud512ba0a2016-04-13 18:16:35 +0200174
175 VERIFY(test_assign(Vector1(),Matrix11()*Vector1(),
176 InnerVectorizedTraversal,CompleteUnrolling));
177
178 VERIFY(test_assign(Matrix11(),Matrix11().lazyProduct(Matrix11()),
179 InnerVectorizedTraversal,InnerUnrolling+CompleteUnrolling));
Gael Guennebaud51ec1882010-07-08 23:30:16 +0200180 }
Benoit Steiner25d05c42016-04-12 14:13:25 -0700181
Gael Guennebaud512ba0a2016-04-13 18:16:35 +0200182 VERIFY(test_redux(Vector1(),
183 LinearVectorizedTraversal,CompleteUnrolling));
184
185 VERIFY(test_redux(Matrix<Scalar,PacketSize,3>(),
186 LinearVectorizedTraversal,CompleteUnrolling));
187
Gael Guennebaud51ec1882010-07-08 23:30:16 +0200188 VERIFY(test_redux(Matrix3(),
189 LinearVectorizedTraversal,CompleteUnrolling));
190
191 VERIFY(test_redux(Matrix44(),
192 LinearVectorizedTraversal,NoUnrolling));
193
Gael Guennebaud64356a62011-01-04 14:18:07 +0100194 VERIFY(test_redux(Matrix44().template block<(Matrix1::Flags&RowMajorBit)?4:PacketSize,(Matrix1::Flags&RowMajorBit)?PacketSize:4>(1,2),
Gael Guennebaud51ec1882010-07-08 23:30:16 +0200195 DefaultTraversal,CompleteUnrolling));
196
197 VERIFY(test_redux(Matrix44c().template block<2*PacketSize,1>(1,2),
198 LinearVectorizedTraversal,CompleteUnrolling));
199
200 VERIFY(test_redux(Matrix44r().template block<1,2*PacketSize>(2,1),
201 LinearVectorizedTraversal,CompleteUnrolling));
Gael Guennebaud2606abe2014-04-18 21:14:40 +0200202
Gael Guennebaud501bc602011-05-19 21:52:40 +0200203 VERIFY((test_assign<
Gael Guennebaud1f502432015-08-06 15:31:07 +0200204 Map<Matrix22, AlignedMax, OuterStride<3*PacketSize> >,
Gael Guennebaud501bc602011-05-19 21:52:40 +0200205 Matrix22
206 >(InnerVectorizedTraversal,CompleteUnrolling)));
207
208 VERIFY((test_assign<
Gael Guennebaud1f502432015-08-06 15:31:07 +0200209 Map<Matrix<Scalar,EIGEN_PLAIN_ENUM_MAX(2,PacketSize),EIGEN_PLAIN_ENUM_MAX(2,PacketSize)>, AlignedMax, InnerStride<3*PacketSize> >,
Gael Guennebaud2606abe2014-04-18 21:14:40 +0200210 Matrix<Scalar,EIGEN_PLAIN_ENUM_MAX(2,PacketSize),EIGEN_PLAIN_ENUM_MAX(2,PacketSize)>
Gael Guennebaud501bc602011-05-19 21:52:40 +0200211 >(DefaultTraversal,CompleteUnrolling)));
212
Gael Guennebaud2606abe2014-04-18 21:14:40 +0200213 VERIFY((test_assign(Matrix11(), Matrix<Scalar,PacketSize,EIGEN_PLAIN_ENUM_MIN(2,PacketSize)>()*Matrix<Scalar,EIGEN_PLAIN_ENUM_MIN(2,PacketSize),PacketSize>(),
Gael Guennebaud1330f8b2015-03-13 21:15:50 +0100214 InnerVectorizedTraversal, CompleteUnrolling)));
Gael Guennebaud501bc602011-05-19 21:52:40 +0200215 #endif
216
217 VERIFY(test_assign(MatrixXX(10,10),MatrixXX(20,20).block(10,10,2,3),
218 SliceVectorizedTraversal,NoUnrolling));
219
220 VERIFY(test_redux(VectorX(10),
221 LinearVectorizedTraversal,NoUnrolling));
Gael Guennebaud51ec1882010-07-08 23:30:16 +0200222 }
223};
224
225template<typename Scalar> struct vectorization_logic<Scalar,false>
226{
227 static void run() {}
228};
229
Gael Guennebaudfebcce32015-08-07 20:05:31 +0200230template<typename Scalar, bool Enable = !internal::is_same<typename internal::unpacket_traits<typename internal::packet_traits<Scalar>::type>::half,
231 typename internal::packet_traits<Scalar>::type>::value >
232struct vectorization_logic_half
233{
234 typedef internal::packet_traits<Scalar> PacketTraits;
235 typedef typename internal::unpacket_traits<typename internal::packet_traits<Scalar>::type>::half PacketType;
236 enum {
237 PacketSize = internal::unpacket_traits<PacketType>::size
238 };
239 static void run()
240 {
241
242 typedef Matrix<Scalar,PacketSize,1> Vector1;
243 typedef Matrix<Scalar,PacketSize,PacketSize> Matrix11;
244 typedef Matrix<Scalar,5*PacketSize,7,ColMajor> Matrix57;
Gael Guennebaud512ba0a2016-04-13 18:16:35 +0200245 typedef Matrix<Scalar,3*PacketSize,5,ColMajor> Matrix35;
Gael Guennebaudfebcce32015-08-07 20:05:31 +0200246 typedef Matrix<Scalar,5*PacketSize,7,DontAlign|ColMajor> Matrix57u;
247// typedef Matrix<Scalar,(Matrix11::Flags&RowMajorBit)?16:4*PacketSize,(Matrix11::Flags&RowMajorBit)?4*PacketSize:16> Matrix44;
248// typedef Matrix<Scalar,(Matrix11::Flags&RowMajorBit)?16:4*PacketSize,(Matrix11::Flags&RowMajorBit)?4*PacketSize:16,DontAlign|EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION> Matrix44u;
249// typedef Matrix<Scalar,4*PacketSize,4*PacketSize,ColMajor> Matrix44c;
250// typedef Matrix<Scalar,4*PacketSize,4*PacketSize,RowMajor> Matrix44r;
251
252 typedef Matrix<Scalar,
253 (PacketSize==8 ? 4 : PacketSize==4 ? 2 : PacketSize==2 ? 1 : /*PacketSize==1 ?*/ 1),
254 (PacketSize==8 ? 2 : PacketSize==4 ? 2 : PacketSize==2 ? 2 : /*PacketSize==1 ?*/ 1)
255 > Matrix1;
256
257 typedef Matrix<Scalar,
258 (PacketSize==8 ? 4 : PacketSize==4 ? 2 : PacketSize==2 ? 1 : /*PacketSize==1 ?*/ 1),
259 (PacketSize==8 ? 2 : PacketSize==4 ? 2 : PacketSize==2 ? 2 : /*PacketSize==1 ?*/ 1),
260 DontAlign|((Matrix1::Flags&RowMajorBit)?RowMajor:ColMajor)> Matrix1u;
261
262 // this type is made such that it can only be vectorized when viewed as a linear 1D vector
263 typedef Matrix<Scalar,
264 (PacketSize==8 ? 4 : PacketSize==4 ? 6 : PacketSize==2 ? ((Matrix11::Flags&RowMajorBit)?2:3) : /*PacketSize==1 ?*/ 1),
265 (PacketSize==8 ? 6 : PacketSize==4 ? 2 : PacketSize==2 ? ((Matrix11::Flags&RowMajorBit)?3:2) : /*PacketSize==1 ?*/ 3)
266 > Matrix3;
267
268 #if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT
269 VERIFY(test_assign(Vector1(),Vector1(),
270 InnerVectorizedTraversal,CompleteUnrolling));
271 VERIFY(test_assign(Vector1(),Vector1()+Vector1(),
272 InnerVectorizedTraversal,CompleteUnrolling));
273 VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()),
274 InnerVectorizedTraversal,CompleteUnrolling));
275 VERIFY(test_assign(Vector1(),Vector1().template cast<Scalar>(),
276 InnerVectorizedTraversal,CompleteUnrolling));
277
278
279 VERIFY(test_assign(Vector1(),Vector1(),
280 InnerVectorizedTraversal,CompleteUnrolling));
281 VERIFY(test_assign(Vector1(),Vector1()+Vector1(),
282 InnerVectorizedTraversal,CompleteUnrolling));
283 VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()),
284 InnerVectorizedTraversal,CompleteUnrolling));
285
286 VERIFY(test_assign(Matrix57(),Matrix57()+Matrix57(),
287 InnerVectorizedTraversal,InnerUnrolling));
288
289 VERIFY(test_assign(Matrix57u(),Matrix57()+Matrix57(),
290 LinearTraversal,NoUnrolling));
291
292 VERIFY(test_assign(Matrix1u(),Matrix1()+Matrix1(),
293 LinearTraversal,CompleteUnrolling));
294
295 if(PacketSize>1)
296 {
297 typedef Matrix<Scalar,3,3,ColMajor> Matrix33c;
298 VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1),
299 LinearTraversal,CompleteUnrolling));
300 VERIFY(test_assign(Matrix33c().col(0),Matrix33c().col(1)+Matrix33c().col(1),
301 LinearTraversal,CompleteUnrolling));
302
303 VERIFY(test_assign(Matrix3(),Matrix3().cwiseQuotient(Matrix3()),
304 PacketTraits::HasDiv ? LinearVectorizedTraversal : LinearTraversal,CompleteUnrolling));
305
306 VERIFY(test_assign(Matrix<Scalar,17,17>(),Matrix<Scalar,17,17>()+Matrix<Scalar,17,17>(),
307 LinearTraversal,NoUnrolling));
308
309 VERIFY(test_assign(Matrix11(),Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(2,3)+Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(8,4),
310 DefaultTraversal,PacketSize>4?InnerUnrolling:CompleteUnrolling));
Gael Guennebaud512ba0a2016-04-13 18:16:35 +0200311
312 VERIFY(test_assign(Vector1(),Matrix11()*Vector1(),
313 InnerVectorizedTraversal,CompleteUnrolling));
314
315 VERIFY(test_assign(Matrix11(),Matrix11().lazyProduct(Matrix11()),
316 InnerVectorizedTraversal,InnerUnrolling+CompleteUnrolling));
Gael Guennebaudfebcce32015-08-07 20:05:31 +0200317 }
318
Gael Guennebaud512ba0a2016-04-13 18:16:35 +0200319 VERIFY(test_redux(Vector1(),
320 LinearVectorizedTraversal,CompleteUnrolling));
321
322 VERIFY(test_redux(Matrix<Scalar,PacketSize,3>(),
323 LinearVectorizedTraversal,CompleteUnrolling));
324
Gael Guennebaudfebcce32015-08-07 20:05:31 +0200325 VERIFY(test_redux(Matrix3(),
326 LinearVectorizedTraversal,CompleteUnrolling));
327
Gael Guennebaud512ba0a2016-04-13 18:16:35 +0200328 VERIFY(test_redux(Matrix35(),
Gael Guennebaudfebcce32015-08-07 20:05:31 +0200329 LinearVectorizedTraversal,CompleteUnrolling));
330
331 VERIFY(test_redux(Matrix57().template block<PacketSize,3>(1,0),
332 DefaultTraversal,CompleteUnrolling));
333
334 VERIFY((test_assign<
335 Map<Matrix<Scalar,EIGEN_PLAIN_ENUM_MAX(2,PacketSize),EIGEN_PLAIN_ENUM_MAX(2,PacketSize)>, AlignedMax, InnerStride<3*PacketSize> >,
336 Matrix<Scalar,EIGEN_PLAIN_ENUM_MAX(2,PacketSize),EIGEN_PLAIN_ENUM_MAX(2,PacketSize)>
337 >(DefaultTraversal,CompleteUnrolling)));
338
339 VERIFY((test_assign(Matrix57(), Matrix<Scalar,5*PacketSize,3>()*Matrix<Scalar,3,7>(),
340 InnerVectorizedTraversal, CompleteUnrolling)));
341 #endif
342 }
343};
344
345template<typename Scalar> struct vectorization_logic_half<Scalar,false>
346{
347 static void run() {}
348};
349
Gael Guennebaudcb71dc42009-01-07 22:20:03 +0000350void test_vectorization_logic()
351{
352
353#ifdef EIGEN_VECTORIZE
354
Christoph Hertzberg4f440b82014-07-14 14:36:20 +0200355 CALL_SUBTEST( vectorization_logic<int>::run() );
Gael Guennebaud501bc602011-05-19 21:52:40 +0200356 CALL_SUBTEST( vectorization_logic<float>::run() );
357 CALL_SUBTEST( vectorization_logic<double>::run() );
358 CALL_SUBTEST( vectorization_logic<std::complex<float> >::run() );
359 CALL_SUBTEST( vectorization_logic<std::complex<double> >::run() );
Gael Guennebaud51ec1882010-07-08 23:30:16 +0200360
Gael Guennebaudfebcce32015-08-07 20:05:31 +0200361 CALL_SUBTEST( vectorization_logic_half<int>::run() );
362 CALL_SUBTEST( vectorization_logic_half<float>::run() );
363 CALL_SUBTEST( vectorization_logic_half<double>::run() );
364 CALL_SUBTEST( vectorization_logic_half<std::complex<float> >::run() );
365 CALL_SUBTEST( vectorization_logic_half<std::complex<double> >::run() );
366
Benoit Jacob47160402010-10-25 10:15:22 -0400367 if(internal::packet_traits<float>::Vectorizable)
Gael Guennebaud51ec1882010-07-08 23:30:16 +0200368 {
369 VERIFY(test_assign(Matrix<float,3,3>(),Matrix<float,3,3>()+Matrix<float,3,3>(),
370 LinearTraversal,CompleteUnrolling));
371
372 VERIFY(test_redux(Matrix<float,5,2>(),
373 DefaultTraversal,CompleteUnrolling));
374 }
375
Benoit Jacob47160402010-10-25 10:15:22 -0400376 if(internal::packet_traits<double>::Vectorizable)
Gael Guennebaud51ec1882010-07-08 23:30:16 +0200377 {
378 VERIFY(test_assign(Matrix<double,3,3>(),Matrix<double,3,3>()+Matrix<double,3,3>(),
379 LinearTraversal,CompleteUnrolling));
380
381 VERIFY(test_redux(Matrix<double,7,3>(),
382 DefaultTraversal,CompleteUnrolling));
383 }
Gael Guennebaudcb71dc42009-01-07 22:20:03 +0000384#endif // EIGEN_VECTORIZE
385
386}