when evaluating an xpr, the result can now be vectorizable

even if the xpr itself wasn't vectorizable.
This commit is contained in:
Benoit Jacob 2008-04-14 08:55:12 +00:00
parent ea3ccb1e8c
commit 9789c04467
2 changed files with 43 additions and 28 deletions

View File

@ -81,15 +81,8 @@ struct ei_traits<Matrix<_Scalar, _Rows, _Cols, _Flags, _MaxRows, _MaxCols> >
MaxColsAtCompileTime = _MaxCols, MaxColsAtCompileTime = _MaxCols,
Flags = (_Flags & ~VectorizableBit) Flags = (_Flags & ~VectorizableBit)
| ( | (
( ei_is_matrix_vectorizable<Scalar, _Rows, _Cols, _Flags>::ret
ei_packet_traits<Scalar>::size>1 ? VectorizableBit : 0
&& _Rows!=Dynamic
&& _Cols!=Dynamic
&& (
(_Flags&RowMajorBit && _Cols%ei_packet_traits<Scalar>::size==0)
|| (_Rows%ei_packet_traits<Scalar>::size==0)
)
) ? VectorizableBit : 0
), ),
CoeffReadCost = NumTraits<Scalar>::ReadCost CoeffReadCost = NumTraits<Scalar>::ReadCost
}; };

View File

@ -130,12 +130,49 @@ struct ei_result_of<Func(ArgType0,ArgType1)> {
typedef typename ei_binary_result_of_select<Func, ArgType0, ArgType1, FunctorType>::type type; typedef typename ei_binary_result_of_select<Func, ArgType0, ArgType1, FunctorType>::type type;
}; };
template<typename T> struct ei_functor_traits
{
enum
{
Cost = 10,
IsVectorizable = false
};
};
template<typename T> struct ei_packet_traits
{
typedef T type;
enum {size=1};
};
template<typename Scalar, int Rows, int Cols, unsigned int Flags>
struct ei_is_matrix_vectorizable
{
enum { ret = ei_packet_traits<Scalar>::size > 1
&& Rows!=Dynamic
&& Cols!=Dynamic
&&
(
(Flags&RowMajorBit && Cols%ei_packet_traits<Scalar>::size==0)
|| (Rows%ei_packet_traits<Scalar>::size==0)
)
};
};
template<typename T> struct ei_eval template<typename T> struct ei_eval
{ {
typedef Matrix<typename ei_traits<T>::Scalar, typedef typename ei_traits<T>::Scalar _Scalar;
ei_traits<T>::RowsAtCompileTime, enum { _Rows = ei_traits<T>::RowsAtCompileTime,
ei_traits<T>::ColsAtCompileTime, _Cols = ei_traits<T>::ColsAtCompileTime,
ei_traits<T>::Flags & ~(EvalBeforeNestingBit | EvalBeforeAssigningBit), _Flags = ei_traits<T>::Flags
};
typedef Matrix<_Scalar,
_Rows,
_Cols,
(_Flags & ~(EvalBeforeNestingBit | EvalBeforeAssigningBit))
|
(ei_is_matrix_vectorizable<_Scalar, _Rows, _Cols, _Flags>::ret
? VectorizableBit : 0),
ei_traits<T>::MaxRowsAtCompileTime, ei_traits<T>::MaxRowsAtCompileTime,
ei_traits<T>::MaxColsAtCompileTime> type; ei_traits<T>::MaxColsAtCompileTime> type;
}; };
@ -167,19 +204,4 @@ template<typename T, int n=1> struct ei_nested
>::ret type; >::ret type;
}; };
template<typename T> struct ei_functor_traits
{
enum
{
Cost = 10,
IsVectorizable = false
};
};
template<typename T> struct ei_packet_traits
{
typedef T type;
enum {size=1};
};
#endif // EIGEN_META_H #endif // EIGEN_META_H