@samitouri / QOSamiQemu / commits / 6101a79995

target/arm: Generalize sve_compact_[sd]

Implement with a DO_COMPACT macro and general purpose predicate handling. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20260618040718.572950-4-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Jun 17, 2026 at 21:07 UTC 6101a79995921a5fd1300b6d80f73d1184d3d364
1 file changed +21 -30
target/arm/tcg/sve_helper.c
+21 -30
@@ -3637,39 +3637,30 @@ DO_TRN(sve2_trn_q, Int128, )
3637 #undef DO_UZP
3638 #undef DO_TRN
3639
3640 -void HELPER(sve_compact_s)(void *vd, void *vn, void *vg, uint32_t desc)
3641 -{
3642 - intptr_t i, j, opr_sz = simd_oprsz(desc) / 4;
3643 - uint32_t *d = vd, *n = vn;
3644 - uint8_t *pg = vg;
3645 -
3646 - for (i = j = 0; i < opr_sz; i++) {
3647 - if (pg[H1(i / 2)] & (i & 1 ? 0x10 : 0x01)) {
3648 - d[H4(j)] = n[H4(i)];
3649 - j++;
3650 - }
3651 - }
3652 - for (; j < opr_sz; j++) {
3653 - d[H4(j)] = 0;
3654 - }
3640 +#define DO_COMPACT(NAME, TYPE, H) \
3641 +void HELPER(NAME)(void *vd, void *vn, void *vg, uint32_t desc) \
3642 +{ \
3643 + intptr_t j = 0, oprsz = simd_oprsz(desc); \
3644 + for (intptr_t i = 0; i < oprsz; ) { \
3645 + uint16_t pg = *(uint16_t *)(vg + H1_2(i >> 3)); \
3646 + do { \
3647 + if (pg & 1) { \
3648 + *(TYPE *)(vd + H(j)) = *(TYPE *)(vn + H(i)); \
3649 + j += sizeof(TYPE); \
3650 + } \
3651 + i += sizeof(TYPE); \
3652 + pg >>= sizeof(TYPE); \
3653 + } while (i & 15); \
3654 + } \
3655 + for (; j < oprsz; j += sizeof(TYPE)) { \
3656 + *(TYPE *)(vd + H(j)) = 0; \
3657 + } \
3658 }
3659
3657 -void HELPER(sve_compact_d)(void *vd, void *vn, void *vg, uint32_t desc)
3658 -{
3659 - intptr_t i, j, opr_sz = simd_oprsz(desc) / 8;
3660 - uint64_t *d = vd, *n = vn;
3661 - uint8_t *pg = vg;
3660 +DO_COMPACT(sve_compact_s, uint32_t, H1_4)
3661 +DO_COMPACT(sve_compact_d, uint64_t, H1_8)
3662
3663 - for (i = j = 0; i < opr_sz; i++) {
3664 - if (pg[H1(i)] & 1) {
3665 - d[j] = n[i];
3666 - j++;
3667 - }
3668 - }
3669 - for (; j < opr_sz; j++) {
3670 - d[j] = 0;
3671 - }
3672 -}
3663 +#undef DO_COMPACT
3664
3665 #define DO_EXPAND(NAME, TYPE, H) \
3666 void HELPER(NAME)(void *vd, void *vn, void *vg, uint32_t desc) \