mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
- add _packetCoeff() to Inverse, allowing vectorization.
- let Inverse take template parameter MatrixType instead of ExpressionType, in order to reduce executable code size when taking inverses of xpr's. - introduce ei_corrected_matrix_flags : the flags template parameter to the Matrix class is only a suggestion. This is also useful in ei_eval.
This commit is contained in:
@@ -30,7 +30,7 @@ template<typename Lhs, typename Rhs> struct ei_product_eval_mode;
|
||||
template<typename T> struct NumTraits;
|
||||
|
||||
template<typename _Scalar, int _Rows, int _Cols,
|
||||
unsigned int _Flags = EIGEN_DEFAULT_MATRIX_FLAGS,
|
||||
unsigned int _SuggestedFlags = EIGEN_DEFAULT_MATRIX_FLAGS,
|
||||
int _MaxRows = _Rows, int _MaxCols = _Cols>
|
||||
class Matrix;
|
||||
|
||||
|
||||
@@ -145,36 +145,44 @@ template<typename T> struct ei_packet_traits
|
||||
enum {size=1};
|
||||
};
|
||||
|
||||
template<typename Scalar, int Rows, int Cols, unsigned int Flags>
|
||||
struct ei_is_matrix_vectorizable
|
||||
template<typename Scalar, int Rows, int Cols, unsigned int SuggestedFlags>
|
||||
class ei_corrected_matrix_flags
|
||||
{
|
||||
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)
|
||||
)
|
||||
};
|
||||
enum { is_vectorizable
|
||||
= ei_packet_traits<Scalar>::size > 1
|
||||
&& Rows!=Dynamic
|
||||
&& Cols!=Dynamic
|
||||
&&
|
||||
(
|
||||
SuggestedFlags&RowMajorBit
|
||||
? Cols%ei_packet_traits<Scalar>::size==0
|
||||
: Rows%ei_packet_traits<Scalar>::size==0
|
||||
),
|
||||
_flags1 = SuggestedFlags & ~(EvalBeforeNestingBit | EvalBeforeAssigningBit)
|
||||
};
|
||||
|
||||
public:
|
||||
enum { ret = is_vectorizable
|
||||
? _flags1 | VectorizableBit
|
||||
: _flags1 & ~VectorizableBit
|
||||
};
|
||||
};
|
||||
|
||||
template<typename T> struct ei_eval
|
||||
template<typename T> class ei_eval
|
||||
{
|
||||
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;
|
||||
typedef typename ei_traits<T>::Scalar _Scalar;
|
||||
enum { _Rows = ei_traits<T>::RowsAtCompileTime,
|
||||
_Cols = ei_traits<T>::ColsAtCompileTime,
|
||||
_Flags = ei_traits<T>::Flags
|
||||
};
|
||||
|
||||
public:
|
||||
typedef Matrix<_Scalar,
|
||||
_Rows,
|
||||
_Cols,
|
||||
ei_corrected_matrix_flags<_Scalar, _Rows, _Cols, _Flags>::ret,
|
||||
ei_traits<T>::MaxRowsAtCompileTime,
|
||||
ei_traits<T>::MaxColsAtCompileTime> type;
|
||||
};
|
||||
|
||||
template<typename T> struct ei_unref { typedef T type; };
|
||||
|
||||
Reference in New Issue
Block a user