1
0
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:
Noah Goldstein
2023-09-20 15:44:50 -05:00
parent 5f913506f4
commit d90b43a4ed
5 changed files with 83 additions and 3 deletions

View File

@ -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))