xref: /aosp_15_r20/prebuilts/clang-tools/linux-x86/clang-headers/cpuid.h (revision bed243d3d9cd544cfb038bfa7be843dedc6e6bf7)
1*bed243d3SAndroid Build Coastguard Worker /*===---- cpuid.h - X86 cpu model detection --------------------------------===
2*bed243d3SAndroid Build Coastguard Worker  *
3*bed243d3SAndroid Build Coastguard Worker  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*bed243d3SAndroid Build Coastguard Worker  * See https://llvm.org/LICENSE.txt for license information.
5*bed243d3SAndroid Build Coastguard Worker  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*bed243d3SAndroid Build Coastguard Worker  *
7*bed243d3SAndroid Build Coastguard Worker  *===-----------------------------------------------------------------------===
8*bed243d3SAndroid Build Coastguard Worker  */
9*bed243d3SAndroid Build Coastguard Worker 
10*bed243d3SAndroid Build Coastguard Worker #ifndef __CPUID_H
11*bed243d3SAndroid Build Coastguard Worker #define __CPUID_H
12*bed243d3SAndroid Build Coastguard Worker 
13*bed243d3SAndroid Build Coastguard Worker #if !(__x86_64__ || __i386__)
14*bed243d3SAndroid Build Coastguard Worker #error this header is for x86 only
15*bed243d3SAndroid Build Coastguard Worker #endif
16*bed243d3SAndroid Build Coastguard Worker 
17*bed243d3SAndroid Build Coastguard Worker /* Responses identification request with %eax 0 */
18*bed243d3SAndroid Build Coastguard Worker /* AMD:     "AuthenticAMD" */
19*bed243d3SAndroid Build Coastguard Worker #define signature_AMD_ebx 0x68747541
20*bed243d3SAndroid Build Coastguard Worker #define signature_AMD_edx 0x69746e65
21*bed243d3SAndroid Build Coastguard Worker #define signature_AMD_ecx 0x444d4163
22*bed243d3SAndroid Build Coastguard Worker /* CENTAUR: "CentaurHauls" */
23*bed243d3SAndroid Build Coastguard Worker #define signature_CENTAUR_ebx 0x746e6543
24*bed243d3SAndroid Build Coastguard Worker #define signature_CENTAUR_edx 0x48727561
25*bed243d3SAndroid Build Coastguard Worker #define signature_CENTAUR_ecx 0x736c7561
26*bed243d3SAndroid Build Coastguard Worker /* CYRIX:   "CyrixInstead" */
27*bed243d3SAndroid Build Coastguard Worker #define signature_CYRIX_ebx 0x69727943
28*bed243d3SAndroid Build Coastguard Worker #define signature_CYRIX_edx 0x736e4978
29*bed243d3SAndroid Build Coastguard Worker #define signature_CYRIX_ecx 0x64616574
30*bed243d3SAndroid Build Coastguard Worker /* HYGON:   "HygonGenuine" */
31*bed243d3SAndroid Build Coastguard Worker #define signature_HYGON_ebx 0x6f677948
32*bed243d3SAndroid Build Coastguard Worker #define signature_HYGON_edx 0x6e65476e
33*bed243d3SAndroid Build Coastguard Worker #define signature_HYGON_ecx 0x656e6975
34*bed243d3SAndroid Build Coastguard Worker /* INTEL:   "GenuineIntel" */
35*bed243d3SAndroid Build Coastguard Worker #define signature_INTEL_ebx 0x756e6547
36*bed243d3SAndroid Build Coastguard Worker #define signature_INTEL_edx 0x49656e69
37*bed243d3SAndroid Build Coastguard Worker #define signature_INTEL_ecx 0x6c65746e
38*bed243d3SAndroid Build Coastguard Worker /* TM1:     "TransmetaCPU" */
39*bed243d3SAndroid Build Coastguard Worker #define signature_TM1_ebx 0x6e617254
40*bed243d3SAndroid Build Coastguard Worker #define signature_TM1_edx 0x74656d73
41*bed243d3SAndroid Build Coastguard Worker #define signature_TM1_ecx 0x55504361
42*bed243d3SAndroid Build Coastguard Worker /* TM2:     "GenuineTMx86" */
43*bed243d3SAndroid Build Coastguard Worker #define signature_TM2_ebx 0x756e6547
44*bed243d3SAndroid Build Coastguard Worker #define signature_TM2_edx 0x54656e69
45*bed243d3SAndroid Build Coastguard Worker #define signature_TM2_ecx 0x3638784d
46*bed243d3SAndroid Build Coastguard Worker /* NSC:     "Geode by NSC" */
47*bed243d3SAndroid Build Coastguard Worker #define signature_NSC_ebx 0x646f6547
48*bed243d3SAndroid Build Coastguard Worker #define signature_NSC_edx 0x79622065
49*bed243d3SAndroid Build Coastguard Worker #define signature_NSC_ecx 0x43534e20
50*bed243d3SAndroid Build Coastguard Worker /* NEXGEN:  "NexGenDriven" */
51*bed243d3SAndroid Build Coastguard Worker #define signature_NEXGEN_ebx 0x4778654e
52*bed243d3SAndroid Build Coastguard Worker #define signature_NEXGEN_edx 0x72446e65
53*bed243d3SAndroid Build Coastguard Worker #define signature_NEXGEN_ecx 0x6e657669
54*bed243d3SAndroid Build Coastguard Worker /* RISE:    "RiseRiseRise" */
55*bed243d3SAndroid Build Coastguard Worker #define signature_RISE_ebx 0x65736952
56*bed243d3SAndroid Build Coastguard Worker #define signature_RISE_edx 0x65736952
57*bed243d3SAndroid Build Coastguard Worker #define signature_RISE_ecx 0x65736952
58*bed243d3SAndroid Build Coastguard Worker /* SIS:     "SiS SiS SiS " */
59*bed243d3SAndroid Build Coastguard Worker #define signature_SIS_ebx 0x20536953
60*bed243d3SAndroid Build Coastguard Worker #define signature_SIS_edx 0x20536953
61*bed243d3SAndroid Build Coastguard Worker #define signature_SIS_ecx 0x20536953
62*bed243d3SAndroid Build Coastguard Worker /* UMC:     "UMC UMC UMC " */
63*bed243d3SAndroid Build Coastguard Worker #define signature_UMC_ebx 0x20434d55
64*bed243d3SAndroid Build Coastguard Worker #define signature_UMC_edx 0x20434d55
65*bed243d3SAndroid Build Coastguard Worker #define signature_UMC_ecx 0x20434d55
66*bed243d3SAndroid Build Coastguard Worker /* VIA:     "VIA VIA VIA " */
67*bed243d3SAndroid Build Coastguard Worker #define signature_VIA_ebx 0x20414956
68*bed243d3SAndroid Build Coastguard Worker #define signature_VIA_edx 0x20414956
69*bed243d3SAndroid Build Coastguard Worker #define signature_VIA_ecx 0x20414956
70*bed243d3SAndroid Build Coastguard Worker /* VORTEX:  "Vortex86 SoC" */
71*bed243d3SAndroid Build Coastguard Worker #define signature_VORTEX_ebx 0x74726f56
72*bed243d3SAndroid Build Coastguard Worker #define signature_VORTEX_edx 0x36387865
73*bed243d3SAndroid Build Coastguard Worker #define signature_VORTEX_ecx 0x436f5320
74*bed243d3SAndroid Build Coastguard Worker 
75*bed243d3SAndroid Build Coastguard Worker /* Features in %ecx for leaf 1 */
76*bed243d3SAndroid Build Coastguard Worker #define bit_SSE3        0x00000001
77*bed243d3SAndroid Build Coastguard Worker #define bit_PCLMULQDQ   0x00000002
78*bed243d3SAndroid Build Coastguard Worker #define bit_PCLMUL      bit_PCLMULQDQ   /* for gcc compat */
79*bed243d3SAndroid Build Coastguard Worker #define bit_DTES64      0x00000004
80*bed243d3SAndroid Build Coastguard Worker #define bit_MONITOR     0x00000008
81*bed243d3SAndroid Build Coastguard Worker #define bit_DSCPL       0x00000010
82*bed243d3SAndroid Build Coastguard Worker #define bit_VMX         0x00000020
83*bed243d3SAndroid Build Coastguard Worker #define bit_SMX         0x00000040
84*bed243d3SAndroid Build Coastguard Worker #define bit_EIST        0x00000080
85*bed243d3SAndroid Build Coastguard Worker #define bit_TM2         0x00000100
86*bed243d3SAndroid Build Coastguard Worker #define bit_SSSE3       0x00000200
87*bed243d3SAndroid Build Coastguard Worker #define bit_CNXTID      0x00000400
88*bed243d3SAndroid Build Coastguard Worker #define bit_FMA         0x00001000
89*bed243d3SAndroid Build Coastguard Worker #define bit_CMPXCHG16B  0x00002000
90*bed243d3SAndroid Build Coastguard Worker #define bit_xTPR        0x00004000
91*bed243d3SAndroid Build Coastguard Worker #define bit_PDCM        0x00008000
92*bed243d3SAndroid Build Coastguard Worker #define bit_PCID        0x00020000
93*bed243d3SAndroid Build Coastguard Worker #define bit_DCA         0x00040000
94*bed243d3SAndroid Build Coastguard Worker #define bit_SSE41       0x00080000
95*bed243d3SAndroid Build Coastguard Worker #define bit_SSE4_1      bit_SSE41       /* for gcc compat */
96*bed243d3SAndroid Build Coastguard Worker #define bit_SSE42       0x00100000
97*bed243d3SAndroid Build Coastguard Worker #define bit_SSE4_2      bit_SSE42       /* for gcc compat */
98*bed243d3SAndroid Build Coastguard Worker #define bit_x2APIC      0x00200000
99*bed243d3SAndroid Build Coastguard Worker #define bit_MOVBE       0x00400000
100*bed243d3SAndroid Build Coastguard Worker #define bit_POPCNT      0x00800000
101*bed243d3SAndroid Build Coastguard Worker #define bit_TSCDeadline 0x01000000
102*bed243d3SAndroid Build Coastguard Worker #define bit_AESNI       0x02000000
103*bed243d3SAndroid Build Coastguard Worker #define bit_AES         bit_AESNI       /* for gcc compat */
104*bed243d3SAndroid Build Coastguard Worker #define bit_XSAVE       0x04000000
105*bed243d3SAndroid Build Coastguard Worker #define bit_OSXSAVE     0x08000000
106*bed243d3SAndroid Build Coastguard Worker #define bit_AVX         0x10000000
107*bed243d3SAndroid Build Coastguard Worker #define bit_F16C        0x20000000
108*bed243d3SAndroid Build Coastguard Worker #define bit_RDRND       0x40000000
109*bed243d3SAndroid Build Coastguard Worker 
110*bed243d3SAndroid Build Coastguard Worker /* Features in %edx for leaf 1 */
111*bed243d3SAndroid Build Coastguard Worker #define bit_FPU         0x00000001
112*bed243d3SAndroid Build Coastguard Worker #define bit_VME         0x00000002
113*bed243d3SAndroid Build Coastguard Worker #define bit_DE          0x00000004
114*bed243d3SAndroid Build Coastguard Worker #define bit_PSE         0x00000008
115*bed243d3SAndroid Build Coastguard Worker #define bit_TSC         0x00000010
116*bed243d3SAndroid Build Coastguard Worker #define bit_MSR         0x00000020
117*bed243d3SAndroid Build Coastguard Worker #define bit_PAE         0x00000040
118*bed243d3SAndroid Build Coastguard Worker #define bit_MCE         0x00000080
119*bed243d3SAndroid Build Coastguard Worker #define bit_CX8         0x00000100
120*bed243d3SAndroid Build Coastguard Worker #define bit_CMPXCHG8B   bit_CX8         /* for gcc compat */
121*bed243d3SAndroid Build Coastguard Worker #define bit_APIC        0x00000200
122*bed243d3SAndroid Build Coastguard Worker #define bit_SEP         0x00000800
123*bed243d3SAndroid Build Coastguard Worker #define bit_MTRR        0x00001000
124*bed243d3SAndroid Build Coastguard Worker #define bit_PGE         0x00002000
125*bed243d3SAndroid Build Coastguard Worker #define bit_MCA         0x00004000
126*bed243d3SAndroid Build Coastguard Worker #define bit_CMOV        0x00008000
127*bed243d3SAndroid Build Coastguard Worker #define bit_PAT         0x00010000
128*bed243d3SAndroid Build Coastguard Worker #define bit_PSE36       0x00020000
129*bed243d3SAndroid Build Coastguard Worker #define bit_PSN         0x00040000
130*bed243d3SAndroid Build Coastguard Worker #define bit_CLFSH       0x00080000
131*bed243d3SAndroid Build Coastguard Worker #define bit_DS          0x00200000
132*bed243d3SAndroid Build Coastguard Worker #define bit_ACPI        0x00400000
133*bed243d3SAndroid Build Coastguard Worker #define bit_MMX         0x00800000
134*bed243d3SAndroid Build Coastguard Worker #define bit_FXSR        0x01000000
135*bed243d3SAndroid Build Coastguard Worker #define bit_FXSAVE      bit_FXSR        /* for gcc compat */
136*bed243d3SAndroid Build Coastguard Worker #define bit_SSE         0x02000000
137*bed243d3SAndroid Build Coastguard Worker #define bit_SSE2        0x04000000
138*bed243d3SAndroid Build Coastguard Worker #define bit_SS          0x08000000
139*bed243d3SAndroid Build Coastguard Worker #define bit_HTT         0x10000000
140*bed243d3SAndroid Build Coastguard Worker #define bit_TM          0x20000000
141*bed243d3SAndroid Build Coastguard Worker #define bit_PBE         0x80000000
142*bed243d3SAndroid Build Coastguard Worker 
143*bed243d3SAndroid Build Coastguard Worker /* Features in %ebx for leaf 7 sub-leaf 0 */
144*bed243d3SAndroid Build Coastguard Worker #define bit_FSGSBASE    0x00000001
145*bed243d3SAndroid Build Coastguard Worker #define bit_SGX         0x00000004
146*bed243d3SAndroid Build Coastguard Worker #define bit_BMI         0x00000008
147*bed243d3SAndroid Build Coastguard Worker #define bit_HLE         0x00000010
148*bed243d3SAndroid Build Coastguard Worker #define bit_AVX2        0x00000020
149*bed243d3SAndroid Build Coastguard Worker #define bit_SMEP        0x00000080
150*bed243d3SAndroid Build Coastguard Worker #define bit_BMI2        0x00000100
151*bed243d3SAndroid Build Coastguard Worker #define bit_ENH_MOVSB   0x00000200
152*bed243d3SAndroid Build Coastguard Worker #define bit_INVPCID     0x00000400
153*bed243d3SAndroid Build Coastguard Worker #define bit_RTM         0x00000800
154*bed243d3SAndroid Build Coastguard Worker #define bit_MPX         0x00004000
155*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512F     0x00010000
156*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512DQ    0x00020000
157*bed243d3SAndroid Build Coastguard Worker #define bit_RDSEED      0x00040000
158*bed243d3SAndroid Build Coastguard Worker #define bit_ADX         0x00080000
159*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512IFMA  0x00200000
160*bed243d3SAndroid Build Coastguard Worker #define bit_CLFLUSHOPT  0x00800000
161*bed243d3SAndroid Build Coastguard Worker #define bit_CLWB        0x01000000
162*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512PF    0x04000000
163*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512ER    0x08000000
164*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512CD    0x10000000
165*bed243d3SAndroid Build Coastguard Worker #define bit_SHA         0x20000000
166*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512BW    0x40000000
167*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512VL    0x80000000
168*bed243d3SAndroid Build Coastguard Worker 
169*bed243d3SAndroid Build Coastguard Worker /* Features in %ecx for leaf 7 sub-leaf 0 */
170*bed243d3SAndroid Build Coastguard Worker #define bit_PREFTCHWT1       0x00000001
171*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512VBMI       0x00000002
172*bed243d3SAndroid Build Coastguard Worker #define bit_PKU              0x00000004
173*bed243d3SAndroid Build Coastguard Worker #define bit_OSPKE            0x00000010
174*bed243d3SAndroid Build Coastguard Worker #define bit_WAITPKG          0x00000020
175*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512VBMI2      0x00000040
176*bed243d3SAndroid Build Coastguard Worker #define bit_SHSTK            0x00000080
177*bed243d3SAndroid Build Coastguard Worker #define bit_GFNI             0x00000100
178*bed243d3SAndroid Build Coastguard Worker #define bit_VAES             0x00000200
179*bed243d3SAndroid Build Coastguard Worker #define bit_VPCLMULQDQ       0x00000400
180*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512VNNI       0x00000800
181*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512BITALG     0x00001000
182*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512VPOPCNTDQ  0x00004000
183*bed243d3SAndroid Build Coastguard Worker #define bit_RDPID            0x00400000
184*bed243d3SAndroid Build Coastguard Worker #define bit_CLDEMOTE         0x02000000
185*bed243d3SAndroid Build Coastguard Worker #define bit_MOVDIRI          0x08000000
186*bed243d3SAndroid Build Coastguard Worker #define bit_MOVDIR64B        0x10000000
187*bed243d3SAndroid Build Coastguard Worker #define bit_ENQCMD           0x20000000
188*bed243d3SAndroid Build Coastguard Worker 
189*bed243d3SAndroid Build Coastguard Worker /* Features in %edx for leaf 7 sub-leaf 0 */
190*bed243d3SAndroid Build Coastguard Worker #define bit_AVX5124VNNIW  0x00000004
191*bed243d3SAndroid Build Coastguard Worker #define bit_AVX5124FMAPS  0x00000008
192*bed243d3SAndroid Build Coastguard Worker #define bit_UINTR         0x00000020
193*bed243d3SAndroid Build Coastguard Worker #define bit_SERIALIZE     0x00004000
194*bed243d3SAndroid Build Coastguard Worker #define bit_TSXLDTRK      0x00010000
195*bed243d3SAndroid Build Coastguard Worker #define bit_PCONFIG       0x00040000
196*bed243d3SAndroid Build Coastguard Worker #define bit_IBT           0x00100000
197*bed243d3SAndroid Build Coastguard Worker #define bit_AMXBF16       0x00400000
198*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512FP16    0x00800000
199*bed243d3SAndroid Build Coastguard Worker #define bit_AMXTILE       0x01000000
200*bed243d3SAndroid Build Coastguard Worker #define bit_AMXINT8       0x02000000
201*bed243d3SAndroid Build Coastguard Worker 
202*bed243d3SAndroid Build Coastguard Worker /* Features in %eax for leaf 7 sub-leaf 1 */
203*bed243d3SAndroid Build Coastguard Worker #define bit_SHA512        0x00000001
204*bed243d3SAndroid Build Coastguard Worker #define bit_SM3           0x00000002
205*bed243d3SAndroid Build Coastguard Worker #define bit_SM4           0x00000004
206*bed243d3SAndroid Build Coastguard Worker #define bit_RAOINT        0x00000008
207*bed243d3SAndroid Build Coastguard Worker #define bit_AVXVNNI       0x00000010
208*bed243d3SAndroid Build Coastguard Worker #define bit_AVX512BF16    0x00000020
209*bed243d3SAndroid Build Coastguard Worker #define bit_CMPCCXADD     0x00000080
210*bed243d3SAndroid Build Coastguard Worker #define bit_AMXFP16       0x00200000
211*bed243d3SAndroid Build Coastguard Worker #define bit_HRESET        0x00400000
212*bed243d3SAndroid Build Coastguard Worker #define bit_AVXIFMA       0x00800000
213*bed243d3SAndroid Build Coastguard Worker 
214*bed243d3SAndroid Build Coastguard Worker /* Features in %edx for leaf 7 sub-leaf 1 */
215*bed243d3SAndroid Build Coastguard Worker #define bit_AVXVNNIINT8   0x00000010
216*bed243d3SAndroid Build Coastguard Worker #define bit_AVXNECONVERT  0x00000020
217*bed243d3SAndroid Build Coastguard Worker #define bit_AMXCOMPLEX    0x00000100
218*bed243d3SAndroid Build Coastguard Worker #define bit_AVXVNNIINT16  0x00000400
219*bed243d3SAndroid Build Coastguard Worker #define bit_PREFETCHI     0x00004000
220*bed243d3SAndroid Build Coastguard Worker #define bit_USERMSR       0x00008000
221*bed243d3SAndroid Build Coastguard Worker #define bit_AVX10         0x00080000
222*bed243d3SAndroid Build Coastguard Worker #define bit_APXF          0x00200000
223*bed243d3SAndroid Build Coastguard Worker 
224*bed243d3SAndroid Build Coastguard Worker /* Features in %eax for leaf 13 sub-leaf 1 */
225*bed243d3SAndroid Build Coastguard Worker #define bit_XSAVEOPT    0x00000001
226*bed243d3SAndroid Build Coastguard Worker #define bit_XSAVEC      0x00000002
227*bed243d3SAndroid Build Coastguard Worker #define bit_XSAVES      0x00000008
228*bed243d3SAndroid Build Coastguard Worker 
229*bed243d3SAndroid Build Coastguard Worker /* Features in %eax for leaf 0x14 sub-leaf 0 */
230*bed243d3SAndroid Build Coastguard Worker #define bit_PTWRITE     0x00000010
231*bed243d3SAndroid Build Coastguard Worker 
232*bed243d3SAndroid Build Coastguard Worker /* Features in %ecx for leaf 0x80000001 */
233*bed243d3SAndroid Build Coastguard Worker #define bit_LAHF_LM     0x00000001
234*bed243d3SAndroid Build Coastguard Worker #define bit_ABM         0x00000020
235*bed243d3SAndroid Build Coastguard Worker #define bit_LZCNT       bit_ABM        /* for gcc compat */
236*bed243d3SAndroid Build Coastguard Worker #define bit_SSE4a       0x00000040
237*bed243d3SAndroid Build Coastguard Worker #define bit_PRFCHW      0x00000100
238*bed243d3SAndroid Build Coastguard Worker #define bit_XOP         0x00000800
239*bed243d3SAndroid Build Coastguard Worker #define bit_LWP         0x00008000
240*bed243d3SAndroid Build Coastguard Worker #define bit_FMA4        0x00010000
241*bed243d3SAndroid Build Coastguard Worker #define bit_TBM         0x00200000
242*bed243d3SAndroid Build Coastguard Worker #define bit_MWAITX      0x20000000
243*bed243d3SAndroid Build Coastguard Worker 
244*bed243d3SAndroid Build Coastguard Worker /* Features in %edx for leaf 0x80000001 */
245*bed243d3SAndroid Build Coastguard Worker #define bit_MMXEXT      0x00400000
246*bed243d3SAndroid Build Coastguard Worker #define bit_LM          0x20000000
247*bed243d3SAndroid Build Coastguard Worker #define bit_3DNOWP      0x40000000
248*bed243d3SAndroid Build Coastguard Worker #define bit_3DNOW       0x80000000
249*bed243d3SAndroid Build Coastguard Worker 
250*bed243d3SAndroid Build Coastguard Worker /* Features in %ebx for leaf 0x80000008 */
251*bed243d3SAndroid Build Coastguard Worker #define bit_CLZERO      0x00000001
252*bed243d3SAndroid Build Coastguard Worker #define bit_RDPRU       0x00000010
253*bed243d3SAndroid Build Coastguard Worker #define bit_WBNOINVD    0x00000200
254*bed243d3SAndroid Build Coastguard Worker 
255*bed243d3SAndroid Build Coastguard Worker /* Features in %ebx for leaf 0x24 */
256*bed243d3SAndroid Build Coastguard Worker #define bit_AVX10_256   0x00020000
257*bed243d3SAndroid Build Coastguard Worker #define bit_AVX10_512   0x00040000
258*bed243d3SAndroid Build Coastguard Worker 
259*bed243d3SAndroid Build Coastguard Worker #if __i386__
260*bed243d3SAndroid Build Coastguard Worker #define __cpuid(__leaf, __eax, __ebx, __ecx, __edx) \
261*bed243d3SAndroid Build Coastguard Worker     __asm("cpuid" : "=a"(__eax), "=b" (__ebx), "=c"(__ecx), "=d"(__edx) \
262*bed243d3SAndroid Build Coastguard Worker                   : "0"(__leaf))
263*bed243d3SAndroid Build Coastguard Worker 
264*bed243d3SAndroid Build Coastguard Worker #define __cpuid_count(__leaf, __count, __eax, __ebx, __ecx, __edx) \
265*bed243d3SAndroid Build Coastguard Worker     __asm("cpuid" : "=a"(__eax), "=b" (__ebx), "=c"(__ecx), "=d"(__edx) \
266*bed243d3SAndroid Build Coastguard Worker                   : "0"(__leaf), "2"(__count))
267*bed243d3SAndroid Build Coastguard Worker #else
268*bed243d3SAndroid Build Coastguard Worker /* x86-64 uses %rbx as the base register, so preserve it. */
269*bed243d3SAndroid Build Coastguard Worker #define __cpuid(__leaf, __eax, __ebx, __ecx, __edx) \
270*bed243d3SAndroid Build Coastguard Worker     __asm("  xchgq  %%rbx,%q1\n" \
271*bed243d3SAndroid Build Coastguard Worker           "  cpuid\n" \
272*bed243d3SAndroid Build Coastguard Worker           "  xchgq  %%rbx,%q1" \
273*bed243d3SAndroid Build Coastguard Worker         : "=a"(__eax), "=r" (__ebx), "=c"(__ecx), "=d"(__edx) \
274*bed243d3SAndroid Build Coastguard Worker         : "0"(__leaf))
275*bed243d3SAndroid Build Coastguard Worker 
276*bed243d3SAndroid Build Coastguard Worker #define __cpuid_count(__leaf, __count, __eax, __ebx, __ecx, __edx) \
277*bed243d3SAndroid Build Coastguard Worker     __asm("  xchgq  %%rbx,%q1\n" \
278*bed243d3SAndroid Build Coastguard Worker           "  cpuid\n" \
279*bed243d3SAndroid Build Coastguard Worker           "  xchgq  %%rbx,%q1" \
280*bed243d3SAndroid Build Coastguard Worker         : "=a"(__eax), "=r" (__ebx), "=c"(__ecx), "=d"(__edx) \
281*bed243d3SAndroid Build Coastguard Worker         : "0"(__leaf), "2"(__count))
282*bed243d3SAndroid Build Coastguard Worker #endif
283*bed243d3SAndroid Build Coastguard Worker 
__get_cpuid_max(unsigned int __leaf,unsigned int * __sig)284*bed243d3SAndroid Build Coastguard Worker static __inline unsigned int __get_cpuid_max (unsigned int __leaf,
285*bed243d3SAndroid Build Coastguard Worker                                               unsigned int *__sig)
286*bed243d3SAndroid Build Coastguard Worker {
287*bed243d3SAndroid Build Coastguard Worker     unsigned int __eax, __ebx, __ecx, __edx;
288*bed243d3SAndroid Build Coastguard Worker #if __i386__
289*bed243d3SAndroid Build Coastguard Worker     int __cpuid_supported;
290*bed243d3SAndroid Build Coastguard Worker 
291*bed243d3SAndroid Build Coastguard Worker     __asm("  pushfl\n"
292*bed243d3SAndroid Build Coastguard Worker           "  popl   %%eax\n"
293*bed243d3SAndroid Build Coastguard Worker           "  movl   %%eax,%%ecx\n"
294*bed243d3SAndroid Build Coastguard Worker           "  xorl   $0x00200000,%%eax\n"
295*bed243d3SAndroid Build Coastguard Worker           "  pushl  %%eax\n"
296*bed243d3SAndroid Build Coastguard Worker           "  popfl\n"
297*bed243d3SAndroid Build Coastguard Worker           "  pushfl\n"
298*bed243d3SAndroid Build Coastguard Worker           "  popl   %%eax\n"
299*bed243d3SAndroid Build Coastguard Worker           "  movl   $0,%0\n"
300*bed243d3SAndroid Build Coastguard Worker           "  cmpl   %%eax,%%ecx\n"
301*bed243d3SAndroid Build Coastguard Worker           "  je     1f\n"
302*bed243d3SAndroid Build Coastguard Worker           "  movl   $1,%0\n"
303*bed243d3SAndroid Build Coastguard Worker           "1:"
304*bed243d3SAndroid Build Coastguard Worker         : "=r" (__cpuid_supported) : : "eax", "ecx");
305*bed243d3SAndroid Build Coastguard Worker     if (!__cpuid_supported)
306*bed243d3SAndroid Build Coastguard Worker         return 0;
307*bed243d3SAndroid Build Coastguard Worker #endif
308*bed243d3SAndroid Build Coastguard Worker 
309*bed243d3SAndroid Build Coastguard Worker     __cpuid(__leaf, __eax, __ebx, __ecx, __edx);
310*bed243d3SAndroid Build Coastguard Worker     if (__sig)
311*bed243d3SAndroid Build Coastguard Worker         *__sig = __ebx;
312*bed243d3SAndroid Build Coastguard Worker     return __eax;
313*bed243d3SAndroid Build Coastguard Worker }
314*bed243d3SAndroid Build Coastguard Worker 
__get_cpuid(unsigned int __leaf,unsigned int * __eax,unsigned int * __ebx,unsigned int * __ecx,unsigned int * __edx)315*bed243d3SAndroid Build Coastguard Worker static __inline int __get_cpuid (unsigned int __leaf, unsigned int *__eax,
316*bed243d3SAndroid Build Coastguard Worker                                  unsigned int *__ebx, unsigned int *__ecx,
317*bed243d3SAndroid Build Coastguard Worker                                  unsigned int *__edx)
318*bed243d3SAndroid Build Coastguard Worker {
319*bed243d3SAndroid Build Coastguard Worker     unsigned int __max_leaf = __get_cpuid_max(__leaf & 0x80000000, 0);
320*bed243d3SAndroid Build Coastguard Worker 
321*bed243d3SAndroid Build Coastguard Worker     if (__max_leaf == 0 || __max_leaf < __leaf)
322*bed243d3SAndroid Build Coastguard Worker         return 0;
323*bed243d3SAndroid Build Coastguard Worker 
324*bed243d3SAndroid Build Coastguard Worker     __cpuid(__leaf, *__eax, *__ebx, *__ecx, *__edx);
325*bed243d3SAndroid Build Coastguard Worker     return 1;
326*bed243d3SAndroid Build Coastguard Worker }
327*bed243d3SAndroid Build Coastguard Worker 
__get_cpuid_count(unsigned int __leaf,unsigned int __subleaf,unsigned int * __eax,unsigned int * __ebx,unsigned int * __ecx,unsigned int * __edx)328*bed243d3SAndroid Build Coastguard Worker static __inline int __get_cpuid_count (unsigned int __leaf,
329*bed243d3SAndroid Build Coastguard Worker                                        unsigned int __subleaf,
330*bed243d3SAndroid Build Coastguard Worker                                        unsigned int *__eax, unsigned int *__ebx,
331*bed243d3SAndroid Build Coastguard Worker                                        unsigned int *__ecx, unsigned int *__edx)
332*bed243d3SAndroid Build Coastguard Worker {
333*bed243d3SAndroid Build Coastguard Worker     unsigned int __max_leaf = __get_cpuid_max(__leaf & 0x80000000, 0);
334*bed243d3SAndroid Build Coastguard Worker 
335*bed243d3SAndroid Build Coastguard Worker     if (__max_leaf == 0 || __max_leaf < __leaf)
336*bed243d3SAndroid Build Coastguard Worker         return 0;
337*bed243d3SAndroid Build Coastguard Worker 
338*bed243d3SAndroid Build Coastguard Worker     __cpuid_count(__leaf, __subleaf, *__eax, *__ebx, *__ecx, *__edx);
339*bed243d3SAndroid Build Coastguard Worker     return 1;
340*bed243d3SAndroid Build Coastguard Worker }
341*bed243d3SAndroid Build Coastguard Worker 
342*bed243d3SAndroid Build Coastguard Worker #endif /* __CPUID_H */
343