diff --git a/Eigen/src/Core/functors/AssignmentFunctors.h b/Eigen/src/Core/functors/AssignmentFunctors.h index 3687bb20d..a650afaac 100644 --- a/Eigen/src/Core/functors/AssignmentFunctors.h +++ b/Eigen/src/Core/functors/AssignmentFunctors.h @@ -27,7 +27,7 @@ struct assign_op { template EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const { - internal::pstoret(a, b); + pstoret(a, b); } }; @@ -36,7 +36,7 @@ template struct assign_op {}; template -struct functor_traits > { +struct functor_traits> { enum { Cost = NumTraits::ReadCost, PacketAccess = is_same::value && packet_traits::Vectorizable && @@ -45,88 +45,70 @@ struct functor_traits > { }; /** \internal - * \brief Template functor for scalar/packet assignment with addition + * \brief Template functor for scalar/packet compound assignment * */ -template -struct add_assign_op { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a += b; } +template +struct compound_assign_op { + using traits = functor_traits>; + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr void assignCoeff(DstScalar& a, const SrcScalar& b) const { + assign_op().assignCoeff(a, Func().operator()(a, b)); + } template EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const { - internal::pstoret(a, internal::padd(internal::ploadt(a), b)); + assign_op().template assignPacket( + a, Func().packetOp(ploadt(a), b)); } }; -template -struct functor_traits > { + +template +struct functor_traits> { enum { - Cost = NumTraits::ReadCost + NumTraits::AddCost, - PacketAccess = is_same::value && packet_traits::HasAdd + Cost = functor_traits>::Cost + functor_traits::Cost, + PacketAccess = functor_traits>::PacketAccess && functor_traits::PacketAccess }; }; +/** \internal + * \brief Template functor for scalar/packet assignment with addition + * + */ +template +struct add_assign_op : compound_assign_op> {}; + +template +struct functor_traits> : add_assign_op::traits {}; + /** \internal * \brief Template functor for scalar/packet assignment with subtraction * */ -template -struct sub_assign_op { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a -= b; } +template +struct sub_assign_op : compound_assign_op> {}; - template - EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const { - internal::pstoret(a, internal::psub(internal::ploadt(a), b)); - } -}; template -struct functor_traits > { - enum { - Cost = NumTraits::ReadCost + NumTraits::AddCost, - PacketAccess = is_same::value && packet_traits::HasSub - }; -}; +struct functor_traits> : sub_assign_op::traits {}; /** \internal * \brief Template functor for scalar/packet assignment with multiplication * */ template -struct mul_assign_op { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a *= b; } +struct mul_assign_op : compound_assign_op> {}; - template - EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const { - internal::pstoret(a, internal::pmul(internal::ploadt(a), b)); - } -}; template -struct functor_traits > { - enum { - Cost = NumTraits::ReadCost + NumTraits::MulCost, - PacketAccess = is_same::value && packet_traits::HasMul - }; -}; +struct functor_traits> : mul_assign_op::traits {}; /** \internal - * \brief Template functor for scalar/packet assignment with diviving + * \brief Template functor for scalar/packet assignment with dividing * */ template -struct div_assign_op { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a /= b; } +struct div_assign_op : compound_assign_op> {}; - template - EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const { - internal::pstoret(a, internal::pdiv(internal::ploadt(a), b)); - } -}; template -struct functor_traits > { - enum { - Cost = NumTraits::ReadCost + NumTraits::MulCost, - PacketAccess = is_same::value && packet_traits::HasDiv - }; -}; +struct functor_traits> : div_assign_op::traits {}; /** \internal * \brief Template functor for scalar/packet assignment with swapping @@ -158,7 +140,7 @@ struct swap_assign_op { } }; template -struct functor_traits > { +struct functor_traits> { enum { Cost = 3 * NumTraits::ReadCost, PacketAccess =