Skip to content

Commit 03b2885

Browse files
authored
Fixes an issue with FeatureSIMD=0 and ArmBase.Yield (#62351)
* Mark ArmBase.Yiels with HW_Flag_NoFloatingPointUsed in src/coreclr/jit/hwintrinsiclistarm64.h * Move handling of ArmBase.Yield to an earlier point in impSpecialIntrinsic and simplify the remaining logic in src/coreclr/jit/hwintrinsicarm64.cpp * Address feedback
1 parent 14e8df1 commit 03b2885

File tree

2 files changed

+19
-20
lines changed

2 files changed

+19
-20
lines changed

src/coreclr/jit/hwintrinsicarm64.cpp

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -308,8 +308,22 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic,
308308
var_types retType,
309309
unsigned simdSize)
310310
{
311-
HWIntrinsicCategory category = HWIntrinsicInfo::lookupCategory(intrinsic);
312-
int numArgs = sig->numArgs;
311+
const HWIntrinsicCategory category = HWIntrinsicInfo::lookupCategory(intrinsic);
312+
const int numArgs = sig->numArgs;
313+
314+
// The vast majority of "special" intrinsics are Vector64/Vector128 methods.
315+
// The only exception is ArmBase.Yield which should be treated differently.
316+
if (intrinsic == NI_ArmBase_Yield)
317+
{
318+
assert(sig->numArgs == 0);
319+
assert(JITtype2varType(sig->retType) == TYP_VOID);
320+
assert(simdSize == 0);
321+
322+
return gtNewScalarHWIntrinsicNode(TYP_VOID, intrinsic);
323+
}
324+
325+
assert(category != HW_Category_Scalar);
326+
assert(!HWIntrinsicInfo::isScalarIsa(HWIntrinsicInfo::lookupIsa(intrinsic)));
313327

314328
if (!featureSIMD || !IsBaselineSimdIsaSupported())
315329
{
@@ -318,13 +332,8 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic,
318332

319333
assert(numArgs >= 0);
320334

321-
var_types simdBaseType = TYP_UNKNOWN;
322-
323-
if (intrinsic != NI_ArmBase_Yield)
324-
{
325-
simdBaseType = JitType2PreciseVarType(simdBaseJitType);
326-
assert(varTypeIsArithmetic(simdBaseType));
327-
}
335+
const var_types simdBaseType = JitType2PreciseVarType(simdBaseJitType);
336+
assert(varTypeIsArithmetic(simdBaseType));
328337

329338
GenTree* retNode = nullptr;
330339
GenTree* op1 = nullptr;
@@ -333,16 +342,6 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic,
333342

334343
switch (intrinsic)
335344
{
336-
case NI_ArmBase_Yield:
337-
{
338-
assert(sig->numArgs == 0);
339-
assert(JITtype2varType(sig->retType) == TYP_VOID);
340-
assert(simdSize == 0);
341-
342-
retNode = gtNewScalarHWIntrinsicNode(TYP_VOID, intrinsic);
343-
break;
344-
}
345-
346345
case NI_Vector64_Abs:
347346
case NI_Vector128_Abs:
348347
{

src/coreclr/jit/hwintrinsiclistarm64.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,7 @@ HARDWARE_INTRINSIC(Aes, PolynomialMultiplyWideningUpper,
627627
// Base Intrinsics
628628
HARDWARE_INTRINSIC(ArmBase, LeadingZeroCount, 0, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_clz, INS_clz, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_BaseTypeFromFirstArg|HW_Flag_NoFloatingPointUsed)
629629
HARDWARE_INTRINSIC(ArmBase, ReverseElementBits, 0, 1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_rbit, INS_rbit, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_NoFloatingPointUsed)
630-
HARDWARE_INTRINSIC(ArmBase, Yield, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Special, HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport)
630+
HARDWARE_INTRINSIC(ArmBase, Yield, 0, 0, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Special, HW_Flag_NoFloatingPointUsed|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport)
631631

632632
// ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
633633
// ISA Function name SIMD size Number of arguments Instructions Category Flags

0 commit comments

Comments
 (0)