aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/i386/builtin_target.c
blob: 45554d8771d2a4a2aefd8d6483c1315fa136530b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/* 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 ("avx512vpopcntdq") >= 0);

  assert (__builtin_cpu_supports ("x86-64") >= 0);
  assert (__builtin_cpu_supports ("x86-64-v2") >= 0);
  assert (__builtin_cpu_supports ("x86-64-v3") >= 0);
  assert (__builtin_cpu_supports ("x86-64-v4") >= 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;
}