Skip to content

Commit cfce757

Browse files
authored
Initial support for System.Runtime.Intrinsics.Arm.Aes (#48114)
1 parent bb37a36 commit cfce757

File tree

5 files changed

+24
-0
lines changed

5 files changed

+24
-0
lines changed

src/mono/mono/mini/llvm-intrinsics.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,10 @@ INTRINS(AARCH64_CRC32CB, aarch64_crc32cb)
259259
INTRINS(AARCH64_CRC32CH, aarch64_crc32ch)
260260
INTRINS(AARCH64_CRC32CW, aarch64_crc32cw)
261261
INTRINS(AARCH64_CRC32CX, aarch64_crc32cx)
262+
INTRINS(AARCH64_AESD, aarch64_crypto_aesd)
263+
INTRINS(AARCH64_AESE, aarch64_crypto_aese)
264+
INTRINS(AARCH64_AESIMC, aarch64_crypto_aesimc)
265+
INTRINS(AARCH64_AESMC, aarch64_crypto_aesmc)
262266
INTRINS(AARCH64_SHA1C, aarch64_crypto_sha1c)
263267
INTRINS(AARCH64_SHA1H, aarch64_crypto_sha1h)
264268
INTRINS(AARCH64_SHA1M, aarch64_crypto_sha1m)

src/mono/mono/mini/mini-llvm.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9069,6 +9069,8 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
90699069
case SIMD_OP_ARM64_CRC32CH: id = INTRINS_AARCH64_CRC32CH; zext_last = TRUE; break;
90709070
case SIMD_OP_ARM64_CRC32CW: id = INTRINS_AARCH64_CRC32CW; zext_last = TRUE; break;
90719071
case SIMD_OP_ARM64_CRC32CX: id = INTRINS_AARCH64_CRC32CX; break;
9072+
case SIMD_OP_AES_DEC: id = INTRINS_AARCH64_AESD; break;
9073+
case SIMD_OP_AES_ENC: id = INTRINS_AARCH64_AESE; break;
90729074
case SIMD_OP_ARM64_SHA1SU1: id = INTRINS_AARCH64_SHA1SU1; break;
90739075
case SIMD_OP_ARM64_SHA256SU0: id = INTRINS_AARCH64_SHA256SU0; break;
90749076
default: g_assert_not_reached (); break;
@@ -9096,6 +9098,8 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
90969098
case OP_XOP_X_X: {
90979099
IntrinsicId id = (IntrinsicId)0;
90989100
switch (ins->inst_c0) {
9101+
case SIMD_OP_AES_IMC: id = INTRINS_AARCH64_AESIMC; break;
9102+
case SIMD_OP_ARM64_AES_AESMC: id = INTRINS_AARCH64_AESMC; break;
90999103
case SIMD_OP_LLVM_FABS: id = INTRINS_AARCH64_ADV_SIMD_ABS_FLOAT; break;
91009104
case SIMD_OP_LLVM_DABS: id = INTRINS_AARCH64_ADV_SIMD_ABS_DOUBLE; break;
91019105
case SIMD_OP_LLVM_I8ABS: id = INTRINS_AARCH64_ADV_SIMD_ABS_INT8; break;

src/mono/mono/mini/mini.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2980,6 +2980,7 @@ typedef enum {
29802980
SIMD_OP_ARM64_CRC32CX,
29812981
SIMD_OP_ARM64_RBIT32,
29822982
SIMD_OP_ARM64_RBIT64,
2983+
SIMD_OP_ARM64_AES_AESMC,
29832984
SIMD_OP_ARM64_SHA1C,
29842985
SIMD_OP_ARM64_SHA1H,
29852986
SIMD_OP_ARM64_SHA1M,

src/mono/mono/mini/simd-intrinsics.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,14 @@ static SimdIntrinsic crc32_methods [] = {
818818
{SN_get_IsSupported}
819819
};
820820

821+
static SimdIntrinsic crypto_aes_methods [] = {
822+
{SN_Decrypt, OP_XOP_X_X_X, SIMD_OP_AES_DEC},
823+
{SN_Encrypt, OP_XOP_X_X_X, SIMD_OP_AES_ENC},
824+
{SN_InverseMixColumns, OP_XOP_X_X, SIMD_OP_AES_IMC},
825+
{SN_MixColumns, OP_XOP_X_X, SIMD_OP_ARM64_AES_AESMC},
826+
{SN_get_IsSupported}
827+
};
828+
821829
static SimdIntrinsic sha1_methods [] = {
822830
{SN_FixedRotate, OP_XOP_X_X, SIMD_OP_ARM64_SHA1H},
823831
{SN_HashUpdateChoose, OP_XOP_X_X_X_X, SIMD_OP_ARM64_SHA1C},
@@ -930,6 +938,12 @@ emit_arm64_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignatur
930938
intrinsics_size = sizeof (sha1_methods);
931939
}
932940

941+
if (is_hw_intrinsics_class (klass, "Aes", &is_64bit)) {
942+
feature = MONO_CPU_ARM64_CRYPTO;
943+
intrinsics = crypto_aes_methods;
944+
intrinsics_size = sizeof (crypto_aes_methods);
945+
}
946+
933947
/*
934948
* Common logic for all instruction sets
935949
*/

src/mono/mono/mini/simd-methods-netcore.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,3 +245,4 @@ METHOD(HashUpdate1)
245245
METHOD(HashUpdate2)
246246
METHOD(ScheduleUpdate0)
247247
METHOD(ScheduleUpdate1)
248+
METHOD(MixColumns)

0 commit comments

Comments
 (0)