target/arm: Implement AESDIMC
Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20260826174213.614571-24-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Richard Henderson committed
Aug 26, 2026 at 10:42 UTC
8281183af39452968e64751a2149f0e5f17fbd13
4 files changed
+37
target/arm/tcg/crypto_helper.c
+31
@@ -224,6 +224,37 @@ void HELPER(crypto_aesemc)(void *vd, void *vn, void *vm, uint32_t desc)
224
} while (s > 0);
225
}
226
227
+void HELPER(crypto_aesdimc)(void *vd, void *vn, void *vm, uint32_t desc)
228
+{
229
+ intptr_t opr_sz = simd_oprsz(desc);
230
+ intptr_t idx = simd_data(desc);
231
+ void *vm_idx = vm + idx * 16;
232
+ intptr_t s = opr_sz - 16;
233
+
234
+ do {
235
+ intptr_t base = ROUND_DOWN(s, 4 * 16);
236
+ AESState rk = *(AESState *)(vm_idx + base);
237
+ do {
238
+ AESState *ad = (AESState *)(vd + s);
239
+ AESState *st = (AESState *)(vn + s);
240
+ AESState t;
241
+
242
+ /* Like above: Arm AK comes first; api AK comes last */
243
+ if (HOST_BIG_ENDIAN) {
244
+ t.d[0] = st->d[1] ^ rk.d[1];
245
+ t.d[1] = st->d[0] ^ rk.d[0];
246
+ aesdec_ISB_ISR_IMC_AK(&t, &t, &aes_zero, false);
247
+ ad->d[0] = t.d[1];
248
+ ad->d[1] = t.d[0];
249
+ } else {
250
+ t.v = st->v ^ rk.v;
251
+ aesdec_ISB_ISR_IMC_AK(ad, &t, &aes_zero, false);
252
+ }
253
+ s -= 16;
254
+ } while (s >= base);
255
+ } while (s > 0);
256
+}
257
+
258
/*
259
* SHA-1 logical functions
260
*/
target/arm/tcg/helper-defs.h
+1
@@ -461,6 +461,7 @@ DEF_HELPER_FLAGS_4(crypto_aesd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
461
DEF_HELPER_FLAGS_3(crypto_aesmc, TCG_CALL_NO_RWG, void, ptr, ptr, i32)
462
DEF_HELPER_FLAGS_3(crypto_aesimc, TCG_CALL_NO_RWG, void, ptr, ptr, i32)
463
DEF_HELPER_FLAGS_4(crypto_aesemc, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
464
+DEF_HELPER_FLAGS_4(crypto_aesdimc, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
465
466
DEF_HELPER_FLAGS_4(crypto_aese_idx, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
467
DEF_HELPER_FLAGS_4(crypto_aesd_idx, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
target/arm/tcg/sve.decode
+3
@@ -1991,6 +1991,9 @@ AESD_idx 01000101 00 1 .. .10111011 ..... ...00 @aes2_4
1991
AESEMC 01000101 00 1 .. .11111010 ..... ....0 @aes2_2
1992
AESEMC 01000101 00 1 .. .11111010 ..... ...00 @aes2_4
1993
1994
+AESDIMC 01000101 00 1 .. .11111011 ..... ....0 @aes2_2
1995
+AESDIMC 01000101 00 1 .. .11111011 ..... ...00 @aes2_4
1996
+
1997
# SVE2 crypto constructive binary operations
1998
SM4EKEY 01000101 00 1 ..... 11110 0 ..... ..... @rd_rn_rm_e0
1999
RAX1 01000101 00 1 ..... 11110 1 ..... ..... @rd_rn_rm_e0
target/arm/tcg/translate-sve.c
+2
@@ -8348,6 +8348,8 @@ TRANS_FEAT_STREAMING_IF(AESD_idx, aa64_sve_aes2, aa64_ssve_aes,
8348
do_aes2_idx, a, gen_helper_crypto_aesd_idx)
8349
TRANS_FEAT_STREAMING_IF(AESEMC, aa64_sve_aes2, aa64_ssve_aes,
8350
do_aes2_idx, a, gen_helper_crypto_aesemc)
8351
+TRANS_FEAT_STREAMING_IF(AESDIMC, aa64_sve_aes2, aa64_ssve_aes,
8352
+ do_aes2_idx, a, gen_helper_crypto_aesdimc)
8353
8354
TRANS_FEAT(FCVTNT_sh_m, aa64_sme_or_sve2, gen_gvec_fpst_arg_zpz,
8355
gen_helper_sve2_fcvtnt_sh, a, 0, FPST_A64)