diff options
author | Gael Guennebaud <g.gael@free.fr> | 2015-08-06 17:52:01 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2015-08-06 17:52:01 +0200 |
commit | 2afdef6a54e7fd09a4a6d5e933cf15ffa129beb6 (patch) | |
tree | 796b23d51bcba9c17ade33b51b59d681979a8ba4 /Eigen/src/Core/DenseCoeffsBase.h | |
parent | 1f5024332e47f295c991c3781d57d0466d41a9c8 (diff) |
Generalize first_aligned to take the requested alignment as a template parameter, and add a first_default_aligned variante calling first_aligned with the requirement of the largest packet for the given scalar type.
Diffstat (limited to 'Eigen/src/Core/DenseCoeffsBase.h')
-rw-r--r-- | Eigen/src/Core/DenseCoeffsBase.h | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/Eigen/src/Core/DenseCoeffsBase.h b/Eigen/src/Core/DenseCoeffsBase.h index 11e2a1809..d053911e3 100644 --- a/Eigen/src/Core/DenseCoeffsBase.h +++ b/Eigen/src/Core/DenseCoeffsBase.h @@ -580,33 +580,41 @@ class DenseCoeffsBase<Derived, DirectWriteAccessors> namespace internal { -template<typename Derived, bool JustReturnZero> +template<int Alignment, typename Derived, bool JustReturnZero> struct first_aligned_impl { static inline Index run(const Derived&) { return 0; } }; -template<typename Derived> -struct first_aligned_impl<Derived, false> +template<int Alignment, typename Derived> +struct first_aligned_impl<Alignment, Derived, false> { static inline Index run(const Derived& m) { - return internal::first_aligned(&m.const_cast_derived().coeffRef(0,0), m.size()); + return internal::first_aligned<Alignment>(&m.const_cast_derived().coeffRef(0,0), m.size()); } }; -/** \internal \returns the index of the first element of the array that is well aligned for vectorization. +/** \internal \returns the index of the first element of the array stored by \a m that is properly aligned with respect to \a Alignment for vectorization. + * + * \tparam Alignment requested alignment in Bytes. * * There is also the variant first_aligned(const Scalar*, Integer) defined in Memory.h. See it for more * documentation. */ -template<typename Derived> +template<int Alignment, typename Derived> static inline Index first_aligned(const DenseBase<Derived>& m) { - return first_aligned_impl - <Derived, (evaluator<Derived>::Alignment > 0 ) || !(Derived::Flags & DirectAccessBit)> // FIXME Alignment! - ::run(m.derived()); + enum { ReturnZero = (int(evaluator<Derived>::Alignment) >= Alignment) || !(Derived::Flags & DirectAccessBit) }; + return first_aligned_impl<Alignment, Derived, ReturnZero>::run(m.derived()); +} + +template<typename Derived> +static inline Index first_default_aligned(const DenseBase<Derived>& m) +{ + typedef typename Derived::Scalar Scalar; + return first_aligned<packet_traits<Scalar>::size*sizeof(Scalar)>(m); } template<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret> |