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. */
12 /* Check if the Intel CPU model and sub-model are identified. */
14 check_intel_cpu_model (unsigned int family
, unsigned int model
,
15 unsigned int brand_id
)
17 /* Parse family and model only if brand ID is 0. */
31 assert (__builtin_cpu_is ("atom"));
39 assert (__builtin_cpu_is ("silvermont"));
42 /* Knights Landing. */
43 assert (__builtin_cpu_is ("knl"));
47 assert (__builtin_cpu_is ("knm"));
54 assert (__builtin_cpu_is ("corei7"));
55 assert (__builtin_cpu_is ("nehalem"));
61 assert (__builtin_cpu_is ("corei7"));
62 assert (__builtin_cpu_is ("westmere"));
67 assert (__builtin_cpu_is ("corei7"));
68 assert (__builtin_cpu_is ("sandybridge"));
73 assert (__builtin_cpu_is ("corei7"));
74 assert (__builtin_cpu_is ("ivybridge"));
81 assert (__builtin_cpu_is ("corei7"));
82 assert (__builtin_cpu_is ("haswell"));
89 assert (__builtin_cpu_is ("corei7"));
90 assert (__builtin_cpu_is ("broadwell"));
98 assert (__builtin_cpu_is ("corei7"));
99 assert (__builtin_cpu_is ("skylake"));
102 /* Skylake with AVX-512 support. */
103 assert (__builtin_cpu_is ("corei7"));
104 assert (__builtin_cpu_is ("skylake-avx512"));
111 assert (__builtin_cpu_is ("core2"));
118 /* We have no idea. */
124 /* Check if the AMD CPU model and sub-model are identified. */
126 check_amd_cpu_model (unsigned int family
, unsigned int model
)
130 /* AMD Family 10h. */
136 assert (__builtin_cpu_is ("amdfam10h"));
137 assert (__builtin_cpu_is ("barcelona"));
141 assert (__builtin_cpu_is ("amdfam10h"));
142 assert (__builtin_cpu_is ("shanghai"));
146 assert (__builtin_cpu_is ("amdfam10h"));
147 assert (__builtin_cpu_is ("istanbul"));
153 /* AMD Family 15h. */
155 assert (__builtin_cpu_is ("amdfam15h"));
156 /* Bulldozer version 1. */
158 assert (__builtin_cpu_is ("bdver1"));
159 /* Bulldozer version 2. */
160 if (model
>= 0x10 && model
<= 0x1f)
161 assert (__builtin_cpu_is ("bdver2"));
168 /* Check if the ISA features are identified. */
170 check_features (unsigned int ecx
, unsigned int edx
,
173 unsigned int eax
, ebx
;
174 unsigned int ext_level
;
177 assert (__builtin_cpu_supports ("cmov"));
179 assert (__builtin_cpu_supports ("mmx"));
181 assert (__builtin_cpu_supports ("sse"));
183 assert (__builtin_cpu_supports ("sse2"));
184 if (ecx
& bit_POPCNT
)
185 assert (__builtin_cpu_supports ("popcnt"));
187 assert (__builtin_cpu_supports ("aes"));
188 if (ecx
& bit_PCLMUL
)
189 assert (__builtin_cpu_supports ("pclmul"));
191 assert (__builtin_cpu_supports ("sse3"));
193 assert (__builtin_cpu_supports ("ssse3"));
194 if (ecx
& bit_SSE4_1
)
195 assert (__builtin_cpu_supports ("sse4.1"));
196 if (ecx
& bit_SSE4_2
)
197 assert (__builtin_cpu_supports ("sse4.2"));
199 assert (__builtin_cpu_supports ("avx"));
201 assert (__builtin_cpu_supports ("fma"));
203 /* Get advanced features at level 7 (eax = 7, ecx = 0). */
204 if (max_cpuid_level
>= 7)
206 __cpuid_count (7, 0, eax
, ebx
, ecx
, edx
);
208 assert (__builtin_cpu_supports ("bmi"));
210 assert (__builtin_cpu_supports ("avx2"));
212 assert (__builtin_cpu_supports ("bmi2"));
213 if (ebx
& bit_AVX512F
)
214 assert (__builtin_cpu_supports ("avx512f"));
215 if (ebx
& bit_AVX512VL
)
216 assert (__builtin_cpu_supports ("avx512vl"));
217 if (ebx
& bit_AVX512BW
)
218 assert (__builtin_cpu_supports ("avx512bw"));
219 if (ebx
& bit_AVX512DQ
)
220 assert (__builtin_cpu_supports ("avx512dq"));
221 if (ebx
& bit_AVX512CD
)
222 assert (__builtin_cpu_supports ("avx512cd"));
223 if (ebx
& bit_AVX512PF
)
224 assert (__builtin_cpu_supports ("avx512pf"));
225 if (ebx
& bit_AVX512ER
)
226 assert (__builtin_cpu_supports ("avx512er"));
227 if (ebx
& bit_AVX512IFMA
)
228 assert (__builtin_cpu_supports ("avx512ifma"));
229 if (ecx
& bit_AVX512VBMI
)
230 assert (__builtin_cpu_supports ("avx512vbmi"));
231 if (ecx
& bit_AVX512VPOPCNTDQ
)
232 assert (__builtin_cpu_supports ("avx512vpopcntdq"));
233 if (edx
& bit_AVX5124VNNIW
)
234 assert (__builtin_cpu_supports ("avx5124vnniw"));
235 if (edx
& bit_AVX5124FMAPS
)
236 assert (__builtin_cpu_supports ("avx5124fmaps"));
239 /* Check cpuid level of extended features. */
240 __cpuid (0x80000000, ext_level
, ebx
, ecx
, edx
);
242 if (ext_level
>= 0x80000001)
244 __cpuid (0x80000001, eax
, ebx
, ecx
, edx
);
247 assert (__builtin_cpu_supports ("sse4a"));
249 assert (__builtin_cpu_supports ("fma4"));
251 assert (__builtin_cpu_supports ("xop"));
255 static int __attribute__ ((noinline
))
256 __get_cpuid_output (unsigned int __level
,
257 unsigned int *__eax
, unsigned int *__ebx
,
258 unsigned int *__ecx
, unsigned int *__edx
)
260 return __get_cpuid (__level
, __eax
, __ebx
, __ecx
, __edx
);
266 unsigned int eax
, ebx
, ecx
, edx
;
270 unsigned int model
, family
, brand_id
;
271 unsigned int extended_model
, extended_family
;
273 /* Assume cpuid insn present. Run in level 0 to get vendor id. */
274 if (!__get_cpuid_output (0, &eax
, &ebx
, &ecx
, &edx
))
283 if (!__get_cpuid_output (1, &eax
, &ebx
, &ecx
, &edx
))
286 model
= (eax
>> 4) & 0x0f;
287 family
= (eax
>> 8) & 0x0f;
288 brand_id
= ebx
& 0xff;
289 extended_model
= (eax
>> 12) & 0xf0;
290 extended_family
= (eax
>> 20) & 0xff;
292 if (vendor
== signature_INTEL_ebx
)
294 assert (__builtin_cpu_is ("intel"));
295 /* Adjust family and model for Intel CPUs. */
298 family
+= extended_family
;
299 model
+= extended_model
;
301 else if (family
== 0x06)
302 model
+= extended_model
;
303 check_intel_cpu_model (family
, model
, brand_id
);
304 check_features (ecx
, edx
, max_level
);
306 else if (vendor
== signature_AMD_ebx
)
308 assert (__builtin_cpu_is ("amd"));
309 /* Adjust model and family for AMD CPUS. */
312 family
+= extended_family
;
313 model
+= (extended_model
<< 4);
315 check_amd_cpu_model (family
, model
);
316 check_features (ecx
, edx
, max_level
);
325 /* Check CPU Features. */
326 assert (__builtin_cpu_supports ("cmov") >= 0);
328 assert (__builtin_cpu_supports ("mmx") >= 0);
330 assert (__builtin_cpu_supports ("popcnt") >= 0);
332 assert (__builtin_cpu_supports ("sse") >= 0);
334 assert (__builtin_cpu_supports ("sse2") >= 0);
336 assert (__builtin_cpu_supports ("sse3") >= 0);
338 assert (__builtin_cpu_supports ("ssse3") >= 0);
340 assert (__builtin_cpu_supports ("sse4.1") >= 0);
342 assert (__builtin_cpu_supports ("sse4.2") >= 0);
344 assert (__builtin_cpu_supports ("avx") >= 0);
346 assert (__builtin_cpu_supports ("avx2") >= 0);
348 assert (__builtin_cpu_supports ("avx512f") >= 0);
350 assert (__builtin_cpu_supports ("avx5124vnniw") >= 0);
352 assert (__builtin_cpu_supports ("avx5124fmaps") >= 0);
354 assert (__builtin_cpu_supports ("avx512vpopcntdq") >= 0);
356 /* Check CPU type. */
357 assert (__builtin_cpu_is ("amd") >= 0);
359 assert (__builtin_cpu_is ("intel") >= 0);
361 assert (__builtin_cpu_is ("atom") >= 0);
363 assert (__builtin_cpu_is ("core2") >= 0);
365 assert (__builtin_cpu_is ("corei7") >= 0);
367 assert (__builtin_cpu_is ("nehalem") >= 0);
369 assert (__builtin_cpu_is ("westmere") >= 0);
371 assert (__builtin_cpu_is ("sandybridge") >= 0);
373 assert (__builtin_cpu_is ("amdfam10h") >= 0);
375 assert (__builtin_cpu_is ("barcelona") >= 0);
377 assert (__builtin_cpu_is ("shanghai") >= 0);
379 assert (__builtin_cpu_is ("istanbul") >= 0);
381 assert (__builtin_cpu_is ("amdfam15h") >= 0);
383 assert (__builtin_cpu_is ("bdver1") >= 0);
385 assert (__builtin_cpu_is ("bdver2") >= 0);
392 __builtin_cpu_init ();