Skip to content

Commit 95ad1b1

Browse files
committed
Sve: Expand CreateWhile APIs
Fixes dotnet#108233 Follows on from dotnet#123947 *Rename CreateWhile APIs to make it clear they are Unsigned *Add Signed variants *Add Double and Single variants
1 parent 8214ffd commit 95ad1b1

File tree

7 files changed

+932
-152
lines changed

7 files changed

+932
-152
lines changed

src/coreclr/jit/hwintrinsic.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2402,14 +2402,26 @@ GenTree* Compiler::impHWIntrinsic(NamedIntrinsic intrinsic,
24022402
}
24032403
break;
24042404

2405-
case NI_Sve_CreateWhileLessThanMask8Bit:
2406-
case NI_Sve_CreateWhileLessThanOrEqualMask8Bit:
2407-
case NI_Sve_CreateWhileLessThanMask16Bit:
2408-
case NI_Sve_CreateWhileLessThanOrEqualMask16Bit:
2409-
case NI_Sve_CreateWhileLessThanMask32Bit:
2410-
case NI_Sve_CreateWhileLessThanOrEqualMask32Bit:
2411-
case NI_Sve_CreateWhileLessThanMask64Bit:
2412-
case NI_Sve_CreateWhileLessThanOrEqualMask64Bit:
2405+
case NI_Sve_CreateWhileLessThanMaskByte:
2406+
case NI_Sve_CreateWhileLessThanMaskDouble:
2407+
case NI_Sve_CreateWhileLessThanMaskInt16:
2408+
case NI_Sve_CreateWhileLessThanMaskInt32:
2409+
case NI_Sve_CreateWhileLessThanMaskInt64:
2410+
case NI_Sve_CreateWhileLessThanMaskSByte:
2411+
case NI_Sve_CreateWhileLessThanMaskSingle:
2412+
case NI_Sve_CreateWhileLessThanMaskUInt16:
2413+
case NI_Sve_CreateWhileLessThanMaskUInt32:
2414+
case NI_Sve_CreateWhileLessThanMaskUInt64:
2415+
case NI_Sve_CreateWhileLessThanOrEqualMaskByte:
2416+
case NI_Sve_CreateWhileLessThanOrEqualMaskDouble:
2417+
case NI_Sve_CreateWhileLessThanOrEqualMaskInt16:
2418+
case NI_Sve_CreateWhileLessThanOrEqualMaskInt32:
2419+
case NI_Sve_CreateWhileLessThanOrEqualMaskInt64:
2420+
case NI_Sve_CreateWhileLessThanOrEqualMaskSByte:
2421+
case NI_Sve_CreateWhileLessThanOrEqualMaskSingle:
2422+
case NI_Sve_CreateWhileLessThanOrEqualMaskUInt16:
2423+
case NI_Sve_CreateWhileLessThanOrEqualMaskUInt32:
2424+
case NI_Sve_CreateWhileLessThanOrEqualMaskUInt64:
24132425
retNode->AsHWIntrinsic()->SetAuxiliaryJitType(sigReader.op1JitType);
24142426
break;
24152427

src/coreclr/jit/hwintrinsiccodegenarm64.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2085,10 +2085,16 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
20852085
GetEmitter()->emitIns_R_PATTERN(ins, emitSize, targetReg, opt, SVE_PATTERN_ALL);
20862086
break;
20872087

2088-
case NI_Sve_CreateWhileLessThanMask8Bit:
2089-
case NI_Sve_CreateWhileLessThanMask16Bit:
2090-
case NI_Sve_CreateWhileLessThanMask32Bit:
2091-
case NI_Sve_CreateWhileLessThanMask64Bit:
2088+
case NI_Sve_CreateWhileLessThanMaskByte:
2089+
case NI_Sve_CreateWhileLessThanMaskDouble:
2090+
case NI_Sve_CreateWhileLessThanMaskInt16:
2091+
case NI_Sve_CreateWhileLessThanMaskInt32:
2092+
case NI_Sve_CreateWhileLessThanMaskInt64:
2093+
case NI_Sve_CreateWhileLessThanMaskSByte:
2094+
case NI_Sve_CreateWhileLessThanMaskSingle:
2095+
case NI_Sve_CreateWhileLessThanMaskUInt16:
2096+
case NI_Sve_CreateWhileLessThanMaskUInt32:
2097+
case NI_Sve_CreateWhileLessThanMaskUInt64:
20922098
{
20932099
// Emit size and instruction is based on the scalar operands.
20942100
var_types auxType = node->GetAuxiliaryType();
@@ -2102,10 +2108,16 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
21022108
break;
21032109
}
21042110

2105-
case NI_Sve_CreateWhileLessThanOrEqualMask8Bit:
2106-
case NI_Sve_CreateWhileLessThanOrEqualMask16Bit:
2107-
case NI_Sve_CreateWhileLessThanOrEqualMask32Bit:
2108-
case NI_Sve_CreateWhileLessThanOrEqualMask64Bit:
2111+
case NI_Sve_CreateWhileLessThanOrEqualMaskByte:
2112+
case NI_Sve_CreateWhileLessThanOrEqualMaskDouble:
2113+
case NI_Sve_CreateWhileLessThanOrEqualMaskInt16:
2114+
case NI_Sve_CreateWhileLessThanOrEqualMaskInt32:
2115+
case NI_Sve_CreateWhileLessThanOrEqualMaskInt64:
2116+
case NI_Sve_CreateWhileLessThanOrEqualMaskSByte:
2117+
case NI_Sve_CreateWhileLessThanOrEqualMaskSingle:
2118+
case NI_Sve_CreateWhileLessThanOrEqualMaskUInt16:
2119+
case NI_Sve_CreateWhileLessThanOrEqualMaskUInt32:
2120+
case NI_Sve_CreateWhileLessThanOrEqualMaskUInt64:
21092121
{
21102122
// Emit size and instruction is based on the scalar operands.
21112123
var_types auxType = node->GetAuxiliaryType();

src/coreclr/jit/hwintrinsiclistarm64sve.h

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,26 @@ HARDWARE_INTRINSIC(Sve, CreateTrueMaskSingle,
8585
HARDWARE_INTRINSIC(Sve, CreateTrueMaskUInt16, -1, 1, {INS_invalid, INS_invalid, INS_invalid, INS_sve_ptrue, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_SpecialImport)
8686
HARDWARE_INTRINSIC(Sve, CreateTrueMaskUInt32, -1, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ptrue, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_SpecialImport)
8787
HARDWARE_INTRINSIC(Sve, CreateTrueMaskUInt64, -1, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ptrue, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_SpecialImport)
88-
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMask16Bit, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_sve_whilelt, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
89-
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMask32Bit, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilelt, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
90-
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMask64Bit, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilelt, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
91-
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMask8Bit, -1, 2, {INS_invalid, INS_sve_whilelt, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
92-
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMask16Bit, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_sve_whilele, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
93-
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMask32Bit, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilele, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
94-
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMask64Bit, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilele, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
95-
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMask8Bit, -1, 2, {INS_invalid, INS_sve_whilele, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
88+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMaskByte, -1, 2, {INS_invalid, INS_sve_whilelt, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
89+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMaskDouble, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilelt}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
90+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMaskInt16, -1, 2, {INS_invalid, INS_invalid, INS_sve_whilelt, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
91+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMaskInt32, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilelt, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
92+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMaskInt64, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilelt, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
93+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMaskSByte, -1, 2, {INS_sve_whilelt, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
94+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMaskSingle, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilelt, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
95+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMaskUInt16, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_sve_whilelt, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
96+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMaskUInt32, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilelt, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
97+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanMaskUInt64, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilelt, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
98+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMaskByte, -1, 2, {INS_invalid, INS_sve_whilele, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
99+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMaskDouble, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilele}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
100+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMaskInt16, -1, 2, {INS_invalid, INS_invalid, INS_sve_whilele, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
101+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMaskInt32, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilele, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
102+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMaskInt64, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilele, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
103+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMaskSByte, -1, 2, {INS_sve_whilele, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
104+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMaskSingle, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilele, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
105+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMaskUInt16, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_sve_whilele, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
106+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMaskUInt32, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilele, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
107+
HARDWARE_INTRINSIC(Sve, CreateWhileLessThanOrEqualMaskUInt64, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_whilele, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ReturnsPerElementMask)
96108
HARDWARE_INTRINSIC(Sve, Divide, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sdiv, INS_sve_udiv, INS_sve_sdiv, INS_sve_udiv, INS_sve_fdiv, INS_sve_fdiv}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation)
97109
HARDWARE_INTRINSIC(Sve, DotProduct, -1, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sdot, INS_sve_udot, INS_sve_sdot, INS_sve_udot, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics)
98110
HARDWARE_INTRINSIC(Sve, DotProductBySelectedScalar, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sdot, INS_sve_udot, INS_sve_sdot, INS_sve_udot, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_HasImmediateOperand|HW_Flag_HasRMWSemantics|HW_Flag_LowVectorOperation)

0 commit comments

Comments
 (0)