]>
git.ipfire.org Git - thirdparty/gcc.git/blob - 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. */
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"));
91 assert (__builtin_cpu_is ("corei7"));
92 assert (__builtin_cpu_is ("skylake"));
95 /* Skylake with AVX-512 support. */
96 assert (__builtin_cpu_is ("corei7"));
97 assert (__builtin_cpu_is ("skylake-avx512"));
104 assert (__builtin_cpu_is ("core2"));
111 /* We have no idea. */
117 /* Check if the AMD CPU model and sub-model are identified. */
119 check_amd_cpu_model (unsigned int family
, unsigned int model
)
123 /* AMD Family 10h. */
129 assert (__builtin_cpu_is ("amdfam10h"));
130 assert (__builtin_cpu_is ("barcelona"));
134 assert (__builtin_cpu_is ("amdfam10h"));
135 assert (__builtin_cpu_is ("shanghai"));
139 assert (__builtin_cpu_is ("amdfam10h"));
140 assert (__builtin_cpu_is ("istanbul"));
146 /* AMD Family 15h. */
148 assert (__builtin_cpu_is ("amdfam15h"));
149 /* Bulldozer version 1. */
151 assert (__builtin_cpu_is ("bdver1"));
152 /* Bulldozer version 2. */
153 if (model
>= 0x10 && model
<= 0x1f)
154 assert (__builtin_cpu_is ("bdver2"));
161 /* Check if the ISA features are identified. */
163 check_features (unsigned int ecx
, unsigned int edx
,
167 assert (__builtin_cpu_supports ("cmov"));
169 assert (__builtin_cpu_supports ("mmx"));
171 assert (__builtin_cpu_supports ("sse"));
173 assert (__builtin_cpu_supports ("sse2"));
174 if (ecx
& bit_POPCNT
)
175 assert (__builtin_cpu_supports ("popcnt"));
177 assert (__builtin_cpu_supports ("sse3"));
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"));
185 assert (__builtin_cpu_supports ("avx"));
187 /* Get advanced features at level 7 (eax = 7, ecx = 0). */
188 if (max_cpuid_level
>= 7)
190 unsigned int eax
, ebx
, ecx
, edx
;
191 __cpuid_count (7, 0, eax
, ebx
, ecx
, edx
);
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"));
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
)
220 return __get_cpuid (__level
, __eax
, __ebx
, __ecx
, __edx
);
226 unsigned int eax
, ebx
, ecx
, edx
;
230 unsigned int model
, family
, brand_id
;
231 unsigned int extended_model
, extended_family
;
233 /* Assume cpuid insn present. Run in level 0 to get vendor id. */
234 if (!__get_cpuid_output (0, &eax
, &ebx
, &ecx
, &edx
))
243 if (!__get_cpuid_output (1, &eax
, &ebx
, &ecx
, &edx
))
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;
252 if (vendor
== signature_INTEL_ebx
)
254 assert (__builtin_cpu_is ("intel"));
255 /* Adjust family and model for Intel CPUs. */
258 family
+= extended_family
;
259 model
+= extended_model
;
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
);
266 else if (vendor
== signature_AMD_ebx
)
268 assert (__builtin_cpu_is ("amd"));
269 /* Adjust model and family for AMD CPUS. */
272 family
+= extended_family
;
273 model
+= (extended_model
<< 4);
275 check_amd_cpu_model (family
, model
);
276 check_features (ecx
, edx
, max_level
);
285 /* Check CPU Features. */
286 assert (__builtin_cpu_supports ("cmov") >= 0);
288 assert (__builtin_cpu_supports ("mmx") >= 0);
290 assert (__builtin_cpu_supports ("popcnt") >= 0);
292 assert (__builtin_cpu_supports ("sse") >= 0);
294 assert (__builtin_cpu_supports ("sse2") >= 0);
296 assert (__builtin_cpu_supports ("sse3") >= 0);
298 assert (__builtin_cpu_supports ("ssse3") >= 0);
300 assert (__builtin_cpu_supports ("sse4.1") >= 0);
302 assert (__builtin_cpu_supports ("sse4.2") >= 0);
304 assert (__builtin_cpu_supports ("avx") >= 0);
306 assert (__builtin_cpu_supports ("avx2") >= 0);
308 assert (__builtin_cpu_supports ("avx512f") >= 0);
310 /* Check CPU type. */
311 assert (__builtin_cpu_is ("amd") >= 0);
313 assert (__builtin_cpu_is ("intel") >= 0);
315 assert (__builtin_cpu_is ("atom") >= 0);
317 assert (__builtin_cpu_is ("core2") >= 0);
319 assert (__builtin_cpu_is ("corei7") >= 0);
321 assert (__builtin_cpu_is ("nehalem") >= 0);
323 assert (__builtin_cpu_is ("westmere") >= 0);
325 assert (__builtin_cpu_is ("sandybridge") >= 0);
327 assert (__builtin_cpu_is ("amdfam10h") >= 0);
329 assert (__builtin_cpu_is ("barcelona") >= 0);
331 assert (__builtin_cpu_is ("shanghai") >= 0);
333 assert (__builtin_cpu_is ("istanbul") >= 0);
335 assert (__builtin_cpu_is ("amdfam15h") >= 0);
337 assert (__builtin_cpu_is ("bdver1") >= 0);
339 assert (__builtin_cpu_is ("bdver2") >= 0);
346 __builtin_cpu_init ();