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"));
93 assert (__builtin_cpu_is ("core2"));
100 /* We have no idea. */
106 /* Check if the AMD CPU model and sub-model are identified. */
108 check_amd_cpu_model (unsigned int family
, unsigned int model
)
112 /* AMD Family 10h. */
118 assert (__builtin_cpu_is ("amdfam10h"));
119 assert (__builtin_cpu_is ("barcelona"));
123 assert (__builtin_cpu_is ("amdfam10h"));
124 assert (__builtin_cpu_is ("shanghai"));
128 assert (__builtin_cpu_is ("amdfam10h"));
129 assert (__builtin_cpu_is ("istanbul"));
135 /* AMD Family 15h. */
137 assert (__builtin_cpu_is ("amdfam15h"));
138 /* Bulldozer version 1. */
140 assert (__builtin_cpu_is ("bdver1"));
141 /* Bulldozer version 2. */
142 if (model
>= 0x10 && model
<= 0x1f)
143 assert (__builtin_cpu_is ("bdver2"));
150 /* Check if the ISA features are identified. */
152 check_features (unsigned int ecx
, unsigned int edx
,
156 assert (__builtin_cpu_supports ("cmov"));
158 assert (__builtin_cpu_supports ("mmx"));
160 assert (__builtin_cpu_supports ("sse"));
162 assert (__builtin_cpu_supports ("sse2"));
163 if (ecx
& bit_POPCNT
)
164 assert (__builtin_cpu_supports ("popcnt"));
166 assert (__builtin_cpu_supports ("sse3"));
168 assert (__builtin_cpu_supports ("ssse3"));
169 if (ecx
& bit_SSE4_1
)
170 assert (__builtin_cpu_supports ("sse4.1"));
171 if (ecx
& bit_SSE4_2
)
172 assert (__builtin_cpu_supports ("sse4.2"));
174 assert (__builtin_cpu_supports ("avx"));
176 /* Get advanced features at level 7 (eax = 7, ecx = 0). */
177 if (max_cpuid_level
>= 7)
179 unsigned int eax
, ebx
, ecx
, edx
;
180 __cpuid_count (7, 0, eax
, ebx
, ecx
, edx
);
182 assert (__builtin_cpu_supports ("avx2"));
183 if (ebx
& bit_AVX512F
)
184 assert (__builtin_cpu_supports ("avx512f"));
188 static int __attribute__ ((noinline
))
189 __get_cpuid_output (unsigned int __level
,
190 unsigned int *__eax
, unsigned int *__ebx
,
191 unsigned int *__ecx
, unsigned int *__edx
)
193 return __get_cpuid (__level
, __eax
, __ebx
, __ecx
, __edx
);
199 unsigned int eax
, ebx
, ecx
, edx
;
203 unsigned int model
, family
, brand_id
;
204 unsigned int extended_model
, extended_family
;
206 /* Assume cpuid insn present. Run in level 0 to get vendor id. */
207 if (!__get_cpuid_output (0, &eax
, &ebx
, &ecx
, &edx
))
216 if (!__get_cpuid_output (1, &eax
, &ebx
, &ecx
, &edx
))
219 model
= (eax
>> 4) & 0x0f;
220 family
= (eax
>> 8) & 0x0f;
221 brand_id
= ebx
& 0xff;
222 extended_model
= (eax
>> 12) & 0xf0;
223 extended_family
= (eax
>> 20) & 0xff;
225 if (vendor
== signature_INTEL_ebx
)
227 assert (__builtin_cpu_is ("intel"));
228 /* Adjust family and model for Intel CPUs. */
231 family
+= extended_family
;
232 model
+= extended_model
;
234 else if (family
== 0x06)
235 model
+= extended_model
;
236 check_intel_cpu_model (family
, model
, brand_id
);
237 check_features (ecx
, edx
, max_level
);
239 else if (vendor
== signature_AMD_ebx
)
241 assert (__builtin_cpu_is ("amd"));
242 /* Adjust model and family for AMD CPUS. */
245 family
+= extended_family
;
246 model
+= (extended_model
<< 4);
248 check_amd_cpu_model (family
, model
);
249 check_features (ecx
, edx
, max_level
);
258 /* Check CPU Features. */
259 assert (__builtin_cpu_supports ("cmov") >= 0);
261 assert (__builtin_cpu_supports ("mmx") >= 0);
263 assert (__builtin_cpu_supports ("popcnt") >= 0);
265 assert (__builtin_cpu_supports ("sse") >= 0);
267 assert (__builtin_cpu_supports ("sse2") >= 0);
269 assert (__builtin_cpu_supports ("sse3") >= 0);
271 assert (__builtin_cpu_supports ("ssse3") >= 0);
273 assert (__builtin_cpu_supports ("sse4.1") >= 0);
275 assert (__builtin_cpu_supports ("sse4.2") >= 0);
277 assert (__builtin_cpu_supports ("avx") >= 0);
279 assert (__builtin_cpu_supports ("avx2") >= 0);
281 assert (__builtin_cpu_supports ("avx512f") >= 0);
283 /* Check CPU type. */
284 assert (__builtin_cpu_is ("amd") >= 0);
286 assert (__builtin_cpu_is ("intel") >= 0);
288 assert (__builtin_cpu_is ("atom") >= 0);
290 assert (__builtin_cpu_is ("core2") >= 0);
292 assert (__builtin_cpu_is ("corei7") >= 0);
294 assert (__builtin_cpu_is ("nehalem") >= 0);
296 assert (__builtin_cpu_is ("westmere") >= 0);
298 assert (__builtin_cpu_is ("sandybridge") >= 0);
300 assert (__builtin_cpu_is ("amdfam10h") >= 0);
302 assert (__builtin_cpu_is ("barcelona") >= 0);
304 assert (__builtin_cpu_is ("shanghai") >= 0);
306 assert (__builtin_cpu_is ("istanbul") >= 0);
308 assert (__builtin_cpu_is ("amdfam15h") >= 0);
310 assert (__builtin_cpu_is ("bdver1") >= 0);
312 assert (__builtin_cpu_is ("bdver2") >= 0);
319 __builtin_cpu_init ();