Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 54b5fd0

Browse files
committed
[Arm64] Set Instruction set flags
1 parent f1c7328 commit 54b5fd0

File tree

4 files changed

+74
-2
lines changed

4 files changed

+74
-2
lines changed

src/jit/compiler.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2740,6 +2740,15 @@ void Compiler::compSetProcessor()
27402740
codeGen->getEmitter()->SetUseSSE4(true);
27412741
}
27422742
}
2743+
#endif
2744+
#if defined(_TARGET_ARM64_)
2745+
// There is no JitFlag for Base instructions handle manually
2746+
opts.setSupportedISA(InstructionSet_Base);
2747+
#define HARDWARE_INTRINSIC_CLASS(flag, isa) \
2748+
if (jitFlags.IsSet(JitFlags::flag)) \
2749+
opts.setSupportedISA(InstructionSet_##isa);
2750+
#include "hwintrinsiclistArm64.h"
2751+
27432752
#endif
27442753
}
27452754

src/jit/compiler.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7974,7 +7974,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
79747974

79757975
bool compSupports(InstructionSet isa) const
79767976
{
7977-
#ifdef _TARGET_XARCH_
7977+
#if defined(_TARGET_XARCH_) | defined(_TARGET_ARM64_)
79787978
return (opts.compSupportsISA & (1ULL << isa)) != 0;
79797979
#else
79807980
return false;
@@ -8100,7 +8100,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
81008100
bool compCanUseSSE4; // Allow CodeGen to use SSE3, SSSE3, SSE4.1 and SSE4.2 instructions
81018101
#endif // _TARGET_XARCH_
81028102

8103-
#ifdef _TARGET_XARCH_
8103+
#if defined(_TARGET_XARCH_) | defined(_TARGET_ARM64_)
81048104
uint64_t compSupportsISA;
81058105
void setSupportedISA(InstructionSet isa)
81068106
{

src/jit/hwintrinsiclistArm64.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
/*****************************************************************************/
6+
#if !defined(HARDWARE_INTRINSIC) && !defined(HARDWARE_INTRINSIC_CLASS)
7+
#error Define HARDWARE_INTRINSIC and/or HARDWARE_INTRINSIC_CLASS before including this file
8+
#endif
9+
/*****************************************************************************/
10+
11+
// clang-format off
12+
13+
#if defined(HARDWARE_INTRINSIC_CLASS)
14+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_AES, Aes )
15+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_ATOMICS, Atomics )
16+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_CRC32, Crc32 )
17+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_DCPOP, Dcpop )
18+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_DP, Dp )
19+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_FCMA, Fcma )
20+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_FP, Fp )
21+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_FP16, Fp16 )
22+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_JSCVT, Jscvt )
23+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_LRCPC, Lrcpc )
24+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_PMULL, Pmull )
25+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_SHA1, Sha1 )
26+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_SHA2, Sha2 )
27+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_SHA512, Sha512 )
28+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_SHA3, Sha3 )
29+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_SIMD, Simd )
30+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_SIMD_V81, Simd_v81 )
31+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_SIMD_FP16, Simd_fp16)
32+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_SM3, Sm3 )
33+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_SM4, Sm4 )
34+
HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_SVE, Sve )
35+
#endif // defined(HARDWARE_INTRINSIC_CLASS)
36+
37+
#undef HARDWARE_INTRINSIC_CLASS
38+
#undef HARDWARE_INTRINSIC
39+
40+
// clang-format on

src/jit/instr.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,29 @@ enum InstructionSet
300300
InstructionSet_POPCNT = 38,
301301
#elif defined(_TARGET_ARM_)
302302
InstructionSet_NEON,
303+
#elif defined(_TARGET_ARM64_)
304+
InstructionSet_Base, // Base instructions available on all Arm64 platforms
305+
InstructionSet_Aes, // ID_AA64ISAR0_EL1.AES is 1 or better
306+
InstructionSet_Atomics, // ID_AA64ISAR0_EL1.Atomic is 2 or better
307+
InstructionSet_Crc32, // ID_AA64ISAR0_EL1.CRC32 is 1 or better
308+
InstructionSet_Dcpop, // ID_AA64ISAR1_EL1.DPB is 1 or better
309+
InstructionSet_Dp, // ID_AA64ISAR0_EL1.DP is 1 or better
310+
InstructionSet_Fcma, // ID_AA64ISAR1_EL1.FCMA is 1 or better
311+
InstructionSet_Fp, // ID_AA64PFR0_EL1.FP is 0 or better
312+
InstructionSet_Fp16, // ID_AA64PFR0_EL1.FP is 1 or better
313+
InstructionSet_Jscvt, // ID_AA64ISAR1_EL1.JSCVT is 1 or better
314+
InstructionSet_Lrcpc, // ID_AA64ISAR1_EL1.LRCPC is 1 or better
315+
InstructionSet_Pmull, // ID_AA64ISAR0_EL1.AES is 2 or better
316+
InstructionSet_Sha1, // ID_AA64ISAR0_EL1.SHA1 is 1 or better
317+
InstructionSet_Sha2, // ID_AA64ISAR0_EL1.SHA2 is 1 or better
318+
InstructionSet_Sha512, // ID_AA64ISAR0_EL1.SHA2 is 2 or better
319+
InstructionSet_Sha3, // ID_AA64ISAR0_EL1.SHA3 is 1 or better
320+
InstructionSet_Simd, // ID_AA64PFR0_EL1.AdvSIMD is 0 or better
321+
InstructionSet_Simd_v81, // ID_AA64ISAR0_EL1.RDM is 1 or better
322+
InstructionSet_Simd_fp16, // ID_AA64PFR0_EL1.AdvSIMD is 1 or better
323+
InstructionSet_Sm3, // ID_AA64ISAR0_EL1.SM3 is 1 or better
324+
InstructionSet_Sm4, // ID_AA64ISAR0_EL1.SM4 is 1 or better
325+
InstructionSet_Sve, // ID_AA64PFR0_EL1.SVE is 1 or better
303326
#endif
304327
InstructionSet_NONE // No instruction set is available indicating an invalid value
305328
};

0 commit comments

Comments
 (0)