]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/i386/cpuid.h
Add builtin_expect to predict that CPU supports cpuid to cpuid.h
[thirdparty/gcc.git] / gcc / config / i386 / cpuid.h
CommitLineData
b3172cab 1/*
83ffe9cd 2 * Copyright (C) 2007-2023 Free Software Foundation, Inc.
b3172cab
UB
3 *
4 * This file is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
748086b7 6 * Free Software Foundation; either version 3, or (at your option) any
b3172cab
UB
7 * later version.
8 *
b3172cab
UB
9 * This file is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
748086b7
JJ
14 * Under Section 7 of GPL version 3, you are granted additional
15 * permissions described in the GCC Runtime Library Exception, version
16 * 3.1, as published by the Free Software Foundation.
b3172cab 17 *
748086b7
JJ
18 * You should have received a copy of the GNU General Public License and
19 * a copy of the GCC Runtime Library Exception along with this program;
20 * see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
21 * <http://www.gnu.org/licenses/>.
b3172cab
UB
22 */
23
29e1039c
L
24#ifndef _CPUID_H_INCLUDED
25#define _CPUID_H_INCLUDED
26
b3172cab
UB
27/* %ecx */
28#define bit_SSE3 (1 << 0)
8b96a312 29#define bit_PCLMUL (1 << 1)
5fcafa60 30#define bit_LZCNT (1 << 5)
b3172cab 31#define bit_SSSE3 (1 << 9)
95879c72 32#define bit_FMA (1 << 12)
b3172cab
UB
33#define bit_CMPXCHG16B (1 << 13)
34#define bit_SSE4_1 (1 << 19)
35#define bit_SSE4_2 (1 << 20)
cabf85c3 36#define bit_MOVBE (1 << 22)
b3172cab 37#define bit_POPCNT (1 << 23)
8b96a312 38#define bit_AES (1 << 25)
95879c72
L
39#define bit_XSAVE (1 << 26)
40#define bit_OSXSAVE (1 << 27)
41#define bit_AVX (1 << 28)
4ee89d5f
L
42#define bit_F16C (1 << 29)
43#define bit_RDRND (1 << 30)
b3172cab
UB
44
45/* %edx */
46#define bit_CMPXCHG8B (1 << 8)
47#define bit_CMOV (1 << 15)
48#define bit_MMX (1 << 23)
49#define bit_FXSAVE (1 << 24)
50#define bit_SSE (1 << 25)
51#define bit_SSE2 (1 << 26)
52
fbed6f36 53/* Extended Features (%eax == 0x80000001) */
b3172cab
UB
54/* %ecx */
55#define bit_LAHF_LM (1 << 0)
c3d34a78 56#define bit_ABM (1 << 5)
b3172cab 57#define bit_SSE4a (1 << 6)
9006f7f3 58#define bit_PRFCHW (1 << 8)
43a8b705 59#define bit_XOP (1 << 11)
c3d34a78
SP
60#define bit_LWP (1 << 15)
61#define bit_FMA4 (1 << 16)
94d13ad1 62#define bit_TBM (1 << 21)
500a08b2 63#define bit_MWAITX (1 << 29)
b3172cab
UB
64
65/* %edx */
ef230b38 66#define bit_MMXEXT (1 << 22)
b3172cab
UB
67#define bit_LM (1 << 29)
68#define bit_3DNOWP (1 << 30)
f3ffa342 69#define bit_3DNOW (1u << 31)
b3172cab 70
fbed6f36 71/* %ebx */
9ce29eb0 72#define bit_CLZERO (1 << 0)
13b93d4b 73#define bit_WBNOINVD (1 << 9)
9ce29eb0 74
fd7ecd80 75/* Extended Features Leaf (%eax == 7, %ecx == 0) */
43b3f52f 76/* %ebx */
4ee89d5f 77#define bit_FSGSBASE (1 << 0)
fd7ecd80
MZ
78#define bit_SGX (1 << 2)
79#define bit_BMI (1 << 3)
80#define bit_HLE (1 << 4)
7afac110 81#define bit_AVX2 (1 << 5)
82feeb8d 82#define bit_BMI2 (1 << 8)
fd7ecd80 83#define bit_RTM (1 << 11)
3f97cb0b 84#define bit_AVX512F (1 << 16)
07165dd7 85#define bit_AVX512DQ (1 << 17)
e61c94dd 86#define bit_RDSEED (1 << 18)
fd7ecd80 87#define bit_ADX (1 << 19)
4190ea38 88#define bit_AVX512IFMA (1 << 21)
9cdea277 89#define bit_CLFLUSHOPT (1 << 23)
9c3bca11 90#define bit_CLWB (1 << 24)
3f97cb0b
AI
91#define bit_AVX512PF (1 << 26)
92#define bit_AVX512ER (1 << 27)
93#define bit_AVX512CD (1 << 28)
c1618f82 94#define bit_SHA (1 << 29)
b525d943 95#define bit_AVX512BW (1 << 30)
852a63c5 96#define bit_AVX512VL (1u << 31)
b3172cab 97
43b3f52f 98/* %ecx */
fd7ecd80 99#define bit_PREFETCHWT1 (1 << 0)
3dcc8af5 100#define bit_AVX512VBMI (1 << 1)
fd7ecd80 101#define bit_PKU (1 << 3)
41a4ef22 102#define bit_OSPKE (1 << 4)
55f31ed1 103#define bit_WAITPKG (1 << 5)
fca51879 104#define bit_AVX512VBMI2 (1 << 6)
2a25448c 105#define bit_SHSTK (1 << 7)
b8cca31c 106#define bit_GFNI (1 << 8)
b7b0a4fa 107#define bit_VAES (1 << 9)
6557be99 108#define bit_VPCLMULQDQ (1 << 10)
fd7ecd80 109#define bit_AVX512VNNI (1 << 11)
e2a29465 110#define bit_AVX512BITALG (1 << 12)
fbed6f36 111#define bit_AVX512VPOPCNTDQ (1 << 14)
1d516992 112#define bit_RDPID (1 << 22)
fd7ecd80
MZ
113#define bit_KL (1 << 23)
114#define bit_CLDEMOTE (1 << 25)
37d51c75
SP
115#define bit_MOVDIRI (1 << 27)
116#define bit_MOVDIR64B (1 << 28)
6a10feda 117#define bit_ENQCMD (1 << 29)
fbed6f36
UB
118
119/* %edx */
fd7ecd80
MZ
120#define bit_AVX5124VNNIW (1 << 2)
121#define bit_AVX5124FMAPS (1 << 3)
122#define bit_UINTR (1 << 5)
e21b52af 123#define bit_AVX512VP2INTERSECT (1 << 8)
366386c7 124#define bit_SERIALIZE (1 << 14)
1e47cb35 125#define bit_TSXLDTRK (1 << 16)
fd7ecd80
MZ
126#define bit_PCONFIG (1 << 18)
127#define bit_IBT (1 << 20)
5c609842 128#define bit_AMX_BF16 (1 << 22)
fd7ecd80 129#define bit_AVX512FP16 (1 << 23)
5c609842 130#define bit_AMX_TILE (1 << 24)
131#define bit_AMX_INT8 (1 << 25)
fd7ecd80
MZ
132
133/* Extended Features Sub-leaf (%eax == 7, %ecx == 1) */
134/* %eax */
86446132 135#define bit_SHA512 (1 << 0)
8643bcba 136#define bit_SM3 (1 << 1)
37bdeb8f 137#define bit_SM4 (1 << 2)
fd7ecd80
MZ
138#define bit_RAOINT (1 << 3)
139#define bit_AVXVNNI (1 << 4)
140#define bit_AVX512BF16 (1 << 5)
141#define bit_CMPCCXADD (1 << 7)
efa6a82b 142#define bit_AMX_COMPLEX (1 << 8)
fd7ecd80
MZ
143#define bit_AMX_FP16 (1 << 21)
144#define bit_HRESET (1 << 22)
145#define bit_AVXIFMA (1 << 23)
146
147/* %edx */
148#define bit_AVXVNNIINT8 (1 << 4)
149#define bit_AVXNECONVERT (1 << 5)
1dbc1081 150#define bit_AVXVNNIINT16 (1 << 10)
fd7ecd80 151#define bit_PREFETCHI (1 << 14)
1e47cb35 152
a74630f3 153/* Extended State Enumeration Sub-leaf (%eax == 0xd, %ecx == 1) */
3a0d99bb 154#define bit_XSAVEOPT (1 << 0)
9cdea277
IT
155#define bit_XSAVEC (1 << 1)
156#define bit_XSAVES (1 << 3)
3a0d99bb 157
a74630f3 158/* PT sub leaf (%eax == 0x14, %ecx == 0) */
41f8d1fc
AK
159/* %ebx */
160#define bit_PTWRITE (1 << 4)
161
632a2f50 162/* Keylocker leaf (%eax == 0x19) */
163/* %ebx */
164#define bit_AESKLE ( 1<<0 )
165#define bit_WIDEKL ( 1<<2 )
166
167
ef64d158
UD
168/* Signatures for different CPU implementations as returned in uses
169 of cpuid with level 0. */
170#define signature_AMD_ebx 0x68747541
171#define signature_AMD_ecx 0x444d4163
172#define signature_AMD_edx 0x69746e65
173
174#define signature_CENTAUR_ebx 0x746e6543
175#define signature_CENTAUR_ecx 0x736c7561
176#define signature_CENTAUR_edx 0x48727561
177
178#define signature_CYRIX_ebx 0x69727943
179#define signature_CYRIX_ecx 0x64616574
180#define signature_CYRIX_edx 0x736e4978
181
182#define signature_INTEL_ebx 0x756e6547
183#define signature_INTEL_ecx 0x6c65746e
184#define signature_INTEL_edx 0x49656e69
185
186#define signature_TM1_ebx 0x6e617254
187#define signature_TM1_ecx 0x55504361
188#define signature_TM1_edx 0x74656d73
189
190#define signature_TM2_ebx 0x756e6547
191#define signature_TM2_ecx 0x3638784d
192#define signature_TM2_edx 0x54656e69
193
194#define signature_NSC_ebx 0x646f6547
195#define signature_NSC_ecx 0x43534e20
196#define signature_NSC_edx 0x79622065
197
198#define signature_NEXGEN_ebx 0x4778654e
199#define signature_NEXGEN_ecx 0x6e657669
200#define signature_NEXGEN_edx 0x72446e65
201
202#define signature_RISE_ebx 0x65736952
203#define signature_RISE_ecx 0x65736952
204#define signature_RISE_edx 0x65736952
205
206#define signature_SIS_ebx 0x20536953
207#define signature_SIS_ecx 0x20536953
208#define signature_SIS_edx 0x20536953
209
210#define signature_UMC_ebx 0x20434d55
211#define signature_UMC_ecx 0x20434d55
212#define signature_UMC_edx 0x20434d55
213
214#define signature_VIA_ebx 0x20414956
215#define signature_VIA_ecx 0x20414956
216#define signature_VIA_edx 0x20414956
217
218#define signature_VORTEX_ebx 0x74726f56
219#define signature_VORTEX_ecx 0x436f5320
220#define signature_VORTEX_edx 0x36387865
221
a239aff8
M
222#define signature_SHANGHAI_ebx 0x68532020
223#define signature_SHANGHAI_ecx 0x20206961
224#define signature_SHANGHAI_edx 0x68676e61
225
8c365be6
UB
226#ifndef __x86_64__
227/* At least one cpu (Winchip 2) does not set %ebx and %ecx
228 for cpuid leaf 1. Forcibly zero the two registers before
229 calling cpuid as a precaution. */
9c89c9e9
L
230#define __cpuid(level, a, b, c, d) \
231 do { \
232 if (__builtin_constant_p (level) && (level) != 1) \
233 __asm__ __volatile__ ("cpuid\n\t" \
234 : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
235 : "0" (level)); \
236 else \
237 __asm__ __volatile__ ("cpuid\n\t" \
238 : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
239 : "0" (level), "1" (0), "2" (0)); \
8c365be6
UB
240 } while (0)
241#else
9c89c9e9
L
242#define __cpuid(level, a, b, c, d) \
243 __asm__ __volatile__ ("cpuid\n\t" \
244 : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
245 : "0" (level))
8c365be6 246#endif
cb0dee88 247
9c89c9e9
L
248#define __cpuid_count(level, count, a, b, c, d) \
249 __asm__ __volatile__ ("cpuid\n\t" \
250 : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
251 : "0" (level), "2" (count))
02147868 252
b3172cab
UB
253
254/* Return highest supported input value for cpuid instruction. ext can
c9f16151 255 be either 0x0 or 0x80000000 to return highest supported value for
b3172cab
UB
256 basic or extended cpuid information. Function returns 0 if cpuid
257 is not supported or whatever cpuid returns in eax register. If sig
258 pointer is non-null, then first four bytes of the signature
259 (as found in ebx register) are returned in location pointed by sig. */
260
261static __inline unsigned int
262__get_cpuid_max (unsigned int __ext, unsigned int *__sig)
263{
264 unsigned int __eax, __ebx, __ecx, __edx;
265
266#ifndef __x86_64__
267 /* See if we can use cpuid. On AMD64 we always can. */
93234e58 268#if __GNUC__ >= 3
9ad5e54f
RIL
269 __asm__ ("pushf{l|d}\n\t"
270 "pushf{l|d}\n\t"
271 "pop{l}\t%0\n\t"
272 "mov{l}\t{%0, %1|%1, %0}\n\t"
273 "xor{l}\t{%2, %0|%0, %2}\n\t"
274 "push{l}\t%0\n\t"
275 "popf{l|d}\n\t"
276 "pushf{l|d}\n\t"
277 "pop{l}\t%0\n\t"
278 "popf{l|d}\n\t"
b3172cab
UB
279 : "=&r" (__eax), "=&r" (__ebx)
280 : "i" (0x00200000));
2e834acb
JJ
281#else
282/* Host GCCs older than 3.0 weren't supporting Intel asm syntax
283 nor alternatives in i386 code. */
284 __asm__ ("pushfl\n\t"
285 "pushfl\n\t"
286 "popl\t%0\n\t"
287 "movl\t%0, %1\n\t"
288 "xorl\t%2, %0\n\t"
289 "pushl\t%0\n\t"
290 "popfl\n\t"
291 "pushfl\n\t"
292 "popl\t%0\n\t"
293 "popfl\n\t"
294 : "=&r" (__eax), "=&r" (__ebx)
295 : "i" (0x00200000));
296#endif
b3172cab 297
1fc96cdd 298 if (__builtin_expect (!((__eax ^ __ebx) & 0x00200000), 0))
b3172cab
UB
299 return 0;
300#endif
301
302 /* Host supports cpuid. Return highest supported cpuid input value. */
303 __cpuid (__ext, __eax, __ebx, __ecx, __edx);
304
305 if (__sig)
306 *__sig = __ebx;
307
308 return __eax;
309}
310
2488ebe5 311/* Return cpuid data for requested cpuid leaf, as found in returned
b3172cab
UB
312 eax, ebx, ecx and edx registers. The function checks if cpuid is
313 supported and returns 1 for valid cpuid information or 0 for
2488ebe5 314 unsupported cpuid leaf. All pointers are required to be non-null. */
b3172cab
UB
315
316static __inline int
2488ebe5 317__get_cpuid (unsigned int __leaf,
b3172cab
UB
318 unsigned int *__eax, unsigned int *__ebx,
319 unsigned int *__ecx, unsigned int *__edx)
320{
2488ebe5 321 unsigned int __ext = __leaf & 0x80000000;
a6c78ea3 322 unsigned int __maxlevel = __get_cpuid_max (__ext, 0);
b3172cab 323
a6c78ea3 324 if (__maxlevel == 0 || __maxlevel < __leaf)
b3172cab
UB
325 return 0;
326
2488ebe5
UB
327 __cpuid (__leaf, *__eax, *__ebx, *__ecx, *__edx);
328 return 1;
329}
330
331/* Same as above, but sub-leaf can be specified. */
332
333static __inline int
334__get_cpuid_count (unsigned int __leaf, unsigned int __subleaf,
335 unsigned int *__eax, unsigned int *__ebx,
336 unsigned int *__ecx, unsigned int *__edx)
337{
338 unsigned int __ext = __leaf & 0x80000000;
a6c78ea3 339 unsigned int __maxlevel = __get_cpuid_max (__ext, 0);
2488ebe5 340
1fc96cdd 341 if (__builtin_expect (__maxlevel == 0, 0) || __maxlevel < __leaf)
2488ebe5
UB
342 return 0;
343
344 __cpuid_count (__leaf, __subleaf, *__eax, *__ebx, *__ecx, *__edx);
b3172cab
UB
345 return 1;
346}
29e1039c
L
347
348static __inline void
349__cpuidex (int __cpuid_info[4], int __leaf, int __subleaf)
350{
351 __cpuid_count (__leaf, __subleaf, __cpuid_info[0], __cpuid_info[1],
352 __cpuid_info[2], __cpuid_info[3]);
353}
354
355#endif /* _CPUID_H_INCLUDED */