1 /* Cpu detection code, extracted from mmx.h ((c)1997-99 by H. Dietz
2 and R. Fisher). Converted to C and improved by Fabrice Bellard */
5 #include "../dsputil.h"
7 /* ebx saving is necessary for PIC. gcc seems unable to see it alone */
8 #define cpuid(index,eax,ebx,ecx,edx)\
10 ("movl %%ebx, %%esi\n\t"\
13 : "=a" (eax), "=S" (ebx),\
14 "=c" (ecx), "=d" (edx)\
17 /* Function to test if multimedia instructions are supported... */
21 int eax
, ebx
, ecx
, edx
;
23 __asm__
__volatile__ (
24 /* See if CPUID instruction is supported ... */
25 /* ... Get copies of EFLAGS into eax and ecx */
30 /* ... Toggle the ID bit in one copy and store */
31 /* to the EFLAGS reg */
32 "xorl $0x200000, %0\n\t"
36 /* ... Get the (hopefully modified) EFLAGS */
39 : "=a" (eax
), "=c" (ecx
)
45 return 0; /* CPUID not supported */
47 cpuid(0, eax
, ebx
, ecx
, edx
);
49 if (ebx
== 0x756e6547 &&
55 cpuid(1, eax
, ebx
, ecx
, edx
);
56 if ((edx
& 0x00800000) == 0)
60 rval
|= MM_MMXEXT
| MM_SSE
;
64 } else if (ebx
== 0x68747541 &&
68 cpuid(0x80000000, eax
, ebx
, ecx
, edx
);
69 if ((unsigned)eax
< 0x80000001)
71 cpuid(0x80000001, eax
, ebx
, ecx
, edx
);
72 if ((edx
& 0x00800000) == 0)
80 } else if (ebx
== 0x746e6543 &&
82 ecx
== 0x736c7561) { /* "CentaurHauls" */
84 cpuid(0x80000000, eax
, ebx
, ecx
, edx
);
85 if ((unsigned)eax
< 0x80000001)
87 cpuid(0x80000001, eax
, ebx
, ecx
, edx
);
89 if( edx
& ( 1 << 31) )
91 if( edx
& ( 1 << 23) )
93 if( edx
& ( 1 << 24) )
96 } else if (ebx
== 0x69727943 &&
100 /* See if extended CPUID level 80000001 is supported */
101 /* The value of CPUID/80000001 for the 6x86MX is undefined
102 according to the Cyrix CPU Detection Guide (Preliminary
103 Rev. 1.01 table 1), so we'll check the value of eax for
104 CPUID/0 to see if standard CPUID level 2 is supported.
105 According to the table, the only CPU which supports level
106 2 is also the only one which supports extended CPUID levels.
110 cpuid(0x80000001, eax
, ebx
, ecx
, edx
);
111 if ((eax
& 0x00800000) == 0)
114 if (eax
& 0x01000000)
126 mm_flags
= mm_support();
127 printf("mm_support = 0x%08u\n",mm_flags
);