summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFei Peng <feipeng.compiler@gmail.com>2019-03-29 14:28:30 -0700
committerTanner Gooding <tagoo@outlook.com>2019-03-29 14:28:30 -0700
commit4a4ba4d379002c8b8e77ef968f510cf0283201d0 (patch)
tree84896b322d12fc6b5b2e97ff720905d20d50186f
parent4e5a542537ea73c94d3443d9c82b05c744f76758 (diff)
downloadcoreclr-4a4ba4d379002c8b8e77ef968f510cf0283201d0.tar.gz
coreclr-4a4ba4d379002c8b8e77ef968f510cf0283201d0.tar.bz2
coreclr-4a4ba4d379002c8b8e77ef968f510cf0283201d0.zip
Simplify and unify Vector64/128/256 platform-agnostic intrinsic handling (#23028)
* Simplify and unify Vector64/128/256 platform-agnostic intrinsic handling * Removed unsupported ISAs
-rw-r--r--src/jit/compiler.cpp7
-rw-r--r--src/jit/gentree.cpp4
-rw-r--r--src/jit/hwintrinsicArm64.cpp48
-rw-r--r--src/jit/hwintrinsiccodegenxarch.cpp21
-rw-r--r--src/jit/hwintrinsiclistArm64.h49
-rw-r--r--src/jit/hwintrinsiclistxarch.h78
-rw-r--r--src/jit/hwintrinsicxarch.cpp126
-rw-r--r--src/jit/importer.cpp266
-rw-r--r--src/jit/instr.h5
-rw-r--r--src/jit/lowerxarch.cpp4
-rw-r--r--src/jit/lsraxarch.cpp14
11 files changed, 206 insertions, 416 deletions
diff --git a/src/jit/compiler.cpp b/src/jit/compiler.cpp
index a594e23251..fe02e2c42b 100644
--- a/src/jit/compiler.cpp
+++ b/src/jit/compiler.cpp
@@ -2270,7 +2270,9 @@ void Compiler::compSetProcessor()
#ifdef FEATURE_CORECLR
if (JitConfig.EnableHWIntrinsic())
{
- opts.setSupportedISA(InstructionSet_Base);
+ // Dummy ISAs for simplifying the JIT code
+ opts.setSupportedISA(InstructionSet_Vector128);
+ opts.setSupportedISA(InstructionSet_Vector256);
if (JitConfig.EnableSSE())
{
@@ -2419,6 +2421,9 @@ void Compiler::compSetProcessor()
#if defined(_TARGET_ARM64_)
// There is no JitFlag for Base instructions handle manually
opts.setSupportedISA(InstructionSet_Base);
+ // Dummy ISAs for simplifying the JIT code
+ opts.setSupportedISA(InstructionSet_Vector64);
+ opts.setSupportedISA(InstructionSet_Vector128);
#define HARDWARE_INTRINSIC_CLASS(flag, jit_config, isa) \
if (jitFlags.IsSet(JitFlags::flag) && JitConfig.jit_config()) \
opts.setSupportedISA(InstructionSet_##isa);
diff --git a/src/jit/gentree.cpp b/src/jit/gentree.cpp
index 93de32a480..69e774cf9b 100644
--- a/src/jit/gentree.cpp
+++ b/src/jit/gentree.cpp
@@ -16446,7 +16446,7 @@ GenTree* Compiler::gtGetSIMDZero(var_types simdType, var_types baseType, CORINFO
// We only return the HWIntrinsicNode if SSE is supported, since it is possible for
// the user to disable the SSE HWIntrinsic support via the COMPlus configuration knobs
// even though the hardware vector types are still available.
- return gtNewSimdHWIntrinsicNode(simdType, NI_Base_Vector128_Zero, baseType, size);
+ return gtNewSimdHWIntrinsicNode(simdType, NI_Vector128_Zero, baseType, size);
}
return nullptr;
case TYP_SIMD32:
@@ -16455,7 +16455,7 @@ GenTree* Compiler::gtGetSIMDZero(var_types simdType, var_types baseType, CORINFO
// We only return the HWIntrinsicNode if AVX is supported, since it is possible for
// the user to disable the AVX HWIntrinsic support via the COMPlus configuration knobs
// even though the hardware vector types are still available.
- return gtNewSimdHWIntrinsicNode(simdType, NI_Base_Vector256_Zero, baseType, size);
+ return gtNewSimdHWIntrinsicNode(simdType, NI_Vector256_Zero, baseType, size);
}
return nullptr;
default:
diff --git a/src/jit/hwintrinsicArm64.cpp b/src/jit/hwintrinsicArm64.cpp
index b662a43629..47a2b56a7c 100644
--- a/src/jit/hwintrinsicArm64.cpp
+++ b/src/jit/hwintrinsicArm64.cpp
@@ -13,9 +13,11 @@ enum Flag
{
#define HARDWARE_INTRINSIC_CLASS(flag, jit_config, isa) isa = 1ULL << InstructionSet_##isa,
#include "hwintrinsiclistArm64.h"
- None = 0,
- Base = 1ULL << InstructionSet_Base,
- EveryISA = ~0ULL
+ None = 0,
+ Base = 1ULL << InstructionSet_Base,
+ Vector64 = 1ULL << InstructionSet_Vector64,
+ Vector128 = 1ULL << InstructionSet_Vector128,
+ EveryISA = ~0ULL
};
Flag operator|(Flag a, Flag b)
@@ -77,6 +79,10 @@ InstructionSet Compiler::lookupHWIntrinsicISA(const char* className)
{
if (strcmp(className, "Base") == 0)
return InstructionSet_Base;
+ if (strncmp(className, "Vector64", 8) == 0)
+ return InstructionSet_Vector64;
+ if (strncmp(className, "Vector128", 9) == 0)
+ return InstructionSet_Vector128;
#define HARDWARE_INTRINSIC_CLASS(flag, jit_config, isa) \
if (strcmp(className, #isa) == 0) \
return InstructionSet_##isa;
@@ -325,24 +331,24 @@ GenTree* Compiler::impHWIntrinsic(NamedIntrinsic intrinsic,
switch (intrinsic)
{
- case NI_Base_Vector64_AsByte:
- case NI_Base_Vector64_AsInt16:
- case NI_Base_Vector64_AsInt32:
- case NI_Base_Vector64_AsSByte:
- case NI_Base_Vector64_AsSingle:
- case NI_Base_Vector64_AsUInt16:
- case NI_Base_Vector64_AsUInt32:
- case NI_Base_Vector128_As:
- case NI_Base_Vector128_AsByte:
- case NI_Base_Vector128_AsDouble:
- case NI_Base_Vector128_AsInt16:
- case NI_Base_Vector128_AsInt32:
- case NI_Base_Vector128_AsInt64:
- case NI_Base_Vector128_AsSByte:
- case NI_Base_Vector128_AsSingle:
- case NI_Base_Vector128_AsUInt16:
- case NI_Base_Vector128_AsUInt32:
- case NI_Base_Vector128_AsUInt64:
+ case NI_Vector64_AsByte:
+ case NI_Vector64_AsInt16:
+ case NI_Vector64_AsInt32:
+ case NI_Vector64_AsSByte:
+ case NI_Vector64_AsSingle:
+ case NI_Vector64_AsUInt16:
+ case NI_Vector64_AsUInt32:
+ case NI_Vector128_As:
+ case NI_Vector128_AsByte:
+ case NI_Vector128_AsDouble:
+ case NI_Vector128_AsInt16:
+ case NI_Vector128_AsInt32:
+ case NI_Vector128_AsInt64:
+ case NI_Vector128_AsSByte:
+ case NI_Vector128_AsSingle:
+ case NI_Vector128_AsUInt16:
+ case NI_Vector128_AsUInt32:
+ case NI_Vector128_AsUInt64:
{
if (!featureSIMD)
{
diff --git a/src/jit/hwintrinsiccodegenxarch.cpp b/src/jit/hwintrinsiccodegenxarch.cpp
index d21d2946c9..4d63bef6ef 100644
--- a/src/jit/hwintrinsiccodegenxarch.cpp
+++ b/src/jit/hwintrinsiccodegenxarch.cpp
@@ -323,7 +323,8 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
switch (isa)
{
- case InstructionSet_Base:
+ case InstructionSet_Vector128:
+ case InstructionSet_Vector256:
genBaseIntrinsic(node);
break;
case InstructionSet_SSE:
@@ -1226,8 +1227,8 @@ void CodeGen::genBaseIntrinsic(GenTreeHWIntrinsic* node)
switch (intrinsicId)
{
- case NI_Base_Vector128_CreateScalarUnsafe:
- case NI_Base_Vector256_CreateScalarUnsafe:
+ case NI_Vector128_CreateScalarUnsafe:
+ case NI_Vector256_CreateScalarUnsafe:
{
if (varTypeIsIntegral(baseType))
{
@@ -1252,8 +1253,8 @@ void CodeGen::genBaseIntrinsic(GenTreeHWIntrinsic* node)
break;
}
- case NI_Base_Vector128_ToScalar:
- case NI_Base_Vector256_ToScalar:
+ case NI_Vector128_ToScalar:
+ case NI_Vector256_ToScalar:
{
assert(varTypeIsFloating(baseType));
@@ -1271,7 +1272,7 @@ void CodeGen::genBaseIntrinsic(GenTreeHWIntrinsic* node)
break;
}
- case NI_Base_Vector128_ToVector256:
+ case NI_Vector128_ToVector256:
{
// ToVector256 has zero-extend semantics in order to ensure it is deterministic
// We always emit a move to the target register, even when op1Reg == targetReg,
@@ -1291,8 +1292,8 @@ void CodeGen::genBaseIntrinsic(GenTreeHWIntrinsic* node)
break;
}
- case NI_Base_Vector128_ToVector256Unsafe:
- case NI_Base_Vector256_GetLower:
+ case NI_Vector128_ToVector256Unsafe:
+ case NI_Vector256_GetLower:
{
if (op1->isContained() || op1->isUsedFromSpillTemp())
{
@@ -1306,8 +1307,8 @@ void CodeGen::genBaseIntrinsic(GenTreeHWIntrinsic* node)
break;
}
- case NI_Base_Vector128_Zero:
- case NI_Base_Vector256_Zero:
+ case NI_Vector128_Zero:
+ case NI_Vector256_Zero:
{
assert(op1 == nullptr);
emit->emitIns_SIMD_R_R_R(ins, attr, targetReg, targetReg, targetReg);
diff --git a/src/jit/hwintrinsiclistArm64.h b/src/jit/hwintrinsiclistArm64.h
index cbf60c7374..e61999e3aa 100644
--- a/src/jit/hwintrinsiclistArm64.h
+++ b/src/jit/hwintrinsiclistArm64.h
@@ -35,30 +35,35 @@ HARDWARE_INTRINSIC_CLASS(JIT_FLAG_HAS_ARM64_SVE , EnableArm64Sve , Sv
#endif // defined(HARDWARE_INTRINSIC_CLASS)
#if defined(HARDWARE_INTRINSIC)
-// (ID Class Function name Form Floating, Signed, Unsigned, Flags)
+// (ID Class Function name Form Floating, Signed, Unsigned, Flags)
// None (For internal use only)
-HARDWARE_INTRINSIC(NI_ARM64_NONE_MOV, None, None, UnaryOp, INS_mov, INS_mov, INS_mov, None )
+HARDWARE_INTRINSIC(NI_ARM64_NONE_MOV, None, None, UnaryOp, INS_mov, INS_mov, INS_mov, None )
+
// Base
-HARDWARE_INTRINSIC(NI_ARM64_BASE_CLS, Base, LeadingSignCount, UnaryOp, INS_invalid, INS_cls, INS_cls, None )
-HARDWARE_INTRINSIC(NI_ARM64_BASE_CLZ, Base, LeadingZeroCount, UnaryOp, INS_invalid, INS_clz, INS_clz, None )
-HARDWARE_INTRINSIC(NI_Base_Vector64_AsByte, Base, AsByte, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector64_AsInt16, Base, AsInt16, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector64_AsInt32, Base, AsInt32, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector64_AsSByte, Base, AsSByte, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector64_AsSingle, Base, AsSingle, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector64_AsUInt16, Base, AsUInt16, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector64_AsUInt32, Base, AsUInt32, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector128_As, Base, As, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector128_AsByte, Base, AsByte, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector128_AsDouble, Base, AsDouble, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector128_AsInt16, Base, AsInt16, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector128_AsInt32, Base, AsInt32, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector128_AsInt64, Base, AsInt64, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector128_AsSByte, Base, AsSByte, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector128_AsSingle, Base, AsSingle, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector128_AsUInt16, Base, AsUInt16, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector128_AsUInt32, Base, AsUInt32, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
-HARDWARE_INTRINSIC(NI_Base_Vector128_AsUInt64, Base, AsUInt64, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_ARM64_BASE_CLS, Base, LeadingSignCount, UnaryOp, INS_invalid, INS_cls, INS_cls, None )
+HARDWARE_INTRINSIC(NI_ARM64_BASE_CLZ, Base, LeadingZeroCount, UnaryOp, INS_invalid, INS_clz, INS_clz, None )
+
+// Vector64
+HARDWARE_INTRINSIC(NI_Vector64_AsByte, Vector64, AsByte, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector64_AsInt16, Vector64, AsInt16, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector64_AsInt32, Vector64, AsInt32, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector64_AsSByte, Vector64, AsSByte, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector64_AsSingle, Vector64, AsSingle, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector64_AsUInt16, Vector64, AsUInt16, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector64_AsUInt32, Vector64, AsUInt32, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+
+// Vector128
+HARDWARE_INTRINSIC(NI_Vector128_As, Vector128, As, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector128_AsByte, Vector128, AsByte, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector128_AsDouble, Vector128, AsDouble, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector128_AsInt16, Vector128, AsInt16, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector128_AsInt32, Vector128, AsInt32, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector128_AsInt64, Vector128, AsInt64, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector128_AsSByte, Vector128, AsSByte, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector128_AsSingle, Vector128, AsSingle, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector128_AsUInt16, Vector128, AsUInt16, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector128_AsUInt32, Vector128, AsUInt32, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
+HARDWARE_INTRINSIC(NI_Vector128_AsUInt64, Vector128, AsUInt64, UnaryOp, INS_invalid, INS_invalid, INS_invalid, None )
#if NYI
// Crc32
HARDWARE_INTRINSIC(NI_ARM64_CRC32_CRC32, Crc32, Crc32, CrcOp, INS_invalid, INS_invalid, INS_crc32, None )
diff --git a/src/jit/hwintrinsiclistxarch.h b/src/jit/hwintrinsiclistxarch.h
index 58e3fbb2ea..e10a264b9c 100644
--- a/src/jit/hwintrinsiclistxarch.h
+++ b/src/jit/hwintrinsiclistxarch.h
@@ -26,42 +26,48 @@
// Intrinsic ID Function name ISA ival SIMD size NumArg instructions Category Flags
// {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE}
// ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
-// Base Intrinsics
-HARDWARE_INTRINSIC(Base_Vector128_As, "As", Base, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_AsByte, "AsByte", Base, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_AsDouble, "AsDouble", Base, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_AsInt16, "AsInt16", Base, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_AsInt32, "AsInt32", Base, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_AsInt64, "AsInt64", Base, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_AsSByte, "AsSByte", Base, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_AsSingle, "AsSingle", Base, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_AsUInt16, "AsUInt16", Base, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_AsUInt32, "AsUInt32", Base, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_AsUInt64, "AsUInt64", Base, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_CreateScalarUnsafe, "CreateScalarUnsafe", Base, -1, 16, 1, {INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_movss, INS_movsdsse2}, HW_Category_SIMDScalar, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_GetElement, "GetElement", Base, -1, 16, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg)
-HARDWARE_INTRINSIC(Base_Vector128_WithElement, "WithElement", Base, -1, 16, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg)
-HARDWARE_INTRINSIC(Base_Vector128_ToScalar, "ToScalar", Base, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_movss, INS_movsdsse2}, HW_Category_SimpleSIMD, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_ToVector256, "ToVector256", Base, -1, 16, 1, {INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movups, INS_movupd}, HW_Category_SimpleSIMD, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_ToVector256Unsafe, "ToVector256Unsafe", Base, -1, 16, 1, {INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movups, INS_movupd}, HW_Category_SimpleSIMD, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector128_Zero, "get_Zero", Base, -1, 16, 0, {INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_As, "As", Base, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_AsByte, "AsByte", Base, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_AsDouble, "AsDouble", Base, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_AsInt16, "AsInt16", Base, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_AsInt32, "AsInt32", Base, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_AsInt64, "AsInt64", Base, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_AsSByte, "AsSByte", Base, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_AsSingle, "AsSingle", Base, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_AsUInt16, "AsUInt16", Base, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_AsUInt32, "AsUInt32", Base, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_AsUInt64, "AsUInt64", Base, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_CreateScalarUnsafe, "CreateScalarUnsafe", Base, -1, 32, 1, {INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_movss, INS_movsdsse2}, HW_Category_SIMDScalar, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_GetElement, "GetElement", Base, -1, 32, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg)
-HARDWARE_INTRINSIC(Base_Vector256_WithElement, "WithElement", Base, -1, 32, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg)
-HARDWARE_INTRINSIC(Base_Vector256_GetLower, "GetLower", Base, -1, 32, 1, {INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movups, INS_movupd}, HW_Category_SimpleSIMD, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_ToScalar, "ToScalar", Base, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_movss, INS_movsdsse2}, HW_Category_SimpleSIMD, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
-HARDWARE_INTRINSIC(Base_Vector256_Zero, "get_Zero", Base, -1, 32, 0, {INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_NoRMWSemantics)
+// Vector128 Intrinsics
+HARDWARE_INTRINSIC(Vector128_As, "As", Vector128, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_AsByte, "AsByte", Vector128, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_AsDouble, "AsDouble", Vector128, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_AsInt16, "AsInt16", Vector128, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_AsInt32, "AsInt32", Vector128, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_AsInt64, "AsInt64", Vector128, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_AsSByte, "AsSByte", Vector128, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_AsSingle, "AsSingle", Vector128, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_AsUInt16, "AsUInt16", Vector128, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_AsUInt32, "AsUInt32", Vector128, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_AsUInt64, "AsUInt64", Vector128, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_CreateScalarUnsafe, "CreateScalarUnsafe", Vector128, -1, 16, 1, {INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_movss, INS_movsdsse2}, HW_Category_SIMDScalar, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_GetElement, "GetElement", Vector128, -1, 16, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg)
+HARDWARE_INTRINSIC(Vector128_WithElement, "WithElement", Vector128, -1, 16, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg)
+HARDWARE_INTRINSIC(Vector128_ToScalar, "ToScalar", Vector128, -1, 16, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_movss, INS_movsdsse2}, HW_Category_SimpleSIMD, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_ToVector256, "ToVector256", Vector128, -1, 16, 1, {INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movups, INS_movupd}, HW_Category_SimpleSIMD, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_ToVector256Unsafe, "ToVector256Unsafe", Vector128, -1, 16, 1, {INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movups, INS_movupd}, HW_Category_SimpleSIMD, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector128_Zero, "get_Zero", Vector128, -1, 16, 0, {INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_NoRMWSemantics)
+
+// ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
+// Intrinsic ID Function name ISA ival SIMD size NumArg instructions Category Flags
+// {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE}
+// ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
+// Vector256 Intrinsics
+HARDWARE_INTRINSIC(Vector256_As, "As", Vector256, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_AsByte, "AsByte", Vector256, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_AsDouble, "AsDouble", Vector256, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_AsInt16, "AsInt16", Vector256, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_AsInt32, "AsInt32", Vector256, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_AsInt64, "AsInt64", Vector256, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_AsSByte, "AsSByte", Vector256, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_AsSingle, "AsSingle", Vector256, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_AsUInt16, "AsUInt16", Vector256, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_AsUInt32, "AsUInt32", Vector256, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_AsUInt64, "AsUInt64", Vector256, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_CreateScalarUnsafe, "CreateScalarUnsafe", Vector256, -1, 32, 1, {INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_mov_i2xmm, INS_movss, INS_movsdsse2}, HW_Category_SIMDScalar, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_GetElement, "GetElement", Vector256, -1, 32, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg)
+HARDWARE_INTRINSIC(Vector256_WithElement, "WithElement", Vector256, -1, 32, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg)
+HARDWARE_INTRINSIC(Vector256_GetLower, "GetLower", Vector256, -1, 32, 1, {INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movdqu, INS_movups, INS_movupd}, HW_Category_SimpleSIMD, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_ToScalar, "ToScalar", Vector256, -1, 32, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_movss, INS_movsdsse2}, HW_Category_SimpleSIMD, HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoRMWSemantics)
+HARDWARE_INTRINSIC(Vector256_Zero, "get_Zero", Vector256, -1, 32, 0, {INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps, INS_xorps}, HW_Category_Helper, HW_Flag_SpecialImport|HW_Flag_NoContainment|HW_Flag_NoRMWSemantics)
// ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
// Intrinsic ID Function name ISA ival SIMD size NumArg instructions Category Flags
diff --git a/src/jit/hwintrinsicxarch.cpp b/src/jit/hwintrinsicxarch.cpp
index dc298ed230..eb70a06aa0 100644
--- a/src/jit/hwintrinsicxarch.cpp
+++ b/src/jit/hwintrinsicxarch.cpp
@@ -48,7 +48,12 @@ NamedIntrinsic HWIntrinsicInfo::lookupId(const char* className, const char* meth
// TODO-Throughput: replace sequential search by binary search
InstructionSet isa = lookupIsa(className, enclosingClassName);
- assert(isa != InstructionSet_ILLEGAL);
+ if (isa == InstructionSet_ILLEGAL)
+ {
+ // There are several platform-agnostic intrinsics (e.g., Vector64) that
+ // are not supported in x86, so early return NI_Illegal
+ return NI_Illegal;
+ }
assert(methodName != nullptr);
@@ -179,6 +184,17 @@ static InstructionSet lookupInstructionSet(const char* className)
return InstructionSet_POPCNT;
}
}
+ else if (className[0] == 'V')
+ {
+ if (strncmp(className, "Vector128", 9) == 0)
+ {
+ return InstructionSet_Vector128;
+ }
+ else if (strncmp(className, "Vector256", 9) == 0)
+ {
+ return InstructionSet_Vector256;
+ }
+ }
else if (strcmp(className, "Fma") == 0)
{
return InstructionSet_FMA;
@@ -188,7 +204,6 @@ static InstructionSet lookupInstructionSet(const char* className)
return InstructionSet_LZCNT;
}
- unreached();
return InstructionSet_ILLEGAL;
}
@@ -504,7 +519,6 @@ bool HWIntrinsicInfo::isFullyImplementedIsa(InstructionSet isa)
case InstructionSet_AES:
case InstructionSet_AVX:
case InstructionSet_AVX2:
- case InstructionSet_Base:
case InstructionSet_BMI1:
case InstructionSet_BMI2:
case InstructionSet_BMI1_X64:
@@ -525,6 +539,8 @@ bool HWIntrinsicInfo::isFullyImplementedIsa(InstructionSet isa)
case InstructionSet_SSE41_X64:
case InstructionSet_SSE42:
case InstructionSet_SSE42_X64:
+ case InstructionSet_Vector128:
+ case InstructionSet_Vector256:
{
return true;
}
@@ -928,7 +944,8 @@ GenTree* Compiler::impHWIntrinsic(NamedIntrinsic intrinsic,
// other intrinsics need special importation
switch (isa)
{
- case InstructionSet_Base:
+ case InstructionSet_Vector128:
+ case InstructionSet_Vector256:
return impBaseIntrinsic(intrinsic, method, sig, mustExpand);
case InstructionSet_SSE:
return impSSEIntrinsic(intrinsic, method, sig, mustExpand);
@@ -1024,17 +1041,17 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
switch (intrinsic)
{
- case NI_Base_Vector256_As:
- case NI_Base_Vector256_AsByte:
- case NI_Base_Vector256_AsDouble:
- case NI_Base_Vector256_AsInt16:
- case NI_Base_Vector256_AsInt32:
- case NI_Base_Vector256_AsInt64:
- case NI_Base_Vector256_AsSByte:
- case NI_Base_Vector256_AsSingle:
- case NI_Base_Vector256_AsUInt16:
- case NI_Base_Vector256_AsUInt32:
- case NI_Base_Vector256_AsUInt64:
+ case NI_Vector256_As:
+ case NI_Vector256_AsByte:
+ case NI_Vector256_AsDouble:
+ case NI_Vector256_AsInt16:
+ case NI_Vector256_AsInt32:
+ case NI_Vector256_AsInt64:
+ case NI_Vector256_AsSByte:
+ case NI_Vector256_AsSingle:
+ case NI_Vector256_AsUInt16:
+ case NI_Vector256_AsUInt32:
+ case NI_Vector256_AsUInt64:
{
if (!compSupports(InstructionSet_AVX))
{
@@ -1045,17 +1062,17 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
__fallthrough;
}
- case NI_Base_Vector128_As:
- case NI_Base_Vector128_AsByte:
- case NI_Base_Vector128_AsDouble:
- case NI_Base_Vector128_AsInt16:
- case NI_Base_Vector128_AsInt32:
- case NI_Base_Vector128_AsInt64:
- case NI_Base_Vector128_AsSByte:
- case NI_Base_Vector128_AsSingle:
- case NI_Base_Vector128_AsUInt16:
- case NI_Base_Vector128_AsUInt32:
- case NI_Base_Vector128_AsUInt64:
+ case NI_Vector128_As:
+ case NI_Vector128_AsByte:
+ case NI_Vector128_AsDouble:
+ case NI_Vector128_AsInt16:
+ case NI_Vector128_AsInt32:
+ case NI_Vector128_AsInt64:
+ case NI_Vector128_AsSByte:
+ case NI_Vector128_AsSingle:
+ case NI_Vector128_AsUInt16:
+ case NI_Vector128_AsUInt32:
+ case NI_Vector128_AsUInt64:
{
// We fold away the cast here, as it only exists to satisfy
// the type system. It is safe to do this here since the retNode type
@@ -1069,7 +1086,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
break;
}
- case NI_Base_Vector128_CreateScalarUnsafe:
+ case NI_Vector128_CreateScalarUnsafe:
{
assert(sig->numArgs == 1);
@@ -1091,7 +1108,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
break;
}
- case NI_Base_Vector128_ToScalar:
+ case NI_Vector128_ToScalar:
{
assert(sig->numArgs == 1);
@@ -1103,9 +1120,9 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
break;
}
- case NI_Base_Vector128_ToVector256:
- case NI_Base_Vector128_ToVector256Unsafe:
- case NI_Base_Vector256_GetLower:
+ case NI_Vector128_ToVector256:
+ case NI_Vector128_ToVector256Unsafe:
+ case NI_Vector256_GetLower:
{
assert(sig->numArgs == 1);
@@ -1117,7 +1134,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
break;
}
- case NI_Base_Vector128_Zero:
+ case NI_Vector128_Zero:
{
assert(sig->numArgs == 0);
@@ -1128,7 +1145,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
break;
}
- case NI_Base_Vector256_CreateScalarUnsafe:
+ case NI_Vector256_CreateScalarUnsafe:
{
assert(sig->numArgs == 1);
@@ -1150,7 +1167,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
break;
}
- case NI_Base_Vector256_ToScalar:
+ case NI_Vector256_ToScalar:
{
assert(sig->numArgs == 1);
@@ -1162,7 +1179,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
break;
}
- case NI_Base_Vector256_Zero:
+ case NI_Vector256_Zero:
{
assert(sig->numArgs == 0);
@@ -1173,7 +1190,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
break;
}
- case NI_Base_Vector256_WithElement:
+ case NI_Vector256_WithElement:
{
if (!compSupports(InstructionSet_AVX))
{
@@ -1183,7 +1200,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
__fallthrough;
}
- case NI_Base_Vector128_WithElement:
+ case NI_Vector128_WithElement:
{
assert(sig->numArgs == 3);
GenTree* indexOp = impStackTop(1).val;
@@ -1263,7 +1280,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
else
{
vectorOp =
- gtNewSimdHWIntrinsicNode(TYP_SIMD16, vectorOp, NI_Base_Vector256_GetLower, baseType, simdSize);
+ gtNewSimdHWIntrinsicNode(TYP_SIMD16, vectorOp, NI_Vector256_GetLower, baseType, simdSize);
}
}
@@ -1287,8 +1304,8 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
// vector.WithElement(0, value)
// =>
// movss xmm0, xmm1 (xmm0 = vector, xmm1 = value)
- valueOp = gtNewSimdHWIntrinsicNode(TYP_SIMD16, valueOp,
- NI_Base_Vector128_CreateScalarUnsafe, TYP_FLOAT, 16);
+ valueOp = gtNewSimdHWIntrinsicNode(TYP_SIMD16, valueOp, NI_Vector128_CreateScalarUnsafe,
+ TYP_FLOAT, 16);
retNode = gtNewSimdHWIntrinsicNode(TYP_SIMD16, vectorOp, valueOp, NI_SSE_MoveScalar,
TYP_FLOAT, 16);
}
@@ -1298,9 +1315,8 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
// =>
// shufps xmm1, xmm0, 0 (xmm0 = vector, xmm1 = value)
// shufps xmm1, xmm0, 226
- GenTree* tmpOp =
- gtNewSimdHWIntrinsicNode(TYP_SIMD16, valueOp, NI_Base_Vector128_CreateScalarUnsafe,
- TYP_FLOAT, 16);
+ GenTree* tmpOp = gtNewSimdHWIntrinsicNode(TYP_SIMD16, valueOp,
+ NI_Vector128_CreateScalarUnsafe, TYP_FLOAT, 16);
GenTree* dupVectorOp = nullptr;
vectorOp = impCloneExpr(vectorOp, &dupVectorOp, NO_CLASS_HANDLE, (unsigned)CHECK_SPILL_ALL,
nullptr DEBUGARG("Clone Vector for Vector128<float>.WithElement"));
@@ -1332,9 +1348,8 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
// =>
// shufps xmm1, xmm0, 32 (xmm0 = vector, xmm1 = value)
// shufps xmm0, xmm1, 36
- GenTree* tmpOp =
- gtNewSimdHWIntrinsicNode(TYP_SIMD16, valueOp, NI_Base_Vector128_CreateScalarUnsafe,
- TYP_FLOAT, 16);
+ GenTree* tmpOp = gtNewSimdHWIntrinsicNode(TYP_SIMD16, valueOp,
+ NI_Vector128_CreateScalarUnsafe, TYP_FLOAT, 16);
GenTree* dupVectorOp = nullptr;
vectorOp = impCloneExpr(vectorOp, &dupVectorOp, NO_CLASS_HANDLE, (unsigned)CHECK_SPILL_ALL,
nullptr DEBUGARG("Clone Vector for Vector128<float>.WithElement"));
@@ -1348,7 +1363,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
}
else
{
- valueOp = gtNewSimdHWIntrinsicNode(TYP_SIMD16, valueOp, NI_Base_Vector128_CreateScalarUnsafe,
+ valueOp = gtNewSimdHWIntrinsicNode(TYP_SIMD16, valueOp, NI_Vector128_CreateScalarUnsafe,
TYP_FLOAT, 16);
immNode->AsIntCon()->SetIconValue(imm8 * 16);
__fallthrough;
@@ -1378,8 +1393,8 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
// vector.WithElement(1, value)
// =>
// unpcklpd xmm0, xmm1 (xmm0 = vector, xmm1 = value)
- valueOp = gtNewSimdHWIntrinsicNode(TYP_SIMD16, valueOp, NI_Base_Vector128_CreateScalarUnsafe,
- TYP_DOUBLE, 16);
+ valueOp =
+ gtNewSimdHWIntrinsicNode(TYP_SIMD16, valueOp, NI_Vector128_CreateScalarUnsafe, TYP_DOUBLE, 16);
NamedIntrinsic in = (imm8 == 0) ? NI_SSE2_MoveScalar : NI_SSE2_UnpackLow;
retNode = gtNewSimdHWIntrinsicNode(TYP_SIMD16, vectorOp, valueOp, in, TYP_DOUBLE, 16);
break;
@@ -1401,7 +1416,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
break;
}
- case NI_Base_Vector256_GetElement:
+ case NI_Vector256_GetElement:
{
if (!compSupports(InstructionSet_AVX))
{
@@ -1411,7 +1426,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
__fallthrough;
}
- case NI_Base_Vector128_GetElement:
+ case NI_Vector128_GetElement:
{
assert(sig->numArgs == 2);
GenTree* indexOp = impStackTop().val;
@@ -1482,7 +1497,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
else
{
vectorOp =
- gtNewSimdHWIntrinsicNode(TYP_SIMD16, vectorOp, NI_Base_Vector256_GetLower, baseType, simdSize);
+ gtNewSimdHWIntrinsicNode(TYP_SIMD16, vectorOp, NI_Vector256_GetLower, baseType, simdSize);
}
}
@@ -1508,7 +1523,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
case TYP_FLOAT:
case TYP_DOUBLE:
- resIntrinsic = NI_Base_Vector128_ToScalar;
+ resIntrinsic = NI_Vector128_ToScalar;
break;
default:
@@ -1544,7 +1559,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
nullptr DEBUGARG("Clone Vector for Vector128<float>.GetElement"));
vectorOp = gtNewSimdHWIntrinsicNode(TYP_SIMD16, vectorOp, clonedVectorOp, immNode,
NI_SSE_Shuffle, TYP_FLOAT, 16);
- return gtNewSimdHWIntrinsicNode(retType, vectorOp, NI_Base_Vector128_ToScalar, TYP_FLOAT, 16);
+ return gtNewSimdHWIntrinsicNode(retType, vectorOp, NI_Vector128_ToScalar, TYP_FLOAT, 16);
}
__fallthrough;
}
@@ -1578,8 +1593,7 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
// pshufd xmm1, xmm0, 0xEE (xmm0 = vector)
vectorOp = gtNewSimdHWIntrinsicNode(TYP_SIMD16, vectorOp, gtNewIconNode(0xEE), NI_SSE2_Shuffle,
TYP_INT, 16);
- retNode =
- gtNewSimdHWIntrinsicNode(TYP_DOUBLE, vectorOp, NI_Base_Vector128_ToScalar, TYP_DOUBLE, 16);
+ retNode = gtNewSimdHWIntrinsicNode(TYP_DOUBLE, vectorOp, NI_Vector128_ToScalar, TYP_DOUBLE, 16);
break;
default:
diff --git a/src/jit/importer.cpp b/src/jit/importer.cpp
index 74ec369f81..5e012e3672 100644
--- a/src/jit/importer.cpp
+++ b/src/jit/importer.cpp
@@ -4012,15 +4012,15 @@ GenTree* Compiler::impIntrinsic(GenTree* newobjThis,
// ).ToScalar();
GenTree* op3 = gtNewSimdHWIntrinsicNode(TYP_SIMD16, impPopStack().val,
- NI_Base_Vector128_CreateScalarUnsafe, callType, 16);
+ NI_Vector128_CreateScalarUnsafe, callType, 16);
GenTree* op2 = gtNewSimdHWIntrinsicNode(TYP_SIMD16, impPopStack().val,
- NI_Base_Vector128_CreateScalarUnsafe, callType, 16);
+ NI_Vector128_CreateScalarUnsafe, callType, 16);
GenTree* op1 = gtNewSimdHWIntrinsicNode(TYP_SIMD16, impPopStack().val,
- NI_Base_Vector128_CreateScalarUnsafe, callType, 16);
+ NI_Vector128_CreateScalarUnsafe, callType, 16);
GenTree* res =
gtNewSimdHWIntrinsicNode(TYP_SIMD16, op1, op2, op3, NI_FMA_MultiplyAddScalar, callType, 16);
- retNode = gtNewSimdHWIntrinsicNode(callType, res, NI_Base_Vector128_ToScalar, callType, 16);
+ retNode = gtNewSimdHWIntrinsicNode(callType, res, NI_Vector128_ToScalar, callType, 16);
}
#endif // _TARGET_XARCH_
break;
@@ -4264,262 +4264,12 @@ NamedIntrinsic Compiler::lookupNamedIntrinsic(CORINFO_METHOD_HANDLE method)
#ifdef FEATURE_HW_INTRINSICS
else if (strncmp(namespaceName, "System.Runtime.Intrinsics", 25) == 0)
{
- namespaceName += 25;
-
- if (namespaceName[0] == '\0')
- {
- if (strncmp(className, "Vector", 6) == 0)
- {
- className += 6;
-
-#if defined(_TARGET_ARM64_)
- if (strncmp(className, "64", 2) == 0)
- {
- className += 2;
-
- if (className[0] == '\0')
- {
- if (strncmp(methodName, "As", 2) == 0)
- {
- methodName += 2;
-
- // Vector64_As, Vector64_AsDouble, Vector64_AsInt64, and Vector64_AsUInt64
- // are not currently supported as they require additional plumbing to be
- // supported by the JIT as TYP_SIMD8.
-
- if (strcmp(methodName, "Byte") == 0)
- {
- result = NI_Base_Vector64_AsByte;
- }
- else if (strcmp(methodName, "Int16") == 0)
- {
- result = NI_Base_Vector64_AsInt16;
- }
- else if (strcmp(methodName, "Int32") == 0)
- {
- result = NI_Base_Vector64_AsInt32;
- }
- else if (strcmp(methodName, "SByte") == 0)
- {
- result = NI_Base_Vector64_AsSByte;
- }
- else if (strcmp(methodName, "Single") == 0)
- {
- result = NI_Base_Vector64_AsSingle;
- }
- else if (strcmp(methodName, "UInt16") == 0)
- {
- result = NI_Base_Vector64_AsUInt16;
- }
- else if (strcmp(methodName, "UInt32") == 0)
- {
- result = NI_Base_Vector64_AsUInt32;
- }
- }
- }
- }
- else
-#endif // _TARGET_ARM64_
- if (strncmp(className, "128", 3) == 0)
- {
- className += 3;
-
- if (className[0] == '\0')
- {
- if (strncmp(methodName, "As", 2) == 0)
- {
- methodName += 2;
-
- if (methodName[0] == '\0')
- {
- result = NI_Base_Vector128_As;
- }
- else if (strcmp(methodName, "Byte") == 0)
- {
- result = NI_Base_Vector128_AsByte;
- }
- else if (strcmp(methodName, "Double") == 0)
- {
- result = NI_Base_Vector128_AsDouble;
- }
- else if (strcmp(methodName, "Int16") == 0)
- {
- result = NI_Base_Vector128_AsInt16;
- }
- else if (strcmp(methodName, "Int32") == 0)
- {
- result = NI_Base_Vector128_AsInt32;
- }
- else if (strcmp(methodName, "Int64") == 0)
- {
- result = NI_Base_Vector128_AsInt64;
- }
- else if (strcmp(methodName, "SByte") == 0)
- {
- result = NI_Base_Vector128_AsSByte;
- }
- else if (strcmp(methodName, "Single") == 0)
- {
- result = NI_Base_Vector128_AsSingle;
- }
- else if (strcmp(methodName, "UInt16") == 0)
- {
- result = NI_Base_Vector128_AsUInt16;
- }
- else if (strcmp(methodName, "UInt32") == 0)
- {
- result = NI_Base_Vector128_AsUInt32;
- }
- else if (strcmp(methodName, "UInt64") == 0)
- {
- result = NI_Base_Vector128_AsUInt64;
- }
- }
-#if defined(_TARGET_XARCH_)
- else if (strcmp(methodName, "CreateScalarUnsafe") == 0)
- {
- result = NI_Base_Vector128_CreateScalarUnsafe;
- }
- else if (strcmp(methodName, "GetElement") == 0)
- {
- result = NI_Base_Vector128_GetElement;
- }
- else if (strncmp(methodName, "To", 2) == 0)
- {
- methodName += 2;
-
- if (strcmp(methodName, "Scalar") == 0)
- {
- result = NI_Base_Vector128_ToScalar;
- }
- else if (strncmp(methodName, "Vector256", 9) == 0)
- {
- methodName += 9;
-
- if (methodName[0] == '\0')
- {
- result = NI_Base_Vector128_ToVector256;
- }
- else if (strcmp(methodName, "Unsafe") == 0)
- {
- result = NI_Base_Vector128_ToVector256Unsafe;
- }
- }
- }
- else if (strcmp(methodName, "WithElement") == 0)
- {
- result = NI_Base_Vector128_WithElement;
- }
-#endif // _TARGET_XARCH_
- }
-#if defined(_TARGET_XARCH_)
- else if (strcmp(className, "`1") == 0)
- {
- if (strcmp(methodName, "get_Zero") == 0)
- {
- result = NI_Base_Vector128_Zero;
- }
- }
-#endif // _TARGET_XARCH_
- }
-#if defined(_TARGET_XARCH_)
- else if (strncmp(className, "256", 3) == 0)
- {
- className += 3;
-
- if (className[0] == '\0')
- {
- if (strncmp(methodName, "As", 2) == 0)
- {
- methodName += 2;
-
- if (methodName[0] == '\0')
- {
- result = NI_Base_Vector256_As;
- }
- else if (strcmp(methodName, "Byte") == 0)
- {
- result = NI_Base_Vector256_AsByte;
- }
- else if (strcmp(methodName, "Double") == 0)
- {
- result = NI_Base_Vector256_AsDouble;
- }
- else if (strcmp(methodName, "Int16") == 0)
- {
- result = NI_Base_Vector256_AsInt16;
- }
- else if (strcmp(methodName, "Int32") == 0)
- {
- result = NI_Base_Vector256_AsInt32;
- }
- else if (strcmp(methodName, "Int64") == 0)
- {
- result = NI_Base_Vector256_AsInt64;
- }
- else if (strcmp(methodName, "SByte") == 0)
- {
- result = NI_Base_Vector256_AsSByte;
- }
- else if (strcmp(methodName, "Single") == 0)
- {
- result = NI_Base_Vector256_AsSingle;
- }
- else if (strcmp(methodName, "UInt16") == 0)
- {
- result = NI_Base_Vector256_AsUInt16;
- }
- else if (strcmp(methodName, "UInt32") == 0)
- {
- result = NI_Base_Vector256_AsUInt32;
- }
- else if (strcmp(methodName, "UInt64") == 0)
- {
- result = NI_Base_Vector256_AsUInt64;
- }
- }
- else if (strcmp(methodName, "CreateScalarUnsafe") == 0)
- {
- result = NI_Base_Vector256_CreateScalarUnsafe;
- }
- else if (strcmp(methodName, "GetElement") == 0)
- {
- result = NI_Base_Vector256_GetElement;
- }
- else if (strcmp(methodName, "GetLower") == 0)
- {
- result = NI_Base_Vector256_GetLower;
- }
- else if (strcmp(methodName, "ToScalar") == 0)
- {
- result = NI_Base_Vector256_ToScalar;
- }
- else if (strcmp(methodName, "WithElement") == 0)
- {
- result = NI_Base_Vector256_WithElement;
- }
- }
- else if (strcmp(className, "`1") == 0)
- {
- if (strcmp(methodName, "get_Zero") == 0)
- {
- result = NI_Base_Vector256_Zero;
- }
- }
- }
-#endif // _TARGET_XARCH_
- }
- }
#if defined(_TARGET_XARCH_)
- else if (strcmp(namespaceName, ".X86") == 0)
- {
- result = HWIntrinsicInfo::lookupId(className, methodName, enclosingClassName);
- }
+ assert(strcmp(namespaceName + 25, ".X86") == 0 || namespaceName[25] == '\0');
+ result = HWIntrinsicInfo::lookupId(className, methodName, enclosingClassName);
#elif defined(_TARGET_ARM64_)
- else if (strcmp(namespaceName, ".Arm.Arm64") == 0)
- {
- result = lookupHWIntrinsic(className, methodName);
- }
+ assert(strcmp(namespaceName + 25, ".Arm.Arm64") == 0 || namespaceName[25] == '\0');
+ result = lookupHWIntrinsic(className, methodName);
#else // !defined(_TARGET_XARCH_) && !defined(_TARGET_ARM64_)
#error Unsupported platform
#endif // !defined(_TARGET_XARCH_) && !defined(_TARGET_ARM64_)
diff --git a/src/jit/instr.h b/src/jit/instr.h
index a7749d81b7..75f1b592a7 100644
--- a/src/jit/instr.h
+++ b/src/jit/instr.h
@@ -296,7 +296,8 @@ enum InstructionSet
{
InstructionSet_ILLEGAL = 0,
#ifdef _TARGET_XARCH_
- InstructionSet_Base,
+ InstructionSet_Vector128,
+ InstructionSet_Vector256,
// Start linear order SIMD instruction sets
// These ISAs have strictly generation to generation order.
InstructionSet_SSE,
@@ -326,6 +327,8 @@ enum InstructionSet
#elif defined(_TARGET_ARM_)
InstructionSet_NEON,
#elif defined(_TARGET_ARM64_)
+ InstructionSet_Vector64,
+ InstructionSet_Vector128,
InstructionSet_Base, // Base instructions available on all Arm64 platforms
InstructionSet_Aes, // ID_AA64ISAR0_EL1.AES is 1 or better
InstructionSet_Atomics, // ID_AA64ISAR0_EL1.Atomic is 2 or better
diff --git a/src/jit/lowerxarch.cpp b/src/jit/lowerxarch.cpp
index a716545842..df0959015d 100644
--- a/src/jit/lowerxarch.cpp
+++ b/src/jit/lowerxarch.cpp
@@ -2654,8 +2654,8 @@ bool Lowering::IsContainableHWIntrinsicOp(GenTreeHWIntrinsic* containingNode, Ge
switch (containingIntrinsicId)
{
- case NI_Base_Vector128_CreateScalarUnsafe:
- case NI_Base_Vector256_CreateScalarUnsafe:
+ case NI_Vector128_CreateScalarUnsafe:
+ case NI_Vector256_CreateScalarUnsafe:
{
assert(supportsSIMDScalarLoads == false);
diff --git a/src/jit/lsraxarch.cpp b/src/jit/lsraxarch.cpp
index c430db049d..a1e56aac0f 100644
--- a/src/jit/lsraxarch.cpp
+++ b/src/jit/lsraxarch.cpp
@@ -2403,10 +2403,10 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree)
// must be handled within the case.
switch (intrinsicId)
{
- case NI_Base_Vector128_CreateScalarUnsafe:
- case NI_Base_Vector128_ToScalar:
- case NI_Base_Vector256_CreateScalarUnsafe:
- case NI_Base_Vector256_ToScalar:
+ case NI_Vector128_CreateScalarUnsafe:
+ case NI_Vector128_ToScalar:
+ case NI_Vector256_CreateScalarUnsafe:
+ case NI_Vector256_ToScalar:
{
assert(numArgs == 1);
@@ -2432,9 +2432,9 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree)
break;
}
- case NI_Base_Vector128_ToVector256:
- case NI_Base_Vector128_ToVector256Unsafe:
- case NI_Base_Vector256_GetLower:
+ case NI_Vector128_ToVector256:
+ case NI_Vector128_ToVector256Unsafe:
+ case NI_Vector256_GetLower:
{
assert(numArgs == 1);