From d8ed4f6884ead5688cbfca0339a580a2e15b24ea Mon Sep 17 00:00:00 2001 From: Rasmus Munk Larsen <4643818-rmlarsen1@users.noreply.gitlab.com> Date: Wed, 25 Feb 2026 19:26:49 -0800 Subject: [PATCH] Fix GEBP half/quarter-packet loops for nr>=8 RHS packing on ARM64 libeigen/eigen!2216 Co-authored-by: Rasmus Munk Larsen --- .../Core/products/GeneralBlockPanelKernel.h | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/Eigen/src/Core/products/GeneralBlockPanelKernel.h b/Eigen/src/Core/products/GeneralBlockPanelKernel.h index cb32270f4..15a3bbf0f 100644 --- a/Eigen/src/Core/products/GeneralBlockPanelKernel.h +++ b/Eigen/src/Core/products/GeneralBlockPanelKernel.h @@ -1496,7 +1496,16 @@ EIGEN_DONT_INLINE void gebp_kernel= LhsProgressHalf) { HalfTraits half_traits; for (Index i = peeled_mc1; i < peeled_mc_half; i += LhsProgressHalf) { - for (Index j2 = 0; j2 < packet_cols4; j2 += 4) { +#if EIGEN_ARCH_ARM64 || EIGEN_ARCH_LOONGARCH64 + EIGEN_IF_CONSTEXPR(nr >= 8) { + for (Index j2 = 0; j2 < packet_cols8; j2 += 8) { + gebp_micro_panel_impl<1, 8, HalfTraits, LhsScalar, RhsScalar, ResScalar, Index, DataMapper, LinearMapper, + LhsPacket>(half_traits, res, blockA, blockB, alpha, i, j2, depth, strideA, strideB, + offsetA, offsetB, prefetch_res_offset, peeled_kc, pk); + } + } +#endif + for (Index j2 = packet_cols8; j2 < packet_cols4; j2 += 4) { gebp_micro_panel_impl<1, 4, HalfTraits, LhsScalar, RhsScalar, ResScalar, Index, DataMapper, LinearMapper, LhsPacket>(half_traits, res, blockA, blockB, alpha, i, j2, depth, strideA, strideB, offsetA, offsetB, prefetch_res_offset, peeled_kc, pk); @@ -1513,7 +1522,16 @@ EIGEN_DONT_INLINE void gebp_kernel= LhsProgressQuarter) { QuarterTraits quarter_traits; for (Index i = peeled_mc_half; i < peeled_mc_quarter; i += LhsProgressQuarter) { - for (Index j2 = 0; j2 < packet_cols4; j2 += 4) { +#if EIGEN_ARCH_ARM64 || EIGEN_ARCH_LOONGARCH64 + EIGEN_IF_CONSTEXPR(nr >= 8) { + for (Index j2 = 0; j2 < packet_cols8; j2 += 8) { + gebp_micro_panel_impl<1, 8, QuarterTraits, LhsScalar, RhsScalar, ResScalar, Index, DataMapper, LinearMapper, + LhsPacket>(quarter_traits, res, blockA, blockB, alpha, i, j2, depth, strideA, strideB, + offsetA, offsetB, prefetch_res_offset, peeled_kc, pk); + } + } +#endif + for (Index j2 = packet_cols8; j2 < packet_cols4; j2 += 4) { gebp_micro_panel_impl<1, 4, QuarterTraits, LhsScalar, RhsScalar, ResScalar, Index, DataMapper, LinearMapper, LhsPacket>(quarter_traits, res, blockA, blockB, alpha, i, j2, depth, strideA, strideB, offsetA, offsetB, prefetch_res_offset, peeled_kc, pk);