25 #define bit_SSE3 (1 << 0)
26 #define bit_PCLMUL (1 << 1)
27 #define bit_SSSE3 (1 << 9)
28 #define bit_FMA (1 << 12)
29 #define bit_CMPXCHG16B (1 << 13)
30 #define bit_SSE4_1 (1 << 19)
31 #define bit_SSE4_2 (1 << 20)
32 #define bit_MOVBE (1 << 22)
33 #define bit_POPCNT (1 << 23)
34 #define bit_AES (1 << 25)
35 #define bit_XSAVE (1 << 26)
36 #define bit_OSXSAVE (1 << 27)
37 #define bit_AVX (1 << 28)
40 #define bit_CMPXCHG8B (1 << 8)
41 #define bit_CMOV (1 << 15)
42 #define bit_MMX (1 << 23)
43 #define bit_FXSAVE (1 << 24)
44 #define bit_SSE (1 << 25)
45 #define bit_SSE2 (1 << 26)
49 #define bit_LAHF_LM (1 << 0)
50 #define bit_SSE4a (1 << 6)
51 #define bit_SSE5 (1 << 11)
54 #define bit_LM (1 << 29)
55 #define bit_3DNOWP (1 << 30)
56 #define bit_3DNOW (1 << 31)
59 #if defined(__i386__) && defined(__PIC__)
62 #define __cpuid(level, a, b, c, d) \
63 __asm__ ("xchg{l}\t{%%}ebx, %1\n\t" \
65 "xchg{l}\t{%%}ebx, %1\n\t" \
66 : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
69 #define __cpuid_count(level, count, a, b, c, d) \
70 __asm__ ("xchg{l}\t{%%}ebx, %1\n\t" \
72 "xchg{l}\t{%%}ebx, %1\n\t" \
73 : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
74 : "0" (level), "2" (count))
78 #define __cpuid(level, a, b, c, d) \
79 __asm__ ("xchgl\t%%ebx, %1\n\t" \
81 "xchgl\t%%ebx, %1\n\t" \
82 : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
85 #define __cpuid_count(level, count, a, b, c, d) \
86 __asm__ ("xchgl\t%%ebx, %1\n\t" \
88 "xchgl\t%%ebx, %1\n\t" \
89 : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
90 : "0" (level), "2" (count))
93 #define __cpuid(level, a, b, c, d) \
94 __asm__ ("cpuid\n\t" \
95 : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
98 #define __cpuid_count(level, count, a, b, c, d) \
99 __asm__ ("cpuid\n\t" \
100 : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
101 : "0" (level), "2" (count))
111 static __inline
unsigned int
114 unsigned int __eax, __ebx, __ecx, __edx;
119 __asm__ (
"pushf{l|d}\n\t"
122 "mov{l}\t{%0, %1|%1, %0}\n\t"
123 "xor{l}\t{%2, %0|%0, %2}\n\t"
129 :
"=&r" (__eax),
"=&r" (__ebx)
134 __asm__ (
"pushfl\n\t"
144 :
"=&r" (__eax),
"=&r" (__ebx)
148 if (!((__eax ^ __ebx) & 0x00200000))
153 __cpuid (__ext, __eax, __ebx, __ecx, __edx);
168 unsigned int *__eax,
unsigned int *__ebx,
169 unsigned int *__ecx,
unsigned int *__edx)
171 unsigned int __ext = __level & 0x80000000;
176 __cpuid (__level, *__eax, *__ebx, *__ecx, *__edx);
184 static __inline
unsigned int
187 unsigned int index, __eax, __edx;
188 __asm__ (
"xgetbv" :
"=a"(__eax),
"=d"(__edx) :
"c" (index));