unsigned int max_cpuid_level = cpu_model2->__cpu_max_level;
unsigned int eax, ebx;
unsigned int ext_level;
+ unsigned int subleaf_level;
/* Get XCR_XFEATURE_ENABLED_MASK register with xgetbv. */
#define XCR_XFEATURE_ENABLED_MASK 0x0
/* Get Advanced Features at level 7 (eax = 7, ecx = 0/1). */
if (max_cpuid_level >= 7)
{
- __cpuid_count (7, 0, eax, ebx, ecx, edx);
+ __cpuid_count (7, 0, subleaf_level, ebx, ecx, edx);
if (ebx & bit_BMI)
set_feature (FEATURE_BMI);
if (ebx & bit_SGX)
set_feature (FEATURE_AVX512FP16);
}
- __cpuid_count (7, 1, eax, ebx, ecx, edx);
- if (eax & bit_HRESET)
- set_feature (FEATURE_HRESET);
- if (eax & bit_CMPCCXADD)
- set_feature(FEATURE_CMPCCXADD);
- if (edx & bit_PREFETCHI)
- set_feature (FEATURE_PREFETCHI);
- if (eax & bit_RAOINT)
- set_feature (FEATURE_RAOINT);
- if (avx_usable)
- {
- if (eax & bit_AVXVNNI)
- set_feature (FEATURE_AVXVNNI);
- if (eax & bit_AVXIFMA)
- set_feature (FEATURE_AVXIFMA);
- if (edx & bit_AVXVNNIINT8)
- set_feature (FEATURE_AVXVNNIINT8);
- if (edx & bit_AVXNECONVERT)
- set_feature (FEATURE_AVXNECONVERT);
- if (edx & bit_AVXVNNIINT16)
- set_feature (FEATURE_AVXVNNIINT16);
- if (eax & bit_SM3)
- set_feature (FEATURE_SM3);
- if (eax & bit_SHA512)
- set_feature (FEATURE_SHA512);
- if (eax & bit_SM4)
- set_feature (FEATURE_SM4);
- }
- if (avx512_usable)
- {
- if (eax & bit_AVX512BF16)
- set_feature (FEATURE_AVX512BF16);
- }
- if (amx_usable)
+ if (subleaf_level >= 1)
{
- if (eax & bit_AMX_FP16)
- set_feature (FEATURE_AMX_FP16);
- if (edx & bit_AMX_COMPLEX)
- set_feature (FEATURE_AMX_COMPLEX);
+ __cpuid_count (7, 1, eax, ebx, ecx, edx);
+ if (eax & bit_HRESET)
+ set_feature (FEATURE_HRESET);
+ if (eax & bit_CMPCCXADD)
+ set_feature(FEATURE_CMPCCXADD);
+ if (edx & bit_PREFETCHI)
+ set_feature (FEATURE_PREFETCHI);
+ if (eax & bit_RAOINT)
+ set_feature (FEATURE_RAOINT);
+ if (avx_usable)
+ {
+ if (eax & bit_AVXVNNI)
+ set_feature (FEATURE_AVXVNNI);
+ if (eax & bit_AVXIFMA)
+ set_feature (FEATURE_AVXIFMA);
+ if (edx & bit_AVXVNNIINT8)
+ set_feature (FEATURE_AVXVNNIINT8);
+ if (edx & bit_AVXNECONVERT)
+ set_feature (FEATURE_AVXNECONVERT);
+ if (edx & bit_AVXVNNIINT16)
+ set_feature (FEATURE_AVXVNNIINT16);
+ if (eax & bit_SM3)
+ set_feature (FEATURE_SM3);
+ if (eax & bit_SHA512)
+ set_feature (FEATURE_SHA512);
+ if (eax & bit_SM4)
+ set_feature (FEATURE_SM4);
+ }
+ if (avx512_usable)
+ {
+ if (eax & bit_AVX512BF16)
+ set_feature (FEATURE_AVX512BF16);
+ }
+ if (amx_usable)
+ {
+ if (eax & bit_AMX_FP16)
+ set_feature (FEATURE_AMX_FP16);
+ if (edx & bit_AMX_COMPLEX)
+ set_feature (FEATURE_AMX_COMPLEX);
+ }
}
}