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); \