Signed-off-by: Richard Henderson <[email protected]>
---
target/arm/tcg/sve_helper.c | 4 ++++
target/arm/tcg/translate-sve.c | 2 ++
target/arm/tcg/sve.decode | 1 +
3 files changed, 7 insertions(+)
diff --git a/target/arm/tcg/sve_helper.c b/target/arm/tcg/sve_helper.c
index 59e4bad05f..847c49d784 100644
--- a/target/arm/tcg/sve_helper.c
+++ b/target/arm/tcg/sve_helper.c
@@ -971,6 +971,7 @@ DO_ZPZ_D(sve_revw_d, uint64_t, wswap64)
void HELPER(sme_revd_q)(void *vd, void *vn, void *vg, uint32_t desc)
{
intptr_t i, opr_sz = simd_oprsz(desc) / 8;
+ bool zeroing = simd_data(desc) & 1;
uint64_t *d = vd, *n = vn;
uint8_t *pg = vg;
@@ -980,6 +981,9 @@ void HELPER(sme_revd_q)(void *vd, void *vn, void *vg,
uint32_t desc)
uint64_t n1 = n[i + 1];
d[i + 0] = n1;
d[i + 1] = n0;
+ } else if (zeroing) {
+ d[i + 0] = 0;
+ d[i + 1] = 0;
}
}
}
diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c
index c3903d8fcc..ad9d30d92d 100644
--- a/target/arm/tcg/translate-sve.c
+++ b/target/arm/tcg/translate-sve.c
@@ -3089,6 +3089,8 @@ TRANS_FEAT(REVW_z, aa64_sme2p2_or_sve2p2,
gen_gvec_ool_arg_zpz,
TRANS_FEAT(REVD_m, aa64_sme_or_sve2p1, gen_gvec_ool_arg_zpz,
gen_helper_sme_revd_q, a, 0)
+TRANS_FEAT(REVD_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
+ gen_helper_sme_revd_q, a, 1)
TRANS_FEAT(SPLICE, aa64_sme_or_sve, gen_gvec_ool_arg_zpzz,
gen_helper_sve_splice, a, a->esz)
diff --git a/target/arm/tcg/sve.decode b/target/arm/tcg/sve.decode
index 867ae2916e..45f8633fd3 100644
--- a/target/arm/tcg/sve.decode
+++ b/target/arm/tcg/sve.decode
@@ -734,6 +734,7 @@ REVB_z 00000101 .. 1001 00 101 ... ..... .....
@rd_pg_rn
REVH_z 00000101 .. 1001 01 101 ... ..... ..... @rd_pg_rn
REVW_z 00000101 .. 1001 10 101 ... ..... ..... @rd_pg_rn
RBIT_z 00000101 .. 1001 11 101 ... ..... ..... @rd_pg_rn
+REVD_z 00000101 00 1011 10 101 ... ..... ..... @rd_pg_rn_e0
# SVE vector splice (predicated, destructive)
SPLICE 00000101 .. 101 100 100 ... ..... ..... @rdn_pg_rm
--
2.43.0