/* This test checks if the __builtin_cpu_is and __builtin_cpu_supports calls are recognized. It also independently uses CPUID to get cpu type and features supported and checks if the builtins correctly identify the platform. The code to do the identification is adapted from libgcc/config/i386/cpuinfo.c. */ /* { dg-do run } */ #include #include #include "cpuid.h" #define CHECK___builtin_cpu_is(cpu) assert (__builtin_cpu_is (cpu)) #define CHECK___builtin_cpu_supports(isa) \ assert (__builtin_cpu_supports (isa)) #define gcc_assert(a) assert (a) #define gcc_unreachable() abort () #define inline #include "../../../common/config/i386/i386-cpuinfo.h" #include "../../../common/config/i386/cpuinfo.h" /* Check if the ISA features are identified. */ static void check_features (struct __processor_model *cpu_model, unsigned int *cpu_features2) { #define has_feature(f) \ has_cpu_feature (cpu_model, cpu_features2, f) #define ISA_NAMES_TABLE_START #define ISA_NAMES_TABLE_END #define ISA_NAMES_TABLE_ENTRY(name, feature, priority, option) \ assert (!!has_feature (feature) == !!__builtin_cpu_supports (name)); #include "../../../common/config/i386/i386-isas.h" } static int check_detailed () { struct __processor_model cpu_model = { 0 }; struct __processor_model2 cpu_model2 = { 0 }; unsigned int cpu_features2[SIZE_OF_CPU_FEATURES] = { 0 }; if (cpu_indicator_init (&cpu_model, &cpu_model2, cpu_features2) != 0) return 0; check_features (&cpu_model, cpu_features2); switch (cpu_model.__cpu_vendor) { case VENDOR_INTEL: assert (__builtin_cpu_is ("intel")); get_intel_cpu (&cpu_model, &cpu_model2, cpu_features2); break; case VENDOR_AMD: assert (__builtin_cpu_is ("amd")); get_amd_cpu (&cpu_model, &cpu_model2, cpu_features2); break; default: break; } return 0; } static int quick_check () { /* Check CPU Features. */ assert (__builtin_cpu_supports ("cmov") >= 0); assert (__builtin_cpu_supports ("mmx") >= 0); assert (__builtin_cpu_supports ("popcnt") >= 0); assert (__builtin_cpu_supports ("sse") >= 0); assert (__builtin_cpu_supports ("sse2") >= 0); assert (__builtin_cpu_supports ("sse3") >= 0); assert (__builtin_cpu_supports ("ssse3") >= 0); assert (__builtin_cpu_supports ("sse4.1") >= 0); assert (__builtin_cpu_supports ("sse4.2") >= 0); assert (__builtin_cpu_supports ("avx") >= 0); assert (__builtin_cpu_supports ("avx2") >= 0); assert (__builtin_cpu_supports ("avx512f") >= 0); assert (__builtin_cpu_supports ("avx5124vnniw") >= 0); assert (__builtin_cpu_supports ("avx5124fmaps") >= 0); assert (__builtin_cpu_supports ("avx512vpopcntdq") >= 0); /* Check CPU type. */ assert (__builtin_cpu_is ("amd") >= 0); assert (__builtin_cpu_is ("intel") >= 0); assert (__builtin_cpu_is ("atom") >= 0); assert (__builtin_cpu_is ("core2") >= 0); assert (__builtin_cpu_is ("corei7") >= 0); assert (__builtin_cpu_is ("nehalem") >= 0); assert (__builtin_cpu_is ("westmere") >= 0); assert (__builtin_cpu_is ("sandybridge") >= 0); assert (__builtin_cpu_is ("amdfam10h") >= 0); assert (__builtin_cpu_is ("barcelona") >= 0); assert (__builtin_cpu_is ("shanghai") >= 0); assert (__builtin_cpu_is ("istanbul") >= 0); assert (__builtin_cpu_is ("amdfam15h") >= 0); assert (__builtin_cpu_is ("bdver1") >= 0); assert (__builtin_cpu_is ("bdver2") >= 0); return 0; } int main () { __builtin_cpu_init (); quick_check (); check_detailed (); return 0; }