Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 1 | // This file is part of Eigen, a lightweight C++ template library |
Benoit Jacob | 6347b1d | 2009-05-22 20:25:33 +0200 | [diff] [blame] | 2 | // for linear algebra. |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 3 | // |
| 4 | // Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr> |
| 5 | // |
| 6 | // Eigen is free software; you can redistribute it and/or |
| 7 | // modify it under the terms of the GNU Lesser General Public |
| 8 | // License as published by the Free Software Foundation; either |
| 9 | // version 3 of the License, or (at your option) any later version. |
| 10 | // |
| 11 | // Alternatively, you can redistribute it and/or |
| 12 | // modify it under the terms of the GNU General Public License as |
| 13 | // published by the Free Software Foundation; either version 2 of |
| 14 | // the License, or (at your option) any later version. |
| 15 | // |
| 16 | // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY |
| 17 | // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| 18 | // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the |
| 19 | // GNU General Public License for more details. |
| 20 | // |
| 21 | // You should have received a copy of the GNU Lesser General Public |
| 22 | // License and a copy of the GNU General Public License along with |
| 23 | // Eigen. If not, see <http://www.gnu.org/licenses/>. |
| 24 | |
Benoit Jacob | 27f5250 | 2010-02-27 19:04:22 -0500 | [diff] [blame] | 25 | #define EIGEN_DEBUG_ASSIGN |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 26 | #include "main.h" |
| 27 | #include <typeinfo> |
| 28 | |
| 29 | template<typename Dst, typename Src> |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 30 | bool test_assign(const Dst&, const Src&, int traversal, int unrolling) |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 31 | { |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 32 | ei_assign_traits<Dst,Src>::debug(); |
| 33 | return ei_assign_traits<Dst,Src>::Traversal==traversal |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 34 | && ei_assign_traits<Dst,Src>::Unrolling==unrolling; |
| 35 | } |
| 36 | |
Benoit Jacob | b1f666d | 2010-02-26 20:12:51 -0500 | [diff] [blame] | 37 | template<typename Dst, typename Src> |
| 38 | bool test_assign(int traversal, int unrolling) |
| 39 | { |
| 40 | ei_assign_traits<Dst,Src>::debug(); |
| 41 | return ei_assign_traits<Dst,Src>::Traversal==traversal |
| 42 | && ei_assign_traits<Dst,Src>::Unrolling==unrolling; |
| 43 | } |
| 44 | |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 45 | template<typename Xpr> |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 46 | bool test_redux(const Xpr&, int traversal, int unrolling) |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 47 | { |
Gael Guennebaud | c5245a3 | 2009-02-13 08:45:19 +0000 | [diff] [blame] | 48 | typedef ei_redux_traits<ei_scalar_sum_op<typename Xpr::Scalar>,Xpr> traits; |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 49 | return traits::Traversal==traversal && traits::Unrolling==unrolling; |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 50 | } |
| 51 | |
| 52 | void test_vectorization_logic() |
| 53 | { |
| 54 | |
| 55 | #ifdef EIGEN_VECTORIZE |
| 56 | |
| 57 | VERIFY(test_assign(Vector4f(),Vector4f(), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 58 | InnerVectorizedTraversal,CompleteUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 59 | VERIFY(test_assign(Vector4f(),Vector4f()+Vector4f(), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 60 | InnerVectorizedTraversal,CompleteUnrolling)); |
Gael Guennebaud | 30d4786 | 2009-12-17 10:43:46 +0100 | [diff] [blame] | 61 | VERIFY(test_assign(Vector4f(),Vector4f().cwiseProduct(Vector4f()), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 62 | InnerVectorizedTraversal,CompleteUnrolling)); |
Benoit Jacob | 8b1e7c2 | 2009-04-29 14:51:19 +0000 | [diff] [blame] | 63 | VERIFY(test_assign(Vector4f(),Vector4f().cast<float>(), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 64 | InnerVectorizedTraversal,CompleteUnrolling)); |
Benoit Jacob | 8b1e7c2 | 2009-04-29 14:51:19 +0000 | [diff] [blame] | 65 | |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 66 | |
| 67 | VERIFY(test_assign(Matrix4f(),Matrix4f(), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 68 | InnerVectorizedTraversal,CompleteUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 69 | VERIFY(test_assign(Matrix4f(),Matrix4f()+Matrix4f(), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 70 | InnerVectorizedTraversal,CompleteUnrolling)); |
Gael Guennebaud | 30d4786 | 2009-12-17 10:43:46 +0100 | [diff] [blame] | 71 | VERIFY(test_assign(Matrix4f(),Matrix4f().cwiseProduct(Matrix4f()), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 72 | InnerVectorizedTraversal,CompleteUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 73 | |
| 74 | VERIFY(test_assign(Matrix<float,16,16>(),Matrix<float,16,16>()+Matrix<float,16,16>(), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 75 | InnerVectorizedTraversal,InnerUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 76 | |
Gael Guennebaud | e499646 | 2010-06-24 15:38:14 +0200 | [diff] [blame^] | 77 | VERIFY(test_assign(Matrix<float,16,16,DontAlign|EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION>(),Matrix<float,16,16>()+Matrix<float,16,16>(), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 78 | LinearTraversal,NoUnrolling)); |
| 79 | |
Gael Guennebaud | e499646 | 2010-06-24 15:38:14 +0200 | [diff] [blame^] | 80 | VERIFY(test_assign(Matrix<float,2,2,DontAlign|EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION>(),Matrix<float,2,2>()+Matrix<float,2,2>(), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 81 | LinearTraversal,CompleteUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 82 | |
Gael Guennebaud | 30d4786 | 2009-12-17 10:43:46 +0100 | [diff] [blame] | 83 | VERIFY(test_assign(Matrix<float,6,2>(),Matrix<float,6,2>().cwiseQuotient(Matrix<float,6,2>()), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 84 | LinearVectorizedTraversal,CompleteUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 85 | |
| 86 | VERIFY(test_assign(Matrix<float,17,17>(),Matrix<float,17,17>()+Matrix<float,17,17>(), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 87 | LinearTraversal,NoUnrolling)); |
| 88 | |
| 89 | VERIFY(test_assign(Matrix<float,3,3>(),Matrix<float,3,3>()+Matrix<float,3,3>(), |
| 90 | LinearTraversal,CompleteUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 91 | |
| 92 | VERIFY(test_assign(Matrix<float,4,4>(),Matrix<float,17,17>().block<4,4>(2,3)+Matrix<float,17,17>().block<4,4>(10,4), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 93 | DefaultTraversal,CompleteUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 94 | |
| 95 | VERIFY(test_assign(MatrixXf(10,10),MatrixXf(20,20).block(10,10,2,3), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 96 | SliceVectorizedTraversal,NoUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 97 | |
Benoit Jacob | b1f666d | 2010-02-26 20:12:51 -0500 | [diff] [blame] | 98 | VERIFY((test_assign< |
| 99 | Map<Matrix<float,4,8>, Aligned, OuterStride<12> >, |
| 100 | Matrix<float,4,8> |
| 101 | >(InnerVectorizedTraversal,CompleteUnrolling))); |
| 102 | |
| 103 | VERIFY((test_assign< |
| 104 | Map<Matrix<float,4,8>, Aligned, InnerStride<12> >, |
| 105 | Matrix<float,4,8> |
| 106 | >(DefaultTraversal,CompleteUnrolling))); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 107 | |
Gael Guennebaud | c5245a3 | 2009-02-13 08:45:19 +0000 | [diff] [blame] | 108 | VERIFY(test_redux(VectorXf(10), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 109 | LinearVectorizedTraversal,NoUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 110 | |
Gael Guennebaud | c5245a3 | 2009-02-13 08:45:19 +0000 | [diff] [blame] | 111 | VERIFY(test_redux(Matrix<float,5,2>(), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 112 | DefaultTraversal,CompleteUnrolling)); |
Gael Guennebaud | c5245a3 | 2009-02-13 08:45:19 +0000 | [diff] [blame] | 113 | |
| 114 | VERIFY(test_redux(Matrix<float,6,2>(), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 115 | LinearVectorizedTraversal,CompleteUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 116 | |
Gael Guennebaud | c5245a3 | 2009-02-13 08:45:19 +0000 | [diff] [blame] | 117 | VERIFY(test_redux(Matrix<float,16,16>(), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 118 | LinearVectorizedTraversal,NoUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 119 | |
Gael Guennebaud | c5245a3 | 2009-02-13 08:45:19 +0000 | [diff] [blame] | 120 | VERIFY(test_redux(Matrix<float,16,16>().block<4,4>(1,2), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 121 | DefaultTraversal,CompleteUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 122 | |
Gael Guennebaud | e499646 | 2010-06-24 15:38:14 +0200 | [diff] [blame^] | 123 | VERIFY(test_redux(Matrix<float,16,16,ColMajor>().block<8,1>(1,2), |
| 124 | LinearVectorizedTraversal,CompleteUnrolling)); |
| 125 | |
| 126 | VERIFY(test_redux(Matrix<float,16,16,RowMajor>().block<1,8>(2,1), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 127 | LinearVectorizedTraversal,CompleteUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 128 | |
Gael Guennebaud | c5245a3 | 2009-02-13 08:45:19 +0000 | [diff] [blame] | 129 | VERIFY(test_redux(Matrix<double,7,3>(), |
Benoit Jacob | 94c706d | 2009-11-18 11:57:07 -0500 | [diff] [blame] | 130 | DefaultTraversal,CompleteUnrolling)); |
Gael Guennebaud | cb71dc4 | 2009-01-07 22:20:03 +0000 | [diff] [blame] | 131 | |
| 132 | #endif // EIGEN_VECTORIZE |
| 133 | |
| 134 | } |