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,
Flags = (_Flags & ~VectorizableBit)
| (
(
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)
)
) ? VectorizableBit : 0
ei_is_matrix_vectorizable<Scalar, _Rows, _Cols, _Flags>::ret
? VectorizableBit : 0
),
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;
};
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
{
typedef Matrix<typename ei_traits<T>::Scalar,
ei_traits<T>::RowsAtCompileTime,
ei_traits<T>::ColsAtCompileTime,
ei_traits<T>::Flags & ~(EvalBeforeNestingBit | EvalBeforeAssigningBit),
typedef typename ei_traits<T>::Scalar _Scalar;
enum { _Rows = ei_traits<T>::RowsAtCompileTime,
_Cols = ei_traits<T>::ColsAtCompileTime,
_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>::MaxColsAtCompileTime> type;
};
@ -167,19 +204,4 @@ template<typename T, int n=1> struct ei_nested
>::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