From 62d990e7eea4a3335204c9ab9647aa1e80206ee3 Mon Sep 17 00:00:00 2001 From: monojenkins Date: Wed, 27 Jan 2021 14:38:08 -0500 Subject: [PATCH] Add initial support for System.Runtime.Intrinsics.Arm.Sha1 (#20789) Contribute to dotnet/runtime#42323 This PR added support for the following API's - IsSupported - ScheduleUpdate0 - ScheduleUpdate1 The rest relies on adding Vector64 support for arm64, which will be done by a following-up PR. Co-authored-by: fanyang-mono --- mono/mini/llvm-intrinsics.h | 6 ++++++ mono/mini/mini-llvm.c | 2 ++ mono/mini/mini.h | 6 ++++++ mono/mini/simd-intrinsics-netcore.c | 16 ++++++++++++++++ mono/mini/simd-methods-netcore.h | 6 +++++- 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/mono/mini/llvm-intrinsics.h b/mono/mini/llvm-intrinsics.h index 643c3c0f1916..487df32aa043 100644 --- a/mono/mini/llvm-intrinsics.h +++ b/mono/mini/llvm-intrinsics.h @@ -259,6 +259,12 @@ INTRINS(AARCH64_CRC32CB, aarch64_crc32cb) INTRINS(AARCH64_CRC32CH, aarch64_crc32ch) INTRINS(AARCH64_CRC32CW, aarch64_crc32cw) INTRINS(AARCH64_CRC32CX, aarch64_crc32cx) +INTRINS(AARCH64_SHA1C, aarch64_crypto_sha1c) +INTRINS(AARCH64_SHA1H, aarch64_crypto_sha1h) +INTRINS(AARCH64_SHA1M, aarch64_crypto_sha1m) +INTRINS(AARCH64_SHA1P, aarch64_crypto_sha1p) +INTRINS(AARCH64_SHA1SU0, aarch64_crypto_sha1su0) +INTRINS(AARCH64_SHA1SU1, aarch64_crypto_sha1su1) INTRINS(AARCH64_SHA256SU0, aarch64_crypto_sha256su0) INTRINS(AARCH64_SHA256SU1, aarch64_crypto_sha256su1) INTRINS(AARCH64_SHA256H, aarch64_crypto_sha256h) diff --git a/mono/mini/mini-llvm.c b/mono/mini/mini-llvm.c index 2bf7bd16b57d..6a445f280dd9 100644 --- a/mono/mini/mini-llvm.c +++ b/mono/mini/mini-llvm.c @@ -9071,6 +9071,7 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) case SIMD_OP_ARM64_CRC32CH: id = INTRINS_AARCH64_CRC32CH; zext_last = TRUE; break; case SIMD_OP_ARM64_CRC32CW: id = INTRINS_AARCH64_CRC32CW; zext_last = TRUE; break; case SIMD_OP_ARM64_CRC32CX: id = INTRINS_AARCH64_CRC32CX; break; + case SIMD_OP_ARM64_SHA1SU1: id = INTRINS_AARCH64_SHA1SU1; break; case SIMD_OP_ARM64_SHA256SU0: id = INTRINS_AARCH64_SHA256SU0; break; default: g_assert_not_reached (); break; } @@ -9084,6 +9085,7 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) case OP_XOP_X_X_X_X: { IntrinsicId id = (IntrinsicId)0; switch (ins->inst_c0) { + case SIMD_OP_ARM64_SHA1SU0: id = INTRINS_AARCH64_SHA1SU0; break; case SIMD_OP_ARM64_SHA256H: id = INTRINS_AARCH64_SHA256H; break; case SIMD_OP_ARM64_SHA256H2: id = INTRINS_AARCH64_SHA256H2; break; case SIMD_OP_ARM64_SHA256SU1: id = INTRINS_AARCH64_SHA256SU1; break; diff --git a/mono/mini/mini.h b/mono/mini/mini.h index 26d99ec2aa65..641b9c54eb7b 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -2988,6 +2988,12 @@ typedef enum { SIMD_OP_ARM64_CRC32CX, SIMD_OP_ARM64_RBIT32, SIMD_OP_ARM64_RBIT64, + SIMD_OP_ARM64_SHA1C, + SIMD_OP_ARM64_SHA1H, + SIMD_OP_ARM64_SHA1M, + SIMD_OP_ARM64_SHA1P, + SIMD_OP_ARM64_SHA1SU0, + SIMD_OP_ARM64_SHA1SU1, SIMD_OP_ARM64_SHA256H, SIMD_OP_ARM64_SHA256H2, SIMD_OP_ARM64_SHA256SU0, diff --git a/mono/mini/simd-intrinsics-netcore.c b/mono/mini/simd-intrinsics-netcore.c index e69506721629..68f1a5d29682 100644 --- a/mono/mini/simd-intrinsics-netcore.c +++ b/mono/mini/simd-intrinsics-netcore.c @@ -817,6 +817,16 @@ static SimdIntrinsic crc32_methods [] = { {SN_get_IsSupported} }; +static SimdIntrinsic sha1_methods [] = { + {SN_FixedRotate, OP_XOP_X_X, SIMD_OP_ARM64_SHA1H}, + {SN_HashUpdateChoose, OP_XOP_X_X_X_X, SIMD_OP_ARM64_SHA1C}, + {SN_HashUpdateMajority, OP_XOP_X_X_X_X, SIMD_OP_ARM64_SHA1M}, + {SN_HashUpdateParity, OP_XOP_X_X_X_X, SIMD_OP_ARM64_SHA1P}, + {SN_ScheduleUpdate0, OP_XOP_X_X_X_X, SIMD_OP_ARM64_SHA1SU0}, + {SN_ScheduleUpdate1, OP_XOP_X_X_X, SIMD_OP_ARM64_SHA1SU1}, + {SN_get_IsSupported} +}; + static SimdIntrinsic sha256_methods [] = { {SN_HashUpdate1, OP_XOP_X_X_X_X, SIMD_OP_ARM64_SHA256H}, {SN_HashUpdate2, OP_XOP_X_X_X_X, SIMD_OP_ARM64_SHA256H2}, @@ -906,6 +916,12 @@ emit_arm64_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignatur intrinsics_size = sizeof (sha256_methods); } + if (is_hw_intrinsics_class (klass, "Sha1", &is_64bit)) { + feature = MONO_CPU_ARM64_CRYPTO; + intrinsics = sha1_methods; + intrinsics_size = sizeof (sha1_methods); + } + /* * Common logic for all instruction sets */ diff --git a/mono/mini/simd-methods-netcore.h b/mono/mini/simd-methods-netcore.h index 51601e0c7a8c..9b0bbabbf66c 100644 --- a/mono/mini/simd-methods-netcore.h +++ b/mono/mini/simd-methods-netcore.h @@ -236,7 +236,11 @@ METHOD(ComputeCrc32C) // X86Base METHOD(BitScanForward) METHOD(BitScanReverse) -// Arm64 +// Crypto +METHOD(FixedRotate) +METHOD(HashUpdateChoose) +METHOD(HashUpdateMajority) +METHOD(HashUpdateParity) METHOD(HashUpdate1) METHOD(HashUpdate2) METHOD(ScheduleUpdate0)