mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-02-23 18:20:47 +08:00
when evaluating an xpr, the result can now be vectorizable
even if the xpr itself wasn't vectorizable.
This commit is contained in:
parent
ea3ccb1e8c
commit
9789c04467
@ -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
|
||||
};
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user