From c6482963688adde6a369a8ec7790a9aa043298b5 Mon Sep 17 00:00:00 2001 From: YJ Chang Date: Wed, 4 Feb 2026 16:39:51 +0000 Subject: [PATCH] Update HVX floating-point reduction to support V79 architecture. libeigen/eigen!2124 --- Eigen/src/Core/arch/HVX/PacketMath.h | 8 ++++++++ 1 file changed, 8 insertions(+) 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) {