mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-01 10:06:57 +03:00
x86: Add support for AVX10 preset and vec size in cpu-features
This commit add support for the new AVX10 cpu features: https://cdrdv2-public.intel.com/784267/355989-intel-avx10-spec.pdf We add checks for: - `AVX10`: Check if AVX10 is present. - `AVX10_{X,Y,Z}MM`: Check if a given vec class has AVX10 support. `make check` passes and cpuid output was checked against GNR/DMR on an emulator.
This commit is contained in:
@ -115,11 +115,18 @@ update_active (struct cpu_features *cpu_features)
|
||||
CPU_FEATURE_SET_ACTIVE (cpu_features, SHSTK);
|
||||
#endif
|
||||
|
||||
enum
|
||||
{
|
||||
os_xmm = 1,
|
||||
os_ymm = 2,
|
||||
os_zmm = 4
|
||||
} os_vector_size = os_xmm;
|
||||
/* Can we call xgetbv? */
|
||||
if (CPU_FEATURES_CPU_P (cpu_features, OSXSAVE))
|
||||
{
|
||||
unsigned int xcrlow;
|
||||
unsigned int xcrhigh;
|
||||
CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10);
|
||||
asm ("xgetbv" : "=a" (xcrlow), "=d" (xcrhigh) : "c" (0));
|
||||
/* Is YMM and XMM state usable? */
|
||||
if ((xcrlow & (bit_YMM_state | bit_XMM_state))
|
||||
@ -128,6 +135,7 @@ update_active (struct cpu_features *cpu_features)
|
||||
/* Determine if AVX is usable. */
|
||||
if (CPU_FEATURES_CPU_P (cpu_features, AVX))
|
||||
{
|
||||
os_vector_size |= os_ymm;
|
||||
CPU_FEATURE_SET (cpu_features, AVX);
|
||||
/* The following features depend on AVX being usable. */
|
||||
/* Determine if AVX2 is usable. */
|
||||
@ -166,6 +174,7 @@ update_active (struct cpu_features *cpu_features)
|
||||
| bit_ZMM16_31_state))
|
||||
== (bit_Opmask_state | bit_ZMM0_15_state | bit_ZMM16_31_state))
|
||||
{
|
||||
os_vector_size |= os_zmm;
|
||||
/* Determine if AVX512F is usable. */
|
||||
if (CPU_FEATURES_CPU_P (cpu_features, AVX512F))
|
||||
{
|
||||
@ -210,6 +219,22 @@ update_active (struct cpu_features *cpu_features)
|
||||
}
|
||||
}
|
||||
|
||||
if (CPU_FEATURES_CPU_P (cpu_features, AVX10)
|
||||
&& cpu_features->basic.max_cpuid >= 0x24)
|
||||
{
|
||||
__cpuid_count (
|
||||
0x24, 0, cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.eax,
|
||||
cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ebx,
|
||||
cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ecx,
|
||||
cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.edx);
|
||||
if (os_vector_size & os_xmm)
|
||||
CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_XMM);
|
||||
if (os_vector_size & os_ymm)
|
||||
CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_YMM);
|
||||
if (os_vector_size & os_zmm)
|
||||
CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_ZMM);
|
||||
}
|
||||
|
||||
/* Are XTILECFG and XTILEDATA states usable? */
|
||||
if ((xcrlow & (bit_XTILECFG_state | bit_XTILEDATA_state))
|
||||
== (bit_XTILECFG_state | bit_XTILEDATA_state))
|
||||
|
Reference in New Issue
Block a user