Update cpuinfo to support AVX10.2 ISA detection
diff --git a/include/cpuinfo.h b/include/cpuinfo.h index 6eb4b8c..ea3c1d0 100644 --- a/include/cpuinfo.h +++ b/include/cpuinfo.h
@@ -821,6 +821,7 @@ bool avx512_4vnniw; bool avx512_4fmaps; bool avx10_1; + bool avx10_2; bool amx_bf16; bool amx_tile; bool amx_int8; @@ -1444,6 +1445,14 @@ #endif } +static inline bool cpuinfo_has_x86_avx10_2(void) { +#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64 + return cpuinfo_isa.avx10_2; +#else + return false; +#endif +} + static inline bool cpuinfo_has_x86_hle(void) { #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64 return cpuinfo_isa.hle;
diff --git a/src/x86/isa.c b/src/x86/isa.c index 47a6afa..c8b1c99 100644 --- a/src/x86/isa.c +++ b/src/x86/isa.c
@@ -46,6 +46,8 @@ (max_base_index >= 7) ? cpuidex(7, 0) : (struct cpuid_regs){0, 0, 0, 0}; const struct cpuid_regs structured_feature_info1 = (max_base_index >= 7) ? cpuidex(7, 1) : (struct cpuid_regs){0, 0, 0, 0}; + const struct cpuid_regs structured_feature_info2 = + (max_base_index >= 7) ? cpuidex(0x24, 0) : (struct cpuid_regs){0, 0, 0, 0}; const uint32_t processor_capacity_info_index = UINT32_C(0x80000008); const struct cpuid_regs processor_capacity_info = (max_extended_index >= processor_capacity_info_index) @@ -435,6 +437,11 @@ isa.avx10_1 = avx512_regs && !!(structured_feature_info1.edx & UINT32_C(0x00080000)); /* + * AVX 10.2 instructions: + */ + isa.avx10_2 = !!((structured_feature_info2.ebx & UINT32_C(0x0000007F)) >= 2) && isa.avx10_1; + + /* * AVX512PF instructions: * - Intel: ebx[bit 26] in structured feature info (ecx = 0). */
diff --git a/tools/cpuid-dump.c b/tools/cpuid-dump.c index 87c403d..1a65510 100644 --- a/tools/cpuid-dump.c +++ b/tools/cpuid-dump.c
@@ -123,6 +123,15 @@ print_cpuidex(regs, eax, ecx); } break; + case UINT32_C(0x00000024): + for (uint32_t ecx = 0; ecx <= max_socid_index; ecx++) { + const struct cpuid_regs regs = cpuidex(eax, ecx); + if (ecx == 0) { + max_socid_index = regs.eax; + } + print_cpuidex(regs, eax, ecx); + } + break; default: print_cpuid(cpuidex(eax, 0), eax); break;
diff --git a/tools/isa-info.c b/tools/isa-info.c index 96bcdd7..21f94a5 100644 --- a/tools/isa-info.c +++ b/tools/isa-info.c
@@ -71,6 +71,7 @@ printf("\tAVX512_4VNNIW: %s\n", cpuinfo_has_x86_avx512_4vnniw() ? "yes" : "no"); printf("\tAVX512_4FMAPS: %s\n", cpuinfo_has_x86_avx512_4fmaps() ? "yes" : "no"); printf("\tAVX10_1: %s\n", cpuinfo_has_x86_avx10_1() ? "yes" : "no"); + printf("\tAVX10_2: %s\n", cpuinfo_has_x86_avx10_2() ? "yes" : "no"); printf("\tAMX_BF16: %s\n", cpuinfo_has_x86_amx_bf16() ? "yes" : "no"); printf("\tAMX_TILE: %s\n", cpuinfo_has_x86_amx_tile() ? "yes" : "no"); printf("\tAMX_INT8: %s\n", cpuinfo_has_x86_amx_int8() ? "yes" : "no");