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 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/target/arm/tcg/sve_helper.c b/target/arm/tcg/sve_helper.c index fa4bf02278..c2b3162084 100644 --- a/target/arm/tcg/sve_helper.c +++ b/target/arm/tcg/sve_helper.c @@ -8595,6 +8595,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]; \ @@ -8603,6 +8604,8 @@ void HELPER(NAME)(void *vd, void *vn, void *vg, \ if (likely((pg >> (i & 63)) & 1)) { \ TYPEW nn = *(TYPEW *)(vn + HW(i)); \ *(TYPEN *)(vd + HN(i + sizeof(TYPEN))) = OP(nn, status); \ + } else if (zeroing) { \ + *(TYPEN *)(vd + HN(i + sizeof(TYPEN))) = 0; \ } \ } while (i & 63); \ } while (i != 0); \ @@ -8617,6 +8620,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]; \ @@ -8625,6 +8629,8 @@ void HELPER(NAME)(void *vd, void *vn, void *vg, \ if (likely((pg >> (i & 63)) & 1)) { \ TYPEN nn = *(TYPEN *)(vn + HN(i + sizeof(TYPEN))); \ *(TYPEW *)(vd + HW(i)) = OP(nn, status); \ + } else if (zeroing) { \ + *(TYPEW *)(vd + HW(i)) = 0; \ } \ } while (i & 63); \ } while (i != 0); \ -- 2.43.0
