diff options
author | Gael Guennebaud <g.gael@free.fr> | 2015-03-31 20:16:02 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2015-03-31 20:16:02 +0200 |
commit | 20d030f207a8f92d75e8e4aca9d515b9939aa58a (patch) | |
tree | dd25a1fcb1b5820814f0a788f80da2682a360270 /Eigen | |
parent | 678207e02a35e32f2098fcb2cb8a510c9ee191e1 (diff) |
Fix vectorization of swap for non trivial expressions
Diffstat (limited to 'Eigen')
-rw-r--r-- | Eigen/src/Core/Swap.h | 8 | ||||
-rw-r--r-- | Eigen/src/Core/functors/AssignmentFunctors.h | 8 |
2 files changed, 6 insertions, 10 deletions
diff --git a/Eigen/src/Core/Swap.h b/Eigen/src/Core/Swap.h index dcb42821f..3880f7b78 100644 --- a/Eigen/src/Core/Swap.h +++ b/Eigen/src/Core/Swap.h @@ -38,13 +38,17 @@ public: template<int StoreMode, int LoadMode> void assignPacket(Index row, Index col) { - m_functor.template swapPacket<StoreMode,LoadMode,PacketScalar>(&m_dst.coeffRef(row,col), &const_cast<SrcEvaluatorTypeT&>(m_src).coeffRef(row,col)); + PacketScalar tmp = m_src.template packet<LoadMode>(row,col); + const_cast<SrcEvaluatorTypeT&>(m_src).template writePacket<LoadMode>(row,col, m_dst.template packet<StoreMode>(row,col)); + m_dst.template writePacket<StoreMode>(row,col,tmp); } template<int StoreMode, int LoadMode> void assignPacket(Index index) { - m_functor.template swapPacket<StoreMode,LoadMode,PacketScalar>(&m_dst.coeffRef(index), &const_cast<SrcEvaluatorTypeT&>(m_src).coeffRef(index)); + PacketScalar tmp = m_src.template packet<LoadMode>(index); + const_cast<SrcEvaluatorTypeT&>(m_src).template writePacket<LoadMode>(index, m_dst.template packet<StoreMode>(index)); + m_dst.template writePacket<StoreMode>(index,tmp); } // TODO find a simple way not to have to copy/paste this function from generic_dense_assignment_kernel, by simple I mean no CRTP (Gael) diff --git a/Eigen/src/Core/functors/AssignmentFunctors.h b/Eigen/src/Core/functors/AssignmentFunctors.h index 161b0aa93..d55ae6096 100644 --- a/Eigen/src/Core/functors/AssignmentFunctors.h +++ b/Eigen/src/Core/functors/AssignmentFunctors.h @@ -150,14 +150,6 @@ template<typename Scalar> struct swap_assign_op { swap(a,const_cast<Scalar&>(b)); #endif } - - template<int LhsAlignment, int RhsAlignment, typename Packet> - EIGEN_STRONG_INLINE void swapPacket(Scalar* a, Scalar* b) const - { - Packet tmp = internal::ploadt<Packet,RhsAlignment>(b); - internal::pstoret<Scalar,Packet,RhsAlignment>(b, internal::ploadt<Packet,LhsAlignment>(a)); - internal::pstoret<Scalar,Packet,LhsAlignment>(a, tmp); - } }; template<typename Scalar> struct functor_traits<swap_assign_op<Scalar> > { |