From 54b86f18439397f51fbf4b14f6127a337446f3cf Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Thu, 31 Oct 2024 12:46:24 -0700 Subject: [PATCH] Remove the rest of the SimdAsHWIntrinsic support (#106594) --- src/coreclr/jit/CMakeLists.txt | 6 - src/coreclr/jit/compiler.h | 50 - src/coreclr/jit/fgbasic.cpp | 19 - src/coreclr/jit/hwintrinsicarm64.cpp | 2 +- src/coreclr/jit/hwintrinsicxarch.cpp | 2 +- src/coreclr/jit/importercalls.cpp | 203 ++- src/coreclr/jit/namedintrinsiclist.h | 12 - src/coreclr/jit/simdashwintrinsic.cpp | 1582 ------------------ src/coreclr/jit/simdashwintrinsic.h | 127 -- src/coreclr/jit/simdashwintrinsiclistarm64.h | 140 -- src/coreclr/jit/simdashwintrinsiclistxarch.h | 140 -- 11 files changed, 143 insertions(+), 2140 deletions(-) delete mode 100644 src/coreclr/jit/simdashwintrinsic.cpp delete mode 100644 src/coreclr/jit/simdashwintrinsic.h delete mode 100644 src/coreclr/jit/simdashwintrinsiclistarm64.h delete mode 100644 src/coreclr/jit/simdashwintrinsiclistxarch.h diff --git a/src/coreclr/jit/CMakeLists.txt b/src/coreclr/jit/CMakeLists.txt index a4e83a35b8c9d..4e89d8c31b1fb 100644 --- a/src/coreclr/jit/CMakeLists.txt +++ b/src/coreclr/jit/CMakeLists.txt @@ -200,7 +200,6 @@ set( JIT_AMD64_SOURCES lowerxarch.cpp lsraxarch.cpp simd.cpp - simdashwintrinsic.cpp simdcodegenxarch.cpp targetamd64.cpp unwindamd64.cpp @@ -227,7 +226,6 @@ set( JIT_I386_SOURCES lowerxarch.cpp lsraxarch.cpp simd.cpp - simdashwintrinsic.cpp simdcodegenxarch.cpp targetx86.cpp unwindx86.cpp @@ -245,7 +243,6 @@ set( JIT_ARM64_SOURCES lsraarmarch.cpp lsraarm64.cpp simd.cpp - simdashwintrinsic.cpp targetarm64.cpp unwindarmarch.cpp unwindarm64.cpp @@ -372,7 +369,6 @@ set( JIT_HEADERS scev.h sideeffects.h simd.h - simdashwintrinsic.h sm.h smallhash.h smcommon.h @@ -406,7 +402,6 @@ set( JIT_AMD64_HEADERS hwintrinsiclistxarch.h hwintrinsic.h instrsxarch.h - simdashwintrinsiclistxarch.h ) set( JIT_I386_HEADERS ${JIT_AMD64_HEADERS} ) @@ -420,7 +415,6 @@ set( JIT_ARM64_HEADERS instrsarm64.h instrsarm64sve.h registerarm64.h - simdashwintrinsiclistarm64.h ) set( JIT_ARM_HEADERS diff --git a/src/coreclr/jit/compiler.h b/src/coreclr/jit/compiler.h index 56410dfd3035a..215c9978128f8 100644 --- a/src/coreclr/jit/compiler.h +++ b/src/coreclr/jit/compiler.h @@ -65,7 +65,6 @@ inline var_types genActualType(T value); #include "hwintrinsic.h" #include "simd.h" -#include "simdashwintrinsic.h" #include "jitmetadata.h" @@ -2607,7 +2606,6 @@ class Compiler #ifdef FEATURE_HW_INTRINSICS friend struct GenTreeHWIntrinsic; friend struct HWIntrinsicInfo; - friend struct SimdAsHWIntrinsicInfo; #endif // FEATURE_HW_INTRINSICS #ifndef TARGET_64BIT @@ -3160,41 +3158,6 @@ class Compiler CorInfoType simdBaseJitType, unsigned simdSize); - GenTreeHWIntrinsic* gtNewSimdAsHWIntrinsicNode(var_types type, - NamedIntrinsic hwIntrinsicID, - CorInfoType simdBaseJitType, - unsigned simdSize) - { - return gtNewSimdHWIntrinsicNode(type, hwIntrinsicID, simdBaseJitType, simdSize); - } - - GenTreeHWIntrinsic* gtNewSimdAsHWIntrinsicNode( - var_types type, GenTree* op1, NamedIntrinsic hwIntrinsicID, CorInfoType simdBaseJitType, unsigned simdSize) - { - return gtNewSimdHWIntrinsicNode(type, op1, hwIntrinsicID, simdBaseJitType, simdSize); - } - - GenTreeHWIntrinsic* gtNewSimdAsHWIntrinsicNode(var_types type, - GenTree* op1, - GenTree* op2, - NamedIntrinsic hwIntrinsicID, - CorInfoType simdBaseJitType, - unsigned simdSize) - { - return gtNewSimdHWIntrinsicNode(type, op1, op2, hwIntrinsicID, simdBaseJitType, simdSize); - } - - GenTreeHWIntrinsic* gtNewSimdAsHWIntrinsicNode(var_types type, - GenTree* op1, - GenTree* op2, - GenTree* op3, - NamedIntrinsic hwIntrinsicID, - CorInfoType simdBaseJitType, - unsigned simdSize) - { - return gtNewSimdHWIntrinsicNode(type, op1, op2, op3, hwIntrinsicID, simdBaseJitType, simdSize); - } - GenTree* gtNewSimdAbsNode( var_types type, GenTree* op1, CorInfoType simdBaseJitType, unsigned simdSize); @@ -4685,23 +4648,10 @@ class Compiler CORINFO_SIG_INFO* sig R2RARG(CORINFO_CONST_LOOKUP* entryPoint), bool mustExpand); - GenTree* impSimdAsHWIntrinsic(NamedIntrinsic intrinsic, - CORINFO_CLASS_HANDLE clsHnd, - CORINFO_METHOD_HANDLE method, - CORINFO_SIG_INFO* sig, - bool mustExpand); protected: bool compSupportsHWIntrinsic(CORINFO_InstructionSet isa); - GenTree* impSimdAsHWIntrinsicSpecial(NamedIntrinsic intrinsic, - CORINFO_CLASS_HANDLE clsHnd, - CORINFO_SIG_INFO* sig, - var_types retType, - CorInfoType simdBaseJitType, - unsigned simdSize, - bool mustExpand); - GenTree* impSpecialIntrinsic(NamedIntrinsic intrinsic, CORINFO_CLASS_HANDLE clsHnd, CORINFO_METHOD_HANDLE method, diff --git a/src/coreclr/jit/fgbasic.cpp b/src/coreclr/jit/fgbasic.cpp index 7153de98b9f2b..be84f883a6426 100644 --- a/src/coreclr/jit/fgbasic.cpp +++ b/src/coreclr/jit/fgbasic.cpp @@ -1246,7 +1246,6 @@ void Compiler::fgFindJumpTargets(const BYTE* codeAddr, IL_OFFSET codeSize, Fixed case NI_Vector128_Create: case NI_Vector128_CreateScalar: case NI_Vector128_CreateScalarUnsafe: - case NI_VectorT_Create: #if defined(TARGET_XARCH) case NI_BMI1_TrailingZeroCount: case NI_BMI1_X64_TrailingZeroCount: @@ -1501,21 +1500,6 @@ void Compiler::fgFindJumpTargets(const BYTE* codeAddr, IL_OFFSET codeSize, Fixed case NI_Vector128_AsUInt64: case NI_Vector128_AsVector4: case NI_Vector128_op_UnaryPlus: - case NI_VectorT_As: - case NI_VectorT_AsVectorByte: - case NI_VectorT_AsVectorDouble: - case NI_VectorT_AsVectorInt16: - case NI_VectorT_AsVectorInt32: - case NI_VectorT_AsVectorInt64: - case NI_VectorT_AsVectorNInt: - case NI_VectorT_AsVectorNUInt: - case NI_VectorT_AsVectorSByte: - case NI_VectorT_AsVectorSingle: - case NI_VectorT_AsVectorUInt16: - case NI_VectorT_AsVectorUInt32: - case NI_VectorT_AsVectorUInt64: - case NI_VectorT_op_Explicit: - case NI_VectorT_op_UnaryPlus: #if defined(TARGET_XARCH) case NI_Vector256_As: case NI_Vector256_AsByte: @@ -1570,9 +1554,6 @@ void Compiler::fgFindJumpTargets(const BYTE* codeAddr, IL_OFFSET codeSize, Fixed case NI_Vector128_get_AllBitsSet: case NI_Vector128_get_One: case NI_Vector128_get_Zero: - case NI_VectorT_get_AllBitsSet: - case NI_VectorT_get_One: - case NI_VectorT_get_Zero: #if defined(TARGET_XARCH) case NI_Vector256_get_AllBitsSet: case NI_Vector256_get_One: diff --git a/src/coreclr/jit/hwintrinsicarm64.cpp b/src/coreclr/jit/hwintrinsicarm64.cpp index afe933da87c3f..75d32b86e37fd 100644 --- a/src/coreclr/jit/hwintrinsicarm64.cpp +++ b/src/coreclr/jit/hwintrinsicarm64.cpp @@ -1264,7 +1264,7 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic, } impSpillSideEffect(true, verCurrentState.esStackDepth - - 2 DEBUGARG("Spilling op1 side effects for SimdAsHWIntrinsic")); + 2 DEBUGARG("Spilling op1 side effects for vector CreateSequence")); op2 = impPopStack().val; op1 = impPopStack().val; diff --git a/src/coreclr/jit/hwintrinsicxarch.cpp b/src/coreclr/jit/hwintrinsicxarch.cpp index a833b5733d52c..95d96fb63180f 100644 --- a/src/coreclr/jit/hwintrinsicxarch.cpp +++ b/src/coreclr/jit/hwintrinsicxarch.cpp @@ -2361,7 +2361,7 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic, } impSpillSideEffect(true, verCurrentState.esStackDepth - - 2 DEBUGARG("Spilling op1 side effects for SimdAsHWIntrinsic")); + 2 DEBUGARG("Spilling op1 side effects for vector CreateSequence")); op2 = impPopStack().val; op1 = impPopStack().val; diff --git a/src/coreclr/jit/importercalls.cpp b/src/coreclr/jit/importercalls.cpp index aaaa030131261..7ba613e61053c 100644 --- a/src/coreclr/jit/importercalls.cpp +++ b/src/coreclr/jit/importercalls.cpp @@ -3214,73 +3214,47 @@ GenTree* Compiler::impIntrinsic(CORINFO_CLASS_HANDLE clsHnd, } #ifdef FEATURE_HW_INTRINSICS - if ((ni > NI_HW_INTRINSIC_START) && (ni < NI_SIMD_AS_HWINTRINSIC_END)) + if ((ni > NI_HW_INTRINSIC_START) && (ni < NI_HW_INTRINSIC_END)) { static_assert_no_msg(NI_HW_INTRINSIC_START < NI_HW_INTRINSIC_END); - static_assert_no_msg(NI_SIMD_AS_HWINTRINSIC_START < NI_SIMD_AS_HWINTRINSIC_END); - static_assert_no_msg((NI_HW_INTRINSIC_END + 1) == NI_SIMD_AS_HWINTRINSIC_START); - - if (ni < NI_HW_INTRINSIC_END) + if (!isIntrinsic) { - assert(ni > NI_HW_INTRINSIC_START); - - if (!isIntrinsic) - { #if defined(TARGET_XARCH) - // We can't guarantee that all overloads for the xplat intrinsics can be - // handled by the AltJit, so limit only the platform specific intrinsics - assert((LAST_NI_Vector512 + 1) == FIRST_NI_X86Base); + // We can't guarantee that all overloads for the xplat intrinsics can be + // handled by the AltJit, so limit only the platform specific intrinsics + assert((LAST_NI_Vector512 + 1) == FIRST_NI_X86Base); - if (ni < LAST_NI_Vector512) + if (ni < LAST_NI_Vector512) #elif defined(TARGET_ARM64) - // We can't guarantee that all overloads for the xplat intrinsics can be - // handled by the AltJit, so limit only the platform specific intrinsics - assert((LAST_NI_Vector128 + 1) == FIRST_NI_AdvSimd); + // We can't guarantee that all overloads for the xplat intrinsics can be + // handled by the AltJit, so limit only the platform specific intrinsics + assert((LAST_NI_Vector128 + 1) == FIRST_NI_AdvSimd); - if (ni < LAST_NI_Vector128) + if (ni < LAST_NI_Vector128) #else #error Unsupported platform #endif - { - // Several of the NI_Vector64/128/256 APIs do not have - // all overloads as intrinsic today so they will assert - return nullptr; - } - } - - GenTree* hwintrinsic = impHWIntrinsic(ni, clsHnd, method, sig R2RARG(entryPoint), mustExpand); - - if (hwintrinsic == nullptr) { - if (mustExpand) - { - return impUnsupportedNamedIntrinsic(CORINFO_HELP_THROW_NOT_IMPLEMENTED, method, sig, mustExpand); - } + // Several of the NI_Vector64/128/256 APIs do not have + // all overloads as intrinsic today so they will assert return nullptr; } - - // Fold result, if possible - return gtFoldExpr(hwintrinsic); } - else - { - assert((ni > NI_SIMD_AS_HWINTRINSIC_START) && (ni < NI_SIMD_AS_HWINTRINSIC_END)); - if (isIntrinsic) - { - GenTree* hwintrinsic = impSimdAsHWIntrinsic(ni, clsHnd, method, sig, mustExpand); + GenTree* hwintrinsic = impHWIntrinsic(ni, clsHnd, method, sig R2RARG(entryPoint), mustExpand); - if (hwintrinsic == nullptr) - { - assert(!mustExpand); - return nullptr; - } - - // Fold result, if possible - return gtFoldExpr(hwintrinsic); + if (hwintrinsic == nullptr) + { + if (mustExpand) + { + return impUnsupportedNamedIntrinsic(CORINFO_HELP_THROW_NOT_IMPLEMENTED, method, sig, mustExpand); } + return nullptr; } + + // Fold result, if possible + return gtFoldExpr(hwintrinsic); } #endif // FEATURE_HW_INTRINSICS @@ -10563,24 +10537,129 @@ NamedIntrinsic Compiler::lookupNamedIntrinsic(CORINFO_METHOD_HANDLE method) else { #ifdef FEATURE_HW_INTRINSICS - if (strncmp(methodName, - "System.Runtime.Intrinsics.ISimdVector APIs to still be expanded where - // possible but, they all prefix the qualified name of the interface first, so we'll check - // for that and skip the prefix before trying to resolve the method. + if (strncmp(methodName, + "System.Runtime.Intrinsics.ISimdVector APIs to still be expanded where + // possible but, they all prefix the qualified name of the interface first, so we'll + // check for that and skip the prefix before trying to resolve the method. + + if (strncmp(methodName + 70, ",T>.", 7) == 0) + { + methodName += 77; + } + } + + uint32_t size = getVectorTByteLength(); + assert((size == 16) || (size == 32) || (size == 64)); + + const char* lookupClassName = className; + + switch (size) + { + case 16: + { + lookupClassName = isVectorT ? "Vector128`1" : "Vector128"; + break; + } + + case 32: + { + lookupClassName = isVectorT ? "Vector256`1" : "Vector256"; + break; + } + + case 64: + { + lookupClassName = isVectorT ? "Vector512`1" : "Vector512"; + break; + } + + default: + { + unreached(); + } + } - if (strncmp(methodName + 70, ",T>.", 7) == 0) + const char* lookupMethodName = methodName; + + if ((strncmp(methodName, "As", 2) == 0) && (methodName[2] != '\0')) { - methodName += 77; + if (strncmp(methodName + 2, "Vector", 6) == 0) + { + if (strcmp(methodName + 8, "Byte") == 0) + { + lookupMethodName = "AsByte"; + } + else if (strcmp(methodName + 8, "Double") == 0) + { + lookupMethodName = "AsDouble"; + } + else if (strcmp(methodName + 8, "Int16") == 0) + { + lookupMethodName = "AsInt16"; + } + else if (strcmp(methodName + 8, "Int32") == 0) + { + lookupMethodName = "AsInt32"; + } + else if (strcmp(methodName + 8, "Int64") == 0) + { + lookupMethodName = "AsInt64"; + } + else if (strcmp(methodName + 8, "NInt") == 0) + { + lookupMethodName = "AsNInt"; + } + else if (strcmp(methodName + 8, "NUInt") == 0) + { + lookupMethodName = "AsNUInt"; + } + else if (strcmp(methodName + 8, "SByte") == 0) + { + lookupMethodName = "AsSByte"; + } + else if (strcmp(methodName + 8, "Single") == 0) + { + lookupMethodName = "AsSingle"; + } + else if (strcmp(methodName + 8, "UInt16") == 0) + { + lookupMethodName = "AsUInt16"; + } + else if (strcmp(methodName + 8, "UInt32") == 0) + { + lookupMethodName = "AsUInt32"; + } + else if (strcmp(methodName + 8, "UInt64") == 0) + { + lookupMethodName = "AsUInt64"; + } + } + + if (lookupMethodName == methodName) + { + // There are several other As prefixed APIs + // which represent extension methods for + // Vector2/3/4 Matrix4x4, Quaternion, or Plane + lookupMethodName = nullptr; + } } - } - CORINFO_SIG_INFO sig; - info.compCompHnd->getMethodSig(method, &sig); + if (lookupMethodName != nullptr) + { + CORINFO_SIG_INFO sig; + info.compCompHnd->getMethodSig(method, &sig); - result = - SimdAsHWIntrinsicInfo::lookupId(this, &sig, className, methodName, enclosingClassNames[0]); + result = HWIntrinsicInfo::lookupId(this, &sig, lookupClassName, lookupMethodName, + enclosingClassNames[0], enclosingClassNames[1]); + } + } #endif // FEATURE_HW_INTRINSICS if (result == NI_Illegal) @@ -10614,7 +10693,7 @@ NamedIntrinsic Compiler::lookupNamedIntrinsic(CORINFO_METHOD_HANDLE method) { // Otherwise mark this as a general intrinsic in the namespace // so we can still get the inlining profitability boost. - result = NI_System_Runtime_Intrinsics_Intrinsic; + result = NI_System_Numerics_Intrinsic; } } } @@ -10880,7 +10959,7 @@ NamedIntrinsic Compiler::lookupNamedIntrinsic(CORINFO_METHOD_HANDLE method) { // Otherwise mark this as a general intrinsic in the namespace // so we can still get the inlining profitability boost. - result = NI_System_Numerics_Intrinsic; + result = NI_System_Runtime_Intrinsics_Intrinsic; } } } diff --git a/src/coreclr/jit/namedintrinsiclist.h b/src/coreclr/jit/namedintrinsiclist.h index da753e875399b..b4de4cc920e9a 100644 --- a/src/coreclr/jit/namedintrinsiclist.h +++ b/src/coreclr/jit/namedintrinsiclist.h @@ -165,18 +165,6 @@ enum NamedIntrinsic : unsigned short #include "hwintrinsiclistarm64.h" #endif // !defined(TARGET_XARCH) && !defined(TARGET_ARM64) NI_HW_INTRINSIC_END, - - NI_SIMD_AS_HWINTRINSIC_START, -#if defined(TARGET_XARCH) -#define SIMD_AS_HWINTRINSIC(classId, id, name, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, flag) \ - NI_##classId##_##id, -#include "simdashwintrinsiclistxarch.h" -#elif defined(TARGET_ARM64) -#define SIMD_AS_HWINTRINSIC(classId, id, name, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, flag) \ - NI_##classId##_##id, -#include "simdashwintrinsiclistarm64.h" -#endif // !defined(TARGET_XARCH) && !defined(TARGET_ARM64) - NI_SIMD_AS_HWINTRINSIC_END, #endif // FEATURE_HW_INTRINSICS #if defined(FEATURE_SIMD) diff --git a/src/coreclr/jit/simdashwintrinsic.cpp b/src/coreclr/jit/simdashwintrinsic.cpp deleted file mode 100644 index fbd4762544644..0000000000000 --- a/src/coreclr/jit/simdashwintrinsic.cpp +++ /dev/null @@ -1,1582 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -#include "jitpch.h" -#include "simdashwintrinsic.h" - -#ifdef FEATURE_HW_INTRINSICS - -static const SimdAsHWIntrinsicInfo simdAsHWIntrinsicInfoArray[] = { -// clang-format off -#if defined(TARGET_XARCH) -#define SIMD_AS_HWINTRINSIC(classId, id, name, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, flag) \ - {NI_##classId##_##id, name, SimdAsHWIntrinsicClassId::classId, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, static_cast(flag)}, -#include "simdashwintrinsiclistxarch.h" -#elif defined(TARGET_ARM64) -#define SIMD_AS_HWINTRINSIC(classId, id, name, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, flag) \ - {NI_##classId##_##id, name, SimdAsHWIntrinsicClassId::classId, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, static_cast(flag)}, -#include "simdashwintrinsiclistarm64.h" -#else -#error Unsupported platform -#endif - // clang-format on -}; - -//------------------------------------------------------------------------ -// lookup: Gets the SimdAsHWIntrinsicInfo associated with a given NamedIntrinsic -// -// Arguments: -// id -- The NamedIntrinsic associated with the SimdAsHWIntrinsic to lookup -// -// Return Value: -// The SimdAsHWIntrinsicInfo associated with id -const SimdAsHWIntrinsicInfo& SimdAsHWIntrinsicInfo::lookup(NamedIntrinsic id) -{ - assert(id != NI_Illegal); - - assert(id > NI_SIMD_AS_HWINTRINSIC_START); - assert(id < NI_SIMD_AS_HWINTRINSIC_END); - - return simdAsHWIntrinsicInfoArray[id - NI_SIMD_AS_HWINTRINSIC_START - 1]; -} - -//------------------------------------------------------------------------ -// lookupId: Gets the NamedIntrinsic for a given method name and InstructionSet -// -// Arguments: -// comp -- The compiler -// sig -- The signature of the intrinsic -// className -- The name of the class associated with the SimdIntrinsic to lookup -// methodName -- The name of the method associated with the SimdIntrinsic to lookup -// enclosingClassName -- The name of the enclosing class -// -// Return Value: -// The NamedIntrinsic associated with methodName and classId -NamedIntrinsic SimdAsHWIntrinsicInfo::lookupId(Compiler* comp, - CORINFO_SIG_INFO* sig, - const char* className, - const char* methodName, - const char* enclosingClassName) -{ - SimdAsHWIntrinsicClassId classId = lookupClassId(comp, className, enclosingClassName); - - if (classId == SimdAsHWIntrinsicClassId::Unknown) - { - return NI_Illegal; - } - - unsigned numArgs = sig->numArgs; - - if (sig->hasThis()) - { - return NI_Illegal; - } - - if (classId == SimdAsHWIntrinsicClassId::Vector) - { - // We want to avoid doing anything that would unnecessarily trigger a recorded dependency against Vector - // so we duplicate a few checks here to ensure this works smoothly for the static Vector class. - - if (strcmp(methodName, "get_IsHardwareAccelerated") == 0) - { - return comp->IsBaselineSimdIsaSupported() ? NI_IsSupported_True : NI_IsSupported_False; - } - - var_types retType = JITtype2varType(sig->retType); - CorInfoType simdBaseJitType = CORINFO_TYPE_UNDEF; - CORINFO_CLASS_HANDLE argClass = NO_CLASS_HANDLE; - - if (retType == TYP_STRUCT) - { - argClass = sig->retTypeSigClass; - } - else - { - assert(numArgs != 0); - argClass = comp->info.compCompHnd->getArgClass(sig, sig->args); - } - - const char* argNamespaceName; - const char* argClassName = comp->getClassNameFromMetadata(argClass, &argNamespaceName); - - classId = lookupClassId(comp, argClassName, nullptr); - - if (classId == SimdAsHWIntrinsicClassId::Unknown) - { - return NI_Illegal; - } - assert(classId != SimdAsHWIntrinsicClassId::Vector); - } - - assert(strcmp(methodName, "get_IsHardwareAccelerated") != 0); - - for (int i = 0; i < (NI_SIMD_AS_HWINTRINSIC_END - NI_SIMD_AS_HWINTRINSIC_START - 1); i++) - { - const SimdAsHWIntrinsicInfo& intrinsicInfo = simdAsHWIntrinsicInfoArray[i]; - - if (classId != intrinsicInfo.classId) - { - continue; - } - - if (numArgs != static_cast(intrinsicInfo.numArgs)) - { - continue; - } - - if (strcmp(methodName, intrinsicInfo.name) != 0) - { - continue; - } - - return intrinsicInfo.id; - } - - return NI_Illegal; -} - -//------------------------------------------------------------------------ -// lookupClassId: Gets the SimdAsHWIntrinsicClassId for a given class name and enclsoing class name -// -// Arguments: -// comp -- The compiler -// className -- The name of the class associated with the SimdAsHWIntrinsicClassId to lookup -// enclosingClassName -- The name of the enclosing class -// -// Return Value: -// The SimdAsHWIntrinsicClassId associated with className and enclosingClassName -SimdAsHWIntrinsicClassId SimdAsHWIntrinsicInfo::lookupClassId(Compiler* comp, - const char* className, - const char* enclosingClassName) -{ - if ((className == nullptr) || (enclosingClassName != nullptr)) - { - return SimdAsHWIntrinsicClassId::Unknown; - } - - switch (className[0]) - { - case 'V': - { - if (strncmp(className, "Vector", 6) != 0) - { - break; - } - - className += 6; - - if (className[0] == '\0') - { - return SimdAsHWIntrinsicClassId::Vector; - } - else if (strcmp(className, "`1") == 0) - { - uint32_t vectorTByteLength = comp->getVectorTByteLength(); - -#if defined(TARGET_XARCH) - if ((vectorTByteLength == 16) || (vectorTByteLength == 32) || (vectorTByteLength == 64)) -#else - if (vectorTByteLength == 16) -#endif - { - return SimdAsHWIntrinsicClassId::VectorT; - } - - // We return unknown for any unsupported size - return SimdAsHWIntrinsicClassId::Unknown; - } - break; - } - - default: - { - break; - } - } - - return SimdAsHWIntrinsicClassId::Unknown; -} - -//------------------------------------------------------------------------ -// impSimdAsIntrinsic: Import a SIMD intrinsic as a GT_HWINTRINSIC node if possible -// -// Arguments: -// intrinsic -- id of the intrinsic function. -// clsHnd -- class handle containing the intrinsic function. -// method -- method handle of the intrinsic function. -// sig -- signature of the intrinsic call -// mustExpand -- true if the intrinsic must return a GenTree*; otherwise, false -// -// Return Value: -// The GT_HWINTRINSIC node, or nullptr if not a supported intrinsic -// -GenTree* Compiler::impSimdAsHWIntrinsic(NamedIntrinsic intrinsic, - CORINFO_CLASS_HANDLE clsHnd, - CORINFO_METHOD_HANDLE method, - CORINFO_SIG_INFO* sig, - bool mustExpand) -{ - if (!IsBaselineSimdIsaSupported()) - { - // The user disabled support for the baseline ISA so - // don't emit any SIMD intrinsics as they all require - // this at a minimum - return nullptr; - } - - // NextCallRetAddr requires a CALL, so return nullptr. - if (info.compHasNextCallRetAddr) - { - return nullptr; - } - - CORINFO_CLASS_HANDLE argClass = NO_CLASS_HANDLE; - var_types retType = genActualType(JITtype2varType(sig->retType)); - CorInfoType simdBaseJitType = CORINFO_TYPE_UNDEF; - var_types simdType = TYP_UNKNOWN; - unsigned simdSize = 0; - unsigned numArgs = sig->numArgs; - - // We want to resolve and populate the handle cache for this type even - // if it isn't the basis for anything carried on the node. - simdBaseJitType = getBaseJitTypeAndSizeOfSIMDType(clsHnd, &simdSize); - - if ((clsHnd != m_simdHandleCache->VectorHandle) && - ((simdBaseJitType == CORINFO_TYPE_UNDEF) || !varTypeIsArithmetic(JitType2PreciseVarType(simdBaseJitType)))) - { - // We want to exit early if the clsHnd should have a base type and it isn't one - // of the supported types. This handles cases like op_Explicit which take a Vector - return nullptr; - } - - if (retType == TYP_STRUCT) - { - simdBaseJitType = getBaseJitTypeAndSizeOfSIMDType(sig->retTypeSigClass, &simdSize); - if ((simdBaseJitType == CORINFO_TYPE_UNDEF) || !varTypeIsArithmetic(JitType2PreciseVarType(simdBaseJitType)) || - (simdSize == 0)) - { - // Unsupported type - return nullptr; - } - retType = getSIMDTypeForSize(simdSize); - } - else if (numArgs != 0) - { - if (sig->hasThis() && (retType == TYP_VOID)) - { - simdBaseJitType = strip(info.compCompHnd->getArgType(sig, sig->args, &argClass)); - } - else - { - argClass = info.compCompHnd->getArgClass(sig, sig->args); - simdBaseJitType = getBaseJitTypeAndSizeOfSIMDType(argClass, &simdSize); - } - } - - assert(!sig->hasThis()); - - if ((clsHnd == m_simdHandleCache->VectorHandle) && (numArgs != 0) && - !SimdAsHWIntrinsicInfo::KeepBaseTypeFromRet(intrinsic)) - { - // We need to fixup the clsHnd in the case we are an intrinsic on Vector - // The first argument will be the appropriate Vector handle to use - clsHnd = info.compCompHnd->getArgClass(sig, sig->args); - - // We also need to adjust the simdBaseJitType as some methods on Vector return - // a type different than the operation we need to perform. An example - // is LessThan or Equals which takes double but returns long. This is - // unlike the counterparts on Vector which take a return the same type. - simdBaseJitType = getBaseJitTypeAndSizeOfSIMDType(clsHnd, &simdSize); - } - - if ((simdBaseJitType == CORINFO_TYPE_UNDEF) || !varTypeIsArithmetic(JitType2PreciseVarType(simdBaseJitType)) || - (simdSize == 0)) - { - // We get here for a devirtualization of IEquatable`1.Equals - // or if the user tries to use Vector with an unsupported type - return nullptr; - } - - var_types simdBaseType = JitType2PreciseVarType(simdBaseJitType); - simdType = getSIMDTypeForSize(simdSize); - assert(varTypeIsSIMD(simdType)); - - NamedIntrinsic hwIntrinsic = SimdAsHWIntrinsicInfo::lookupHWIntrinsic(intrinsic, simdBaseType); - - if ((hwIntrinsic == NI_Illegal) || !varTypeIsSIMD(simdType)) - { - // The simdBaseJitType isn't supported by the intrinsic - return nullptr; - } - - // Set `compFloatingPointUsed` to cover the scenario where an intrinsic - // is operating on SIMD fields, but where no SIMD local vars are in use. - compFloatingPointUsed = true; - - if (hwIntrinsic == intrinsic) - { - // The SIMD intrinsic requires special handling outside the normal code path - return impSimdAsHWIntrinsicSpecial(intrinsic, clsHnd, sig, retType, simdBaseJitType, simdSize, mustExpand); - } - - CORINFO_InstructionSet hwIntrinsicIsa = HWIntrinsicInfo::lookupIsa(hwIntrinsic); - - if (!compOpportunisticallyDependsOn(hwIntrinsicIsa)) - { - // The JIT doesn't support the required ISA - return nullptr; - } - - CORINFO_ARG_LIST_HANDLE argList = sig->args; - var_types argType = TYP_UNKNOWN; - - GenTree* op1 = nullptr; - GenTree* op2 = nullptr; - - switch (numArgs) - { - case 0: - { - return gtNewSimdAsHWIntrinsicNode(retType, hwIntrinsic, simdBaseJitType, simdSize); - } - - case 1: - { - argType = JITtype2varType(strip(info.compCompHnd->getArgType(sig, argList, &argClass))); - op1 = getArgForHWIntrinsic(argType, argClass); - - return gtNewSimdAsHWIntrinsicNode(retType, op1, hwIntrinsic, simdBaseJitType, simdSize); - } - - case 2: - { - if (SimdAsHWIntrinsicInfo::SpillSideEffectsOp1(intrinsic)) - { - impSpillSideEffect(true, verCurrentState.esStackDepth - - 2 DEBUGARG("Spilling op1 side effects for SimdAsHWIntrinsic")); - } - - assert(!SimdAsHWIntrinsicInfo::SpillSideEffectsOp2(intrinsic)); - - CORINFO_ARG_LIST_HANDLE arg2 = info.compCompHnd->getArgNext(argList); - argType = JITtype2varType(strip(info.compCompHnd->getArgType(sig, arg2, &argClass))); - op2 = getArgForHWIntrinsic(argType, argClass); - - argType = JITtype2varType(strip(info.compCompHnd->getArgType(sig, argList, &argClass))); - op1 = getArgForHWIntrinsic(argType, argClass); - - return gtNewSimdAsHWIntrinsicNode(retType, op1, op2, hwIntrinsic, simdBaseJitType, simdSize); - } - } - - assert(!"Unexpected SimdAsHWIntrinsic"); - return nullptr; -} - -//------------------------------------------------------------------------ -// impSimdAsHWIntrinsicSpecial: Import a SIMD intrinsic as a GT_HWINTRINSIC node if possible -// This method handles cases which cannot be table driven -// -// Arguments: -// intrinsic -- id of the intrinsic function. -// clsHnd -- class handle containing the intrinsic function. -// sig -- signature of the intrinsic call -// retType -- the return type of the intrinsic call -// simdBaseJitType -- the base JIT type of SIMD type of the intrinsic -// simdSize -- the size of the SIMD type of the intrinsic -// mustExpand -- true if the intrinsic must return a GenTree*; otherwise, false -// -// Return Value: -// The GT_HWINTRINSIC node, or nullptr if not a supported intrinsic -// -GenTree* Compiler::impSimdAsHWIntrinsicSpecial(NamedIntrinsic intrinsic, - CORINFO_CLASS_HANDLE clsHnd, - CORINFO_SIG_INFO* sig, - var_types retType, - CorInfoType simdBaseJitType, - unsigned simdSize, - bool mustExpand) -{ - var_types simdBaseType = JitType2PreciseVarType(simdBaseJitType); - - assert(retType != TYP_UNKNOWN); - assert(varTypeIsArithmetic(simdBaseType)); - assert(simdSize != 0); - assert(SimdAsHWIntrinsicInfo::lookupHWIntrinsic(intrinsic, simdBaseType) == intrinsic); - - var_types simdType = getSIMDTypeForSize(simdSize); - assert(varTypeIsSIMD(simdType)); - - CORINFO_ARG_LIST_HANDLE argList = sig->args; - var_types argType = TYP_UNKNOWN; - CORINFO_CLASS_HANDLE argClass = NO_CLASS_HANDLE; - - GenTree* op1 = nullptr; - GenTree* op2 = nullptr; - GenTree* op3 = nullptr; - GenTree* op4 = nullptr; - GenTree* op5 = nullptr; - - unsigned numArgs = sig->numArgs; - assert(!sig->hasThis()); - -#if defined(TARGET_XARCH) - // We should have already exited early if SSE2 isn't supported - assert(compIsaSupportedDebugOnly(InstructionSet_SSE2)); - - if (SimdAsHWIntrinsicInfo::lookupClassId(intrinsic) == SimdAsHWIntrinsicClassId::VectorT) - { - if (simdSize == 32) - { - assert(compIsaSupportedDebugOnly(InstructionSet_AVX2)); - } - else if (simdSize == 64) - { - assert(IsBaselineVector512IsaSupportedDebugOnly()); - } - } -#elif defined(TARGET_ARM64) - // We should have already exited early if AdvSimd isn't supported - assert(compIsaSupportedDebugOnly(InstructionSet_AdvSimd)); -#else -#error Unsupported platform -#endif // !TARGET_XARCH && !TARGET_ARM64 - - bool isOpExplicit = false; - - switch (intrinsic) - { - case NI_VectorT_ConvertToInt32Native: - case NI_VectorT_MaxNative: - case NI_VectorT_MinNative: - { - if (BlockNonDeterministicIntrinsics(mustExpand)) - { - return nullptr; - } - break; - } - - case NI_VectorT_ConvertToInt64Native: - case NI_VectorT_ConvertToUInt32Native: - case NI_VectorT_ConvertToUInt64Native: - { - if (BlockNonDeterministicIntrinsics(mustExpand)) - { - return nullptr; - } - -#if defined(TARGET_XARCH) - if (!IsBaselineVector512IsaSupportedOpportunistically()) - { - return nullptr; - } -#endif // TARGET_XARCH - - break; - } - - case NI_VectorT_MultiplyAddEstimate: - { - if (BlockNonDeterministicIntrinsics(mustExpand)) - { - return nullptr; - } - break; - } - -#if defined(TARGET_XARCH) - case NI_VectorT_ConvertToDouble: - { - if (IsBaselineVector512IsaSupportedOpportunistically() || - ((simdSize != 64) && compOpportunisticallyDependsOn(InstructionSet_AVX10v1))) - { - break; - } - return nullptr; - } - - case NI_VectorT_ConvertToInt32: - { - if (compOpportunisticallyDependsOn(InstructionSet_SSE41)) - { - break; - } - return nullptr; - } - - case NI_VectorT_ConvertToInt64: - case NI_VectorT_ConvertToUInt32: - case NI_VectorT_ConvertToUInt64: - { - if (IsBaselineVector512IsaSupportedOpportunistically() || - (simdSize != 64 && compOpportunisticallyDependsOn(InstructionSet_AVX10v1))) - { - break; - } - return nullptr; - } - - case NI_VectorT_ConvertToSingle: - { - if ((simdBaseType == TYP_INT) || - (simdBaseType == TYP_UINT && - (IsBaselineVector512IsaSupportedOpportunistically() || - (simdSize != 64 && compOpportunisticallyDependsOn(InstructionSet_AVX10v1))))) - { - break; - } - return nullptr; - } -#endif // TARGET_XARCH - -#if defined(TARGET_X86) - case NI_VectorT_Create: - { - if (varTypeIsLong(simdBaseType) && !impStackTop(0).val->IsIntegralConst()) - { - // TODO-XARCH-CQ: It may be beneficial to emit the movq - // instruction, which takes a 64-bit memory address and - // works on 32-bit x86 systems. - return nullptr; - } - break; - } -#endif // TARGET_X86 - - case NI_VectorT_CreateSequence: - { - if (varTypeIsLong(simdBaseType) && !impStackTop(0).val->OperIsConst()) - { -#if defined(TARGET_XARCH) - if (!canUseEvexEncoding()) - { - // TODO-XARCH-CQ: We should support long/ulong multiplication - return nullptr; - } -#endif // TARGET_XARCH - -#if defined(TARGET_X86) || defined(TARGET_ARM64) - // TODO-XARCH-CQ: We need to support 64-bit CreateBroadcast - // TODO-ARM64-CQ: We should support long/ulong multiplication. - return nullptr; -#endif // TARGET_X86 || TARGET_ARM64 - } - break; - } - - case NI_VectorT_As: - case NI_VectorT_AsVectorByte: - case NI_VectorT_AsVectorDouble: - case NI_VectorT_AsVectorInt16: - case NI_VectorT_AsVectorInt32: - case NI_VectorT_AsVectorInt64: - case NI_VectorT_AsVectorNInt: - case NI_VectorT_AsVectorNUInt: - case NI_VectorT_AsVectorSByte: - case NI_VectorT_AsVectorSingle: - case NI_VectorT_AsVectorUInt16: - case NI_VectorT_AsVectorUInt32: - case NI_VectorT_AsVectorUInt64: - { - unsigned retSimdSize; - CorInfoType retBaseJitType = getBaseJitTypeAndSizeOfSIMDType(sig->retTypeSigClass, &retSimdSize); - - if ((retBaseJitType == CORINFO_TYPE_UNDEF) || - !varTypeIsArithmetic(JitType2PreciseVarType(retBaseJitType)) || (retSimdSize == 0)) - { - // We get here if the return type is an unsupported type - return nullptr; - } - - isOpExplicit = true; - break; - } - -#if defined(TARGET_X86) - case NI_VectorT_ToScalar: - { - if (varTypeIsLong(simdBaseType) && !compOpportunisticallyDependsOn(InstructionSet_SSE41)) - { - return nullptr; - } - - break; - } -#endif // TARGET_X86 - -#if defined(TARGET_XARCH) - case NI_VectorT_GetElement: - { - op2 = impStackTop(0).val; - - switch (simdBaseType) - { - case TYP_BYTE: - case TYP_UBYTE: - case TYP_INT: - case TYP_UINT: - case TYP_LONG: - case TYP_ULONG: - { - bool useToScalar = op2->IsIntegralConst(0); - -#if defined(TARGET_X86) - useToScalar &= !varTypeIsLong(simdBaseType); -#endif // TARGET_X86 - - if (!useToScalar && !compOpportunisticallyDependsOn(InstructionSet_SSE41)) - { - // Using software fallback if simdBaseType is not supported by hardware - return nullptr; - } - break; - } - - case TYP_DOUBLE: - case TYP_FLOAT: - case TYP_SHORT: - case TYP_USHORT: - { - // short/ushort/float/double is supported by SSE2 - break; - } - - default: - { - unreached(); - } - } - break; - } -#endif // TARGET_XARCH - -#if defined(TARGET_XARCH) - case NI_VectorT_Dot: - { - if ((simdBaseType == TYP_INT) || (simdBaseType == TYP_UINT)) - { - if (!compOpportunisticallyDependsOn(InstructionSet_SSE41)) - { - // TODO-XARCH-CQ: We can support 32-bit integers if we updating multiplication - // to be lowered rather than imported as the relevant operations. - return nullptr; - } - } - else - { - assert(varTypeIsShort(simdBaseType) || varTypeIsFloating(simdBaseType)); - } - break; - } - - case NI_VectorT_WithElement: - { - assert(sig->numArgs == 3); - GenTree* indexOp = impStackTop(1).val; - - if (!indexOp->IsIntegralConst()) - { - // TODO-XARCH-CQ: We should always import these like we do with GetElement - // Index is not a constant, use the software fallback - return nullptr; - } - - ssize_t imm8 = indexOp->AsIntCon()->IconValue(); - ssize_t count = simdSize / genTypeSize(simdBaseType); - - if ((imm8 >= count) || (imm8 < 0)) - { - // Using software fallback if index is out of range (throw exception) - return nullptr; - } - - switch (simdBaseType) - { - // Using software fallback if simdBaseType is not supported by hardware - case TYP_BYTE: - case TYP_UBYTE: - case TYP_INT: - case TYP_UINT: - { - if (!compOpportunisticallyDependsOn(InstructionSet_SSE41)) - { - return nullptr; - } - break; - } - - case TYP_LONG: - case TYP_ULONG: - { - if (!compOpportunisticallyDependsOn(InstructionSet_SSE41_X64)) - { - return nullptr; - } - break; - } - - case TYP_DOUBLE: - case TYP_FLOAT: - case TYP_SHORT: - case TYP_USHORT: - { - // short/ushort/float/double is supported by SSE2 - break; - } - - default: - { - unreached(); - } - } - break; - } -#endif // TARGET_XARCH - -#if defined(TARGET_ARM64) - case NI_VectorT_LoadAligned: - case NI_VectorT_LoadAlignedNonTemporal: - case NI_VectorT_StoreAligned: - case NI_VectorT_StoreAlignedNonTemporal: - { - if (opts.OptimizationDisabled()) - { - // ARM64 doesn't have aligned loads/stores, but aligned simd ops are only validated - // to be aligned when optimizations are disable, so only skip the intrinsic handling - // if optimizations are enabled - return nullptr; - } - break; - } - - case NI_VectorT_WithElement: - { - assert(numArgs == 3); - GenTree* indexOp = impStackTop(1).val; - - if (!indexOp->IsIntegralConst()) - { - // TODO-ARM64-CQ: We should always import these like we do with GetElement - // If index is not constant use software fallback. - return nullptr; - } - - ssize_t imm8 = indexOp->AsIntCon()->IconValue(); - ssize_t count = simdSize / genTypeSize(simdBaseType); - - if ((imm8 >= count) || (imm8 < 0)) - { - // Using software fallback if index is out of range (throw exception) - return nullptr; - } - - break; - } -#endif - -#if defined(TARGET_XARCH) - case NI_VectorT_Floor: - case NI_VectorT_Ceiling: - { - if (!compOpportunisticallyDependsOn(InstructionSet_SSE41)) - { - return nullptr; - } - break; - } -#endif // TARGET_XARCH - - case NI_VectorT_FusedMultiplyAdd: - { - bool isFmaAccelerated = false; - -#if defined(TARGET_XARCH) - isFmaAccelerated = compOpportunisticallyDependsOn(InstructionSet_FMA); -#elif defined(TARGET_ARM64) - isFmaAccelerated = compOpportunisticallyDependsOn(InstructionSet_AdvSimd); -#endif - - if (!isFmaAccelerated) - { - return nullptr; - } - break; - } - -#if defined(TARGET_XARCH) - case NI_VectorT_op_Multiply: - { - if (varTypeIsLong(simdBaseType)) - { - if (!canUseEvexEncoding()) - { - // TODO-XARCH-CQ: We should support long/ulong multiplication - return nullptr; - } - -#if defined(TARGET_X86) - // TODO-XARCH-CQ: We need to support 64-bit CreateBroadcast - return nullptr; -#endif // TARGET_X86 - } - break; - } -#endif // TARGET_XARCH - -#if defined(TARGET_XARCH) - case NI_VectorT_op_RightShift: - { - if (varTypeIsLong(simdBaseType) || (simdBaseType == TYP_DOUBLE)) - { - if (!canUseEvexEncoding()) - { - // TODO-XARCH-CQ: We should support long/ulong arithmetic shift - return nullptr; - } - } - break; - } -#endif // TARGET_XARCH - - default: - { - // Most intrinsics have some path that works even if only SSE2/AdvSimd is available - break; - } - } - - GenTree* copyBlkDst = nullptr; - GenTree* copyBlkSrc = nullptr; - - switch (numArgs) - { - case 0: - { - switch (intrinsic) - { - case NI_VectorT_get_AllBitsSet: - { - return gtNewAllBitsSetConNode(retType); - } - - case NI_VectorT_get_Indices: - { - assert(sig->numArgs == 0); - return gtNewSimdGetIndicesNode(retType, simdBaseJitType, simdSize); - } - - case NI_VectorT_get_One: - { - return gtNewOneConNode(retType, simdBaseType); - } - - case NI_VectorT_get_Zero: - { - return gtNewZeroConNode(retType); - } - - default: - { - // Some platforms warn about unhandled switch cases - // We handle it more generally via the assert and nullptr return below. - break; - } - } - break; - } - - case 1: - { - isOpExplicit |= (intrinsic == NI_VectorT_op_Explicit); - - if (isOpExplicit) - { - // We fold away the cast here, as it only exists to satisfy the - // type system. It is safe to do this here since the op1 type - // and the signature return type are both the same TYP_SIMD. - op1 = impSIMDPopStack(); - SetOpLclRelatedToSIMDIntrinsic(op1); - assert(op1->gtType == getSIMDTypeForSize(getSIMDTypeSizeInBytes(sig->retTypeSigClass))); - - return op1; - } - - argType = JITtype2varType(strip(info.compCompHnd->getArgType(sig, argList, &argClass))); - op1 = getArgForHWIntrinsic(argType, argClass); - - switch (intrinsic) - { - case NI_VectorT_Abs: - { - return gtNewSimdAbsNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_Ceiling: - { - return gtNewSimdCeilNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_Create: - { - return gtNewSimdCreateBroadcastNode(simdType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_Floor: - { - return gtNewSimdFloorNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_IsNaN: - { - return gtNewSimdIsNaNNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_IsNegative: - { - return gtNewSimdIsNegativeNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_IsPositive: - { - return gtNewSimdIsPositiveNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_IsPositiveInfinity: - { - return gtNewSimdIsPositiveInfinityNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_IsZero: - { - return gtNewSimdIsZeroNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_LoadUnsafe: - { - if (op1->OperIs(GT_CAST) && op1->gtGetOp1()->TypeIs(TYP_BYREF)) - { - // If what we have is a BYREF, that's what we really want, so throw away the cast. - op1 = op1->gtGetOp1(); - } - - return gtNewSimdLoadNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_LoadAligned: - { - if (op1->OperIs(GT_CAST) && op1->gtGetOp1()->TypeIs(TYP_BYREF)) - { - // If what we have is a BYREF, that's what we really want, so throw away the cast. - op1 = op1->gtGetOp1(); - } - - return gtNewSimdLoadAlignedNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_LoadAlignedNonTemporal: - { - if (op1->OperIs(GT_CAST) && op1->gtGetOp1()->TypeIs(TYP_BYREF)) - { - // If what we have is a BYREF, that's what we really want, so throw away the cast. - op1 = op1->gtGetOp1(); - } - - return gtNewSimdLoadNonTemporalNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_UnaryNegation: - { - return gtNewSimdUnOpNode(GT_NEG, retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_OnesComplement: - { - return gtNewSimdUnOpNode(GT_NOT, retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_Sqrt: - { - return gtNewSimdSqrtNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_Sum: - { - return gtNewSimdSumNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_ToScalar: - { -#if defined(TARGET_X86) - if (varTypeIsLong(simdBaseType)) - { - // We should have verified SSE41 was available above. - assert(compIsaSupportedDebugOnly(InstructionSet_SSE41)); - op2 = gtNewIconNode(0); - return gtNewSimdGetElementNode(retType, op1, op2, simdBaseJitType, simdSize); - } -#endif // TARGET_X86 - - return gtNewSimdToScalarNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_UnaryPlus: - { - return op1; - } - - case NI_VectorT_WidenLower: - { - return gtNewSimdWidenLowerNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_WidenUpper: - { - return gtNewSimdWidenUpperNode(retType, op1, simdBaseJitType, simdSize); - } - -#if defined(TARGET_XARCH) - case NI_VectorT_ConvertToDouble: - { - assert(sig->numArgs == 1); - assert(varTypeIsLong(simdBaseType)); - NamedIntrinsic intrinsic = NI_Illegal; - if ((simdSize != 64) && compOpportunisticallyDependsOn(InstructionSet_AVX10v1)) - { - if (simdSize == 32) - { - intrinsic = NI_AVX10v1_ConvertToVector256Double; - } - else - { - assert(simdSize == 16); - intrinsic = NI_AVX10v1_ConvertToVector128Double; - } - } - else - { - if (simdSize == 64) - { - intrinsic = NI_AVX512DQ_ConvertToVector512Double; - } - else if (simdSize == 32) - { - intrinsic = NI_AVX512DQ_VL_ConvertToVector256Double; - } - else - { - assert(simdSize == 16); - intrinsic = NI_AVX512DQ_VL_ConvertToVector128Double; - } - } - return gtNewSimdHWIntrinsicNode(retType, op1, intrinsic, simdBaseJitType, simdSize); - } - - case NI_VectorT_ConvertToSingle: - { - assert(varTypeIsInt(simdBaseType)); - NamedIntrinsic intrinsic = NI_Illegal; - if (simdBaseType == TYP_INT) - { - switch (simdSize) - { - case 16: - intrinsic = NI_SSE2_ConvertToVector128Single; - break; - case 32: - intrinsic = NI_AVX_ConvertToVector256Single; - break; - case 64: - intrinsic = NI_AVX512F_ConvertToVector512Single; - break; - default: - unreached(); - } - } - else if (simdBaseType == TYP_UINT && simdSize != 64 && - compOpportunisticallyDependsOn(InstructionSet_AVX10v1)) - { - switch (simdSize) - { - case 16: - intrinsic = NI_AVX10v1_ConvertToVector128Single; - break; - case 32: - intrinsic = NI_AVX10v1_ConvertToVector256Single; - break; - default: - unreached(); - } - } - else if (simdBaseType == TYP_UINT) - { - switch (simdSize) - { - case 16: - intrinsic = NI_AVX512F_VL_ConvertToVector128Single; - break; - case 32: - intrinsic = NI_AVX512F_VL_ConvertToVector256Single; - break; - case 64: - intrinsic = NI_AVX512F_ConvertToVector512Single; - break; - default: - unreached(); - } - } - assert(intrinsic != NI_Illegal); - return gtNewSimdHWIntrinsicNode(retType, op1, intrinsic, simdBaseJitType, simdSize); - } -#elif defined(TARGET_ARM64) - case NI_VectorT_ConvertToDouble: - { - assert((simdBaseType == TYP_LONG) || (simdBaseType == TYP_ULONG)); - return gtNewSimdHWIntrinsicNode(retType, op1, NI_AdvSimd_Arm64_ConvertToDouble, simdBaseJitType, - simdSize); - } - - case NI_VectorT_ConvertToSingle: - { - assert((simdBaseType == TYP_INT) || (simdBaseType == TYP_UINT)); - return gtNewSimdHWIntrinsicNode(retType, op1, NI_AdvSimd_ConvertToSingle, simdBaseJitType, - simdSize); - } -#else -#error Unsupported platform -#endif // !TARGET_XARCH && !TARGET_ARM64 - - case NI_VectorT_ConvertToInt32: - { - assert(sig->numArgs == 1); - assert(simdBaseType == TYP_FLOAT); - return gtNewSimdCvtNode(retType, op1, CORINFO_TYPE_INT, simdBaseJitType, simdSize); - } - - case NI_VectorT_ConvertToInt32Native: - { - assert(sig->numArgs == 1); - assert(simdBaseType == TYP_FLOAT); - return gtNewSimdCvtNativeNode(retType, op1, CORINFO_TYPE_INT, simdBaseJitType, simdSize); - } - - case NI_VectorT_ConvertToInt64: - { - assert(sig->numArgs == 1); - assert(simdBaseType == TYP_DOUBLE); - return gtNewSimdCvtNode(retType, op1, CORINFO_TYPE_LONG, simdBaseJitType, simdSize); - } - - case NI_VectorT_ConvertToInt64Native: - { - assert(sig->numArgs == 1); - assert(simdBaseType == TYP_DOUBLE); - return gtNewSimdCvtNativeNode(retType, op1, CORINFO_TYPE_LONG, simdBaseJitType, simdSize); - } - - case NI_VectorT_ConvertToUInt32: - { - assert(sig->numArgs == 1); - assert(simdBaseType == TYP_FLOAT); - return gtNewSimdCvtNode(retType, op1, CORINFO_TYPE_UINT, simdBaseJitType, simdSize); - } - - case NI_VectorT_ConvertToUInt32Native: - { - assert(sig->numArgs == 1); - assert(simdBaseType == TYP_FLOAT); - return gtNewSimdCvtNativeNode(retType, op1, CORINFO_TYPE_UINT, simdBaseJitType, simdSize); - } - - case NI_VectorT_ConvertToUInt64: - { - assert(sig->numArgs == 1); - assert(simdBaseType == TYP_DOUBLE); - return gtNewSimdCvtNode(retType, op1, CORINFO_TYPE_ULONG, simdBaseJitType, simdSize); - } - - case NI_VectorT_ConvertToUInt64Native: - { - assert(sig->numArgs == 1); - assert(simdBaseType == TYP_DOUBLE); - return gtNewSimdCvtNativeNode(retType, op1, CORINFO_TYPE_ULONG, simdBaseJitType, simdSize); - } - - default: - { - // Some platforms warn about unhandled switch cases - // We handle it more generally via the assert and nullptr return below. - break; - } - } - break; - } - - case 2: - { - if (SimdAsHWIntrinsicInfo::SpillSideEffectsOp1(intrinsic)) - { - impSpillSideEffect(true, verCurrentState.esStackDepth - - 2 DEBUGARG("Spilling op1 side effects for SimdAsHWIntrinsic")); - } - - assert(!SimdAsHWIntrinsicInfo::SpillSideEffectsOp2(intrinsic)); - - CORINFO_ARG_LIST_HANDLE arg2 = info.compCompHnd->getArgNext(argList); - argType = JITtype2varType(strip(info.compCompHnd->getArgType(sig, arg2, &argClass))); - op2 = getArgForHWIntrinsic(argType, argClass); - - argType = JITtype2varType(strip(info.compCompHnd->getArgType(sig, argList, &argClass))); - - op1 = getArgForHWIntrinsic(argType, argClass); - - switch (intrinsic) - { - case NI_VectorT_op_Addition: - { - return gtNewSimdBinOpNode(GT_ADD, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_AndNot: - { - return gtNewSimdBinOpNode(GT_AND_NOT, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_BitwiseAnd: - { - return gtNewSimdBinOpNode(GT_AND, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_BitwiseOr: - { - return gtNewSimdBinOpNode(GT_OR, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_CreateSequence: - { - return gtNewSimdCreateSequenceNode(simdType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_Division: - { - return gtNewSimdBinOpNode(GT_DIV, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_Dot: - { - op1 = gtNewSimdDotProdNode(simdType, op1, op2, simdBaseJitType, simdSize); - return gtNewSimdGetElementNode(retType, op1, gtNewIconNode(0), simdBaseJitType, simdSize); - } - - case NI_VectorT_Equals: - { - return gtNewSimdCmpOpNode(GT_EQ, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_Equality: - { - return gtNewSimdCmpOpAllNode(GT_EQ, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_EqualsAny: - { - return gtNewSimdCmpOpAnyNode(GT_EQ, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_ExclusiveOr: - { - return gtNewSimdBinOpNode(GT_XOR, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_GetElement: - { - return gtNewSimdGetElementNode(retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_GreaterThan: - { - return gtNewSimdCmpOpNode(GT_GT, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_GreaterThanAll: - { - return gtNewSimdCmpOpAllNode(GT_GT, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_GreaterThanAny: - { - return gtNewSimdCmpOpAnyNode(GT_GT, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_GreaterThanOrEqual: - { - return gtNewSimdCmpOpNode(GT_GE, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_GreaterThanOrEqualAll: - { - return gtNewSimdCmpOpAllNode(GT_GE, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_GreaterThanOrEqualAny: - { - return gtNewSimdCmpOpAnyNode(GT_GE, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_Inequality: - { - return gtNewSimdCmpOpAnyNode(GT_NE, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_LessThan: - { - return gtNewSimdCmpOpNode(GT_LT, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_LessThanAll: - { - return gtNewSimdCmpOpAllNode(GT_LT, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_LessThanAny: - { - return gtNewSimdCmpOpAnyNode(GT_LT, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_LessThanOrEqual: - { - return gtNewSimdCmpOpNode(GT_LE, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_LessThanOrEqualAll: - { - return gtNewSimdCmpOpAllNode(GT_LE, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_LessThanOrEqualAny: - { - return gtNewSimdCmpOpAnyNode(GT_LE, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_LoadUnsafeIndex: - { - GenTree* tmp; - - if (op1->OperIs(GT_CAST) && op1->gtGetOp1()->TypeIs(TYP_BYREF)) - { - // If what we have is a BYREF, that's what we really want, so throw away the cast. - op1 = op1->gtGetOp1(); - } - - tmp = gtNewIconNode(genTypeSize(simdBaseType), op2->TypeGet()); - op2 = gtNewOperNode(GT_MUL, op2->TypeGet(), op2, tmp); - op1 = gtNewOperNode(GT_ADD, op1->TypeGet(), op1, op2); - - return gtNewSimdLoadNode(retType, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_Max: - { - return gtNewSimdMaxNode(retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_MaxNative: - { - return gtNewSimdMaxNativeNode(retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_Min: - { - return gtNewSimdMinNode(retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_MinNative: - { - return gtNewSimdMinNativeNode(retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_Multiply: - { - return gtNewSimdBinOpNode(GT_MUL, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_Narrow: - { - return gtNewSimdNarrowNode(retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_LeftShift: - { - return gtNewSimdBinOpNode(GT_LSH, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_RightShift: - { - genTreeOps op = varTypeIsUnsigned(simdBaseType) ? GT_RSZ : GT_RSH; - return gtNewSimdBinOpNode(op, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_UnsignedRightShift: - { - return gtNewSimdBinOpNode(GT_RSZ, retType, op1, op2, simdBaseJitType, simdSize); - } - - case NI_VectorT_StoreUnsafe: - { - assert(retType == TYP_VOID); - - if (op2->OperIs(GT_CAST) && op2->gtGetOp1()->TypeIs(TYP_BYREF)) - { - // If what we have is a BYREF, that's what we really want, so throw away the cast. - op2 = op2->gtGetOp1(); - } - - return gtNewSimdStoreNode(op2, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_StoreAligned: - { - assert(retType == TYP_VOID); - - if (op2->OperIs(GT_CAST) && op2->gtGetOp1()->TypeIs(TYP_BYREF)) - { - // If what we have is a BYREF, that's what we really want, so throw away the cast. - op2 = op2->gtGetOp1(); - } - - return gtNewSimdStoreAlignedNode(op2, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_StoreAlignedNonTemporal: - { - assert(retType == TYP_VOID); - - if (op2->OperIs(GT_CAST) && op2->gtGetOp1()->TypeIs(TYP_BYREF)) - { - // If what we have is a BYREF, that's what we really want, so throw away the cast. - op2 = op2->gtGetOp1(); - } - - return gtNewSimdStoreNonTemporalNode(op2, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_op_Subtraction: - { - return gtNewSimdBinOpNode(GT_SUB, retType, op1, op2, simdBaseJitType, simdSize); - } - - default: - { - // Some platforms warn about unhandled switch cases - // We handle it more generally via the assert and nullptr return below. - break; - } - } - break; - } - - case 3: - { - if (SimdAsHWIntrinsicInfo::SpillSideEffectsOp1(intrinsic)) - { - impSpillSideEffect(true, verCurrentState.esStackDepth - - 3 DEBUGARG("Spilling op1 side effects for SimdAsHWIntrinsic")); - } - - if (SimdAsHWIntrinsicInfo::SpillSideEffectsOp2(intrinsic)) - { - impSpillSideEffect(true, verCurrentState.esStackDepth - - 2 DEBUGARG("Spilling op2 side effects for SimdAsHWIntrinsic")); - } - - CORINFO_ARG_LIST_HANDLE arg2 = info.compCompHnd->getArgNext(argList); - CORINFO_ARG_LIST_HANDLE arg3 = info.compCompHnd->getArgNext(arg2); - - argType = JITtype2varType(strip(info.compCompHnd->getArgType(sig, arg3, &argClass))); - op3 = getArgForHWIntrinsic(argType, argClass); - - argType = JITtype2varType(strip(info.compCompHnd->getArgType(sig, arg2, &argClass))); - op2 = getArgForHWIntrinsic(argType, argClass); - - argType = JITtype2varType(strip(info.compCompHnd->getArgType(sig, argList, &argClass))); - op1 = getArgForHWIntrinsic(argType, argClass); - - switch (intrinsic) - { - case NI_VectorT_ConditionalSelect: - { - return gtNewSimdCndSelNode(retType, op1, op2, op3, simdBaseJitType, simdSize); - } - - case NI_VectorT_FusedMultiplyAdd: - { - return gtNewSimdFmaNode(retType, op1, op2, op3, simdBaseJitType, simdSize); - } - - case NI_VectorT_MultiplyAddEstimate: - { - bool isFmaAccelerated = false; - -#if defined(TARGET_XARCH) - isFmaAccelerated = compExactlyDependsOn(InstructionSet_FMA); -#elif defined(TARGET_ARM64) - isFmaAccelerated = compExactlyDependsOn(InstructionSet_AdvSimd); -#endif - - if (isFmaAccelerated) - { - return gtNewSimdFmaNode(retType, op1, op2, op3, simdBaseJitType, simdSize); - } - - GenTree* mulNode = gtNewSimdBinOpNode(GT_MUL, retType, op1, op2, simdBaseJitType, simdSize); - return gtNewSimdBinOpNode(GT_ADD, retType, mulNode, op3, simdBaseJitType, simdSize); - } - - case NI_VectorT_StoreUnsafeIndex: - { - assert(retType == TYP_VOID); - GenTree* tmp; - - if (op2->OperIs(GT_CAST) && op2->gtGetOp1()->TypeIs(TYP_BYREF)) - { - // If what we have is a BYREF, that's what we really want, so throw away the cast. - op2 = op2->gtGetOp1(); - } - - tmp = gtNewIconNode(genTypeSize(simdBaseType), op3->TypeGet()); - op3 = gtNewOperNode(GT_MUL, op3->TypeGet(), op3, tmp); - op2 = gtNewOperNode(GT_ADD, op2->TypeGet(), op2, op3); - - return gtNewSimdStoreNode(op2, op1, simdBaseJitType, simdSize); - } - - case NI_VectorT_WithElement: - { - return gtNewSimdWithElementNode(retType, op1, op2, op3, simdBaseJitType, simdSize); - } - - default: - { - // Some platforms warn about unhandled switch cases - // We handle it more generally via the assert and nullptr return below. - break; - } - } - break; - } - } - - if (copyBlkDst != nullptr) - { - assert(copyBlkSrc != nullptr); - GenTree* retNode = gtNewStoreValueNode(simdType, copyBlkDst, copyBlkSrc); - - return retNode; - } - assert(copyBlkSrc == nullptr); - - assert(!"Unexpected SimdAsHWIntrinsic"); - return nullptr; -} - -#endif // FEATURE_HW_INTRINSICS diff --git a/src/coreclr/jit/simdashwintrinsic.h b/src/coreclr/jit/simdashwintrinsic.h deleted file mode 100644 index 77fc25ae74f4e..0000000000000 --- a/src/coreclr/jit/simdashwintrinsic.h +++ /dev/null @@ -1,127 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -#ifndef _SIMD_AS_HWINTRINSIC_H_ -#define _SIMD_AS_HWINTRINSIC_H_ - -enum class SimdAsHWIntrinsicClassId -{ - Unknown, - Vector, - VectorT, -}; - -enum class SimdAsHWIntrinsicFlag : unsigned int -{ - None = 0, - - // For SIMDVectorHandle, keep the base type from the result type - KeepBaseTypeFromRet = 0x01, - - // Indicates that side effects need to be spilled for op1 - SpillSideEffectsOp1 = 0x02, - - // Indicates that side effects need to be spilled for op2 - SpillSideEffectsOp2 = 0x04, -}; - -inline SimdAsHWIntrinsicFlag operator~(SimdAsHWIntrinsicFlag value) -{ - return static_cast(~static_cast(value)); -} - -inline SimdAsHWIntrinsicFlag operator|(SimdAsHWIntrinsicFlag lhs, SimdAsHWIntrinsicFlag rhs) -{ - return static_cast(static_cast(lhs) | static_cast(rhs)); -} - -inline SimdAsHWIntrinsicFlag operator&(SimdAsHWIntrinsicFlag lhs, SimdAsHWIntrinsicFlag rhs) -{ - return static_cast(static_cast(lhs) & static_cast(rhs)); -} - -inline SimdAsHWIntrinsicFlag operator^(SimdAsHWIntrinsicFlag lhs, SimdAsHWIntrinsicFlag rhs) -{ - return static_cast(static_cast(lhs) ^ static_cast(rhs)); -} - -struct SimdAsHWIntrinsicInfo -{ - NamedIntrinsic id; - const char* name; - SimdAsHWIntrinsicClassId classId; - int numArgs; - NamedIntrinsic hwIntrinsic[10]; - SimdAsHWIntrinsicFlag flags; - - static const SimdAsHWIntrinsicInfo& lookup(NamedIntrinsic id); - - static NamedIntrinsic lookupId(Compiler* comp, - CORINFO_SIG_INFO* sig, - const char* className, - const char* methodName, - const char* enclosingClassName); - - static SimdAsHWIntrinsicClassId lookupClassId(Compiler* comp, - const char* className, - const char* enclosingClassName); - - // Member lookup - - static NamedIntrinsic lookupId(NamedIntrinsic id) - { - return lookup(id).id; - } - - static const char* lookupName(NamedIntrinsic id) - { - return lookup(id).name; - } - - static SimdAsHWIntrinsicClassId lookupClassId(NamedIntrinsic id) - { - return lookup(id).classId; - } - - static int lookupNumArgs(NamedIntrinsic id) - { - return lookup(id).numArgs; - } - - static NamedIntrinsic lookupHWIntrinsic(NamedIntrinsic id, var_types type) - { - if ((type < TYP_BYTE) || (type > TYP_DOUBLE)) - { - assert(!"Unexpected type"); - return NI_Illegal; - } - return lookup(id).hwIntrinsic[type - TYP_BYTE]; - } - - static SimdAsHWIntrinsicFlag lookupFlags(NamedIntrinsic id) - { - return lookup(id).flags; - } - - // Flags lookup - - static bool KeepBaseTypeFromRet(NamedIntrinsic id) - { - SimdAsHWIntrinsicFlag flags = lookupFlags(id); - return (flags & SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet) == SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet; - } - - static bool SpillSideEffectsOp1(NamedIntrinsic id) - { - SimdAsHWIntrinsicFlag flags = lookupFlags(id); - return (flags & SimdAsHWIntrinsicFlag::SpillSideEffectsOp1) == SimdAsHWIntrinsicFlag::SpillSideEffectsOp1; - } - - static bool SpillSideEffectsOp2(NamedIntrinsic id) - { - SimdAsHWIntrinsicFlag flags = lookupFlags(id); - return (flags & SimdAsHWIntrinsicFlag::SpillSideEffectsOp2) == SimdAsHWIntrinsicFlag::SpillSideEffectsOp2; - } -}; - -#endif // _SIMD_AS_HWINTRINSIC_H_ diff --git a/src/coreclr/jit/simdashwintrinsiclistarm64.h b/src/coreclr/jit/simdashwintrinsiclistarm64.h deleted file mode 100644 index 2ca159110dc4c..0000000000000 --- a/src/coreclr/jit/simdashwintrinsiclistarm64.h +++ /dev/null @@ -1,140 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -/*****************************************************************************/ -#ifndef SIMD_AS_HWINTRINSIC -#error Define SIMD_AS_HWINTRINSIC before including this file -#endif - -#if defined(SIMD_AS_HWINTRINSIC_ID) || defined(SIMD_AS_HWINTRINSIC_NM) -#error SIMD_AS_HWINTRINSIC_ID and SIMD_AS_HWINTRINSIC_NM should not be defined before including this file -#endif -/*****************************************************************************/ - -// clang-format off - -#ifdef FEATURE_HW_INTRINSICS - -// Defines a SimdAsHWIntrinsic where the name is implicitly taken from the id -#define SIMD_AS_HWINTRINSIC_ID(classId, id, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, flag) \ - SIMD_AS_HWINTRINSIC(classId, id, #id, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, flag) - -// Defines a SimdAsHWIntrinsic where the name is explicit -#define SIMD_AS_HWINTRINSIC_NM(classId, id, name, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, flag) \ - SIMD_AS_HWINTRINSIC(classId, id, name, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, flag) - -/* Note - * Each intrinsic has a unique Intrinsic ID with type of `enum NamedIntrinsic` - * Each intrinsic has a `NumArg` for number of parameters - * Each intrinsic has 10 `NamedIntrinsic` fields that list the HWIntrinsic that should be generated based-on the base type - * NI_Illegal is used to represent an unsupported type - * Using the same Intrinsic ID as the represented entry is used to indicate special handling is required - * Each intrinsic has one or more flags with type of `enum SimdAsHWIntrinsicFlag` -*/ - -// ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************* -// ISA ID Name NumArg Instructions Flags -// {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} -// ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************* -// Vector Intrinsics -SIMD_AS_HWINTRINSIC_ID(VectorT, Abs, 1, {NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AndNot, 2, {NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, As, 1, {NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorByte, 1, {NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorDouble, 1, {NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorInt16, 1, {NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorInt32, 1, {NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorInt64, 1, {NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorNInt, 1, {NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorNUInt, 1, {NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorSByte, 1, {NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorSingle, 1, {NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorUInt16, 1, {NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorUInt32, 1, {NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorUInt64, 1, {NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, Ceiling, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_Ceiling, NI_VectorT_Ceiling}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConditionalSelect, 3, {NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToDouble, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToDouble, NI_VectorT_ConvertToDouble, NI_Illegal, NI_Illegal}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToInt32, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToInt32, NI_Illegal}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToInt32Native, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToInt32Native, NI_Illegal}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToInt64, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToInt64}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToInt64Native, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToInt64Native}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToSingle, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToSingle, NI_VectorT_ConvertToSingle, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToUInt32, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToUInt32, NI_Illegal}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToUInt32Native, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToUInt32Native, NI_Illegal}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToUInt64, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToUInt64}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToUInt64Native, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToUInt64Native}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, Create, 1, {NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet) -SIMD_AS_HWINTRINSIC_ID(VectorT, CreateSequence, 2, {NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet | SimdAsHWIntrinsicFlag::SpillSideEffectsOp1) -SIMD_AS_HWINTRINSIC_ID(VectorT, Dot, 2, {NI_VectorT_Dot, NI_VectorT_Dot, NI_VectorT_Dot, NI_VectorT_Dot, NI_VectorT_Dot, NI_VectorT_Dot, NI_Illegal, NI_Illegal, NI_VectorT_Dot, NI_VectorT_Dot}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, Equals, 2, {NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, EqualsAny, 2, {NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, Floor, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_Floor, NI_VectorT_Floor}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, FusedMultiplyAdd, 3, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_FusedMultiplyAdd, NI_VectorT_FusedMultiplyAdd}, SimdAsHWIntrinsicFlag::SpillSideEffectsOp1 | SimdAsHWIntrinsicFlag::SpillSideEffectsOp2) -SIMD_AS_HWINTRINSIC_ID(VectorT, get_AllBitsSet, 0, {NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, get_Indices, 0, {NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, get_One, 0, {NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, get_Zero, 0, {NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GetElement, 2, {NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GreaterThan, 2, {NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GreaterThanAll, 2, {NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GreaterThanAny, 2, {NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GreaterThanOrEqual, 2, {NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GreaterThanOrEqualAll, 2, {NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GreaterThanOrEqualAny, 2, {NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, IsNaN, 1, {NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, IsNegative, 1, {NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, IsPositive, 1, {NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, IsPositiveInfinity, 1, {NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, IsZero, 1, {NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LessThan, 2, {NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LessThanAll, 2, {NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LessThanAny, 2, {NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LessThanOrEqual, 2, {NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LessThanOrEqualAll, 2, {NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LessThanOrEqualAny, 2, {NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LoadAligned, 1, {NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet) -SIMD_AS_HWINTRINSIC_ID(VectorT, LoadAlignedNonTemporal, 1, {NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet) -SIMD_AS_HWINTRINSIC_ID(VectorT, LoadUnsafe, 1, {NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet) -SIMD_AS_HWINTRINSIC_NM(VectorT, LoadUnsafeIndex, "LoadUnsafe", 2, {NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet) -SIMD_AS_HWINTRINSIC_ID(VectorT, Max, 2, {NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, MaxNative, 2, {NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, Min, 2, {NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, MinNative, 2, {NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, MultiplyAddEstimate, 3, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_MultiplyAddEstimate, NI_VectorT_MultiplyAddEstimate}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, Narrow, 2, {NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Addition, 2, {NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_BitwiseAnd, 2, {NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_BitwiseOr, 2, {NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Division, 2, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_op_Division, NI_VectorT_op_Division}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Equality, 2, {NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_ExclusiveOr, 2, {NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Explicit, 1, {NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Inequality, 2, {NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_LeftShift, 2, {NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Multiply, 2, {NI_VectorT_op_Multiply, NI_VectorT_op_Multiply, NI_VectorT_op_Multiply, NI_VectorT_op_Multiply, NI_VectorT_op_Multiply, NI_VectorT_op_Multiply, NI_Illegal, NI_Illegal, NI_VectorT_op_Multiply, NI_VectorT_op_Multiply}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_OnesComplement, 1, {NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_RightShift, 2, {NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Subtraction, 2, {NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_UnaryNegation, 1, {NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_UnaryPlus, 1, {NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_UnsignedRightShift, 2, {NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_NM(VectorT, Sqrt, "SquareRoot", 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_Sqrt, NI_VectorT_Sqrt}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, StoreAligned, 2, {NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned}, SimdAsHWIntrinsicFlag::SpillSideEffectsOp1) -SIMD_AS_HWINTRINSIC_ID(VectorT, StoreAlignedNonTemporal, 2, {NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal}, SimdAsHWIntrinsicFlag::SpillSideEffectsOp1) -SIMD_AS_HWINTRINSIC_ID(VectorT, StoreUnsafe, 2, {NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe}, SimdAsHWIntrinsicFlag::SpillSideEffectsOp1) -SIMD_AS_HWINTRINSIC_NM(VectorT, StoreUnsafeIndex, "StoreUnsafe", 3, {NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex}, SimdAsHWIntrinsicFlag::SpillSideEffectsOp1) -SIMD_AS_HWINTRINSIC_ID(VectorT, Sum, 1, {NI_VectorT_Sum, NI_VectorT_Sum, NI_VectorT_Sum, NI_VectorT_Sum, NI_VectorT_Sum, NI_VectorT_Sum, NI_VectorT_Sum, NI_VectorT_Sum, NI_VectorT_Sum, NI_VectorT_Sum}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ToScalar, 1, {NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, WidenLower, 1, {NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, WidenUpper, 1, {NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, WithElement, 3, {NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement}, SimdAsHWIntrinsicFlag::None) - -#undef SIMD_AS_HWINTRINSIC_NM -#undef SIMD_AS_HWINTRINSIC_ID - -#endif // FEATURE_HW_INTRINSICS - -#undef SIMD_AS_HWINTRINSIC - -// clang-format on diff --git a/src/coreclr/jit/simdashwintrinsiclistxarch.h b/src/coreclr/jit/simdashwintrinsiclistxarch.h deleted file mode 100644 index 6baf3143cd02d..0000000000000 --- a/src/coreclr/jit/simdashwintrinsiclistxarch.h +++ /dev/null @@ -1,140 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -/*****************************************************************************/ -#ifndef SIMD_AS_HWINTRINSIC -#error Define SIMD_AS_HWINTRINSIC before including this file -#endif - -#if defined(SIMD_AS_HWINTRINSIC_ID) || defined(SIMD_AS_HWINTRINSIC_NM) -#error SIMD_AS_HWINTRINSIC_ID and SIMD_AS_HWINTRINSIC_NM should not be defined before including this file -#endif -/*****************************************************************************/ - -// clang-format off - -#ifdef FEATURE_HW_INTRINSICS - -// Defines a SimdAsHWIntrinsic where the name is implicitly taken from the id -#define SIMD_AS_HWINTRINSIC_ID(classId, id, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, flag) \ - SIMD_AS_HWINTRINSIC(classId, id, #id, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, flag) - -// Defines a SimdAsHWIntrinsic where the name is explicit -#define SIMD_AS_HWINTRINSIC_NM(classId, id, name, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, flag) \ - SIMD_AS_HWINTRINSIC(classId, id, name, numarg, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, flag) - -/* Note - * Each intrinsic has a unique Intrinsic ID with type of `enum NamedIntrinsic` - * Each intrinsic has a `NumArg` for number of parameters - * Each intrinsic has 10 `NamedIntrinsic` fields that list the HWIntrinsic that should be generated based-on the base type - * NI_Illegal is used to represent an unsupported type - * Using the same Intrinsic ID as the represented entry is used to indicate special handling is required - * Each intrinsic has one or more flags with type of `enum SimdAsHWIntrinsicFlag` -*/ - -// ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************* -// ISA ID Name NumArg Instructions Flags -// {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} -// ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************* -// Vector Intrinsics -SIMD_AS_HWINTRINSIC_ID(VectorT, Abs, 1, {NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs, NI_VectorT_Abs}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AndNot, 2, {NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot, NI_VectorT_AndNot}, SimdAsHWIntrinsicFlag::SpillSideEffectsOp1) -SIMD_AS_HWINTRINSIC_ID(VectorT, As, 1, {NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As, NI_VectorT_As}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorByte, 1, {NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte, NI_VectorT_AsVectorByte}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorDouble, 1, {NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble, NI_VectorT_AsVectorDouble}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorInt16, 1, {NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16, NI_VectorT_AsVectorInt16}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorInt32, 1, {NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32, NI_VectorT_AsVectorInt32}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorInt64, 1, {NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64, NI_VectorT_AsVectorInt64}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorNInt, 1, {NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt, NI_VectorT_AsVectorNInt}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorNUInt, 1, {NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt, NI_VectorT_AsVectorNUInt}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorSByte, 1, {NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte, NI_VectorT_AsVectorSByte}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorSingle, 1, {NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle, NI_VectorT_AsVectorSingle}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorUInt16, 1, {NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16, NI_VectorT_AsVectorUInt16}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorUInt32, 1, {NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32, NI_VectorT_AsVectorUInt32}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, AsVectorUInt64, 1, {NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64, NI_VectorT_AsVectorUInt64}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, Ceiling, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_Ceiling, NI_VectorT_Ceiling}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConditionalSelect, 3, {NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect, NI_VectorT_ConditionalSelect}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToDouble, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToDouble, NI_VectorT_ConvertToDouble, NI_Illegal, NI_Illegal}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToInt32, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToInt32, NI_Illegal}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToInt32Native, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToInt32Native, NI_Illegal}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToInt64, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToInt64}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToInt64Native, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToInt64Native}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToSingle, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToSingle, NI_VectorT_ConvertToSingle, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToUInt32, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToUInt32, NI_Illegal}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToUInt32Native, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToUInt32Native, NI_Illegal}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToUInt64, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToUInt64}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ConvertToUInt64Native, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_ConvertToUInt64Native}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, Create, 1, {NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create, NI_VectorT_Create}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet) -SIMD_AS_HWINTRINSIC_ID(VectorT, CreateSequence, 2, {NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence, NI_VectorT_CreateSequence}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet | SimdAsHWIntrinsicFlag::SpillSideEffectsOp1) -SIMD_AS_HWINTRINSIC_ID(VectorT, Dot, 2, {NI_Illegal, NI_Illegal, NI_VectorT_Dot, NI_VectorT_Dot, NI_VectorT_Dot, NI_VectorT_Dot, NI_Illegal, NI_Illegal, NI_VectorT_Dot, NI_VectorT_Dot}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, Equals, 2, {NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals, NI_VectorT_Equals}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, EqualsAny, 2, {NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny, NI_VectorT_EqualsAny}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, Floor, 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_Floor, NI_VectorT_Floor}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, FusedMultiplyAdd, 3, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_FusedMultiplyAdd, NI_VectorT_FusedMultiplyAdd}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, get_AllBitsSet, 0, {NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet, NI_VectorT_get_AllBitsSet}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, get_Indices, 0, {NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices, NI_VectorT_get_Indices}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, get_One, 0, {NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One, NI_VectorT_get_One}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, get_Zero, 0, {NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero, NI_VectorT_get_Zero}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GetElement, 2, {NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement, NI_VectorT_GetElement}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GreaterThan, 2, {NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan, NI_VectorT_GreaterThan}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GreaterThanAll, 2, {NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll, NI_VectorT_GreaterThanAll}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GreaterThanAny, 2, {NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny, NI_VectorT_GreaterThanAny}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GreaterThanOrEqual, 2, {NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual, NI_VectorT_GreaterThanOrEqual}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GreaterThanOrEqualAll, 2, {NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll, NI_VectorT_GreaterThanOrEqualAll}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, GreaterThanOrEqualAny, 2, {NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny, NI_VectorT_GreaterThanOrEqualAny}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, IsNaN, 1, {NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN, NI_VectorT_IsNaN}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, IsNegative, 1, {NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative, NI_VectorT_IsNegative}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, IsPositive, 1, {NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive, NI_VectorT_IsPositive}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, IsPositiveInfinity, 1, {NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity, NI_VectorT_IsPositiveInfinity}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, IsZero, 1, {NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero, NI_VectorT_IsZero}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LessThan, 2, {NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan, NI_VectorT_LessThan}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LessThanAll, 2, {NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll, NI_VectorT_LessThanAll}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LessThanAny, 2, {NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny, NI_VectorT_LessThanAny}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LessThanOrEqual, 2, {NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual, NI_VectorT_LessThanOrEqual}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LessThanOrEqualAll, 2, {NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll, NI_VectorT_LessThanOrEqualAll}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LessThanOrEqualAny, 2, {NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny, NI_VectorT_LessThanOrEqualAny}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, LoadAligned, 1, {NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned, NI_VectorT_LoadAligned}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet) -SIMD_AS_HWINTRINSIC_ID(VectorT, LoadAlignedNonTemporal, 1, {NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal, NI_VectorT_LoadAlignedNonTemporal}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet) -SIMD_AS_HWINTRINSIC_ID(VectorT, LoadUnsafe, 1, {NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe, NI_VectorT_LoadUnsafe}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet) -SIMD_AS_HWINTRINSIC_NM(VectorT, LoadUnsafeIndex, "LoadUnsafe", 2, {NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex, NI_VectorT_LoadUnsafeIndex}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet) -SIMD_AS_HWINTRINSIC_ID(VectorT, Max, 2, {NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max, NI_VectorT_Max}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, MaxNative, 2, {NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative, NI_VectorT_MaxNative}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, Min, 2, {NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min, NI_VectorT_Min}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, MinNative, 2, {NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative, NI_VectorT_MinNative}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, MultiplyAddEstimate, 3, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_MultiplyAddEstimate, NI_VectorT_MultiplyAddEstimate}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, Narrow, 2, {NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow, NI_VectorT_Narrow}, SimdAsHWIntrinsicFlag::KeepBaseTypeFromRet) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Addition, 2, {NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition, NI_VectorT_op_Addition}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_BitwiseAnd, 2, {NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd, NI_VectorT_op_BitwiseAnd}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_BitwiseOr, 2, {NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr, NI_VectorT_op_BitwiseOr}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Division, 2, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_op_Division, NI_VectorT_op_Division}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Equality, 2, {NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality, NI_VectorT_op_Equality}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_ExclusiveOr, 2, {NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr, NI_VectorT_op_ExclusiveOr}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Explicit, 1, {NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit, NI_VectorT_op_Explicit}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Inequality, 2, {NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality, NI_VectorT_op_Inequality}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_LeftShift, 2, {NI_Illegal, NI_Illegal, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift, NI_VectorT_op_LeftShift}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Multiply, 2, {NI_Illegal, NI_Illegal, NI_VectorT_op_Multiply, NI_VectorT_op_Multiply, NI_VectorT_op_Multiply, NI_VectorT_op_Multiply, NI_Illegal, NI_Illegal, NI_VectorT_op_Multiply, NI_VectorT_op_Multiply}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_OnesComplement, 1, {NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement, NI_VectorT_op_OnesComplement}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_RightShift, 2, {NI_Illegal, NI_Illegal, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift, NI_VectorT_op_RightShift}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_Subtraction, 2, {NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction, NI_VectorT_op_Subtraction}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_UnaryNegation, 1, {NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation, NI_VectorT_op_UnaryNegation}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_UnaryPlus, 1, {NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus, NI_VectorT_op_UnaryPlus}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, op_UnsignedRightShift, 2, {NI_Illegal, NI_Illegal, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift, NI_VectorT_op_UnsignedRightShift}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_NM(VectorT, Sqrt, "SquareRoot", 1, {NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_Illegal, NI_VectorT_Sqrt, NI_VectorT_Sqrt}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, StoreAligned, 2, {NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned, NI_VectorT_StoreAligned}, SimdAsHWIntrinsicFlag::SpillSideEffectsOp1) -SIMD_AS_HWINTRINSIC_ID(VectorT, StoreAlignedNonTemporal, 2, {NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal, NI_VectorT_StoreAlignedNonTemporal}, SimdAsHWIntrinsicFlag::SpillSideEffectsOp1) -SIMD_AS_HWINTRINSIC_ID(VectorT, StoreUnsafe, -1, {NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe, NI_VectorT_StoreUnsafe}, SimdAsHWIntrinsicFlag::SpillSideEffectsOp1) -SIMD_AS_HWINTRINSIC_NM(VectorT, StoreUnsafeIndex, "StoreUnsafe", 3, {NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex, NI_VectorT_StoreUnsafeIndex}, SimdAsHWIntrinsicFlag::SpillSideEffectsOp1) -SIMD_AS_HWINTRINSIC_ID(VectorT, Sum, 1, {NI_Illegal, NI_Illegal, NI_VectorT_Sum, NI_VectorT_Sum, NI_VectorT_Sum, NI_VectorT_Sum, NI_Illegal, NI_Illegal, NI_VectorT_Sum, NI_VectorT_Sum}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, ToScalar, 1, {NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar, NI_VectorT_ToScalar}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, WidenLower, 1, {NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower, NI_VectorT_WidenLower}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, WidenUpper, 1, {NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper, NI_VectorT_WidenUpper}, SimdAsHWIntrinsicFlag::None) -SIMD_AS_HWINTRINSIC_ID(VectorT, WithElement, 3, {NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement, NI_VectorT_WithElement}, SimdAsHWIntrinsicFlag::None) - -#undef SIMD_AS_HWINTRINSIC_NM -#undef SIMD_AS_HWINTRINSIC_ID - -#endif // FEATURE_HW_INTRINSICS - -#undef SIMD_AS_HWINTRINSIC - -// clang-format on