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"));
50 assert (__builtin_cpu_is ("corei7"));
51 assert (__builtin_cpu_is ("nehalem"));
57 assert (__builtin_cpu_is ("corei7"));
58 assert (__builtin_cpu_is ("westmere"));
63 assert (__builtin_cpu_is ("corei7"));
64 assert (__builtin_cpu_is ("sandybridge"));
69 assert (__builtin_cpu_is ("corei7"));
70 assert (__builtin_cpu_is ("ivybridge"));
77 assert (__builtin_cpu_is ("corei7"));
78 assert (__builtin_cpu_is ("haswell"));
85 assert (__builtin_cpu_is ("corei7"));
86 assert (__builtin_cpu_is ("broadwell"));
94 assert (__builtin_cpu_is ("corei7"));
95 assert (__builtin_cpu_is ("skylake"));
98 /* Skylake with AVX-512 support. */
99 assert (__builtin_cpu_is ("corei7"));
100 assert (__builtin_cpu_is ("skylake-avx512"));
107 assert (__builtin_cpu_is ("core2"));
114 /* We have no idea. */
120 /* Check if the AMD CPU model and sub-model are identified. */
122 check_amd_cpu_model (unsigned int family
, unsigned int model
)
126 /* AMD Family 10h. */
132 assert (__builtin_cpu_is ("amdfam10h"));
133 assert (__builtin_cpu_is ("barcelona"));
137 assert (__builtin_cpu_is ("amdfam10h"));
138 assert (__builtin_cpu_is ("shanghai"));
142 assert (__builtin_cpu_is ("amdfam10h"));
143 assert (__builtin_cpu_is ("istanbul"));
149 /* AMD Family 15h. */
151 assert (__builtin_cpu_is ("amdfam15h"));
152 /* Bulldozer version 1. */
154 assert (__builtin_cpu_is ("bdver1"));
155 /* Bulldozer version 2. */
156 if (model
>= 0x10 && model
<= 0x1f)
157 assert (__builtin_cpu_is ("bdver2"));
164 /* Check if the ISA features are identified. */
166 check_features (unsigned int ecx
, unsigned int edx
,
169 unsigned int eax
, ebx
;
170 unsigned int ext_level
;
173 assert (__builtin_cpu_supports ("cmov"));
175 assert (__builtin_cpu_supports ("mmx"));
177 assert (__builtin_cpu_supports ("sse"));
179 assert (__builtin_cpu_supports ("sse2"));
180 if (ecx
& bit_POPCNT
)
181 assert (__builtin_cpu_supports ("popcnt"));
183 assert (__builtin_cpu_supports ("aes"));
184 if (ecx
& bit_PCLMUL
)
185 assert (__builtin_cpu_supports ("pclmul"));
187 assert (__builtin_cpu_supports ("sse3"));
189 assert (__builtin_cpu_supports ("ssse3"));
190 if (ecx
& bit_SSE4_1
)
191 assert (__builtin_cpu_supports ("sse4.1"));
192 if (ecx
& bit_SSE4_2
)
193 assert (__builtin_cpu_supports ("sse4.2"));
195 assert (__builtin_cpu_supports ("avx"));
197 assert (__builtin_cpu_supports ("fma"));
199 /* Get advanced features at level 7 (eax = 7, ecx = 0). */
200 if (max_cpuid_level
>= 7)
202 __cpuid_count (7, 0, eax
, ebx
, ecx
, edx
);
204 assert (__builtin_cpu_supports ("bmi"));
206 assert (__builtin_cpu_supports ("avx2"));
208 assert (__builtin_cpu_supports ("bmi2"));
209 if (ebx
& bit_AVX512F
)
210 assert (__builtin_cpu_supports ("avx512f"));
211 if (ebx
& bit_AVX512VL
)
212 assert (__builtin_cpu_supports ("avx512vl"));
213 if (ebx
& bit_AVX512BW
)
214 assert (__builtin_cpu_supports ("avx512bw"));
215 if (ebx
& bit_AVX512DQ
)
216 assert (__builtin_cpu_supports ("avx512dq"));
217 if (ebx
& bit_AVX512CD
)
218 assert (__builtin_cpu_supports ("avx512cd"));
219 if (ebx
& bit_AVX512PF
)
220 assert (__builtin_cpu_supports ("avx512pf"));
221 if (ebx
& bit_AVX512ER
)
222 assert (__builtin_cpu_supports ("avx512er"));
223 if (ebx
& bit_AVX512IFMA
)
224 assert (__builtin_cpu_supports ("avx512ifma"));
225 if (ecx
& bit_AVX512VBMI
)
226 assert (__builtin_cpu_supports ("avx512vbmi"));
227 if (ecx
& bit_AVX512VPOPCNTDQ
)
228 assert (__builtin_cpu_supports ("avx512vpopcntdq"));
229 if (edx
& bit_AVX5124VNNIW
)
230 assert (__builtin_cpu_supports ("avx5124vnniw"));
231 if (edx
& bit_AVX5124FMAPS
)
232 assert (__builtin_cpu_supports ("avx5124fmaps"));
235 /* Check cpuid level of extended features. */
236 __cpuid (0x80000000, ext_level
, ebx
, ecx
, edx
);
238 if (ext_level
>= 0x80000001)
240 __cpuid (0x80000001, eax
, ebx
, ecx
, edx
);
243 assert (__builtin_cpu_supports ("sse4a"));
245 assert (__builtin_cpu_supports ("fma4"));
247 assert (__builtin_cpu_supports ("xop"));
251 static int __attribute__ ((noinline
))
252 __get_cpuid_output (unsigned int __level
,
253 unsigned int *__eax
, unsigned int *__ebx
,
254 unsigned int *__ecx
, unsigned int *__edx
)
256 return __get_cpuid (__level
, __eax
, __ebx
, __ecx
, __edx
);
262 unsigned int eax
, ebx
, ecx
, edx
;
266 unsigned int model
, family
, brand_id
;
267 unsigned int extended_model
, extended_family
;
269 /* Assume cpuid insn present. Run in level 0 to get vendor id. */
270 if (!__get_cpuid_output (0, &eax
, &ebx
, &ecx
, &edx
))
279 if (!__get_cpuid_output (1, &eax
, &ebx
, &ecx
, &edx
))
282 model
= (eax
>> 4) & 0x0f;
283 family
= (eax
>> 8) & 0x0f;
284 brand_id
= ebx
& 0xff;
285 extended_model
= (eax
>> 12) & 0xf0;
286 extended_family
= (eax
>> 20) & 0xff;
288 if (vendor
== signature_INTEL_ebx
)
290 assert (__builtin_cpu_is ("intel"));
291 /* Adjust family and model for Intel CPUs. */
294 family
+= extended_family
;
295 model
+= extended_model
;
297 else if (family
== 0x06)
298 model
+= extended_model
;
299 check_intel_cpu_model (family
, model
, brand_id
);
300 check_features (ecx
, edx
, max_level
);
302 else if (vendor
== signature_AMD_ebx
)
304 assert (__builtin_cpu_is ("amd"));
305 /* Adjust model and family for AMD CPUS. */
308 family
+= extended_family
;
309 model
+= (extended_model
<< 4);
311 check_amd_cpu_model (family
, model
);
312 check_features (ecx
, edx
, max_level
);
321 /* Check CPU Features. */
322 assert (__builtin_cpu_supports ("cmov") >= 0);
324 assert (__builtin_cpu_supports ("mmx") >= 0);
326 assert (__builtin_cpu_supports ("popcnt") >= 0);
328 assert (__builtin_cpu_supports ("sse") >= 0);
330 assert (__builtin_cpu_supports ("sse2") >= 0);
332 assert (__builtin_cpu_supports ("sse3") >= 0);
334 assert (__builtin_cpu_supports ("ssse3") >= 0);
336 assert (__builtin_cpu_supports ("sse4.1") >= 0);
338 assert (__builtin_cpu_supports ("sse4.2") >= 0);
340 assert (__builtin_cpu_supports ("avx") >= 0);
342 assert (__builtin_cpu_supports ("avx2") >= 0);
344 assert (__builtin_cpu_supports ("avx512f") >= 0);
346 assert (__builtin_cpu_supports ("avx5124vnniw") >= 0);
348 assert (__builtin_cpu_supports ("avx5124fmaps") >= 0);
350 assert (__builtin_cpu_supports ("avx512vpopcntdq") >= 0);
352 /* Check CPU type. */
353 assert (__builtin_cpu_is ("amd") >= 0);
355 assert (__builtin_cpu_is ("intel") >= 0);
357 assert (__builtin_cpu_is ("atom") >= 0);
359 assert (__builtin_cpu_is ("core2") >= 0);
361 assert (__builtin_cpu_is ("corei7") >= 0);
363 assert (__builtin_cpu_is ("nehalem") >= 0);
365 assert (__builtin_cpu_is ("westmere") >= 0);
367 assert (__builtin_cpu_is ("sandybridge") >= 0);
369 assert (__builtin_cpu_is ("amdfam10h") >= 0);
371 assert (__builtin_cpu_is ("barcelona") >= 0);
373 assert (__builtin_cpu_is ("shanghai") >= 0);
375 assert (__builtin_cpu_is ("istanbul") >= 0);
377 assert (__builtin_cpu_is ("amdfam15h") >= 0);
379 assert (__builtin_cpu_is ("bdver1") >= 0);
381 assert (__builtin_cpu_is ("bdver2") >= 0);
388 __builtin_cpu_init ();