@samitouri / QOSamiQemu / commits / 7907ed492d

target/arm: Implement AESD (indexed)

Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20260826174213.614571-22-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Aug 26, 2026 at 10:42 UTC 7907ed492d88eeadfae7f3ef0c3bb9fbc6df13f7
4 files changed +41 -12
target/arm/tcg/crypto_helper.c
+35 -12
@@ -99,6 +99,23 @@ void HELPER(crypto_aese_idx)(void *vd, void *vn, void *vm, uint32_t desc)
99 } while (s > 0);
100 }
101
102 +static void aesd_kernel(AESState *ad, const AESState *st, const AESState *rk)
103 +{
104 + AESState t;
105 +
106 + /* Our uint64_t are in the wrong order for big-endian. */
107 + if (HOST_BIG_ENDIAN) {
108 + t.d[0] = st->d[1] ^ rk->d[1];
109 + t.d[1] = st->d[0] ^ rk->d[0];
110 + aesdec_ISB_ISR_AK(&t, &t, &aes_zero, false);
111 + ad->d[0] = t.d[1];
112 + ad->d[1] = t.d[0];
113 + } else {
114 + t.v = st->v ^ rk->v;
115 + aesdec_ISB_ISR_AK(ad, &t, &aes_zero, false);
116 + }
117 +}
118 +
119 void HELPER(crypto_aesd)(void *vd, void *vn, void *vm, uint32_t desc)
120 {
121 intptr_t i, opr_sz = simd_oprsz(desc);
@@ -107,23 +124,29 @@ void HELPER(crypto_aesd)(void *vd, void *vn, void *vm, uint32_t desc)
124 AESState *ad = (AESState *)(vd + i);
125 AESState *st = (AESState *)(vn + i);
126 AESState *rk = (AESState *)(vm + i);
110 - AESState t;
127
112 - /* Our uint64_t are in the wrong order for big-endian. */
113 - if (HOST_BIG_ENDIAN) {
114 - t.d[0] = st->d[1] ^ rk->d[1];
115 - t.d[1] = st->d[0] ^ rk->d[0];
116 - aesdec_ISB_ISR_AK(&t, &t, &aes_zero, false);
117 - ad->d[0] = t.d[1];
118 - ad->d[1] = t.d[0];
119 - } else {
120 - t.v = st->v ^ rk->v;
121 - aesdec_ISB_ISR_AK(ad, &t, &aes_zero, false);
122 - }
128 + aesd_kernel(ad, st, rk);
129 }
130 clear_tail(vd, opr_sz, simd_maxsz(desc));
131 }
132
133 +void HELPER(crypto_aesd_idx)(void *vd, void *vn, void *vm, uint32_t desc)
134 +{
135 + intptr_t opr_sz = simd_oprsz(desc);
136 + intptr_t idx = simd_data(desc);
137 + void *vm_idx = vm + idx * 16;
138 + intptr_t s = opr_sz - 16;
139 +
140 + do {
141 + intptr_t base = ROUND_DOWN(s, 4 * 16);
142 + AESState rk = *(AESState *)(vm_idx + base);
143 + do {
144 + aesd_kernel(vd + s, vn + s, &rk);
145 + s -= 16;
146 + } while (s >= base);
147 + } while (s > 0);
148 +}
149 +
150 void HELPER(crypto_aesmc)(void *vd, void *vm, uint32_t desc)
151 {
152 intptr_t i, opr_sz = simd_oprsz(desc);
target/arm/tcg/helper-defs.h
+1
@@ -462,6 +462,7 @@ 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
464 DEF_HELPER_FLAGS_4(crypto_aese_idx, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
465 +DEF_HELPER_FLAGS_4(crypto_aesd_idx, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
466
467 DEF_HELPER_FLAGS_4(crypto_sha1su0, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
468 DEF_HELPER_FLAGS_4(crypto_sha1c, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
target/arm/tcg/sve.decode
+3
@@ -1985,6 +1985,9 @@ SM4E 01000101 00 10001 1 11100 0 ..... ..... @rdn_rm_e0
1985 AESE_idx 01000101 00 1 .. .10111010 ..... ....0 @aes2_2
1986 AESE_idx 01000101 00 1 .. .10111010 ..... ...00 @aes2_4
1987
1988 +AESD_idx 01000101 00 1 .. .10111011 ..... ....0 @aes2_2
1989 +AESD_idx 01000101 00 1 .. .10111011 ..... ...00 @aes2_4
1990 +
1991 # SVE2 crypto constructive binary operations
1992 SM4EKEY 01000101 00 1 ..... 11110 0 ..... ..... @rd_rn_rm_e0
1993 RAX1 01000101 00 1 ..... 11110 1 ..... ..... @rd_rn_rm_e0
target/arm/tcg/translate-sve.c
+2
@@ -8344,6 +8344,8 @@ static bool do_aes2_idx(DisasContext *s, arg_rx_n *a, gen_helper_gvec_3 *fn)
8344
8345 TRANS_FEAT_STREAMING_IF(AESE_idx, aa64_sve_aes2, aa64_ssve_aes,
8346 do_aes2_idx, a, gen_helper_crypto_aese_idx)
8347 +TRANS_FEAT_STREAMING_IF(AESD_idx, aa64_sve_aes2, aa64_ssve_aes,
8348 + do_aes2_idx, a, gen_helper_crypto_aesd_idx)
8349
8350 TRANS_FEAT(FCVTNT_sh_m, aa64_sme_or_sve2, gen_gvec_fpst_arg_zpz,
8351 gen_helper_sve2_fcvtnt_sh, a, 0, FPST_A64)