1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_DEBUG_ASSIGN 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "main.h" 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <typeinfo> 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstd::string demangle_traversal(int t) 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(t==DefaultTraversal) return "DefaultTraversal"; 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(t==LinearTraversal) return "LinearTraversal"; 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(t==InnerVectorizedTraversal) return "InnerVectorizedTraversal"; 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(t==LinearVectorizedTraversal) return "LinearVectorizedTraversal"; 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(t==SliceVectorizedTraversal) return "SliceVectorizedTraversal"; 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return "?"; 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstd::string demangle_unrolling(int t) 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(t==NoUnrolling) return "NoUnrolling"; 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(t==InnerUnrolling) return "InnerUnrolling"; 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(t==CompleteUnrolling) return "CompleteUnrolling"; 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return "?"; 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Dst, typename Src> 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathbool test_assign(const Dst&, const Src&, int traversal, int unrolling) 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::assign_traits<Dst,Src>::debug(); 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool res = internal::assign_traits<Dst,Src>::Traversal==traversal 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && internal::assign_traits<Dst,Src>::Unrolling==unrolling; 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!res) 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cerr << " Expected Traversal == " << demangle_traversal(traversal) 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath << " got " << demangle_traversal(internal::assign_traits<Dst,Src>::Traversal) << "\n"; 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cerr << " Expected Unrolling == " << demangle_unrolling(unrolling) 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath << " got " << demangle_unrolling(internal::assign_traits<Dst,Src>::Unrolling) << "\n"; 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return res; 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Dst, typename Src> 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathbool test_assign(int traversal, int unrolling) 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::assign_traits<Dst,Src>::debug(); 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool res = internal::assign_traits<Dst,Src>::Traversal==traversal 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && internal::assign_traits<Dst,Src>::Unrolling==unrolling; 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!res) 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cerr << " Expected Traversal == " << demangle_traversal(traversal) 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath << " got " << demangle_traversal(internal::assign_traits<Dst,Src>::Traversal) << "\n"; 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cerr << " Expected Unrolling == " << demangle_unrolling(unrolling) 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath << " got " << demangle_unrolling(internal::assign_traits<Dst,Src>::Unrolling) << "\n"; 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return res; 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Xpr> 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathbool test_redux(const Xpr&, int traversal, int unrolling) 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef internal::redux_traits<internal::scalar_sum_op<typename Xpr::Scalar>,Xpr> traits; 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool res = traits::Traversal==traversal && traits::Unrolling==unrolling; 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!res) 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cerr << " Expected Traversal == " << demangle_traversal(traversal) 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath << " got " << demangle_traversal(traits::Traversal) << "\n"; 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cerr << " Expected Unrolling == " << demangle_unrolling(unrolling) 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath << " got " << demangle_unrolling(traits::Unrolling) << "\n"; 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return res; 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, bool Enable = internal::packet_traits<Scalar>::Vectorizable> struct vectorization_logic 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketSize = internal::packet_traits<Scalar>::size 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static void run() 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,PacketSize,1> Vector1; 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,Dynamic,1> VectorX; 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,Dynamic,Dynamic> MatrixXX; 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,PacketSize,PacketSize> Matrix11; 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,2*PacketSize,2*PacketSize> Matrix22; 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,(Matrix11::Flags&RowMajorBit)?16:4*PacketSize,(Matrix11::Flags&RowMajorBit)?4*PacketSize:16> Matrix44; 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,(Matrix11::Flags&RowMajorBit)?16:4*PacketSize,(Matrix11::Flags&RowMajorBit)?4*PacketSize:16,DontAlign|EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION> Matrix44u; 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,4*PacketSize,16,ColMajor> Matrix44c; 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,4*PacketSize,16,RowMajor> Matrix44r; 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar, 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (PacketSize==8 ? 4 : PacketSize==4 ? 2 : PacketSize==2 ? 1 : /*PacketSize==1 ?*/ 1), 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (PacketSize==8 ? 2 : PacketSize==4 ? 2 : PacketSize==2 ? 2 : /*PacketSize==1 ?*/ 1) 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath > Matrix1; 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar, 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (PacketSize==8 ? 4 : PacketSize==4 ? 2 : PacketSize==2 ? 1 : /*PacketSize==1 ?*/ 1), 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (PacketSize==8 ? 2 : PacketSize==4 ? 2 : PacketSize==2 ? 2 : /*PacketSize==1 ?*/ 1), 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DontAlign|((Matrix1::Flags&RowMajorBit)?RowMajor:ColMajor)> Matrix1u; 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // this type is made such that it can only be vectorized when viewed as a linear 1D vector 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar, 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (PacketSize==8 ? 4 : PacketSize==4 ? 6 : PacketSize==2 ? ((Matrix11::Flags&RowMajorBit)?2:3) : /*PacketSize==1 ?*/ 1), 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (PacketSize==8 ? 6 : PacketSize==4 ? 2 : PacketSize==2 ? ((Matrix11::Flags&RowMajorBit)?3:2) : /*PacketSize==1 ?*/ 3) 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath > Matrix3; 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Vector1(),Vector1(), 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath InnerVectorizedTraversal,CompleteUnrolling)); 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Vector1(),Vector1()+Vector1(), 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath InnerVectorizedTraversal,CompleteUnrolling)); 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()), 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath InnerVectorizedTraversal,CompleteUnrolling)); 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Vector1(),Vector1().template cast<Scalar>(), 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath InnerVectorizedTraversal,CompleteUnrolling)); 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Vector1(),Vector1(), 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath InnerVectorizedTraversal,CompleteUnrolling)); 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Vector1(),Vector1()+Vector1(), 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath InnerVectorizedTraversal,CompleteUnrolling)); 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()), 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath InnerVectorizedTraversal,CompleteUnrolling)); 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Matrix44(),Matrix44()+Matrix44(), 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath InnerVectorizedTraversal,InnerUnrolling)); 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Matrix44u(),Matrix44()+Matrix44(), 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LinearTraversal,NoUnrolling)); 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Matrix1u(),Matrix1()+Matrix1(), 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LinearTraversal,CompleteUnrolling)); 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Matrix44c().col(1),Matrix44c().col(2)+Matrix44c().col(3), 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath InnerVectorizedTraversal,CompleteUnrolling)); 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Matrix44r().row(2),Matrix44r().row(1)+Matrix44r().row(1), 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath InnerVectorizedTraversal,CompleteUnrolling)); 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(PacketSize>1) 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,3,3,ColMajor> Matrix33c; 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1), 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LinearTraversal,CompleteUnrolling)); 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Matrix33c().col(0),Matrix33c().col(1)+Matrix33c().col(1), 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LinearTraversal,CompleteUnrolling)); 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Matrix3(),Matrix3().cwiseQuotient(Matrix3()), 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LinearVectorizedTraversal,CompleteUnrolling)); 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Matrix<Scalar,17,17>(),Matrix<Scalar,17,17>()+Matrix<Scalar,17,17>(), 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LinearTraversal,NoUnrolling)); 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Matrix11(),Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(2,3)+Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(10,4), 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DefaultTraversal,CompleteUnrolling)); 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_redux(Matrix3(), 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LinearVectorizedTraversal,CompleteUnrolling)); 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_redux(Matrix44(), 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LinearVectorizedTraversal,NoUnrolling)); 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_redux(Matrix44().template block<(Matrix1::Flags&RowMajorBit)?4:PacketSize,(Matrix1::Flags&RowMajorBit)?PacketSize:4>(1,2), 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DefaultTraversal,CompleteUnrolling)); 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_redux(Matrix44c().template block<2*PacketSize,1>(1,2), 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LinearVectorizedTraversal,CompleteUnrolling)); 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_redux(Matrix44r().template block<1,2*PacketSize>(2,1), 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LinearVectorizedTraversal,CompleteUnrolling)); 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY((test_assign< 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Map<Matrix22, Aligned, OuterStride<3*PacketSize> >, 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Matrix22 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath >(InnerVectorizedTraversal,CompleteUnrolling))); 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY((test_assign< 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Map<Matrix22, Aligned, InnerStride<3*PacketSize> >, 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Matrix22 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath >(DefaultTraversal,CompleteUnrolling))); 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY((test_assign(Matrix11(), Matrix11()*Matrix11(), InnerVectorizedTraversal, CompleteUnrolling))); 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(MatrixXX(10,10),MatrixXX(20,20).block(10,10,2,3), 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SliceVectorizedTraversal,NoUnrolling)); 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_redux(VectorX(10), 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LinearVectorizedTraversal,NoUnrolling)); 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct vectorization_logic<Scalar,false> 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static void run() {} 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_vectorization_logic() 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_VECTORIZE 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST( vectorization_logic<float>::run() ); 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST( vectorization_logic<double>::run() ); 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST( vectorization_logic<std::complex<float> >::run() ); 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST( vectorization_logic<std::complex<double> >::run() ); 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(internal::packet_traits<float>::Vectorizable) 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Matrix<float,3,3>(),Matrix<float,3,3>()+Matrix<float,3,3>(), 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LinearTraversal,CompleteUnrolling)); 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_redux(Matrix<float,5,2>(), 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DefaultTraversal,CompleteUnrolling)); 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(internal::packet_traits<double>::Vectorizable) 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_assign(Matrix<double,3,3>(),Matrix<double,3,3>()+Matrix<double,3,3>(), 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LinearTraversal,CompleteUnrolling)); 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(test_redux(Matrix<double,7,3>(), 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DefaultTraversal,CompleteUnrolling)); 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_VECTORIZE 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 236