FEATURE_AVX512VNNI,
FEATURE_AVX512BITALG,
FEATURE_AVX512BF16,
- FEATURE_AVX512VP2INTERSECT
+ FEATURE_AVX512VP2INTERSECT,
+ CPU_FEATURE_MAX
};
// The check below for i386 was copied from clang's cpuid.h (__get_cpuid_max).
static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,
unsigned *Features) {
- Features[0] = 0;
- Features[1] = 0;
unsigned EAX, EBX;
#define setFeature(F) \
unsigned MaxLeaf = 5;
unsigned Vendor;
unsigned Model, Family;
- unsigned Features[2];
+ const unsigned SIZE_OF_FEATURES = (CPU_FEATURE_MAX + 31) / 32;
+ unsigned Features[SIZE_OF_FEATURES] = {0};
// This function needs to run just once.
if (__cpu_model.__cpu_vendor)
// Find available features.
getAvailableFeatures(ECX, EDX, MaxLeaf, &Features[0]);
+
+ assert(SIZE_OF_FEATURES == 2);
__cpu_model.__cpu_features[0] = Features[0];
__cpu_features2 = Features[1];
static void
getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,
- const unsigned (&Features)[3],
+ const unsigned *Features,
unsigned *Type, unsigned *Subtype) {
auto testFeature = [&](unsigned F) {
return (Features[F / 32] & (1U << (F % 32))) != 0;
}
static void getAMDProcessorTypeAndSubtype(unsigned Family, unsigned Model,
- const unsigned (&Features)[3],
+ const unsigned *Features,
unsigned *Type, unsigned *Subtype) {
auto testFeature = [&](unsigned F) {
return (Features[F / 32] & (1U << (F % 32))) != 0;
}
static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,
- unsigned (&Features)[3]) {
- Features[0] = 0;
- Features[1] = 0;
- Features[2] = 0;
+ unsigned *Features) {
unsigned EAX, EBX;
auto setFeature = [&](unsigned F) {
getX86CpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX);
unsigned Family = 0, Model = 0;
- unsigned Features[3] = {0, 0, 0};
+ unsigned Features[(X86::CPU_FEATURE_MAX + 31) / 32] = {0};
detectX86FamilyModel(EAX, &Family, &Model);
getAvailableFeatures(ECX, EDX, MaxLeaf, Features);