@samitouri / QOSamiQemu / commits / 394863a300

target/arm: Enable zeroing in DO_ZPZ macros in sve_helper.c

Use the low bit of simd_data to hold a 'zeroing' bit. The simd_data field is currently unused and always 0. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20260604234852.573178-4-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Jun 4, 2026 at 16:48 UTC 394863a300aee445367b77a8572a3a8cd0ad3194
1 file changed +12 -3
target/arm/tcg/sve_helper.c
+12 -3
@@ -823,18 +823,20 @@ DO_ZPZW(sve_lsl_zpzw_s, uint32_t, uint64_t, H1_4, DO_LSL)
823
824 #undef DO_ZPZW
825
826 -/* Fully general two-operand expander, controlled by a predicate.
827 - */
826 +/* Fully general two-operand expander, controlled by a predicate. */
827 #define DO_ZPZ(NAME, TYPE, H, OP) \
828 void HELPER(NAME)(void *vd, void *vn, void *vg, uint32_t desc) \
829 { \
830 intptr_t i, opr_sz = simd_oprsz(desc); \
831 + bool zeroing = simd_data(desc) & 1; \
832 for (i = 0; i < opr_sz; ) { \
833 uint16_t pg = *(uint16_t *)(vg + H1_2(i >> 3)); \
834 do { \
835 if (pg & 1) { \
836 TYPE nn = *(TYPE *)(vn + H(i)); \
837 *(TYPE *)(vd + H(i)) = OP(nn); \
838 + } else if (zeroing) { \
839 + *(TYPE *)(vd + H(i)) = 0; \
840 } \
841 i += sizeof(TYPE), pg >>= sizeof(TYPE); \
842 } while (i & 15); \
@@ -846,12 +848,15 @@ void HELPER(NAME)(void *vd, void *vn, void *vg, uint32_t desc) \
848 void HELPER(NAME)(void *vd, void *vn, void *vg, uint32_t desc) \
849 { \
850 intptr_t i, opr_sz = simd_oprsz(desc) / 8; \
851 + bool zeroing = simd_data(desc) & 1; \
852 TYPE *d = vd, *n = vn; \
853 uint8_t *pg = vg; \
854 for (i = 0; i < opr_sz; i += 1) { \
855 if (pg[H1(i)] & 1) { \
856 TYPE nn = n[i]; \
857 d[i] = OP(nn); \
858 + } else if (zeroing) { \
859 + d[i] = 0; \
860 } \
861 } \
862 }
@@ -4831,7 +4836,8 @@ DO_ZPZS_FP(sve_ah_fmins_h, float16, H1_2, helper_vfp_ah_minh)
4836 DO_ZPZS_FP(sve_ah_fmins_s, float32, H1_4, helper_vfp_ah_mins)
4837 DO_ZPZS_FP(sve_ah_fmins_d, float64, H1_8, helper_vfp_ah_mind)
4838
4834 -/* Fully general two-operand expander, controlled by a predicate,
4839 +/*
4840 + * Fully general two-operand expander, controlled by a predicate,
4841 * With the extra float_status parameter.
4842 */
4843 #define DO_ZPZ_FP(NAME, TYPE, H, OP) \
@@ -4839,6 +4845,7 @@ void HELPER(NAME)(void *vd, void *vn, void *vg, \
4845 float_status *status, uint32_t desc) \
4846 { \
4847 intptr_t i = simd_oprsz(desc); \
4848 + bool zeroing = simd_data(desc) & 1; \
4849 uint64_t *g = vg; \
4850 do { \
4851 uint64_t pg = g[(i - 1) >> 6]; \
@@ -4847,6 +4854,8 @@ void HELPER(NAME)(void *vd, void *vn, void *vg, \
4854 if (likely((pg >> (i & 63)) & 1)) { \
4855 TYPE nn = *(TYPE *)(vn + H(i)); \
4856 *(TYPE *)(vd + H(i)) = OP(nn, status); \
4857 + } else if (zeroing) { \
4858 + *(TYPE *)(vd + H(i)) = 0; \
4859 } \
4860 } while (i & 63); \
4861 } while (i != 0); \