From 9789c04467d17abc338981cd2aa6d8824e6705b4 Mon Sep 17 00:00:00 2001 From: Benoit Jacob Date: Mon, 14 Apr 2008 08:55:12 +0000 Subject: when evaluating an xpr, the result can now be vectorizable even if the xpr itself wasn't vectorizable. --- Eigen/src/Core/Matrix.h | 11 ++------- Eigen/src/Core/util/Meta.h | 60 +++++++++++++++++++++++++++++++--------------- 2 files changed, 43 insertions(+), 28 deletions(-) (limited to 'Eigen/src/Core') diff --git a/Eigen/src/Core/Matrix.h b/Eigen/src/Core/Matrix.h index 2f65413da..740d6fc9a 100644 --- a/Eigen/src/Core/Matrix.h +++ b/Eigen/src/Core/Matrix.h @@ -81,15 +81,8 @@ struct ei_traits > MaxColsAtCompileTime = _MaxCols, Flags = (_Flags & ~VectorizableBit) | ( - ( - ei_packet_traits::size>1 - && _Rows!=Dynamic - && _Cols!=Dynamic - && ( - (_Flags&RowMajorBit && _Cols%ei_packet_traits::size==0) - || (_Rows%ei_packet_traits::size==0) - ) - ) ? VectorizableBit : 0 + ei_is_matrix_vectorizable::ret + ? VectorizableBit : 0 ), CoeffReadCost = NumTraits::ReadCost }; diff --git a/Eigen/src/Core/util/Meta.h b/Eigen/src/Core/util/Meta.h index 4939128eb..8eafec2f5 100644 --- a/Eigen/src/Core/util/Meta.h +++ b/Eigen/src/Core/util/Meta.h @@ -130,12 +130,49 @@ struct ei_result_of { typedef typename ei_binary_result_of_select::type type; }; +template struct ei_functor_traits +{ + enum + { + Cost = 10, + IsVectorizable = false + }; +}; + +template struct ei_packet_traits +{ + typedef T type; + enum {size=1}; +}; + +template +struct ei_is_matrix_vectorizable +{ + enum { ret = ei_packet_traits::size > 1 + && Rows!=Dynamic + && Cols!=Dynamic + && + ( + (Flags&RowMajorBit && Cols%ei_packet_traits::size==0) + || (Rows%ei_packet_traits::size==0) + ) + }; +}; + template struct ei_eval { - typedef Matrix::Scalar, - ei_traits::RowsAtCompileTime, - ei_traits::ColsAtCompileTime, - ei_traits::Flags & ~(EvalBeforeNestingBit | EvalBeforeAssigningBit), + typedef typename ei_traits::Scalar _Scalar; + enum { _Rows = ei_traits::RowsAtCompileTime, + _Cols = ei_traits::ColsAtCompileTime, + _Flags = ei_traits::Flags + }; + typedef Matrix<_Scalar, + _Rows, + _Cols, + (_Flags & ~(EvalBeforeNestingBit | EvalBeforeAssigningBit)) + | + (ei_is_matrix_vectorizable<_Scalar, _Rows, _Cols, _Flags>::ret + ? VectorizableBit : 0), ei_traits::MaxRowsAtCompileTime, ei_traits::MaxColsAtCompileTime> type; }; @@ -167,19 +204,4 @@ template struct ei_nested >::ret type; }; -template struct ei_functor_traits -{ - enum - { - Cost = 10, - IsVectorizable = false - }; -}; - -template struct ei_packet_traits -{ - typedef T type; - enum {size=1}; -}; - #endif // EIGEN_META_H -- cgit v1.2.3