From ed68978108c5a5c4e9aa86262699041ee4248fe5 Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Fri, 5 Apr 2019 13:58:18 -0700 Subject: [PATCH] Update the JIT to recognize the IsSupported property for all HWIntrinsics (dotnet/coreclr#23751) * Moving some JITDUMP calls into Compiler::lookupNamedIntrinsic * Marking the IsSupported methods as Intrinsic for all HWIntrinsic ISAs * Updating the hwintrinsic importation to more generally handle IsSupported and ThrowPNSE * Applying formatting patch. * Adding using System.Runtime.CompilerServices to the various x86 PlatformNotSupported HWIntrinsic files Commit migrated from https://github.com/dotnet/coreclr/commit/1b4d7c77d3e9d1a67ffa354a63692ecc07553b5c --- src/coreclr/src/jit/hwintrinsicArm64.cpp | 75 ++++++++----------- src/coreclr/src/jit/hwintrinsicArm64.h | 3 - src/coreclr/src/jit/hwintrinsiclistxarch.h | 23 ------ src/coreclr/src/jit/hwintrinsicxarch.cpp | 40 ++++------ src/coreclr/src/jit/hwintrinsicxarch.h | 9 +-- src/coreclr/src/jit/importer.cpp | 66 ++++++++++++++-- src/coreclr/src/jit/namedintrinsiclist.h | 9 ++- .../Arm/Arm64/Aes.PlatformNotSupported.cs | 3 +- .../Arm/Arm64/Base.PlatformNotSupported.cs | 2 +- .../Arm/Arm64/Sha1.PlatformNotSupported.cs | 3 +- .../Arm/Arm64/Sha256.PlatformNotSupported.cs | 2 +- .../Arm/Arm64/Simd.PlatformNotSupported.cs | 2 +- .../X86/Aes.PlatformNotSupported.cs | 3 +- .../X86/Avx.PlatformNotSupported.cs | 3 +- .../X86/Avx2.PlatformNotSupported.cs | 3 +- .../X86/Bmi1.PlatformNotSupported.cs | 5 +- .../X86/Bmi2.PlatformNotSupported.cs | 5 +- .../X86/Fma.PlatformNotSupported.cs | 3 +- .../X86/Lzcnt.PlatformNotSupported.cs | 5 +- .../X86/Pclmulqdq.PlatformNotSupported.cs | 3 +- .../X86/Popcnt.PlatformNotSupported.cs | 7 +- .../X86/Sse.PlatformNotSupported.cs | 5 +- .../X86/Sse2.PlatformNotSupported.cs | 5 +- .../X86/Sse3.PlatformNotSupported.cs | 3 +- .../X86/Sse41.PlatformNotSupported.cs | 5 +- .../X86/Sse42.PlatformNotSupported.cs | 5 +- .../X86/Ssse3.PlatformNotSupported.cs | 3 +- 27 files changed, 162 insertions(+), 138 deletions(-) diff --git a/src/coreclr/src/jit/hwintrinsicArm64.cpp b/src/coreclr/src/jit/hwintrinsicArm64.cpp index 302895d889e07..98b4956238558 100644 --- a/src/coreclr/src/jit/hwintrinsicArm64.cpp +++ b/src/coreclr/src/jit/hwintrinsicArm64.cpp @@ -33,13 +33,6 @@ Flag flag(InstructionSet isa) // clang-format off static const HWIntrinsicInfo hwIntrinsicInfoArray[] = { - // Add lookupHWIntrinsic special cases see lookupHWIntrinsic() below - // NI_ARM64_IsSupported_True is used to expand get_IsSupported to const true - // NI_ARM64_IsSupported_False is used to expand get_IsSupported to const false - // NI_ARM64_PlatformNotSupported to throw PlatformNotSupported exception for every intrinsic not supported on the running platform - {NI_ARM64_IsSupported_True, "get_IsSupported", IsaFlag::EveryISA, HWIntrinsicInfo::IsSupported, HWIntrinsicInfo::None, {}}, - {NI_ARM64_IsSupported_False, "::NI_ARM64_IsSupported_False", IsaFlag::EveryISA, HWIntrinsicInfo::IsSupported, HWIntrinsicInfo::None, {}}, - {NI_ARM64_PlatformNotSupported, "::NI_ARM64_PlatformNotSupported", IsaFlag::EveryISA, HWIntrinsicInfo::Unsupported, HWIntrinsicInfo::None, {}}, #define HARDWARE_INTRINSIC(id, isa, name, form, i0, i1, i2, flags) \ {id, #name, IsaFlag::isa, HWIntrinsicInfo::form, HWIntrinsicInfo::flags, { i0, i1, i2 }}, #include "hwintrinsiclistArm64.h" @@ -101,45 +94,45 @@ InstructionSet Compiler::lookupHWIntrinsicISA(const char* className) // // Return Value: // Id for the hardware intrinsic. -// -// TODO-Throughput: replace sequential search by hash lookup NamedIntrinsic Compiler::lookupHWIntrinsic(const char* className, const char* methodName) { - InstructionSet isa = lookupHWIntrinsicISA(className); - NamedIntrinsic result = NI_Illegal; - if (isa != InstructionSet_NONE) + // TODO-Throughput: replace sequential search by binary search + InstructionSet isa = lookupHWIntrinsicISA(className); + + if (isa == InstructionSet_NONE) + { + // There are several platform-agnostic intrinsics (e.g., Vector256) that + // are not supported in Arm64, so early return NI_Illegal + return NI_Illegal; + } + + bool isIsaSupported = compSupports(isa) && compSupportsHWIntrinsic(isa); + + if (strcmp(methodName, "get_IsSupported") == 0) + { + return isIsaSupported ? NI_IsSupported_True : NI_IsSupported_False; + } + else if (!isIsaSupported) + { + return NI_Throw_PlatformNotSupportedException; + } + + for (int i = 0; i < (NI_HW_INTRINSIC_END - NI_HW_INTRINSIC_START - 1); i++) { - JITDUMP("HW Intrinsic %s.%s: ", className, methodName); - IsaFlag::Flag isaFlag = IsaFlag::flag(isa); - for (int i = 0; i < (NI_HW_INTRINSIC_END - NI_HW_INTRINSIC_START - 1); i++) + if ((IsaFlag::flag(isa) & hwIntrinsicInfoArray[i].isaflags) == 0) { - if ((isaFlag & hwIntrinsicInfoArray[i].isaflags) && strcmp(methodName, hwIntrinsicInfoArray[i].name) == 0) - { - if (compSupportsHWIntrinsic(isa)) - { - // Intrinsic is supported on platform - result = hwIntrinsicInfoArray[i].id; - JITDUMP("Supported\n"); - } - else - { - // When the intrinsic class is not supported - // Return NI_ARM64_PlatformNotSupported for all intrinsics - // Return NI_ARM64_IsSupported_False for the IsSupported property - result = (hwIntrinsicInfoArray[i].id != NI_ARM64_IsSupported_True) ? NI_ARM64_PlatformNotSupported - : NI_ARM64_IsSupported_False; - - JITDUMP("Not Supported\n"); - } - break; - } + continue; } - if (result == NI_Illegal) + + if (strcmp(methodName, hwIntrinsicInfoArray[i].name) == 0) { - JITDUMP("Not recognized\n"); + return hwIntrinsicInfoArray[i].id; } } - return result; + + // There are several helper intrinsics that are implemented in managed code + // Those intrinsics will hit this code path and need to return NI_Illegal + return NI_Illegal; } //------------------------------------------------------------------------ @@ -434,12 +427,6 @@ GenTree* Compiler::impHWIntrinsic(NamedIntrinsic intrinsic, switch (HWIntrinsicInfo::lookup(intrinsic).form) { - case HWIntrinsicInfo::IsSupported: - return gtNewIconNode((intrinsic == NI_ARM64_IsSupported_True) ? 1 : 0); - - case HWIntrinsicInfo::Unsupported: - return impUnsupportedHWIntrinsic(CORINFO_HELP_THROW_PLATFORM_NOT_SUPPORTED, method, sig, mustExpand); - case HWIntrinsicInfo::UnaryOp: op1 = impPopStack().val; diff --git a/src/coreclr/src/jit/hwintrinsicArm64.h b/src/coreclr/src/jit/hwintrinsicArm64.h index 0cd5955129e4f..e6c1530981e61 100644 --- a/src/coreclr/src/jit/hwintrinsicArm64.h +++ b/src/coreclr/src/jit/hwintrinsicArm64.h @@ -14,9 +14,6 @@ struct HWIntrinsicInfo // identically by the Importer, LSRA, Lowering, and CodeGen enum Form { - // Shared forms - IsSupported, // The IsSupported property will use this form - Unsupported, // Any intrisic which is unsupported and must throw PlatformNotSupportException will use this form // Non SIMD forms UnaryOp, // Non SIMD intrinsics which take a single argument CrcOp, // Crc intrinsics. diff --git a/src/coreclr/src/jit/hwintrinsiclistxarch.h b/src/coreclr/src/jit/hwintrinsiclistxarch.h index e10a264b9cf83..ffb4754af2ccb 100644 --- a/src/coreclr/src/jit/hwintrinsiclistxarch.h +++ b/src/coreclr/src/jit/hwintrinsiclistxarch.h @@ -74,7 +74,6 @@ HARDWARE_INTRINSIC(Vector256_Zero, "get_Zero", // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // SSE Intrinsics -HARDWARE_INTRINSIC(SSE_IsSupported, "get_IsSupported", SSE, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(SSE_Add, "Add", SSE, -1, 16, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_addps, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_Commutative) HARDWARE_INTRINSIC(SSE_AddScalar, "AddScalar", SSE, -1, 16, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_addss, INS_invalid}, HW_Category_SIMDScalar, HW_Flag_CopyUpperBits) HARDWARE_INTRINSIC(SSE_And, "And", SSE, -1, 16, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_andps, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_Commutative) @@ -165,7 +164,6 @@ HARDWARE_INTRINSIC(SSE_Xor, "Xor", // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // SSE 64-bit-only Intrinsics -HARDWARE_INTRINSIC(SSE_X64_IsSupported, "get_IsSupported", SSE_X64, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(SSE_X64_ConvertToInt64, "ConvertToInt64", SSE_X64, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_cvtss2si, INS_invalid}, HW_Category_SIMDScalar, HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics|HW_Flag_SpecialCodeGen) HARDWARE_INTRINSIC(SSE_X64_ConvertToInt64WithTruncation, "ConvertToInt64WithTruncation", SSE_X64, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_cvttss2si, INS_invalid}, HW_Category_SIMDScalar, HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics|HW_Flag_SpecialCodeGen) HARDWARE_INTRINSIC(SSE_X64_ConvertScalarToVector128Single, "ConvertScalarToVector128Single", SSE_X64, -1, 16, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_cvtsi2ss, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMDScalar, HW_Flag_BaseTypeFromSecondArg|HW_Flag_CopyUpperBits|HW_Flag_SpecialCodeGen) @@ -175,7 +173,6 @@ HARDWARE_INTRINSIC(SSE_X64_ConvertScalarToVector128Single, "ConvertScal // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // SSE2 Intrinsics -HARDWARE_INTRINSIC(SSE2_IsSupported, "get_IsSupported", SSE2, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(SSE2_Add, "Add", SSE2, -1, 16, 2, {INS_paddb, INS_paddb, INS_paddw, INS_paddw, INS_paddd, INS_paddd, INS_paddq, INS_paddq, INS_invalid, INS_addpd}, HW_Category_SimpleSIMD, HW_Flag_Commutative) HARDWARE_INTRINSIC(SSE2_AddSaturate, "AddSaturate", SSE2, -1, 16, 2, {INS_paddsb, INS_paddusb, INS_paddsw, INS_paddusw, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_Commutative) HARDWARE_INTRINSIC(SSE2_AddScalar, "AddScalar", SSE2, -1, 16, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_addsd}, HW_Category_SIMDScalar, HW_Flag_CopyUpperBits) @@ -285,7 +282,6 @@ HARDWARE_INTRINSIC(SSE2_Xor, "Xor", // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // SSE2 64-bit-only Intrinsics -HARDWARE_INTRINSIC(SSE2_X64_IsSupported, "get_IsSupported", SSE2_X64, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(SSE2_X64_ConvertToInt64, "ConvertToInt64", SSE2_X64, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_mov_xmm2i, INS_invalid, INS_invalid, INS_cvtsd2si}, HW_Category_SIMDScalar, HW_Flag_BaseTypeFromFirstArg|HW_Flag_SpecialCodeGen|HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(SSE2_X64_ConvertToInt64WithTruncation, "ConvertToInt64WithTruncation", SSE2_X64, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_cvttsd2si}, HW_Category_SIMDScalar, HW_Flag_BaseTypeFromFirstArg|HW_Flag_SpecialCodeGen|HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(SSE2_X64_ConvertToUInt64, "ConvertToUInt64", SSE2_X64, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_mov_xmm2i, INS_invalid, INS_invalid}, HW_Category_SIMDScalar, HW_Flag_BaseTypeFromFirstArg|HW_Flag_SpecialCodeGen|HW_Flag_NoRMWSemantics) @@ -299,7 +295,6 @@ HARDWARE_INTRINSIC(SSE2_X64_StoreNonTemporal, "StoreNonTem // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // SSE3 Intrinsics -HARDWARE_INTRINSIC(SSE3_IsSupported, "get_IsSupported", SSE3, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(SSE3_AddSubtract, "AddSubtract", SSE3, -1, 16, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_addsubps, INS_addsubpd}, HW_Category_SimpleSIMD, HW_Flag_NoFlag) HARDWARE_INTRINSIC(SSE3_HorizontalAdd, "HorizontalAdd", SSE3, -1, 16, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_haddps, INS_haddpd}, HW_Category_SimpleSIMD, HW_Flag_NoFlag) HARDWARE_INTRINSIC(SSE3_HorizontalSubtract, "HorizontalSubtract", SSE3, -1, 16, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_hsubps, INS_hsubpd}, HW_Category_SimpleSIMD, HW_Flag_NoFlag) @@ -314,7 +309,6 @@ HARDWARE_INTRINSIC(SSE3_MoveLowAndDuplicate, "MoveLowAndD // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // SSSE3 Intrinsics -HARDWARE_INTRINSIC(SSSE3_IsSupported, "get_IsSupported", SSSE3, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(SSSE3_Abs, "Abs", SSSE3, -1, 16, 1, {INS_invalid, INS_pabsb, INS_invalid, INS_pabsw, INS_invalid, INS_pabsd, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(SSSE3_AlignRight, "AlignRight", SSSE3, -1, 16, 3, {INS_palignr, INS_palignr, INS_palignr, INS_palignr, INS_palignr, INS_palignr, INS_palignr, INS_palignr, INS_invalid, INS_invalid}, HW_Category_IMM, HW_Flag_FullRangeIMM) HARDWARE_INTRINSIC(SSSE3_HorizontalAdd, "HorizontalAdd", SSSE3, -1, 16, 2, {INS_invalid, INS_invalid, INS_phaddw, INS_invalid, INS_phaddd, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_NoFlag) @@ -331,7 +325,6 @@ HARDWARE_INTRINSIC(SSSE3_Sign, "Sign", // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // SSE41 Intrinsics -HARDWARE_INTRINSIC(SSE41_IsSupported, "get_IsSupported", SSE41, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(SSE41_Blend, "Blend", SSE41, -1, 16, 3, {INS_invalid, INS_invalid, INS_pblendw, INS_pblendw, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_blendps, INS_blendpd}, HW_Category_IMM, HW_Flag_FullRangeIMM) HARDWARE_INTRINSIC(SSE41_BlendVariable, "BlendVariable", SSE41, -1, 16, 3, {INS_pblendvb, INS_pblendvb, INS_pblendvb, INS_pblendvb, INS_pblendvb, INS_pblendvb, INS_pblendvb, INS_pblendvb, INS_blendvps, INS_blendvpd}, HW_Category_SimpleSIMD, HW_Flag_NoFlag) HARDWARE_INTRINSIC(SSE41_Ceiling, "Ceiling", SSE41, 10, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_roundps, INS_roundpd}, HW_Category_SimpleSIMD, HW_Flag_NoRMWSemantics) @@ -375,7 +368,6 @@ HARDWARE_INTRINSIC(SSE41_TestZ, "TestZ", // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // SSE41 64-bit-only Intrinsics -HARDWARE_INTRINSIC(SSE41_X64_IsSupported, "get_IsSupported", SSE41_X64, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(SSE41_X64_Extract, "Extract", SSE41_X64, -1, 16, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_pextrq, INS_pextrq, INS_invalid, INS_invalid}, HW_Category_IMM, HW_Flag_FullRangeIMM|HW_Flag_BaseTypeFromFirstArg|HW_Flag_MultiIns|HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(SSE41_X64_Insert, "Insert", SSE41_X64, -1, 16, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_pinsrq, INS_pinsrq, INS_invalid, INS_invalid}, HW_Category_IMM, HW_Flag_FullRangeIMM) @@ -384,7 +376,6 @@ HARDWARE_INTRINSIC(SSE41_X64_Insert, "Insert", // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // SSE42 Intrinsics -HARDWARE_INTRINSIC(SSE42_IsSupported, "get_IsSupported", SSE42, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(SSE42_Crc32, "Crc32", SSE42, -1, 0, 2, {INS_invalid, INS_crc32, INS_invalid, INS_crc32, INS_invalid, INS_crc32, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed) HARDWARE_INTRINSIC(SSE42_CompareGreaterThan, "CompareGreaterThan", SSE42, -1, 16, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_pcmpgtq, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_NoFlag) @@ -393,7 +384,6 @@ HARDWARE_INTRINSIC(SSE42_CompareGreaterThan, "CompareGrea // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // SSE42 Intrinsics -HARDWARE_INTRINSIC(SSE42_X64_IsSupported, "get_IsSupported", SSE42_X64, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(SSE42_X64_Crc32, "Crc32", SSE42_X64, -1, 0, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_crc32, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed) // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** @@ -401,7 +391,6 @@ HARDWARE_INTRINSIC(SSE42_X64_Crc32, "Crc32", // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // AVX Intrinsics -HARDWARE_INTRINSIC(AVX_IsSupported, "get_IsSupported", AVX, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(AVX_Add, "Add", AVX, -1, 32, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_addps, INS_addpd}, HW_Category_SimpleSIMD, HW_Flag_Commutative) HARDWARE_INTRINSIC(AVX_AddSubtract, "AddSubtract", AVX, -1, 32, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_addsubps, INS_addsubpd}, HW_Category_SimpleSIMD, HW_Flag_NoFlag) HARDWARE_INTRINSIC(AVX_And, "And", AVX, -1, 32, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_andps, INS_andpd}, HW_Category_SimpleSIMD, HW_Flag_Commutative) @@ -468,7 +457,6 @@ HARDWARE_INTRINSIC(AVX_Xor, "Xor", // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // AVX2 Intrinsics -HARDWARE_INTRINSIC(AVX2_IsSupported, "get_IsSupported", AVX2, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(AVX2_Abs, "Abs", AVX2, -1, 32, 1, {INS_pabsb, INS_pabsb, INS_pabsw, INS_pabsw, INS_pabsd, INS_pabsd, INS_paddq, INS_paddq, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(AVX2_Add, "Add", AVX2, -1, 32, 2, {INS_paddb, INS_paddb, INS_paddw, INS_paddw, INS_paddd, INS_paddd, INS_paddq, INS_paddq, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_Commutative) HARDWARE_INTRINSIC(AVX2_AddSaturate, "AddSaturate", AVX2, -1, 32, 2, {INS_paddsb, INS_paddusb, INS_paddsw, INS_paddusw, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_Commutative) @@ -543,7 +531,6 @@ HARDWARE_INTRINSIC(AVX2_Xor, "Xor", // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // AES Intrinsics -HARDWARE_INTRINSIC(AES_IsSupported, "get_IsSupported", AES, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(AES_Decrypt, "Decrypt", AES, -1, 16, 2, {INS_invalid, INS_aesdec, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_NoFlag) HARDWARE_INTRINSIC(AES_DecryptLast, "DecryptLast", AES, -1, 16, 2, {INS_invalid, INS_aesdeclast, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_NoFlag) HARDWARE_INTRINSIC(AES_Encrypt, "Encrypt", AES, -1, 16, 2, {INS_invalid, INS_aesenc, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_NoFlag) @@ -556,7 +543,6 @@ HARDWARE_INTRINSIC(AES_KeygenAssist, "KeygenAssis // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // BMI1 Intrinsics -HARDWARE_INTRINSIC(BMI1_IsSupported, "get_IsSupported", BMI1, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(BMI1_AndNot, "AndNot", BMI1, -1, 0, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_andn, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(BMI1_ExtractLowestSetBit, "ExtractLowestSetBit", BMI1, -1, 0, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_blsi, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(BMI1_GetMaskUpToLowestSetBit, "GetMaskUpToLowestSetBit", BMI1, -1, 0, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_blsmsk, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics) @@ -569,7 +555,6 @@ HARDWARE_INTRINSIC(BMI1_BitFieldExtract, "BitFieldExt // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // BMI1 Intrinsics -HARDWARE_INTRINSIC(BMI1_X64_IsSupported, "get_IsSupported", BMI1_X64, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(BMI1_X64_AndNot, "AndNot", BMI1_X64, -1, 0, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_andn, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(BMI1_X64_ExtractLowestSetBit, "ExtractLowestSetBit", BMI1_X64, -1, 0, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_blsi, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(BMI1_X64_GetMaskUpToLowestSetBit, "GetMaskUpToLowestSetBit", BMI1_X64, -1, 0, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_blsmsk, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics) @@ -582,7 +567,6 @@ HARDWARE_INTRINSIC(BMI1_X64_BitFieldExtract, "BitFieldExt // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // BMI2 Intrinsics -HARDWARE_INTRINSIC(BMI2_IsSupported, "get_IsSupported", BMI2, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(BMI2_ParallelBitDeposit, "ParallelBitDeposit", BMI2, -1, 0, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_pdep, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(BMI2_ParallelBitExtract, "ParallelBitExtract", BMI2, -1, 0, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_pext, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(BMI2_ZeroHighBits, "ZeroHighBits", BMI2, -1, 0, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_bzhi, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics) @@ -593,7 +577,6 @@ HARDWARE_INTRINSIC(BMI2_MultiplyNoFlags, "MultiplyNoF // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // BMI2 Intrinsics -HARDWARE_INTRINSIC(BMI2_X64_IsSupported, "get_IsSupported", BMI2_X64, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(BMI2_X64_ParallelBitDeposit, "ParallelBitDeposit", BMI2_X64, -1, 0, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_pdep, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(BMI2_X64_ParallelBitExtract, "ParallelBitExtract", BMI2_X64, -1, 0, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_pext, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics) HARDWARE_INTRINSIC(BMI2_X64_ZeroHighBits, "ZeroHighBits", BMI2_X64, -1, 0, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_bzhi, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics) @@ -604,7 +587,6 @@ HARDWARE_INTRINSIC(BMI2_X64_MultiplyNoFlags, "MultiplyNoF // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // FMA Intrinsics -HARDWARE_INTRINSIC(FMA_IsSupported, "get_IsSupported", FMA, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(FMA_MultiplyAdd, "MultiplyAdd", FMA, -1, 0, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vfmadd213ps, INS_vfmadd213pd}, HW_Category_SimpleSIMD, HW_Flag_SpecialCodeGen|HW_Flag_UnfixedSIMDSize) HARDWARE_INTRINSIC(FMA_MultiplyAddNegated, "MultiplyAddNegated", FMA, -1, 0, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vfnmadd213ps, INS_vfnmadd213pd}, HW_Category_SimpleSIMD, HW_Flag_SpecialCodeGen|HW_Flag_UnfixedSIMDSize) HARDWARE_INTRINSIC(FMA_MultiplyAddNegatedScalar, "MultiplyAddNegatedScalar", FMA, -1, 16, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vfnmadd213ss, INS_vfnmadd213sd}, HW_Category_SIMDScalar, HW_Flag_SpecialCodeGen|HW_Flag_CopyUpperBits) @@ -621,7 +603,6 @@ HARDWARE_INTRINSIC(FMA_MultiplySubtractNegatedScalar, "MultiplySub // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // LZCNT Intrinsics -HARDWARE_INTRINSIC(LZCNT_IsSupported, "get_IsSupported", LZCNT, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(LZCNT_LeadingZeroCount, "LeadingZeroCount", LZCNT, -1, 0, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_lzcnt, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics|HW_Flag_MultiIns) // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** @@ -629,7 +610,6 @@ HARDWARE_INTRINSIC(LZCNT_LeadingZeroCount, "LeadingZero // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // LZCNT Intrinsics -HARDWARE_INTRINSIC(LZCNT_X64_IsSupported, "get_IsSupported", LZCNT_X64, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(LZCNT_X64_LeadingZeroCount, "LeadingZeroCount", LZCNT_X64, -1, 0, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_lzcnt, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics|HW_Flag_MultiIns) // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** @@ -637,7 +617,6 @@ HARDWARE_INTRINSIC(LZCNT_X64_LeadingZeroCount, "LeadingZero // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // PCLMULQDQ Intrinsics -HARDWARE_INTRINSIC(PCLMULQDQ_IsSupported, "get_IsSupported", PCLMULQDQ, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(PCLMULQDQ_CarrylessMultiply, "CarrylessMultiply", PCLMULQDQ, -1, 16, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_pclmulqdq, INS_pclmulqdq, INS_invalid, INS_invalid}, HW_Category_IMM, HW_Flag_FullRangeIMM) // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** @@ -645,7 +624,6 @@ HARDWARE_INTRINSIC(PCLMULQDQ_CarrylessMultiply, "CarrylessMu // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // POPCNT Intrinsics -HARDWARE_INTRINSIC(POPCNT_IsSupported, "get_IsSupported", POPCNT, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(POPCNT_PopCount, "PopCount", POPCNT, -1, 0, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_popcnt, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics|HW_Flag_MultiIns) // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** @@ -653,7 +631,6 @@ HARDWARE_INTRINSIC(POPCNT_PopCount, "PopCount", // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** // POPCNT Intrinsics -HARDWARE_INTRINSIC(POPCNT_X64_IsSupported, "get_IsSupported", POPCNT_X64, -1, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IsSupportedProperty, HW_Flag_NoFlag) HARDWARE_INTRINSIC(POPCNT_X64_PopCount, "PopCount", POPCNT_X64, -1, 0, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_popcnt, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed|HW_Flag_NoRMWSemantics|HW_Flag_MultiIns) #endif // FEATURE_HW_INTRINSIC diff --git a/src/coreclr/src/jit/hwintrinsicxarch.cpp b/src/coreclr/src/jit/hwintrinsicxarch.cpp index 2bc3c5c692fe0..8da12e55f2817 100644 --- a/src/coreclr/src/jit/hwintrinsicxarch.cpp +++ b/src/coreclr/src/jit/hwintrinsicxarch.cpp @@ -43,27 +43,31 @@ const HWIntrinsicInfo& HWIntrinsicInfo::lookup(NamedIntrinsic id) // // Return Value: // The NamedIntrinsic associated with methodName and isa -NamedIntrinsic HWIntrinsicInfo::lookupId(const char* className, const char* methodName, const char* enclosingClassName) +NamedIntrinsic HWIntrinsicInfo::lookupId(Compiler* comp, + const char* className, + const char* methodName, + const char* enclosingClassName) { // TODO-Throughput: replace sequential search by binary search - InstructionSet isa = lookupIsa(className, enclosingClassName); - JITDUMP("HW Intrinsic "); - if (enclosingClassName != nullptr) - { - JITDUMP("%s.", enclosingClassName); - } - JITDUMP("%s.%s: ", className, methodName); if (isa == InstructionSet_ILLEGAL) { // There are several platform-agnostic intrinsics (e.g., Vector64) that // are not supported in x86, so early return NI_Illegal - JITDUMP("Not supported"); return NI_Illegal; } - assert(methodName != nullptr); + bool isIsaSupported = comp->compSupports(isa) && comp->compSupportsHWIntrinsic(isa); + + if (strcmp(methodName, "get_IsSupported") == 0) + { + return isIsaSupported ? NI_IsSupported_True : NI_IsSupported_False; + } + else if (!isIsaSupported) + { + return NI_Throw_PlatformNotSupportedException; + } for (int i = 0; i < (NI_HW_INTRINSIC_END - NI_HW_INTRINSIC_START - 1); i++) { @@ -74,14 +78,12 @@ NamedIntrinsic HWIntrinsicInfo::lookupId(const char* className, const char* meth if (strcmp(methodName, hwIntrinsicInfoArray[i].name) == 0) { - JITDUMP("Supported"); return hwIntrinsicInfoArray[i].id; } } // There are several helper intrinsics that are implemented in managed code // Those intrinsics will hit this code path and need to return NI_Illegal - JITDUMP("Not supported"); return NI_Illegal; } @@ -772,20 +774,6 @@ GenTree* Compiler::impHWIntrinsic(NamedIntrinsic intrinsic, assert(sizeBytes != 0); } - // This intrinsic is supported if - // - the ISA is available on the underlying hardware (compSupports returns true) - // - the compiler supports this hardware intrinsics (compSupportsHWIntrinsic returns true) - bool issupported = compSupports(isa) && compSupportsHWIntrinsic(isa); - - if (category == HW_Category_IsSupportedProperty) - { - return gtNewIconNode(issupported); - } - // - calling to unsupported intrinsics must throw PlatforNotSupportedException - else if (!issupported) - { - return impUnsupportedHWIntrinsic(CORINFO_HELP_THROW_PLATFORM_NOT_SUPPORTED, method, sig, mustExpand); - } // Avoid checking stacktop for 0-op intrinsics if (sig->numArgs > 0 && HWIntrinsicInfo::isImmOp(intrinsic, impStackTop().val)) { diff --git a/src/coreclr/src/jit/hwintrinsicxarch.h b/src/coreclr/src/jit/hwintrinsicxarch.h index dbbb103d4e93c..30a4d9bddbcd4 100644 --- a/src/coreclr/src/jit/hwintrinsicxarch.h +++ b/src/coreclr/src/jit/hwintrinsicxarch.h @@ -15,10 +15,6 @@ enum HWIntrinsicCategory : unsigned int // - the codegen of overloads can be determined by intrinsicID and base type of returned vector HW_Category_SimpleSIMD, - // IsSupported Property - // - each ISA class has an "IsSupported" property - HW_Category_IsSupportedProperty, - // IMM intrinsics // - some SIMD intrinsics requires immediate value (i.e. imm8) to generate instruction HW_Category_IMM, @@ -129,7 +125,10 @@ struct HWIntrinsicInfo static const HWIntrinsicInfo& lookup(NamedIntrinsic id); - static NamedIntrinsic lookupId(const char* className, const char* methodName, const char* enclosingClassName); + static NamedIntrinsic lookupId(Compiler* comp, + const char* className, + const char* methodName, + const char* enclosingClassName); static InstructionSet lookupIsa(const char* className, const char* enclosingClassName); static unsigned lookupSimdSize(Compiler* comp, NamedIntrinsic id, CORINFO_SIG_INFO* sig); diff --git a/src/coreclr/src/jit/importer.cpp b/src/coreclr/src/jit/importer.cpp index 8dc9dab15b916..8600bf304cc59 100644 --- a/src/coreclr/src/jit/importer.cpp +++ b/src/coreclr/src/jit/importer.cpp @@ -3458,6 +3458,21 @@ GenTree* Compiler::impIntrinsic(GenTree* newobjThis, ni = lookupNamedIntrinsic(method); #ifdef FEATURE_HW_INTRINSICS + if (ni == NI_IsSupported_True) + { + return gtNewIconNode(true); + } + + if (ni == NI_IsSupported_False) + { + return gtNewIconNode(false); + } + + if (ni == NI_Throw_PlatformNotSupportedException) + { + return impUnsupportedHWIntrinsic(CORINFO_HELP_THROW_PLATFORM_NOT_SUPPORTED, method, sig, mustExpand); + } + if ((ni > NI_HW_INTRINSIC_START) && (ni < NI_HW_INTRINSIC_END)) { GenTree* hwintrinsic = impHWIntrinsic(ni, method, sig, mustExpand); @@ -4206,19 +4221,40 @@ GenTree* Compiler::impMathIntrinsic(CORINFO_METHOD_HANDLE method, NamedIntrinsic Compiler::lookupNamedIntrinsic(CORINFO_METHOD_HANDLE method) { - NamedIntrinsic result = NI_Illegal; - const char* className = nullptr; const char* namespaceName = nullptr; const char* enclosingClassName = nullptr; const char* methodName = info.compCompHnd->getMethodNameFromMetadata(method, &className, &namespaceName, &enclosingClassName); + JITDUMP("Named Intrinsic "); + + if (namespaceName != nullptr) + { + JITDUMP("%s.", namespaceName); + } + if (enclosingClassName != nullptr) + { + JITDUMP("%s.", enclosingClassName); + } + if (className != nullptr) + { + JITDUMP("%s", className); + } + if (methodName != nullptr) + { + JITDUMP("%s", methodName); + } + JITDUMP(": "); + if ((namespaceName == nullptr) || (className == nullptr) || (methodName == nullptr)) { - return result; + JITDUMP("Not recognized, not enough metadata\n"); + return NI_Illegal; } + NamedIntrinsic result = NI_Illegal; + if (strcmp(namespaceName, "System") == 0) { if ((strcmp(className, "Enum") == 0) && (strcmp(methodName, "HasFlag") == 0)) @@ -4272,16 +4308,36 @@ NamedIntrinsic Compiler::lookupNamedIntrinsic(CORINFO_METHOD_HANDLE method) #ifdef FEATURE_HW_INTRINSICS else if (strncmp(namespaceName, "System.Runtime.Intrinsics", 25) == 0) { + namespaceName += 25; #if defined(_TARGET_XARCH_) - result = HWIntrinsicInfo::lookupId(className, methodName, enclosingClassName); + if ((namespaceName[0] == '\0') || (strcmp(namespaceName, ".X86") == 0)) + { + result = HWIntrinsicInfo::lookupId(this, className, methodName, enclosingClassName); + } #elif defined(_TARGET_ARM64_) - result = lookupHWIntrinsic(className, methodName); + if ((namespaceName[0] == '\0') || (strcmp(namespaceName, ".Arm.Arm64") == 0)) + { + result = lookupHWIntrinsic(className, methodName); + } #else // !defined(_TARGET_XARCH_) && !defined(_TARGET_ARM64_) #error Unsupported platform #endif // !defined(_TARGET_XARCH_) && !defined(_TARGET_ARM64_) + else + { + assert(strcmp(methodName, "get_IsSupported") == 0); + return NI_IsSupported_False; + } } #endif // FEATURE_HW_INTRINSICS + if (result == NI_Illegal) + { + JITDUMP("Not recognized\n"); + } + else + { + JITDUMP("Recognized\n"); + } return result; } diff --git a/src/coreclr/src/jit/namedintrinsiclist.h b/src/coreclr/src/jit/namedintrinsiclist.h index 725e7713216c0..5f28e7033d411 100644 --- a/src/coreclr/src/jit/namedintrinsiclist.h +++ b/src/coreclr/src/jit/namedintrinsiclist.h @@ -10,6 +10,7 @@ enum NamedIntrinsic : unsigned short { NI_Illegal = 0, + NI_System_Enum_HasFlag, NI_System_Math_FusedMultiplyAdd, NI_System_Math_Round, @@ -19,20 +20,22 @@ enum NamedIntrinsic : unsigned short NI_System_Buffers_Binary_BinaryPrimitives_ReverseEndianness, #ifdef FEATURE_HW_INTRINSICS + NI_IsSupported_True, + NI_IsSupported_False, + NI_Throw_PlatformNotSupportedException, + NI_HW_INTRINSIC_START, #if defined(_TARGET_XARCH_) #define HARDWARE_INTRINSIC(id, name, isa, ival, size, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, category, flag) \ NI_##id, #include "hwintrinsiclistxarch.h" #elif defined(_TARGET_ARM64_) - NI_ARM64_IsSupported_False, - NI_ARM64_IsSupported_True, - NI_ARM64_PlatformNotSupported, #define HARDWARE_INTRINSIC(id, isa, name, form, ins0, ins1, ins2, flags) id, #include "hwintrinsiclistArm64.h" #endif // !defined(_TARGET_XARCH_) && !defined(_TARGET_ARM64_) NI_HW_INTRINSIC_END, #endif // FEATURE_HW_INTRINSICS + }; #endif // _NAMEDINTRINSICLIST_H_ diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Aes.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Aes.PlatformNotSupported.cs index ba9c310a63592..086589389f3a4 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Aes.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Aes.PlatformNotSupported.cs @@ -17,7 +17,8 @@ namespace System.Runtime.Intrinsics.Arm.Arm64 [CLSCompliant(false)] public static class Aes { - public static bool IsSupported { get { return false; } } + public static bool IsSupported { [Intrinsic] get { return false; } } + /// /// Performs AES single round decryption /// vaesdq_u8 (uint8x16_t data, uint8x16_t key) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Base.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Base.PlatformNotSupported.cs index a74e23829f54e..99fabb0a6a97e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Base.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Base.PlatformNotSupported.cs @@ -16,7 +16,7 @@ namespace System.Runtime.Intrinsics.Arm.Arm64 [CLSCompliant(false)] public static class Base { - public static bool IsSupported { get { return false; }} + public static bool IsSupported { [Intrinsic] get { return false; }} /// /// Vector LeadingSignCount diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Sha1.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Sha1.PlatformNotSupported.cs index 16a73c6393648..61474ea3826f5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Sha1.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Sha1.PlatformNotSupported.cs @@ -17,8 +17,7 @@ namespace System.Runtime.Intrinsics.Arm.Arm64 [CLSCompliant(false)] public static class Sha1 { - - public static bool IsSupported { get { return false; } } + public static bool IsSupported { [Intrinsic] get { return false; } } /// /// Performs SHA1 hash update choose form. diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Sha256.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Sha256.PlatformNotSupported.cs index f56cfa4597d90..2fbaf05eda842 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Sha256.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Sha256.PlatformNotSupported.cs @@ -17,7 +17,7 @@ namespace System.Runtime.Intrinsics.Arm.Arm64 [CLSCompliant(false)] public static class Sha256 { - public static bool IsSupported { get { return false; } } + public static bool IsSupported { [Intrinsic] get { return false; } } /// /// Performs SHA256 hash update (part 1). diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Simd.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Simd.PlatformNotSupported.cs index cefa1ed37ce8b..e7184b5739f64 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Simd.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Arm64/Simd.PlatformNotSupported.cs @@ -21,7 +21,7 @@ public static class Simd /// IsSupported property indicates whether any method provided /// by this class is supported by the current runtime. /// - public static bool IsSupported { get { return false; }} + public static bool IsSupported { [Intrinsic] get { return false; }} /// /// Vector abs diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Aes.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Aes.PlatformNotSupported.cs index 1a0dc5e8f0fa1..3d261d7c66986 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Aes.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Aes.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace System.Runtime.Intrinsics.X86 @@ -16,7 +17,7 @@ public abstract class Aes : Sse2 { internal Aes() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } /// /// __m128i _mm_aesdec_si128 (__m128i a, __m128i RoundKey) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Avx.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Avx.PlatformNotSupported.cs index 97d545dc3b921..a873913579d9a 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Avx.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Avx.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace System.Runtime.Intrinsics.X86 @@ -16,7 +17,7 @@ public abstract class Avx : Sse42 { internal Avx() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } /// /// __m256 _mm256_add_ps (__m256 a, __m256 b) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Avx2.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Avx2.PlatformNotSupported.cs index ad2244b7b1c30..6a7ca3c52add2 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Avx2.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Avx2.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace System.Runtime.Intrinsics.X86 @@ -16,7 +17,7 @@ public abstract class Avx2 : Avx { internal Avx2() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } /// /// __m256i _mm256_abs_epi8 (__m256i a) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Bmi1.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Bmi1.PlatformNotSupported.cs index 5281097e3bfd1..62c0dfd89414f 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Bmi1.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Bmi1.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace System.Runtime.Intrinsics.X86 @@ -16,13 +17,13 @@ public abstract class Bmi1 { internal Bmi1() { } - public static bool IsSupported { get { return false; } } + public static bool IsSupported { [Intrinsic] get { return false; } } public abstract class X64 { internal X64() { } - public static bool IsSupported { get { return false; } } + public static bool IsSupported { [Intrinsic] get { return false; } } /// /// unsigned __int64 _andn_u64 (unsigned __int64 a, unsigned __int64 b) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Bmi2.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Bmi2.PlatformNotSupported.cs index 7c32e712ae735..b78494e9c73bf 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Bmi2.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Bmi2.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace System.Runtime.Intrinsics.X86 @@ -16,13 +17,13 @@ public abstract class Bmi2 { internal Bmi2() { } - public static bool IsSupported { get { return false; } } + public static bool IsSupported { [Intrinsic] get { return false; } } public abstract class X64 { internal X64() { } - public static bool IsSupported { get { return false; } } + public static bool IsSupported { [Intrinsic] get { return false; } } /// /// unsigned __int64 _bzhi_u64 (unsigned __int64 a, unsigned int index) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Fma.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Fma.PlatformNotSupported.cs index 6d9c2931d4b2d..760aa40a1753a 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Fma.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Fma.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace System.Runtime.Intrinsics.X86 @@ -16,7 +17,7 @@ public abstract class Fma : Avx { internal Fma() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } /// /// __m128 _mm_fmadd_ps (__m128 a, __m128 b, __m128 c) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Lzcnt.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Lzcnt.PlatformNotSupported.cs index cdf23928f9b48..ce00865063213 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Lzcnt.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Lzcnt.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; namespace System.Runtime.Intrinsics.X86 { @@ -15,13 +16,13 @@ public abstract class Lzcnt { internal Lzcnt() { } - public static bool IsSupported { get { return false; } } + public static bool IsSupported { [Intrinsic] get { return false; } } public abstract class X64 { internal X64() { } - public static bool IsSupported { get { return false; } } + public static bool IsSupported { [Intrinsic] get { return false; } } /// /// unsigned __int64 _lzcnt_u64 (unsigned __int64 a) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Pclmulqdq.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Pclmulqdq.PlatformNotSupported.cs index 7ad63c407f5c7..b2b4898d38ecd 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Pclmulqdq.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Pclmulqdq.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace System.Runtime.Intrinsics.X86 @@ -16,7 +17,7 @@ public abstract class Pclmulqdq : Sse2 { internal Pclmulqdq() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } /// /// __m128i _mm_clmulepi64_si128 (__m128i a, __m128i b, const int imm8) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Popcnt.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Popcnt.PlatformNotSupported.cs index 0a46497d91f17..8fe62a1776eb2 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Popcnt.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Popcnt.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; namespace System.Runtime.Intrinsics.X86 { @@ -15,12 +16,14 @@ public abstract class Popcnt : Sse42 { internal Popcnt() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } public new abstract class X64 : Sse41.X64 { internal X64() { } - public new static bool IsSupported { get { return false; } } + + public new static bool IsSupported { [Intrinsic] get { return false; } } + /// /// __int64 _mm_popcnt_u64 (unsigned __int64 a) /// POPCNT reg64, reg/m64 diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse.PlatformNotSupported.cs index ce337e68775e6..4187dd27dfa41 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace System.Runtime.Intrinsics.X86 @@ -16,13 +17,13 @@ public abstract class Sse { internal Sse() { } - public static bool IsSupported { get { return false; } } + public static bool IsSupported { [Intrinsic] get { return false; } } public abstract class X64 { internal X64() { } - public static bool IsSupported { get { return false; } } + public static bool IsSupported { [Intrinsic] get { return false; } } /// /// __int64 _mm_cvtss_si64 (__m128 a) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse2.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse2.PlatformNotSupported.cs index 3085aba002e4c..7ad61f50c0291 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse2.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse2.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace System.Runtime.Intrinsics.X86 @@ -16,13 +17,13 @@ public abstract class Sse2 : Sse { internal Sse2() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } public new abstract class X64 : Sse.X64 { internal X64() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } /// /// __int64 _mm_cvtsd_si64 (__m128d a) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse3.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse3.PlatformNotSupported.cs index d97d4fd544d42..20bc6ae4cf191 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse3.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse3.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace System.Runtime.Intrinsics.X86 @@ -16,7 +17,7 @@ public abstract class Sse3 : Sse2 { internal Sse3() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } /// /// __m128 _mm_addsub_ps (__m128 a, __m128 b) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse41.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse41.PlatformNotSupported.cs index 25259a9578798..dfa5b568c73d0 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse41.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse41.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace System.Runtime.Intrinsics.X86 @@ -16,13 +17,13 @@ public abstract class Sse41 : Ssse3 { internal Sse41() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } public new abstract class X64 : Sse2.X64 { internal X64() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } /// /// __int64 _mm_extract_epi64 (__m128i a, const int imm8) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse42.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse42.PlatformNotSupported.cs index ace4a3f0ecf59..ac4b45af018d1 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse42.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Sse42.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace System.Runtime.Intrinsics.X86 @@ -16,13 +17,13 @@ public abstract class Sse42 : Sse41 { internal Sse42() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } public new abstract class X64 : Sse41.X64 { internal X64() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } /// /// unsigned __int64 _mm_crc32_u64 (unsigned __int64 crc, unsigned __int64 v) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Ssse3.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Ssse3.PlatformNotSupported.cs index 8aa0790e0333e..cd66c76161afc 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Ssse3.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Ssse3.PlatformNotSupported.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace System.Runtime.Intrinsics.X86 @@ -16,7 +17,7 @@ public abstract class Ssse3 : Sse3 { internal Ssse3() { } - public new static bool IsSupported { get { return false; } } + public new static bool IsSupported { [Intrinsic] get { return false; } } /// /// __m128i _mm_abs_epi8 (__m128i a)