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) {