target/arm: Implement SVE reverse within elements (zeroing)
This includes REVB, REVH, REVW, RBIT. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20260604234852.573178-8-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Richard Henderson committed
Jun 4, 2026 at 16:48 UTC
0c33ec8e65d2057120dfbca7c5840509f63deecc
2 files changed
+12
target/arm/tcg/sve.decode
+5
@@ -730,6 +730,11 @@ REVW_m 00000101 .. 1001 10 100 ... ..... ..... @rd_pg_rn
730
RBIT_m 00000101 .. 1001 11 100 ... ..... ..... @rd_pg_rn
731
REVD_m 00000101 00 1011 10 100 ... ..... ..... @rd_pg_rn_e0
732
733
+REVB_z 00000101 .. 1001 00 101 ... ..... ..... @rd_pg_rn
734
+REVH_z 00000101 .. 1001 01 101 ... ..... ..... @rd_pg_rn
735
+REVW_z 00000101 .. 1001 10 101 ... ..... ..... @rd_pg_rn
736
+RBIT_z 00000101 .. 1001 11 101 ... ..... ..... @rd_pg_rn
737
+
738
# SVE vector splice (predicated, destructive)
739
SPLICE 00000101 .. 101 100 100 ... ..... ..... @rdn_pg_rm
740
target/arm/tcg/translate-sve.c
+7
@@ -836,6 +836,7 @@ static gen_helper_gvec_3 * const sve_rbit_fns[4] = {
836
gen_helper_sve_rbit_s, gen_helper_sve_rbit_d,
837
};
838
TRANS_FEAT(RBIT_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz, sve_rbit_fns[a->esz], a, 0)
839
+TRANS_FEAT(RBIT_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz, sve_rbit_fns[a->esz], a, 1)
840
841
static gen_helper_gvec_3 * const sve2p1_orqv_fns[4] = {
842
gen_helper_sve2p1_orqv_b, gen_helper_sve2p1_orqv_h,
@@ -3070,15 +3071,21 @@ static gen_helper_gvec_3 * const revb_fns[4] = {
3071
};
3072
TRANS_FEAT(REVB_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
3073
revb_fns[a->esz], a, 0)
3074
+TRANS_FEAT(REVB_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
3075
+ revb_fns[a->esz], a, 1)
3076
3077
static gen_helper_gvec_3 * const revh_fns[4] = {
3078
NULL, NULL, gen_helper_sve_revh_s, gen_helper_sve_revh_d,
3079
};
3080
TRANS_FEAT(REVH_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
3081
revh_fns[a->esz], a, 0)
3082
+TRANS_FEAT(REVH_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
3083
+ revh_fns[a->esz], a, 1)
3084
3085
TRANS_FEAT(REVW_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
3086
a->esz == 3 ? gen_helper_sve_revw_d : NULL, a, 0)
3087
+TRANS_FEAT(REVW_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
3088
+ a->esz == 3 ? gen_helper_sve_revw_d : NULL, a, 1)
3089
3090
TRANS_FEAT(REVD_m, aa64_sme_or_sve2p1, gen_gvec_ool_arg_zpz,
3091
gen_helper_sme_revd_q, a, 0)