HVX: Improve reduction accuracy libeigen/eigen!3361
diff --git a/Eigen/src/Core/arch/HVX/PacketMath.h b/Eigen/src/Core/arch/HVX/PacketMath.h index f2789b9..62ab874 100644 --- a/Eigen/src/Core/arch/HVX/PacketMath.h +++ b/Eigen/src/Core/arch/HVX/PacketMath.h
@@ -767,17 +767,17 @@ const Index packet_size = unpacket_traits<HVXPacket<T>>::size; #if __HVX_ARCH__ >= 79 HVX_Vector vsum = Q6_Vsf_vadd_VsfVsf(a.Get(), Q6_V_vror_VR(a.Get(), sizeof(float))); +#else + HVX_Vector vsum = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(a.Get(), Q6_V_vror_VR(a.Get(), sizeof(float)))); +#endif for (int i = 2; i < packet_size; i <<= 1) { +#if __HVX_ARCH__ >= 79 vsum = Q6_Vsf_vadd_VsfVsf(vsum, Q6_V_vror_VR(vsum, i * sizeof(float))); +#else + vsum = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(vsum, Q6_V_vror_VR(vsum, i * sizeof(float)))); +#endif } return pfirst(HVXPacket<T>::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<T>::Create(Q6_Vsf_equals_Vqf32(vsum))); -#endif } template <> EIGEN_STRONG_INLINE float predux<Packet32f>(const Packet32f& a) {