Skip to content

Commit

Permalink
Add initial support for System.Runtime.Intrinsics.Arm.Sha1 (mono#20789)
Browse files Browse the repository at this point in the history
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 <fanyang-mono@users.noreply.github.com>
  • Loading branch information
monojenkins and fanyang-mono committed Jan 27, 2021
1 parent 8a39ad3 commit 62d990e
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 1 deletion.
6 changes: 6 additions & 0 deletions mono/mini/llvm-intrinsics.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions mono/mini/mini-llvm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
Expand Down
6 changes: 6 additions & 0 deletions mono/mini/mini.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
16 changes: 16 additions & 0 deletions mono/mini/simd-intrinsics-netcore.c
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand Down Expand Up @@ -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
*/
Expand Down
6 changes: 5 additions & 1 deletion mono/mini/simd-methods-netcore.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 62d990e

Please sign in to comment.