@@ -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
0 commit comments