Skip to content

Commit cb5832d

Browse files
Cleanup some handling around Avx10v1 (#103241)
* Cleanup the instruction set implications for xarch * Cleanup some handling around Avx10v1 * Remove unnecessary XArchIntrinsicConstants bits * Add a clarifying comment
1 parent 4a7ac0e commit cb5832d

File tree

17 files changed

+370
-975
lines changed

17 files changed

+370
-975
lines changed

src/coreclr/inc/corinfoinstructionset.h

+32-52
Original file line numberDiff line numberDiff line change
@@ -584,12 +584,12 @@ inline CORINFO_InstructionSetFlags EnsureInstructionSetFlagsAreValid(CORINFO_Ins
584584
resultflags.RemoveInstructionSet(InstructionSet_SSE41);
585585
if (resultflags.HasInstructionSet(InstructionSet_SSE42) && !resultflags.HasInstructionSet(InstructionSet_SSE41))
586586
resultflags.RemoveInstructionSet(InstructionSet_SSE42);
587+
if (resultflags.HasInstructionSet(InstructionSet_POPCNT) && !resultflags.HasInstructionSet(InstructionSet_SSE42))
588+
resultflags.RemoveInstructionSet(InstructionSet_POPCNT);
587589
if (resultflags.HasInstructionSet(InstructionSet_AVX) && !resultflags.HasInstructionSet(InstructionSet_SSE42))
588590
resultflags.RemoveInstructionSet(InstructionSet_AVX);
589591
if (resultflags.HasInstructionSet(InstructionSet_AVX2) && !resultflags.HasInstructionSet(InstructionSet_AVX))
590592
resultflags.RemoveInstructionSet(InstructionSet_AVX2);
591-
if (resultflags.HasInstructionSet(InstructionSet_AES) && !resultflags.HasInstructionSet(InstructionSet_SSE2))
592-
resultflags.RemoveInstructionSet(InstructionSet_AES);
593593
if (resultflags.HasInstructionSet(InstructionSet_BMI1) && !resultflags.HasInstructionSet(InstructionSet_AVX))
594594
resultflags.RemoveInstructionSet(InstructionSet_BMI1);
595595
if (resultflags.HasInstructionSet(InstructionSet_BMI2) && !resultflags.HasInstructionSet(InstructionSet_AVX))
@@ -598,22 +598,8 @@ inline CORINFO_InstructionSetFlags EnsureInstructionSetFlagsAreValid(CORINFO_Ins
598598
resultflags.RemoveInstructionSet(InstructionSet_FMA);
599599
if (resultflags.HasInstructionSet(InstructionSet_LZCNT) && !resultflags.HasInstructionSet(InstructionSet_X86Base))
600600
resultflags.RemoveInstructionSet(InstructionSet_LZCNT);
601-
if (resultflags.HasInstructionSet(InstructionSet_PCLMULQDQ) && !resultflags.HasInstructionSet(InstructionSet_SSE2))
602-
resultflags.RemoveInstructionSet(InstructionSet_PCLMULQDQ);
603-
if (resultflags.HasInstructionSet(InstructionSet_POPCNT) && !resultflags.HasInstructionSet(InstructionSet_SSE42))
604-
resultflags.RemoveInstructionSet(InstructionSet_POPCNT);
605-
if (resultflags.HasInstructionSet(InstructionSet_Vector128) && !resultflags.HasInstructionSet(InstructionSet_SSE))
606-
resultflags.RemoveInstructionSet(InstructionSet_Vector128);
607-
if (resultflags.HasInstructionSet(InstructionSet_Vector256) && !resultflags.HasInstructionSet(InstructionSet_AVX))
608-
resultflags.RemoveInstructionSet(InstructionSet_Vector256);
609-
if (resultflags.HasInstructionSet(InstructionSet_Vector512) && !resultflags.HasInstructionSet(InstructionSet_AVX512F))
610-
resultflags.RemoveInstructionSet(InstructionSet_Vector512);
611-
if (resultflags.HasInstructionSet(InstructionSet_AVXVNNI) && !resultflags.HasInstructionSet(InstructionSet_AVX2))
612-
resultflags.RemoveInstructionSet(InstructionSet_AVXVNNI);
613601
if (resultflags.HasInstructionSet(InstructionSet_MOVBE) && !resultflags.HasInstructionSet(InstructionSet_SSE42))
614602
resultflags.RemoveInstructionSet(InstructionSet_MOVBE);
615-
if (resultflags.HasInstructionSet(InstructionSet_X86Serialize) && !resultflags.HasInstructionSet(InstructionSet_X86Base))
616-
resultflags.RemoveInstructionSet(InstructionSet_X86Serialize);
617603
if (resultflags.HasInstructionSet(InstructionSet_EVEX) && !resultflags.HasInstructionSet(InstructionSet_AVX2))
618604
resultflags.RemoveInstructionSet(InstructionSet_EVEX);
619605
if (resultflags.HasInstructionSet(InstructionSet_EVEX) && !resultflags.HasInstructionSet(InstructionSet_FMA))
@@ -646,10 +632,14 @@ inline CORINFO_InstructionSetFlags EnsureInstructionSetFlagsAreValid(CORINFO_Ins
646632
resultflags.RemoveInstructionSet(InstructionSet_AVX512VBMI_VL);
647633
if (resultflags.HasInstructionSet(InstructionSet_AVX512VBMI_VL) && !resultflags.HasInstructionSet(InstructionSet_AVX512BW_VL))
648634
resultflags.RemoveInstructionSet(InstructionSet_AVX512VBMI_VL);
649-
if (resultflags.HasInstructionSet(InstructionSet_EVEX) && !resultflags.HasInstructionSet(InstructionSet_AVX2))
650-
resultflags.RemoveInstructionSet(InstructionSet_EVEX);
651-
if (resultflags.HasInstructionSet(InstructionSet_EVEX) && !resultflags.HasInstructionSet(InstructionSet_FMA))
652-
resultflags.RemoveInstructionSet(InstructionSet_EVEX);
635+
if (resultflags.HasInstructionSet(InstructionSet_AES) && !resultflags.HasInstructionSet(InstructionSet_SSE2))
636+
resultflags.RemoveInstructionSet(InstructionSet_AES);
637+
if (resultflags.HasInstructionSet(InstructionSet_PCLMULQDQ) && !resultflags.HasInstructionSet(InstructionSet_SSE2))
638+
resultflags.RemoveInstructionSet(InstructionSet_PCLMULQDQ);
639+
if (resultflags.HasInstructionSet(InstructionSet_AVXVNNI) && !resultflags.HasInstructionSet(InstructionSet_AVX2))
640+
resultflags.RemoveInstructionSet(InstructionSet_AVXVNNI);
641+
if (resultflags.HasInstructionSet(InstructionSet_X86Serialize) && !resultflags.HasInstructionSet(InstructionSet_X86Base))
642+
resultflags.RemoveInstructionSet(InstructionSet_X86Serialize);
653643
if (resultflags.HasInstructionSet(InstructionSet_AVX10v1) && !resultflags.HasInstructionSet(InstructionSet_EVEX))
654644
resultflags.RemoveInstructionSet(InstructionSet_AVX10v1);
655645
if (resultflags.HasInstructionSet(InstructionSet_AVX10v1_V512) && !resultflags.HasInstructionSet(InstructionSet_AVX10v1))
@@ -674,18 +664,18 @@ inline CORINFO_InstructionSetFlags EnsureInstructionSetFlagsAreValid(CORINFO_Ins
674664
resultflags.RemoveInstructionSet(InstructionSet_AVX10v1_V512);
675665
if (resultflags.HasInstructionSet(InstructionSet_AVX10v1_V512) && !resultflags.HasInstructionSet(InstructionSet_AVX512VBMI_VL))
676666
resultflags.RemoveInstructionSet(InstructionSet_AVX10v1_V512);
667+
if (resultflags.HasInstructionSet(InstructionSet_Vector128) && !resultflags.HasInstructionSet(InstructionSet_SSE))
668+
resultflags.RemoveInstructionSet(InstructionSet_Vector128);
669+
if (resultflags.HasInstructionSet(InstructionSet_Vector256) && !resultflags.HasInstructionSet(InstructionSet_AVX))
670+
resultflags.RemoveInstructionSet(InstructionSet_Vector256);
671+
if (resultflags.HasInstructionSet(InstructionSet_Vector512) && !resultflags.HasInstructionSet(InstructionSet_AVX512F))
672+
resultflags.RemoveInstructionSet(InstructionSet_Vector512);
677673
if (resultflags.HasInstructionSet(InstructionSet_VectorT128) && !resultflags.HasInstructionSet(InstructionSet_SSE2))
678674
resultflags.RemoveInstructionSet(InstructionSet_VectorT128);
679675
if (resultflags.HasInstructionSet(InstructionSet_VectorT256) && !resultflags.HasInstructionSet(InstructionSet_AVX2))
680676
resultflags.RemoveInstructionSet(InstructionSet_VectorT256);
681677
if (resultflags.HasInstructionSet(InstructionSet_VectorT512) && !resultflags.HasInstructionSet(InstructionSet_AVX512F))
682678
resultflags.RemoveInstructionSet(InstructionSet_VectorT512);
683-
if (resultflags.HasInstructionSet(InstructionSet_AVX512F) && !resultflags.HasInstructionSet(InstructionSet_AVX512BW_VL))
684-
resultflags.RemoveInstructionSet(InstructionSet_AVX512F);
685-
if (resultflags.HasInstructionSet(InstructionSet_AVX512F) && !resultflags.HasInstructionSet(InstructionSet_AVX512CD_VL))
686-
resultflags.RemoveInstructionSet(InstructionSet_AVX512F);
687-
if (resultflags.HasInstructionSet(InstructionSet_AVX512F) && !resultflags.HasInstructionSet(InstructionSet_AVX512DQ_VL))
688-
resultflags.RemoveInstructionSet(InstructionSet_AVX512F);
689679
#endif // TARGET_AMD64
690680
#ifdef TARGET_X86
691681
if (resultflags.HasInstructionSet(InstructionSet_SSE) && !resultflags.HasInstructionSet(InstructionSet_X86Base))
@@ -700,12 +690,12 @@ inline CORINFO_InstructionSetFlags EnsureInstructionSetFlagsAreValid(CORINFO_Ins
700690
resultflags.RemoveInstructionSet(InstructionSet_SSE41);
701691
if (resultflags.HasInstructionSet(InstructionSet_SSE42) && !resultflags.HasInstructionSet(InstructionSet_SSE41))
702692
resultflags.RemoveInstructionSet(InstructionSet_SSE42);
693+
if (resultflags.HasInstructionSet(InstructionSet_POPCNT) && !resultflags.HasInstructionSet(InstructionSet_SSE42))
694+
resultflags.RemoveInstructionSet(InstructionSet_POPCNT);
703695
if (resultflags.HasInstructionSet(InstructionSet_AVX) && !resultflags.HasInstructionSet(InstructionSet_SSE42))
704696
resultflags.RemoveInstructionSet(InstructionSet_AVX);
705697
if (resultflags.HasInstructionSet(InstructionSet_AVX2) && !resultflags.HasInstructionSet(InstructionSet_AVX))
706698
resultflags.RemoveInstructionSet(InstructionSet_AVX2);
707-
if (resultflags.HasInstructionSet(InstructionSet_AES) && !resultflags.HasInstructionSet(InstructionSet_SSE2))
708-
resultflags.RemoveInstructionSet(InstructionSet_AES);
709699
if (resultflags.HasInstructionSet(InstructionSet_BMI1) && !resultflags.HasInstructionSet(InstructionSet_AVX))
710700
resultflags.RemoveInstructionSet(InstructionSet_BMI1);
711701
if (resultflags.HasInstructionSet(InstructionSet_BMI2) && !resultflags.HasInstructionSet(InstructionSet_AVX))
@@ -714,22 +704,8 @@ inline CORINFO_InstructionSetFlags EnsureInstructionSetFlagsAreValid(CORINFO_Ins
714704
resultflags.RemoveInstructionSet(InstructionSet_FMA);
715705
if (resultflags.HasInstructionSet(InstructionSet_LZCNT) && !resultflags.HasInstructionSet(InstructionSet_X86Base))
716706
resultflags.RemoveInstructionSet(InstructionSet_LZCNT);
717-
if (resultflags.HasInstructionSet(InstructionSet_PCLMULQDQ) && !resultflags.HasInstructionSet(InstructionSet_SSE2))
718-
resultflags.RemoveInstructionSet(InstructionSet_PCLMULQDQ);
719-
if (resultflags.HasInstructionSet(InstructionSet_POPCNT) && !resultflags.HasInstructionSet(InstructionSet_SSE42))
720-
resultflags.RemoveInstructionSet(InstructionSet_POPCNT);
721-
if (resultflags.HasInstructionSet(InstructionSet_Vector128) && !resultflags.HasInstructionSet(InstructionSet_SSE))
722-
resultflags.RemoveInstructionSet(InstructionSet_Vector128);
723-
if (resultflags.HasInstructionSet(InstructionSet_Vector256) && !resultflags.HasInstructionSet(InstructionSet_AVX))
724-
resultflags.RemoveInstructionSet(InstructionSet_Vector256);
725-
if (resultflags.HasInstructionSet(InstructionSet_Vector512) && !resultflags.HasInstructionSet(InstructionSet_AVX512F))
726-
resultflags.RemoveInstructionSet(InstructionSet_Vector512);
727-
if (resultflags.HasInstructionSet(InstructionSet_AVXVNNI) && !resultflags.HasInstructionSet(InstructionSet_AVX2))
728-
resultflags.RemoveInstructionSet(InstructionSet_AVXVNNI);
729707
if (resultflags.HasInstructionSet(InstructionSet_MOVBE) && !resultflags.HasInstructionSet(InstructionSet_SSE42))
730708
resultflags.RemoveInstructionSet(InstructionSet_MOVBE);
731-
if (resultflags.HasInstructionSet(InstructionSet_X86Serialize) && !resultflags.HasInstructionSet(InstructionSet_X86Base))
732-
resultflags.RemoveInstructionSet(InstructionSet_X86Serialize);
733709
if (resultflags.HasInstructionSet(InstructionSet_EVEX) && !resultflags.HasInstructionSet(InstructionSet_AVX2))
734710
resultflags.RemoveInstructionSet(InstructionSet_EVEX);
735711
if (resultflags.HasInstructionSet(InstructionSet_EVEX) && !resultflags.HasInstructionSet(InstructionSet_FMA))
@@ -762,10 +738,14 @@ inline CORINFO_InstructionSetFlags EnsureInstructionSetFlagsAreValid(CORINFO_Ins
762738
resultflags.RemoveInstructionSet(InstructionSet_AVX512VBMI_VL);
763739
if (resultflags.HasInstructionSet(InstructionSet_AVX512VBMI_VL) && !resultflags.HasInstructionSet(InstructionSet_AVX512BW_VL))
764740
resultflags.RemoveInstructionSet(InstructionSet_AVX512VBMI_VL);
765-
if (resultflags.HasInstructionSet(InstructionSet_EVEX) && !resultflags.HasInstructionSet(InstructionSet_AVX2))
766-
resultflags.RemoveInstructionSet(InstructionSet_EVEX);
767-
if (resultflags.HasInstructionSet(InstructionSet_EVEX) && !resultflags.HasInstructionSet(InstructionSet_FMA))
768-
resultflags.RemoveInstructionSet(InstructionSet_EVEX);
741+
if (resultflags.HasInstructionSet(InstructionSet_AES) && !resultflags.HasInstructionSet(InstructionSet_SSE2))
742+
resultflags.RemoveInstructionSet(InstructionSet_AES);
743+
if (resultflags.HasInstructionSet(InstructionSet_PCLMULQDQ) && !resultflags.HasInstructionSet(InstructionSet_SSE2))
744+
resultflags.RemoveInstructionSet(InstructionSet_PCLMULQDQ);
745+
if (resultflags.HasInstructionSet(InstructionSet_AVXVNNI) && !resultflags.HasInstructionSet(InstructionSet_AVX2))
746+
resultflags.RemoveInstructionSet(InstructionSet_AVXVNNI);
747+
if (resultflags.HasInstructionSet(InstructionSet_X86Serialize) && !resultflags.HasInstructionSet(InstructionSet_X86Base))
748+
resultflags.RemoveInstructionSet(InstructionSet_X86Serialize);
769749
if (resultflags.HasInstructionSet(InstructionSet_AVX10v1) && !resultflags.HasInstructionSet(InstructionSet_EVEX))
770750
resultflags.RemoveInstructionSet(InstructionSet_AVX10v1);
771751
if (resultflags.HasInstructionSet(InstructionSet_AVX10v1_V512) && !resultflags.HasInstructionSet(InstructionSet_AVX10v1))
@@ -790,18 +770,18 @@ inline CORINFO_InstructionSetFlags EnsureInstructionSetFlagsAreValid(CORINFO_Ins
790770
resultflags.RemoveInstructionSet(InstructionSet_AVX10v1_V512);
791771
if (resultflags.HasInstructionSet(InstructionSet_AVX10v1_V512) && !resultflags.HasInstructionSet(InstructionSet_AVX512VBMI_VL))
792772
resultflags.RemoveInstructionSet(InstructionSet_AVX10v1_V512);
773+
if (resultflags.HasInstructionSet(InstructionSet_Vector128) && !resultflags.HasInstructionSet(InstructionSet_SSE))
774+
resultflags.RemoveInstructionSet(InstructionSet_Vector128);
775+
if (resultflags.HasInstructionSet(InstructionSet_Vector256) && !resultflags.HasInstructionSet(InstructionSet_AVX))
776+
resultflags.RemoveInstructionSet(InstructionSet_Vector256);
777+
if (resultflags.HasInstructionSet(InstructionSet_Vector512) && !resultflags.HasInstructionSet(InstructionSet_AVX512F))
778+
resultflags.RemoveInstructionSet(InstructionSet_Vector512);
793779
if (resultflags.HasInstructionSet(InstructionSet_VectorT128) && !resultflags.HasInstructionSet(InstructionSet_SSE2))
794780
resultflags.RemoveInstructionSet(InstructionSet_VectorT128);
795781
if (resultflags.HasInstructionSet(InstructionSet_VectorT256) && !resultflags.HasInstructionSet(InstructionSet_AVX2))
796782
resultflags.RemoveInstructionSet(InstructionSet_VectorT256);
797783
if (resultflags.HasInstructionSet(InstructionSet_VectorT512) && !resultflags.HasInstructionSet(InstructionSet_AVX512F))
798784
resultflags.RemoveInstructionSet(InstructionSet_VectorT512);
799-
if (resultflags.HasInstructionSet(InstructionSet_AVX512F) && !resultflags.HasInstructionSet(InstructionSet_AVX512BW_VL))
800-
resultflags.RemoveInstructionSet(InstructionSet_AVX512F);
801-
if (resultflags.HasInstructionSet(InstructionSet_AVX512F) && !resultflags.HasInstructionSet(InstructionSet_AVX512CD_VL))
802-
resultflags.RemoveInstructionSet(InstructionSet_AVX512F);
803-
if (resultflags.HasInstructionSet(InstructionSet_AVX512F) && !resultflags.HasInstructionSet(InstructionSet_AVX512DQ_VL))
804-
resultflags.RemoveInstructionSet(InstructionSet_AVX512F);
805785
#endif // TARGET_X86
806786

807787
} while (!oldflags.Equals(resultflags));

src/coreclr/jit/compiler.cpp

+39-30
Original file line numberDiff line numberDiff line change
@@ -2307,37 +2307,46 @@ void Compiler::compSetProcessor()
23072307
{
23082308
instructionSetFlags.AddInstructionSet(InstructionSet_Vector256);
23092309
}
2310-
// x86-64-v4 feature level supports AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL
2311-
// These have been shipped together historically and at the time of this writing
2312-
// there exists no hardware which doesn't support the entire feature set. To simplify
2313-
// the overall JIT implementation, we currently require the entire set of ISAs to be
2314-
// supported and disable AVX512 support otherwise.
2315-
2316-
if (instructionSetFlags.HasInstructionSet(InstructionSet_AVX512F))
2317-
{
2318-
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512F));
2319-
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512F_VL));
2320-
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512BW));
2321-
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512BW_VL));
2322-
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512CD));
2323-
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512CD_VL));
2324-
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512DQ));
2325-
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512DQ_VL));
2326-
2327-
instructionSetFlags.AddInstructionSet(InstructionSet_Vector512);
2328-
2329-
if ((preferredVectorByteLength == 0) && jitFlags.IsSet(JitFlags::JIT_FLAG_VECTOR512_THROTTLING))
2330-
{
2331-
// Some architectures can experience frequency throttling when
2332-
// executing 512-bit width instructions. To account for this we set the
2333-
// default preferred vector width to 256-bits in some scenarios. Power
2334-
// users can override this with `DOTNET_PreferredVectorBitWidth=512` to
2335-
// allow using such instructions where hardware support is available.
2336-
//
2337-
// Do not condition this based on stress mode as it makes the support
2338-
// reported inconsistent across methods and breaks expectations/functionality
23392310

2340-
preferredVectorByteLength = 256 / 8;
2311+
if (instructionSetFlags.HasInstructionSet(InstructionSet_EVEX))
2312+
{
2313+
if (instructionSetFlags.HasInstructionSet(InstructionSet_AVX512F))
2314+
{
2315+
// x86-64-v4 feature level supports AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL
2316+
// These have been shipped together historically and at the time of this writing
2317+
// there exists no hardware which doesn't support the entire feature set. To simplify
2318+
// the overall JIT implementation, we currently require the entire set of ISAs to be
2319+
// supported and disable AVX512 support otherwise.
2320+
2321+
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512F));
2322+
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512F_VL));
2323+
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512BW));
2324+
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512BW_VL));
2325+
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512CD));
2326+
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512CD_VL));
2327+
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512DQ));
2328+
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX512DQ_VL));
2329+
2330+
instructionSetFlags.AddInstructionSet(InstructionSet_Vector512);
2331+
2332+
if ((preferredVectorByteLength == 0) && jitFlags.IsSet(JitFlags::JIT_FLAG_VECTOR512_THROTTLING))
2333+
{
2334+
// Some architectures can experience frequency throttling when
2335+
// executing 512-bit width instructions. To account for this we set the
2336+
// default preferred vector width to 256-bits in some scenarios. Power
2337+
// users can override this with `DOTNET_PreferredVectorBitWidth=512` to
2338+
// allow using such instructions where hardware support is available.
2339+
//
2340+
// Do not condition this based on stress mode as it makes the support
2341+
// reported inconsistent across methods and breaks expectations/functionality
2342+
2343+
preferredVectorByteLength = 256 / 8;
2344+
}
2345+
}
2346+
else
2347+
{
2348+
// We shouldn't have EVEX enabled if neither AVX512 nor AVX10v1 are supported
2349+
assert(instructionSetFlags.HasInstructionSet(InstructionSet_AVX10v1));
23412350
}
23422351
}
23432352

0 commit comments

Comments
 (0)