blob: 3e7505a8c3a2e19a5f5ad68cc593dec2641491ce [file] [log] [blame]
/* 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 <assert.h>
#include <stdlib.h>
#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;
}