Signed-off-by: Richard Henderson <[email protected]>
---
target/arm/tcg/helper-sve-defs.h | 2 ++
target/arm/tcg/sve_helper.c | 2 ++
target/arm/tcg/translate-sve.c | 22 +++++++++++++++++-----
target/arm/tcg/sve.decode | 1 -
4 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/target/arm/tcg/helper-sve-defs.h b/target/arm/tcg/helper-sve-defs.h
index 75c0fc919d..11342e1e59 100644
--- a/target/arm/tcg/helper-sve-defs.h
+++ b/target/arm/tcg/helper-sve-defs.h
@@ -733,6 +733,8 @@ DEF_HELPER_FLAGS_4(sve_trn_s, TCG_CALL_NO_RWG, void, ptr,
ptr, ptr, i32)
DEF_HELPER_FLAGS_4(sve_trn_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
DEF_HELPER_FLAGS_4(sve2_trn_q, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
+DEF_HELPER_FLAGS_4(sve2p2_compact_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
+DEF_HELPER_FLAGS_4(sve2p2_compact_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
DEF_HELPER_FLAGS_4(sve_compact_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
DEF_HELPER_FLAGS_4(sve_compact_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
diff --git a/target/arm/tcg/sve_helper.c b/target/arm/tcg/sve_helper.c
index 40cf567b0d..3f99a362c3 100644
--- a/target/arm/tcg/sve_helper.c
+++ b/target/arm/tcg/sve_helper.c
@@ -3657,6 +3657,8 @@ void HELPER(NAME)(void *vd, void *vn, void *vg, uint32_t
desc) \
} \
}
+DO_COMPACT(sve2p2_compact_b, uint8_t, H1)
+DO_COMPACT(sve2p2_compact_h, uint16_t, H1_2)
DO_COMPACT(sve_compact_s, uint32_t, H1_4)
DO_COMPACT(sve_compact_d, uint64_t, H1_8)
diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c
index 3101f572fa..325fc28fb3 100644
--- a/target/arm/tcg/translate-sve.c
+++ b/target/arm/tcg/translate-sve.c
@@ -2769,11 +2769,23 @@ TRANS_FEAT_NONSTREAMING(TRN2_q, aa64_sve_f64mm,
do_interleave_q,
*** SVE Permute Vector - Predicated Group
*/
-static gen_helper_gvec_3 * const compact_fns[4] = {
- NULL, NULL, gen_helper_sve_compact_s, gen_helper_sve_compact_d
-};
-TRANS_FEAT_NONSTREAMING(COMPACT, aa64_sve, gen_gvec_ool_arg_zpz,
- compact_fns[a->esz], a, 0)
+static bool trans_COMPACT(DisasContext *s, arg_COMPACT *a)
+{
+ static gen_helper_gvec_3 * const fns[4] = {
+ gen_helper_sve2p2_compact_b, gen_helper_sve2p2_compact_h,
+ gen_helper_sve_compact_s, gen_helper_sve_compact_d
+ };
+
+ if (!dc_isar_feature(aa64_sme2p2, s)) {
+ if (!(a->esz >= MO_32
+ ? dc_isar_feature(aa64_sve, s)
+ : dc_isar_feature(aa64_sve2p2, s))) {
+ return false;
+ }
+ s->is_nonstreaming = true;
+ }
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
+}
/* Call the helper that computes the ARM LastActiveElement pseudocode
* function, scaled by the element size. This includes the not found
diff --git a/target/arm/tcg/sve.decode b/target/arm/tcg/sve.decode
index 5ec1d420c2..a3eefd60e5 100644
--- a/target/arm/tcg/sve.decode
+++ b/target/arm/tcg/sve.decode
@@ -693,7 +693,6 @@ TBXQ 00000101 .. 1 ..... 001 101 ..... .....
@rd_rn_rm
### SVE Permute - Predicated Group
# SVE compress active elements
-# Note esz >= 2
COMPACT 00000101 .. 100001 100 ... ..... ..... @rd_pg_rn
# SVE conditionally broadcast element to vector
--
2.43.0