Signed-off-by: Stephen Long <stepl...@quicinc.com> --- target/arm/cpu.h | 5 +++++ target/arm/helper-sve.h | 4 ++++ target/arm/sve.decode | 6 ++++++ target/arm/sve_helper.c | 25 +++++++++++++++++++++++++ target/arm/translate-sve.c | 16 ++++++++++++++++ 5 files changed, 56 insertions(+)
diff --git a/target/arm/cpu.h b/target/arm/cpu.h index b7c7946771..4dda0cf6c1 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -3870,6 +3870,11 @@ static inline bool isar_feature_aa64_sve2_bitperm(const ARMISARegisters *id) return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, BITPERM) != 0; } +static inline bool isar_feature_aa64_sve2_sm4(const ARMISARegisters *id) +{ + return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, SM4) != 0; +} + /* * Feature tests for "does this exist in either 32-bit or 64-bit?" */ diff --git a/target/arm/helper-sve.h b/target/arm/helper-sve.h index 6e8421991c..3da9590da5 100644 --- a/target/arm/helper-sve.h +++ b/target/arm/helper-sve.h @@ -2690,3 +2690,7 @@ DEF_HELPER_FLAGS_5(sve2_sqrdcmlah_zzzz_d, TCG_CALL_NO_RWG, DEF_HELPER_FLAGS_3(sve2_aesmc, TCG_CALL_NO_RWG, void, ptr, ptr, i32) DEF_HELPER_FLAGS_3(sve2_aesimc, TCG_CALL_NO_RWG, void, ptr, ptr, i32) + +DEF_HELPER_FLAGS_3(sve2_aese, TCG_CALL_NO_RWG, void, ptr, ptr, i32) +DEF_HELPER_FLAGS_3(sve2_aesd, TCG_CALL_NO_RWG, void, ptr, ptr, i32) +DEF_HELPER_FLAGS_3(sve2_sm4e, TCG_CALL_NO_RWG, void, ptr, ptr, i32) diff --git a/target/arm/sve.decode b/target/arm/sve.decode index a83420e690..4bbf219cb6 100644 --- a/target/arm/sve.decode +++ b/target/arm/sve.decode @@ -98,6 +98,7 @@ # Two operand with unused vector element size @pd_pn_e0 ........ ........ ....... rn:4 . rd:4 &rr_esz esz=0 +@pd5_pn5_e0 ........ ........ ...... rn:5 rd:5 &rr_esz esz=0 # Two operand @pd_pn ........ esz:2 .. .... ....... rn:4 . rd:4 &rr_esz @@ -1397,3 +1398,8 @@ SQRDCMLAH_zzzz 01000100 esz:2 0 rm:5 0011 rot:2 rn:5 rd:5 ra=%reg_movprfx ## SVE2 crypto unary operations AESMC 01000101 00 10000011100 0 00000 ..... @rdn_e0 AESIMC 01000101 00 10000011100 1 00000 ..... @rdn_e0 + +## SVE2 crpyto destructive binary operations +AESE 01000101 00 10001 0 11100 0 ..... ..... @pd5_pn5_e0 +AESD 01000101 00 10001 0 11100 1 ..... ..... @pd5_pn5_e0 +SM4E 01000101 00 10001 1 11100 0 ..... ..... @pd5_pn5_e0 diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c index f25bb5338d..0581f33fc7 100644 --- a/target/arm/sve_helper.c +++ b/target/arm/sve_helper.c @@ -7441,3 +7441,28 @@ void HELPER(NAME)(void *vd, void *vn, uint32_t desc) \ DO_CRYPTO_AESMC(sve2_aesmc, 0); DO_CRYPTO_AESMC(sve2_aesimc, 1); + +#define DO_CRYPTO_AESE(NAME, DECRYPT) \ +void HELPER(NAME)(void *vd, void *vn, uint32_t desc) \ +{ \ + intptr_t i, opr_sz = simd_oprsz(desc); \ + void *d = vd, *n = vn; \ + for (i = 0; i < opr_sz; i += 16) { \ + HELPER(crypto_aese)(vd + i, vn + i, DECRYPT); \ + } +} + +DO_CRYPTO_AESE(sve2_aese, 0); +DO_CRYPTO_AESE(sve2_aesd, 1); + +#undef DO_CRYPTO_AESE +#undef DO_CRYPTO_AESMC + +void HELPER(sve2_sm4e)(void *vd, void *vn, uint32_t desc) +{ + intptr_t i, opr_sz = simd_oprsz(desc); + void *d = vd, *n = vn; + for (i = 0; i < opr_sz; i += 16) { + HELPER(crypto_sm4e)(vd + i, vn + i); + } +} diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c index 03463308ca..d991dcdb1c 100644 --- a/target/arm/translate-sve.c +++ b/target/arm/translate-sve.c @@ -7900,3 +7900,19 @@ static bool trans_##NAME(DisasContext *s, arg_rr_esz *a) \ DO_SVE2_AES_CRYPTO(AESMC, aesmc) DO_SVE2_AES_CRYPTO(AESIMC, aesimc) +DO_SVE2_AES_CRYPTO(AESE, aese) +DO_SVE2_AES_CRYPTO(AESD, aesd) + +static bool trans_SM4E(DisasContext *s, arg_rr_esz *a) +{ + if (!dc_isar_feature(aa64_sve2_sm4, s)) { + return false; + } + if (sve_access_check(s)) { + unsigned vsz = vec_full_reg_size(s); + tcg_gen_gvec_2_ool(vec_full_reg_offset(s, a->rd), + vec_full_reg_offset(s, a->rn), + vsz, vsz, 0, gen_helper_sve2_sm4e); + } + return true; +} -- 2.17.1