- 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:
Benoit Jacob
2008-04-16 07:18:27 +00:00
parent 43e2bc14fe
commit acfd6f3bda
5 changed files with 105 additions and 87 deletions

View File

@@ -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;

View File

@@ -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; };