@samitouri / QOSamiQemu / commits / fb5c3a093e

target/arm: Implement AESEMC

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

Richard Henderson committed Aug 26, 2026 at 10:42 UTC fb5c3a093e6a96a69f1398dc99efd9cfd288d3dd
4 files changed +37
target/arm/tcg/crypto_helper.c
+31
@@ -193,6 +193,37 @@ void HELPER(crypto_aesimc)(void *vd, void *vm, uint32_t desc)
193 clear_tail(vd, opr_sz, simd_maxsz(desc));
194 }
195
196 +void HELPER(crypto_aesemc)(void *vd, void *vn, void *vm, uint32_t desc)
197 +{
198 + intptr_t opr_sz = simd_oprsz(desc);
199 + intptr_t idx = simd_data(desc);
200 + void *vm_idx = vm + idx * 16;
201 + intptr_t s = opr_sz - 16;
202 +
203 + do {
204 + intptr_t base = ROUND_DOWN(s, 4 * 16);
205 + AESState rk = *(AESState *)(vm_idx + base);
206 + do {
207 + AESState *ad = (AESState *)(vd + s);
208 + AESState *st = (AESState *)(vn + s);
209 + AESState t;
210 +
211 + /* Like above: Arm AK comes first; api AK comes last */
212 + if (HOST_BIG_ENDIAN) {
213 + t.d[0] = st->d[1] ^ rk.d[1];
214 + t.d[1] = st->d[0] ^ rk.d[0];
215 + aesenc_SB_SR_MC_AK(&t, &t, &aes_zero, false);
216 + ad->d[0] = t.d[1];
217 + ad->d[1] = t.d[0];
218 + } else {
219 + t.v = st->v ^ rk.v;
220 + aesenc_SB_SR_MC_AK(ad, &t, &aes_zero, false);
221 + }
222 + s -= 16;
223 + } while (s >= base);
224 + } while (s > 0);
225 +}
226 +
227 /*
228 * SHA-1 logical functions
229 */
target/arm/tcg/helper-defs.h
+1
@@ -460,6 +460,7 @@ DEF_HELPER_FLAGS_4(crypto_aese, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
460 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
465 DEF_HELPER_FLAGS_4(crypto_aese_idx, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
466 DEF_HELPER_FLAGS_4(crypto_aesd_idx, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
target/arm/tcg/sve.decode
+3
@@ -1988,6 +1988,9 @@ AESE_idx 01000101 00 1 .. .10111010 ..... ...00 @aes2_4
1988 AESD_idx 01000101 00 1 .. .10111011 ..... ....0 @aes2_2
1989 AESD_idx 01000101 00 1 .. .10111011 ..... ...00 @aes2_4
1990
1991 +AESEMC 01000101 00 1 .. .11111010 ..... ....0 @aes2_2
1992 +AESEMC 01000101 00 1 .. .11111010 ..... ...00 @aes2_4
1993 +
1994 # SVE2 crypto constructive binary operations
1995 SM4EKEY 01000101 00 1 ..... 11110 0 ..... ..... @rd_rn_rm_e0
1996 RAX1 01000101 00 1 ..... 11110 1 ..... ..... @rd_rn_rm_e0
target/arm/tcg/translate-sve.c
+2
@@ -8346,6 +8346,8 @@ 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 +TRANS_FEAT_STREAMING_IF(AESEMC, aa64_sve_aes2, aa64_ssve_aes,
8350 + do_aes2_idx, a, gen_helper_crypto_aesemc)
8351
8352 TRANS_FEAT(FCVTNT_sh_m, aa64_sme_or_sve2, gen_gvec_fpst_arg_zpz,
8353 gen_helper_sve2_fcvtnt_sh, a, 0, FPST_A64)