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 <[email protected]> --- target/arm/tcg/sve_helper.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/target/arm/tcg/sve_helper.c b/target/arm/tcg/sve_helper.c index a002006ea5..59e4bad05f 100644 --- a/target/arm/tcg/sve_helper.c +++ b/target/arm/tcg/sve_helper.c @@ -823,18 +823,20 @@ DO_ZPZW(sve_lsl_zpzw_s, uint32_t, uint64_t, H1_4, DO_LSL) #undef DO_ZPZW -/* Fully general two-operand expander, controlled by a predicate. - */ +/* Fully general two-operand expander, controlled by a predicate. */ #define DO_ZPZ(NAME, TYPE, H, OP) \ void HELPER(NAME)(void *vd, void *vn, void *vg, uint32_t desc) \ { \ intptr_t i, opr_sz = simd_oprsz(desc); \ + bool zeroing = simd_data(desc) & 1; \ for (i = 0; i < opr_sz; ) { \ uint16_t pg = *(uint16_t *)(vg + H1_2(i >> 3)); \ do { \ if (pg & 1) { \ TYPE nn = *(TYPE *)(vn + H(i)); \ *(TYPE *)(vd + H(i)) = OP(nn); \ + } else if (zeroing) { \ + *(TYPE *)(vd + H(i)) = 0; \ } \ i += sizeof(TYPE), pg >>= sizeof(TYPE); \ } while (i & 15); \ @@ -846,12 +848,15 @@ void HELPER(NAME)(void *vd, void *vn, void *vg, uint32_t desc) \ void HELPER(NAME)(void *vd, void *vn, void *vg, uint32_t desc) \ { \ intptr_t i, opr_sz = simd_oprsz(desc) / 8; \ + bool zeroing = simd_data(desc) & 1; \ TYPE *d = vd, *n = vn; \ uint8_t *pg = vg; \ for (i = 0; i < opr_sz; i += 1) { \ if (pg[H1(i)] & 1) { \ TYPE nn = n[i]; \ d[i] = OP(nn); \ + } else if (zeroing) { \ + d[i] = 0; \ } \ } \ } @@ -4831,7 +4836,8 @@ DO_ZPZS_FP(sve_ah_fmins_h, float16, H1_2, helper_vfp_ah_minh) DO_ZPZS_FP(sve_ah_fmins_s, float32, H1_4, helper_vfp_ah_mins) DO_ZPZS_FP(sve_ah_fmins_d, float64, H1_8, helper_vfp_ah_mind) -/* Fully general two-operand expander, controlled by a predicate, +/* + * Fully general two-operand expander, controlled by a predicate, * With the extra float_status parameter. */ #define DO_ZPZ_FP(NAME, TYPE, H, OP) \ @@ -4839,6 +4845,7 @@ void HELPER(NAME)(void *vd, void *vn, void *vg, \ float_status *status, uint32_t desc) \ { \ intptr_t i = simd_oprsz(desc); \ + bool zeroing = simd_data(desc) & 1; \ uint64_t *g = vg; \ do { \ uint64_t pg = g[(i - 1) >> 6]; \ @@ -4847,6 +4854,8 @@ void HELPER(NAME)(void *vd, void *vn, void *vg, \ if (likely((pg >> (i & 63)) & 1)) { \ TYPE nn = *(TYPE *)(vn + H(i)); \ *(TYPE *)(vd + H(i)) = OP(nn, status); \ + } else if (zeroing) { \ + *(TYPE *)(vd + H(i)) = 0; \ } \ } while (i & 63); \ } while (i != 0); \ -- 2.43.0
