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