@@ -21299,7 +21299,8 @@ GenTree* Compiler::gtNewSimdBinOpNode(
2129921299 {
2130021300 assert(!varTypeIsLong(simdBaseType));
2130121301 if (((varTypeIsShort(simdBaseType) || varTypeIsByte(simdBaseType)) && simdSize > 16) ||
21302- (!compOpportunisticallyDependsOn(InstructionSet_AVX512) && simdSize > 32) ||
21302+ (!compOpportunisticallyDependsOn(InstructionSet_AVX512) &&
21303+ (simdSize > 32 || (varTypeIsInt(simdBaseType) && simdSize == 32))) ||
2130321304 (!compOpportunisticallyDependsOn(InstructionSet_AVX) && simdSize > 16) || simdSize == 64)
2130421305 {
2130521306 var_types divType = simdSize == 64 ? TYP_SIMD32 : TYP_SIMD16;
@@ -21317,74 +21318,40 @@ GenTree* Compiler::gtNewSimdBinOpNode(
2131721318 return divResult;
2131821319 }
2131921320
21320- if (varTypeIsShort(simdBaseType) && compOpportunisticallyDependsOn(InstructionSet_AVX2))
21321- {
21322- assert(simdSize == 16);
21323- CorInfoType cvtType =
21324- varTypeIsUnsigned(simdBaseType) && compOpportunisticallyDependsOn(InstructionSet_AVX512)
21325- ? CORINFO_TYPE_UINT
21326- : CORINFO_TYPE_INT;
21327- NamedIntrinsic cvtIntrinsic = NI_AVX2_ConvertToVector256Int32;
21328- op1 = gtNewSimdHWIntrinsicNode(TYP_SIMD32, op1, cvtIntrinsic, simdBaseJitType, simdSize);
21329- op2 = gtNewSimdHWIntrinsicNode(TYP_SIMD32, op2, cvtIntrinsic, simdBaseJitType, simdSize);
21330- GenTree* divResult = gtNewSimdBinOpNode(GT_DIV, TYP_SIMD32, op1, op2, cvtType, simdSize * 2);
21331- if (compOpportunisticallyDependsOn(InstructionSet_AVX512))
21332- {
21333- return gtNewSimdHWIntrinsicNode(type, divResult,
21334- varTypeIsSigned(simdBaseType)
21335- ? NI_AVX512_ConvertToVector128Int16
21336- : NI_AVX512_ConvertToVector128UInt16,
21337- cvtType, simdSize * 2);
21338- }
21339- GenTree* divResultDup = fgMakeMultiUse(&divResult);
21340- GenTree* divResultLower = gtNewSimdGetLowerNode(type, divResult, cvtType, simdSize * 2);
21341- GenTree* divResultUpper = gtNewSimdGetUpperNode(type, divResultDup, cvtType, simdSize * 2);
21342- return gtNewSimdNarrowNode(type, divResultLower, divResultUpper, simdBaseJitType, simdSize);
21343- }
21344-
21345- if (varTypeIsByte(simdBaseType) && compOpportunisticallyDependsOn(InstructionSet_AVX512))
21346- {
21347- assert(simdSize == 16);
21348- NamedIntrinsic cvtIntrinsic = varTypeIsSigned(simdBaseType) ? NI_AVX512_ConvertToVector512Int32
21349- : NI_AVX512_ConvertToVector512UInt32;
21350- CorInfoType cvtType = varTypeIsSigned(simdBaseType) ? CORINFO_TYPE_INT : CORINFO_TYPE_UINT;
21351- op1 = gtNewSimdHWIntrinsicNode(TYP_SIMD64, op1, cvtIntrinsic, simdBaseJitType, simdSize * 4);
21352- op2 = gtNewSimdHWIntrinsicNode(TYP_SIMD64, op2, cvtIntrinsic, simdBaseJitType, simdSize * 4);
21353-
21354- GenTree* op1Dup = fgMakeMultiUse(&op1);
21355- GenTree* op2Dup = fgMakeMultiUse(&op2);
21356- GenTree* op1Lower = gtNewSimdGetLowerNode(TYP_SIMD32, op1, cvtType, simdSize * 4);
21357- GenTree* op2Lower = gtNewSimdGetLowerNode(TYP_SIMD32, op2, cvtType, simdSize * 4);
21358- GenTree* divLower =
21359- gtNewSimdBinOpNode(GT_DIV, TYP_SIMD32, op1Lower, op2Lower, cvtType, simdSize * 2);
21360- GenTree* op1Upper = gtNewSimdGetUpperNode(TYP_SIMD32, op1Dup, cvtType, simdSize * 4);
21361- GenTree* op2Upper = gtNewSimdGetUpperNode(TYP_SIMD32, op2Dup, cvtType, simdSize * 4);
21362- GenTree* divUpper =
21363- gtNewSimdBinOpNode(GT_DIV, TYP_SIMD32, op1Upper, op2Upper, cvtType, simdSize * 2);
21364-
21365- GenTree* divResult = gtNewSimdWithUpperNode(TYP_SIMD64, divLower, divUpper, cvtType, simdSize * 4);
21366- return gtNewSimdHWIntrinsicNode(TYP_SIMD16, divResult,
21367- varTypeIsSigned(simdBaseType) ? NI_AVX512_ConvertToVector128SByte
21368- : NI_AVX512_ConvertToVector128Byte,
21369- cvtType, simdSize * 4);
21370- }
21371-
2137221321 if (varTypeIsShort(simdBaseType) || varTypeIsByte(simdBaseType))
2137321322 {
2137421323 assert(simdSize == 16);
21375- CorInfoType cvtType = varTypeIsShort(simdBaseType) ? CORINFO_TYPE_INT : CORINFO_TYPE_SHORT;
2137621324 if (compOpportunisticallyDependsOn(InstructionSet_AVX512))
2137721325 {
21378- CorInfoType signedType = varTypeIsShort(simdBaseType) ? CORINFO_TYPE_INT : CORINFO_TYPE_SHORT;
21379- CorInfoType unsignedType =
21380- varTypeIsShort(simdBaseType) ? CORINFO_TYPE_UINT : CORINFO_TYPE_USHORT;
21381- cvtType = varTypeIsSigned(simdBaseType) ? signedType : unsignedType;
21382- }
21383- GenTree* op1Dup = fgMakeMultiUse(&op1);
21384- GenTree* op2Dup = fgMakeMultiUse(&op2);
21385- GenTree* op1LowerWiden = gtNewSimdWidenLowerNode(type, op1, simdBaseJitType, simdSize);
21386- GenTree* op2LowerWiden = gtNewSimdWidenLowerNode(type, op2, simdBaseJitType, simdSize);
21387- GenTree* divLower =
21326+ CorInfoType cvtBaseType =
21327+ varTypeIsUnsigned(simdBaseType) ? CORINFO_TYPE_UINT : CORINFO_TYPE_INT;
21328+ NamedIntrinsic widenCvtIntrinsic =
21329+ varTypeIsByte(simdBaseType)
21330+ ? (varTypeIsSigned(simdBaseType) ? NI_AVX512_ConvertToVector512Int32
21331+ : NI_AVX512_ConvertToVector512UInt32)
21332+ : NI_AVX2_ConvertToVector256Int32;
21333+ NamedIntrinsic narrowCvtIntrinsic =
21334+ varTypeIsByte(simdBaseType)
21335+ ? (varTypeIsSigned(simdBaseType) ? NI_AVX512_ConvertToVector128SByte
21336+ : NI_AVX512_ConvertToVector128Byte)
21337+ : (varTypeIsSigned(simdBaseType) ? NI_AVX512_ConvertToVector128Int16
21338+ : NI_AVX512_ConvertToVector128UInt16);
21339+ var_types cvtType = varTypeIsByte(simdBaseType) ? TYP_SIMD64 : TYP_SIMD32;
21340+ int cvtSize = simdSize * (varTypeIsByte(simdBaseType) ? 4 : 2);
21341+
21342+ op1 = gtNewSimdHWIntrinsicNode(cvtType, op1, widenCvtIntrinsic, simdBaseJitType, cvtSize);
21343+ op2 = gtNewSimdHWIntrinsicNode(cvtType, op2, widenCvtIntrinsic, simdBaseJitType, cvtSize);
21344+ GenTree* div = gtNewSimdBinOpNode(GT_DIV, cvtType, op1, op2, cvtBaseType, cvtSize);
21345+ return gtNewSimdHWIntrinsicNode(type, div, narrowCvtIntrinsic, cvtBaseType, cvtSize);
21346+ }
21347+ CorInfoType signedType = varTypeIsShort(simdBaseType) ? CORINFO_TYPE_INT : CORINFO_TYPE_SHORT;
21348+ CorInfoType unsignedType = varTypeIsShort(simdBaseType) ? CORINFO_TYPE_UINT : CORINFO_TYPE_USHORT;
21349+ CorInfoType cvtType = varTypeIsSigned(simdBaseType) ? signedType : unsignedType;
21350+ GenTree* op1Dup = fgMakeMultiUse(&op1);
21351+ GenTree* op2Dup = fgMakeMultiUse(&op2);
21352+ GenTree* op1LowerWiden = gtNewSimdWidenLowerNode(type, op1, simdBaseJitType, simdSize);
21353+ GenTree* op2LowerWiden = gtNewSimdWidenLowerNode(type, op2, simdBaseJitType, simdSize);
21354+ GenTree* divLower =
2138821355 gtNewSimdBinOpNode(GT_DIV, type, op1LowerWiden, op2LowerWiden, cvtType, simdSize);
2138921356 GenTree* op1UpperWiden = gtNewSimdWidenUpperNode(type, op1Dup, simdBaseJitType, simdSize);
2139021357 GenTree* op2UpperWiden = gtNewSimdWidenUpperNode(type, op2Dup, simdBaseJitType, simdSize);
@@ -21401,32 +21368,15 @@ GenTree* Compiler::gtNewSimdBinOpNode(
2140121368 simdSize);
2140221369 }
2140321370
21371+ assert(simdSize == 16);
21372+
2140421373 if (compOpportunisticallyDependsOn(InstructionSet_AVX))
2140521374 {
21406- if (simdSize == 32)
21407- {
21408- GenTree* op1Dup = fgMakeMultiUse(&op1);
21409- GenTree* op2Dup = fgMakeMultiUse(&op2);
21410- GenTree* op1Lower = gtNewSimdGetLowerNode(TYP_SIMD16, op1, simdBaseJitType, simdSize);
21411- GenTree* op2Lower = gtNewSimdGetLowerNode(TYP_SIMD16, op2, simdBaseJitType, simdSize);
21412- GenTree* op1Upper = gtNewSimdGetUpperNode(TYP_SIMD16, op1Dup, simdBaseJitType, simdSize);
21413- GenTree* op2Upper = gtNewSimdGetUpperNode(TYP_SIMD16, op2Dup, simdBaseJitType, simdSize);
21414- GenTree* divLower =
21415- gtNewSimdHWIntrinsicNode(TYP_SIMD16, op1Lower, op2Lower, NI_Vector128_op_Division,
21416- simdBaseJitType, simdSize / 2);
21417- GenTree* divUpper =
21418- gtNewSimdHWIntrinsicNode(TYP_SIMD16, op1Upper, op2Upper, NI_Vector128_op_Division,
21419- simdBaseJitType, simdSize / 2);
21420- return gtNewSimdWithUpperNode(type, divLower, divUpper, simdBaseJitType, simdSize);
21421- }
21422-
21423- assert(simdSize == 16);
2142421375 return gtNewSimdHWIntrinsicNode(type, op1, op2, NI_Vector128_op_Division, simdBaseJitType,
2142521376 simdSize);
2142621377 }
2142721378
2142821379 assert(compIsaSupportedDebugOnly(InstructionSet_SSE42));
21429- assert(simdSize == 16);
2143021380 GenTree* op1Dup = fgMakeMultiUse(&op1);
2143121381 GenTree* op2Dup = fgMakeMultiUse(&op2);
2143221382 GenTree* op1Dup2 = fgMakeMultiUse(&op1Dup);
0 commit comments