Skip to content

Commit ce21d88

Browse files
committed
Use existing x64 code
1 parent 0687ba9 commit ce21d88

File tree

2 files changed

+74
-16
lines changed

2 files changed

+74
-16
lines changed

src/coreclr/jit/gentree.cpp

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29198,6 +29198,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2919829198
case NI_AVX512_AndMask:
2919929199
#elif defined(TARGET_ARM64)
2920029200
case NI_AdvSimd_And:
29201+
case NI_Sve_And:
2920129202
#endif
2920229203
{
2920329204
return GT_AND;
@@ -29207,6 +29208,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2920729208
case NI_AVX512_NotMask:
2920829209
#elif defined(TARGET_ARM64)
2920929210
case NI_AdvSimd_Not:
29211+
case NI_Sve_Not:
2921029212
#endif
2921129213
{
2921229214
return GT_NOT;
@@ -29220,6 +29222,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2922029222
case NI_AVX512_XorMask:
2922129223
#elif defined(TARGET_ARM64)
2922229224
case NI_AdvSimd_Xor:
29225+
case NI_Sve_Xor:
2922329226
#endif
2922429227
{
2922529228
return GT_XOR;
@@ -29233,6 +29236,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2923329236
case NI_AVX512_OrMask:
2923429237
#elif defined(TARGET_ARM64)
2923529238
case NI_AdvSimd_Or:
29239+
case NI_Sve_Or:
2923629240
#endif
2923729241
{
2923829242
return GT_OR;
@@ -29246,6 +29250,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2924629250
case NI_AVX512_AndNotMask:
2924729251
#elif defined(TARGET_ARM64)
2924829252
case NI_AdvSimd_BitwiseClear:
29253+
case NI_Sve_BitwiseClear:
2924929254
#endif
2925029255
{
2925129256
return GT_AND_NOT;
@@ -29259,6 +29264,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2925929264
#elif defined(TARGET_ARM64)
2926029265
case NI_AdvSimd_Add:
2926129266
case NI_AdvSimd_Arm64_Add:
29267+
case NI_Sve_Add:
2926229268
#endif
2926329269
{
2926429270
return GT_ADD;
@@ -29290,6 +29296,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2929029296
case NI_AVX512_Divide:
2929129297
#elif defined(TARGET_ARM64)
2929229298
case NI_AdvSimd_Arm64_Divide:
29299+
case NI_Sve_Divide:
2929329300
#endif
2929429301
{
2929529302
return GT_DIV;
@@ -29324,6 +29331,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2932429331
#elif defined(TARGET_ARM64)
2932529332
case NI_AdvSimd_Multiply:
2932629333
case NI_AdvSimd_Arm64_Multiply:
29334+
case NI_Sve_Multiply:
2932729335
#endif
2932829336
{
2932929337
return GT_MUL;
@@ -29364,6 +29372,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2936429372
#if defined(TARGET_ARM64)
2936529373
case NI_AdvSimd_Negate:
2936629374
case NI_AdvSimd_Arm64_Negate:
29375+
case NI_Sve_Negate:
2936729376
{
2936829377
return GT_NEG;
2936929378
}
@@ -29401,6 +29410,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2940129410
case NI_AVX512_ShiftLeftLogicalVariable:
2940229411
#elif defined(TARGET_ARM64)
2940329412
case NI_AdvSimd_ShiftLeftLogical:
29413+
case NI_Sve_ShiftLeftLogical:
2940429414
#endif
2940529415
{
2940629416
return GT_LSH;
@@ -29425,6 +29435,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2942529435
case NI_AVX512_ShiftRightArithmeticVariable:
2942629436
#elif defined(TARGET_ARM64)
2942729437
case NI_AdvSimd_ShiftRightArithmetic:
29438+
case NI_Sve_ShiftRightArithmetic:
2942829439
#endif
2942929440
{
2943029441
return GT_RSH;
@@ -29449,6 +29460,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2944929460
case NI_AVX512_ShiftRightLogicalVariable:
2945029461
#elif defined(TARGET_ARM64)
2945129462
case NI_AdvSimd_ShiftRightLogical:
29463+
case NI_Sve_ShiftRightLogical:
2945229464
#endif
2945329465
{
2945429466
return GT_RSZ;
@@ -29473,6 +29485,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2947329485
#elif defined(TARGET_ARM64)
2947429486
case NI_AdvSimd_Subtract:
2947529487
case NI_AdvSimd_Arm64_Subtract:
29488+
case NI_Sve_Subtract:
2947629489
#endif
2947729490
{
2947829491
return GT_SUB;
@@ -29507,6 +29520,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2950729520
#elif defined(TARGET_ARM64)
2950829521
case NI_AdvSimd_CompareEqual:
2950929522
case NI_AdvSimd_Arm64_CompareEqual:
29523+
case NI_Sve_CompareEqual:
2951029524
#endif
2951129525
{
2951229526
return GT_EQ;
@@ -29540,6 +29554,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2954029554
#elif defined(TARGET_ARM64)
2954129555
case NI_AdvSimd_CompareGreaterThan:
2954229556
case NI_AdvSimd_Arm64_CompareGreaterThan:
29557+
case NI_Sve_CompareGreaterThan:
2954329558
#endif
2954429559
{
2954529560
return GT_GT;
@@ -29571,6 +29586,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2957129586
#elif defined(TARGET_ARM64)
2957229587
case NI_AdvSimd_CompareGreaterThanOrEqual:
2957329588
case NI_AdvSimd_Arm64_CompareGreaterThanOrEqual:
29589+
case NI_Sve_CompareGreaterThanOrEqual:
2957429590
#endif
2957529591
{
2957629592
return GT_GE;
@@ -29604,6 +29620,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2960429620
#elif defined(TARGET_ARM64)
2960529621
case NI_AdvSimd_CompareLessThan:
2960629622
case NI_AdvSimd_Arm64_CompareLessThan:
29623+
case NI_Sve_CompareLessThan:
2960729624
#endif
2960829625
{
2960929626
return GT_LT;
@@ -29635,6 +29652,7 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2963529652
#elif defined(TARGET_ARM64)
2963629653
case NI_AdvSimd_CompareLessThanOrEqual:
2963729654
case NI_AdvSimd_Arm64_CompareLessThanOrEqual:
29655+
case NI_Sve_CompareLessThanOrEqual:
2963829656
#endif
2963929657
{
2964029658
return GT_LE;
@@ -29663,10 +29681,15 @@ genTreeOps GenTreeHWIntrinsic::GetOperForHWIntrinsicId(NamedIntrinsic id, var_ty
2966329681
case NI_X86Base_CompareNotEqual:
2966429682
case NI_AVX_CompareNotEqual:
2966529683
case NI_AVX512_CompareNotEqualMask:
29684+
#elif defined(TARGET_ARM64)
29685+
case NI_Sve_CompareNotEqualTo:
29686+
#endif
2966629687
{
2966729688
return GT_NE;
2966829689
}
2966929690

29691+
29692+
#if defined(TARGET_XARCH)
2967029693
case NI_X86Base_CompareScalarNotEqual:
2967129694
{
2967229695
*isScalar = true;
@@ -30593,8 +30616,13 @@ NamedIntrinsic GenTreeHWIntrinsic::GetHWIntrinsicIdForCmpOp(Compiler* comp,
3059330616
#elif defined(TARGET_ARM64)
3059430617
if (genTypeSize(simdBaseType) == 8)
3059530618
{
30619+
assert(type != TYP_MASK);
3059630620
id = (simdSize == 8) ? NI_AdvSimd_Arm64_CompareEqualScalar : NI_AdvSimd_Arm64_CompareEqual;
3059730621
}
30622+
else if (type == TYP_MASK)
30623+
{
30624+
id = NI_Sve_CompareEqual;
30625+
}
3059830626
else
3059930627
{
3060030628
id = NI_AdvSimd_CompareEqual;
@@ -30632,9 +30660,14 @@ NamedIntrinsic GenTreeHWIntrinsic::GetHWIntrinsicIdForCmpOp(Compiler* comp,
3063230660
#elif defined(TARGET_ARM64)
3063330661
if (genTypeSize(simdBaseType) == 8)
3063430662
{
30663+
assert(type != TYP_MASK);
3063530664
id = (simdSize == 8) ? NI_AdvSimd_Arm64_CompareGreaterThanOrEqualScalar
3063630665
: NI_AdvSimd_Arm64_CompareGreaterThanOrEqual;
3063730666
}
30667+
else if (type == TYP_MASK)
30668+
{
30669+
id = NI_Sve_CompareGreaterThanOrEqual;
30670+
}
3063830671
else
3063930672
{
3064030673
id = NI_AdvSimd_CompareGreaterThanOrEqual;
@@ -30694,8 +30727,13 @@ NamedIntrinsic GenTreeHWIntrinsic::GetHWIntrinsicIdForCmpOp(Compiler* comp,
3069430727
#elif defined(TARGET_ARM64)
3069530728
if (genTypeSize(simdBaseType) == 8)
3069630729
{
30730+
assert(type != TYP_MASK);
3069730731
id = (simdSize == 8) ? NI_AdvSimd_Arm64_CompareGreaterThanScalar : NI_AdvSimd_Arm64_CompareGreaterThan;
3069830732
}
30733+
else if (type == TYP_MASK)
30734+
{
30735+
id = NI_Sve_CompareGreaterThan;
30736+
}
3069930737
else
3070030738
{
3070130739
id = NI_AdvSimd_CompareGreaterThan;
@@ -30733,9 +30771,14 @@ NamedIntrinsic GenTreeHWIntrinsic::GetHWIntrinsicIdForCmpOp(Compiler* comp,
3073330771
#elif defined(TARGET_ARM64)
3073430772
if (genTypeSize(simdBaseType) == 8)
3073530773
{
30774+
assert(type != TYP_MASK);
3073630775
id = (simdSize == 8) ? NI_AdvSimd_Arm64_CompareLessThanOrEqualScalar
3073730776
: NI_AdvSimd_Arm64_CompareLessThanOrEqual;
3073830777
}
30778+
else if (type == TYP_MASK)
30779+
{
30780+
id = NI_Sve_CompareLessThanOrEqual;
30781+
}
3073930782
else
3074030783
{
3074130784
id = NI_AdvSimd_CompareLessThanOrEqual;
@@ -30797,8 +30840,13 @@ NamedIntrinsic GenTreeHWIntrinsic::GetHWIntrinsicIdForCmpOp(Compiler* comp,
3079730840
#elif defined(TARGET_ARM64)
3079830841
if (genTypeSize(simdBaseType) == 8)
3079930842
{
30843+
assert(type != TYP_MASK);
3080030844
id = (simdSize == 8) ? NI_AdvSimd_Arm64_CompareLessThanScalar : NI_AdvSimd_Arm64_CompareLessThan;
3080130845
}
30846+
else if (type == TYP_MASK)
30847+
{
30848+
id = NI_Sve_CompareLessThan;
30849+
}
3080230850
else
3080330851
{
3080430852
id = NI_AdvSimd_CompareLessThan;
@@ -32258,12 +32306,18 @@ GenTree* Compiler::gtFoldExprHWIntrinsic(GenTreeHWIntrinsic* tree)
3225832306
bool isScalar = false;
3225932307
genTreeOps oper = tree->GetOperForHWIntrinsicId(&isScalar);
3226032308

32309+
#if defined(TARGET_XARCH)
3226132310
// We shouldn't find AND_NOT nodes since it should only be produced in lowering
3226232311
assert(oper != GT_AND_NOT);
32312+
#endif //TARGET_XARCH
32313+
32314+
bool hasAllMaskVariant = true;
32315+
#if defined(TARGET_ARM64)
32316+
hasAllMaskVariant = HWIntrinsicInfo::HasAllMaskVariant(ni);
32317+
#endif // TARGET_ARM64
3226332318

3226432319
#if defined(FEATURE_MASKED_HW_INTRINSICS)
32265-
#if defined(TARGET_XARCH)
32266-
if (GenTreeHWIntrinsic::OperIsBitwiseHWIntrinsic(oper))
32320+
if (GenTreeHWIntrinsic::OperIsBitwiseHWIntrinsic(oper) && hasAllMaskVariant)
3226732321
{
3226832322
// Comparisons that produce masks lead to more verbose trees than
3226932323
// necessary in many scenarios due to requiring a CvtMaskToVector
@@ -32273,6 +32327,7 @@ GenTree* Compiler::gtFoldExprHWIntrinsic(GenTreeHWIntrinsic* tree)
3227332327

3227432328
genTreeOps effectiveOper = oper;
3227532329
GenTree* actualOp2 = op2;
32330+
NamedIntrinsic effectiveNi = ni;
3227632331

3227732332
if (oper == GT_NOT)
3227832333
{
@@ -32293,6 +32348,7 @@ GenTree* Compiler::gtFoldExprHWIntrinsic(GenTreeHWIntrinsic* tree)
3229332348
// some platforms don't have direct support for ~op1
3229432349

3229532350
effectiveOper = GT_NOT;
32351+
3229632352
op2 = op1;
3229732353
}
3229832354
}
@@ -32312,37 +32368,31 @@ GenTree* Compiler::gtFoldExprHWIntrinsic(GenTreeHWIntrinsic* tree)
3231232368

3231332369
NamedIntrinsic maskIntrinsicId = NI_Illegal;
3231432370

32371+
#if defined(TARGET_XARCH)
3231532372
switch (effectiveOper)
3231632373
{
3231732374
case GT_AND:
32318-
{
3231932375
maskIntrinsicId = NI_AVX512_AndMask;
3232032376
break;
32321-
}
3232232377

3232332378
case GT_NOT:
32324-
{
3232532379
maskIntrinsicId = NI_AVX512_NotMask;
3232632380
break;
32327-
}
3232832381

3232932382
case GT_OR:
32330-
{
3233132383
maskIntrinsicId = NI_AVX512_OrMask;
3233232384
break;
32333-
}
3233432385

3233532386
case GT_XOR:
32336-
{
3233732387
maskIntrinsicId = NI_AVX512_XorMask;
3233832388
break;
32339-
}
3234032389

3234132390
default:
32342-
{
3234332391
unreached();
32344-
}
3234532392
}
32393+
#else
32394+
maskIntrinsicId = HWIntrinsicInfo::GetMaskVariant(effectiveNi);
32395+
#endif
3234632396

3234732397
assert(maskIntrinsicId != NI_Illegal);
3234832398

@@ -32380,9 +32430,10 @@ GenTree* Compiler::gtFoldExprHWIntrinsic(GenTreeHWIntrinsic* tree)
3238032430
}
3238132431
}
3238232432
}
32383-
#elif defined(TARGET_ARM64)
32433+
32434+
#if defined(TARGET_ARM64)
3238432435
// Check if the tree can be folded into a mask variant
32385-
if (HWIntrinsicInfo::HasAllMaskVariant(tree->GetHWIntrinsicId()))
32436+
if (hasAllMaskVariant)
3238632437
{
3238732438
NamedIntrinsic maskVariant = HWIntrinsicInfo::GetMaskVariant(tree->GetHWIntrinsicId());
3238832439

src/coreclr/jit/valuenum.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8387,8 +8387,11 @@ ValueNum ValueNumStore::EvalHWIntrinsicFunBinary(
83878387
bool isScalar = false;
83888388
genTreeOps oper = tree->GetOperForHWIntrinsicId(&isScalar);
83898389

8390+
#if !defined(TARGET_ARM64)
83908391
// We shouldn't find AND_NOT nodes since it should only be produced in lowering
8391-
assert((oper != GT_AND_NOT) && (oper != GT_OR_NOT) && (oper != GT_XOR_NOT));
8392+
assert(oper != GT_AND_NOT);
8393+
#endif // !TARGET_ARM64
8394+
assert((oper != GT_OR_NOT) && (oper != GT_XOR_NOT));
83928395

83938396
if (isScalar)
83948397
{
@@ -8878,8 +8881,12 @@ ValueNum ValueNumStore::EvalHWIntrinsicFunBinary(
88788881
bool isScalar = false;
88798882
genTreeOps oper = tree->GetOperForHWIntrinsicId(&isScalar);
88808883

8884+
8885+
#if !defined(TARGET_ARM64)
88818886
// We shouldn't find AND_NOT nodes since it should only be produced in lowering
8882-
assert((oper != GT_AND_NOT) && (oper != GT_OR_NOT) && (oper != GT_XOR_NOT));
8887+
assert(oper != GT_AND_NOT);
8888+
#endif // !TARGET_ARM64
8889+
assert((oper != GT_OR_NOT) && (oper != GT_XOR_NOT));
88838890

88848891
if (isScalar)
88858892
{

0 commit comments

Comments
 (0)