]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gcc.target/i386/builtin_target.c
cpuinfo.c (get_intel_cpu): Detect "skylake-avx512".
[thirdparty/gcc.git] / gcc / testsuite / gcc.target / i386 / builtin_target.c
1 /* This test checks if the __builtin_cpu_is and __builtin_cpu_supports calls
2 are recognized. It also independently uses CPUID to get cpu type and
3 features supported and checks if the builtins correctly identify the
4 platform. The code to do the identification is adapted from
5 libgcc/config/i386/cpuinfo.c. */
6
7 /* { dg-do run } */
8
9 #include <assert.h>
10 #include "cpuid.h"
11
12 /* Check if the Intel CPU model and sub-model are identified. */
13 static void
14 check_intel_cpu_model (unsigned int family, unsigned int model,
15 unsigned int brand_id)
16 {
17 /* Parse family and model only if brand ID is 0. */
18 if (brand_id == 0)
19 {
20 switch (family)
21 {
22 case 0x5:
23 /* Pentium. */
24 break;
25 case 0x6:
26 switch (model)
27 {
28 case 0x1c:
29 case 0x26:
30 /* Atom. */
31 assert (__builtin_cpu_is ("atom"));
32 break;
33 case 0x37:
34 case 0x4a:
35 case 0x4d:
36 case 0x5a:
37 case 0x5d:
38 /* Silvermont. */
39 assert (__builtin_cpu_is ("silvermont"));
40 break;
41 case 0x57:
42 /* Knights Landing. */
43 assert (__builtin_cpu_is ("knl"));
44 break;
45 case 0x1a:
46 case 0x1e:
47 case 0x1f:
48 case 0x2e:
49 /* Nehalem. */
50 assert (__builtin_cpu_is ("corei7"));
51 assert (__builtin_cpu_is ("nehalem"));
52 break;
53 case 0x25:
54 case 0x2c:
55 case 0x2f:
56 /* Westmere. */
57 assert (__builtin_cpu_is ("corei7"));
58 assert (__builtin_cpu_is ("westmere"));
59 break;
60 case 0x2a:
61 case 0x2d:
62 /* Sandy Bridge. */
63 assert (__builtin_cpu_is ("corei7"));
64 assert (__builtin_cpu_is ("sandybridge"));
65 break;
66 case 0x3a:
67 case 0x3e:
68 /* Ivy Bridge. */
69 assert (__builtin_cpu_is ("corei7"));
70 assert (__builtin_cpu_is ("ivybridge"));
71 break;
72 case 0x3c:
73 case 0x3f:
74 case 0x45:
75 case 0x46:
76 /* Haswell. */
77 assert (__builtin_cpu_is ("corei7"));
78 assert (__builtin_cpu_is ("haswell"));
79 break;
80 case 0x3d:
81 case 0x47:
82 case 0x4f:
83 case 0x56:
84 /* Broadwell. */
85 assert (__builtin_cpu_is ("corei7"));
86 assert (__builtin_cpu_is ("broadwell"));
87 break;
88 case 0x4e:
89 case 0x5e:
90 /* Skylake. */
91 assert (__builtin_cpu_is ("corei7"));
92 assert (__builtin_cpu_is ("skylake"));
93 break;
94 case 0x55:
95 /* Skylake with AVX-512 support. */
96 assert (__builtin_cpu_is ("corei7"));
97 assert (__builtin_cpu_is ("skylake-avx512"));
98 break;
99 case 0x17:
100 case 0x1d:
101 /* Penryn. */
102 case 0x0f:
103 /* Merom. */
104 assert (__builtin_cpu_is ("core2"));
105 break;
106 default:
107 break;
108 }
109 break;
110 default:
111 /* We have no idea. */
112 break;
113 }
114 }
115 }
116
117 /* Check if the AMD CPU model and sub-model are identified. */
118 static void
119 check_amd_cpu_model (unsigned int family, unsigned int model)
120 {
121 switch (family)
122 {
123 /* AMD Family 10h. */
124 case 0x10:
125 switch (model)
126 {
127 case 0x2:
128 /* Barcelona. */
129 assert (__builtin_cpu_is ("amdfam10h"));
130 assert (__builtin_cpu_is ("barcelona"));
131 break;
132 case 0x4:
133 /* Shanghai. */
134 assert (__builtin_cpu_is ("amdfam10h"));
135 assert (__builtin_cpu_is ("shanghai"));
136 break;
137 case 0x8:
138 /* Istanbul. */
139 assert (__builtin_cpu_is ("amdfam10h"));
140 assert (__builtin_cpu_is ("istanbul"));
141 break;
142 default:
143 break;
144 }
145 break;
146 /* AMD Family 15h. */
147 case 0x15:
148 assert (__builtin_cpu_is ("amdfam15h"));
149 /* Bulldozer version 1. */
150 if ( model <= 0xf)
151 assert (__builtin_cpu_is ("bdver1"));
152 /* Bulldozer version 2. */
153 if (model >= 0x10 && model <= 0x1f)
154 assert (__builtin_cpu_is ("bdver2"));
155 break;
156 default:
157 break;
158 }
159 }
160
161 /* Check if the ISA features are identified. */
162 static void
163 check_features (unsigned int ecx, unsigned int edx,
164 int max_cpuid_level)
165 {
166 if (edx & bit_CMOV)
167 assert (__builtin_cpu_supports ("cmov"));
168 if (edx & bit_MMX)
169 assert (__builtin_cpu_supports ("mmx"));
170 if (edx & bit_SSE)
171 assert (__builtin_cpu_supports ("sse"));
172 if (edx & bit_SSE2)
173 assert (__builtin_cpu_supports ("sse2"));
174 if (ecx & bit_POPCNT)
175 assert (__builtin_cpu_supports ("popcnt"));
176 if (ecx & bit_SSE3)
177 assert (__builtin_cpu_supports ("sse3"));
178 if (ecx & bit_SSSE3)
179 assert (__builtin_cpu_supports ("ssse3"));
180 if (ecx & bit_SSE4_1)
181 assert (__builtin_cpu_supports ("sse4.1"));
182 if (ecx & bit_SSE4_2)
183 assert (__builtin_cpu_supports ("sse4.2"));
184 if (ecx & bit_AVX)
185 assert (__builtin_cpu_supports ("avx"));
186
187 /* Get advanced features at level 7 (eax = 7, ecx = 0). */
188 if (max_cpuid_level >= 7)
189 {
190 unsigned int eax, ebx, ecx, edx;
191 __cpuid_count (7, 0, eax, ebx, ecx, edx);
192 if (ebx & bit_AVX2)
193 assert (__builtin_cpu_supports ("avx2"));
194 if (ebx & bit_AVX512F)
195 assert (__builtin_cpu_supports ("avx512f"));
196 if (ebx & bit_AVX512VL)
197 assert (__builtin_cpu_supports ("avx512vl"));
198 if (ebx & bit_AVX512CD)
199 assert (__builtin_cpu_supports ("avx512cd"));
200 if (ebx & bit_AVX512PF)
201 assert (__builtin_cpu_supports ("avx512pf"));
202 if (ebx & bit_AVX512ER)
203 assert (__builtin_cpu_supports ("avx512er"));
204 if (ebx & bit_AVX512BW)
205 assert (__builtin_cpu_supports ("avx512bw"));
206 if (ebx & bit_AVX512DQ)
207 assert (__builtin_cpu_supports ("avx512dq"));
208 if (ebx & bit_AVX512IFMA)
209 assert (__builtin_cpu_supports ("avx512ifma"));
210 if (ebx & bit_AVX512VBMI)
211 assert (__builtin_cpu_supports ("avx512vbmi"));
212 }
213 }
214
215 static int __attribute__ ((noinline))
216 __get_cpuid_output (unsigned int __level,
217 unsigned int *__eax, unsigned int *__ebx,
218 unsigned int *__ecx, unsigned int *__edx)
219 {
220 return __get_cpuid (__level, __eax, __ebx, __ecx, __edx);
221 }
222
223 static int
224 check_detailed ()
225 {
226 unsigned int eax, ebx, ecx, edx;
227
228 int max_level;
229 unsigned int vendor;
230 unsigned int model, family, brand_id;
231 unsigned int extended_model, extended_family;
232
233 /* Assume cpuid insn present. Run in level 0 to get vendor id. */
234 if (!__get_cpuid_output (0, &eax, &ebx, &ecx, &edx))
235 return 0;
236
237 vendor = ebx;
238 max_level = eax;
239
240 if (max_level < 1)
241 return 0;
242
243 if (!__get_cpuid_output (1, &eax, &ebx, &ecx, &edx))
244 return 0;
245
246 model = (eax >> 4) & 0x0f;
247 family = (eax >> 8) & 0x0f;
248 brand_id = ebx & 0xff;
249 extended_model = (eax >> 12) & 0xf0;
250 extended_family = (eax >> 20) & 0xff;
251
252 if (vendor == signature_INTEL_ebx)
253 {
254 assert (__builtin_cpu_is ("intel"));
255 /* Adjust family and model for Intel CPUs. */
256 if (family == 0x0f)
257 {
258 family += extended_family;
259 model += extended_model;
260 }
261 else if (family == 0x06)
262 model += extended_model;
263 check_intel_cpu_model (family, model, brand_id);
264 check_features (ecx, edx, max_level);
265 }
266 else if (vendor == signature_AMD_ebx)
267 {
268 assert (__builtin_cpu_is ("amd"));
269 /* Adjust model and family for AMD CPUS. */
270 if (family == 0x0f)
271 {
272 family += extended_family;
273 model += (extended_model << 4);
274 }
275 check_amd_cpu_model (family, model);
276 check_features (ecx, edx, max_level);
277 }
278
279 return 0;
280 }
281
282 static int
283 quick_check ()
284 {
285 /* Check CPU Features. */
286 assert (__builtin_cpu_supports ("cmov") >= 0);
287
288 assert (__builtin_cpu_supports ("mmx") >= 0);
289
290 assert (__builtin_cpu_supports ("popcnt") >= 0);
291
292 assert (__builtin_cpu_supports ("sse") >= 0);
293
294 assert (__builtin_cpu_supports ("sse2") >= 0);
295
296 assert (__builtin_cpu_supports ("sse3") >= 0);
297
298 assert (__builtin_cpu_supports ("ssse3") >= 0);
299
300 assert (__builtin_cpu_supports ("sse4.1") >= 0);
301
302 assert (__builtin_cpu_supports ("sse4.2") >= 0);
303
304 assert (__builtin_cpu_supports ("avx") >= 0);
305
306 assert (__builtin_cpu_supports ("avx2") >= 0);
307
308 assert (__builtin_cpu_supports ("avx512f") >= 0);
309
310 /* Check CPU type. */
311 assert (__builtin_cpu_is ("amd") >= 0);
312
313 assert (__builtin_cpu_is ("intel") >= 0);
314
315 assert (__builtin_cpu_is ("atom") >= 0);
316
317 assert (__builtin_cpu_is ("core2") >= 0);
318
319 assert (__builtin_cpu_is ("corei7") >= 0);
320
321 assert (__builtin_cpu_is ("nehalem") >= 0);
322
323 assert (__builtin_cpu_is ("westmere") >= 0);
324
325 assert (__builtin_cpu_is ("sandybridge") >= 0);
326
327 assert (__builtin_cpu_is ("amdfam10h") >= 0);
328
329 assert (__builtin_cpu_is ("barcelona") >= 0);
330
331 assert (__builtin_cpu_is ("shanghai") >= 0);
332
333 assert (__builtin_cpu_is ("istanbul") >= 0);
334
335 assert (__builtin_cpu_is ("amdfam15h") >= 0);
336
337 assert (__builtin_cpu_is ("bdver1") >= 0);
338
339 assert (__builtin_cpu_is ("bdver2") >= 0);
340
341 return 0;
342 }
343
344 int main ()
345 {
346 __builtin_cpu_init ();
347 quick_check ();
348 check_detailed ();
349 return 0;
350 }