@samitouri / QOSamiQemu / commits / dab6115d2c

target/arm: Implement COMPACT for byte/halfword

Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20260618040718.572950-5-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Jun 17, 2026 at 21:07 UTC dab6115d2c4da7450a54f59d7237f7d315bf0c1d
4 files changed +21 -6
target/arm/tcg/helper-sve-defs.h
+2
@@ -733,6 +733,8 @@ DEF_HELPER_FLAGS_4(sve_trn_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
733 DEF_HELPER_FLAGS_4(sve_trn_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
734 DEF_HELPER_FLAGS_4(sve2_trn_q, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
735
736 +DEF_HELPER_FLAGS_4(sve_compact_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
737 +DEF_HELPER_FLAGS_4(sve_compact_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
738 DEF_HELPER_FLAGS_4(sve_compact_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
739 DEF_HELPER_FLAGS_4(sve_compact_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
740
target/arm/tcg/sve.decode
-1
@@ -693,7 +693,6 @@ TBXQ 00000101 .. 1 ..... 001 101 ..... ..... @rd_rn_rm
693 ### SVE Permute - Predicated Group
694
695 # SVE compress active elements
696 -# Note esz >= 2
696 COMPACT 00000101 .. 100001 100 ... ..... ..... @rd_pg_rn
697
698 # SVE conditionally broadcast element to vector
target/arm/tcg/sve_helper.c
+2
@@ -3657,6 +3657,8 @@ void HELPER(NAME)(void *vd, void *vn, void *vg, uint32_t desc) \
3657 } \
3658 }
3659
3660 +DO_COMPACT(sve_compact_b, uint8_t, H1)
3661 +DO_COMPACT(sve_compact_h, uint16_t, H1_2)
3662 DO_COMPACT(sve_compact_s, uint32_t, H1_4)
3663 DO_COMPACT(sve_compact_d, uint64_t, H1_8)
3664
target/arm/tcg/translate-sve.c
+17 -5
@@ -2769,11 +2769,23 @@ TRANS_FEAT_NONSTREAMING(TRN2_q, aa64_sve_f64mm, do_interleave_q,
2769 *** SVE Permute Vector - Predicated Group
2770 */
2771
2772 -static gen_helper_gvec_3 * const compact_fns[4] = {
2773 - NULL, NULL, gen_helper_sve_compact_s, gen_helper_sve_compact_d
2774 -};
2775 -TRANS_FEAT_NONSTREAMING(COMPACT, aa64_sve, gen_gvec_ool_arg_zpz,
2776 - compact_fns[a->esz], a, 0)
2772 +static bool trans_COMPACT(DisasContext *s, arg_COMPACT *a)
2773 +{
2774 + static gen_helper_gvec_3 * const fns[4] = {
2775 + gen_helper_sve_compact_b, gen_helper_sve_compact_h,
2776 + gen_helper_sve_compact_s, gen_helper_sve_compact_d
2777 + };
2778 +
2779 + if (!dc_isar_feature(aa64_sme2p2, s)) {
2780 + if (!(a->esz >= MO_32
2781 + ? dc_isar_feature(aa64_sve, s)
2782 + : dc_isar_feature(aa64_sve2p2, s))) {
2783 + return false;
2784 + }
2785 + s->is_nonstreaming = true;
2786 + }
2787 + return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
2788 +}
2789
2790 /* Call the helper that computes the ARM LastActiveElement pseudocode
2791 * function, scaled by the element size. This includes the not found