diff --git a/Eigen/src/Core/arch/HVX/PacketMath.h b/Eigen/src/Core/arch/HVX/PacketMath.h index db543e0d8..124942683 100644 --- a/Eigen/src/Core/arch/HVX/PacketMath.h +++ b/Eigen/src/Core/arch/HVX/PacketMath.h @@ -764,11 +764,19 @@ EIGEN_STRONG_INLINE void ptranspose(PacketBlock& kernel) { template EIGEN_STRONG_INLINE float predux_hvx(const HVXPacket& a) { const Index packet_size = unpacket_traits>::size; +#if __HVX_ARCH__ >= 79 + HVX_Vector vsum = Q6_Vsf_vadd_VsfVsf(a.Get(), Q6_V_vror_VR(a.Get(), sizeof(float))); + for (int i = 2; i < packet_size; i <<= 1) { + vsum = Q6_Vsf_vadd_VsfVsf(vsum, Q6_V_vror_VR(vsum, i * sizeof(float))); + } + return pfirst(HVXPacket::Create(vsum)); +#else HVX_Vector vsum = Q6_Vqf32_vadd_VsfVsf(a.Get(), Q6_V_vror_VR(a.Get(), sizeof(float))); for (int i = 2; i < packet_size; i <<= 1) { vsum = Q6_Vqf32_vadd_Vqf32Vqf32(vsum, Q6_V_vror_VR(vsum, i * sizeof(float))); } return pfirst(HVXPacket::Create(Q6_Vsf_equals_Vqf32(vsum))); +#endif } template <> EIGEN_STRONG_INLINE float predux(const Packet32f& a) {