mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
fixed cpuid macro to allow PIC compiling
Originally committed as revision 10 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
d771bcae33
commit
a9e3707d6b
@ -4,12 +4,18 @@
|
||||
#include <stdlib.h>
|
||||
#include "../dsputil.h"
|
||||
|
||||
#define cpuid(index,eax,ebx,ecx,edx) \
|
||||
asm ("cpuid" \
|
||||
: "=a" (eax), "=b" (ebx), \
|
||||
"=c" (ecx), "=d" (edx) \
|
||||
: "a" (index) \
|
||||
: "cc")
|
||||
/* ebx saving is necessary for PIC. gcc seems unable to see it alone */
|
||||
static inline void cpuid(int index, int *eax, int *ebx, int *ecx, int *edx)
|
||||
{
|
||||
asm ("pushl %%ebx\n\t"
|
||||
"cpuid\n\t"
|
||||
"movl %%ebx, %1\n\t"
|
||||
"popl %%ebx\n\t"
|
||||
: "=a" (*eax), "=m" (*ebx),
|
||||
"=c" (*ecx), "=d" (*edx)
|
||||
: "a" (index)
|
||||
: "cc");
|
||||
}
|
||||
|
||||
/* Function to test if multimedia instructions are supported... */
|
||||
int mm_support(void)
|
||||
@ -17,7 +23,6 @@ int mm_support(void)
|
||||
int rval;
|
||||
int eax, ebx, ecx, edx;
|
||||
|
||||
|
||||
__asm__ __volatile__ (
|
||||
/* See if CPUID instruction is supported ... */
|
||||
/* ... Get copies of EFLAGS into eax and ecx */
|
||||
@ -42,7 +47,7 @@ int mm_support(void)
|
||||
if (eax == ecx)
|
||||
return 0; /* CPUID not supported */
|
||||
|
||||
cpuid(0, eax, ebx, ecx, edx);
|
||||
cpuid(0, &eax, &ebx, &ecx, &edx);
|
||||
|
||||
if (ebx == 0x756e6547 &&
|
||||
edx == 0x49656e69 &&
|
||||
@ -50,7 +55,7 @@ int mm_support(void)
|
||||
|
||||
/* intel */
|
||||
inteltest:
|
||||
cpuid(1, eax, ebx, ecx, edx);
|
||||
cpuid(1, &eax, &ebx, &ecx, &edx);
|
||||
if ((edx & 0x00800000) == 0)
|
||||
return 0;
|
||||
rval = MM_MMX;
|
||||
@ -63,10 +68,10 @@ int mm_support(void)
|
||||
edx == 0x69746e65 &&
|
||||
ecx == 0x444d4163) {
|
||||
/* AMD */
|
||||
cpuid(0x80000000, eax, ebx, ecx, edx);
|
||||
cpuid(0x80000000, &eax, &ebx, &ecx, &edx);
|
||||
if ((unsigned)eax < 0x80000001)
|
||||
goto inteltest;
|
||||
cpuid(0x80000001, eax, ebx, ecx, edx);
|
||||
cpuid(0x80000001, &eax, &ebx, &ecx, &edx);
|
||||
if ((edx & 0x00800000) == 0)
|
||||
return 0;
|
||||
rval = MM_MMX;
|
||||
@ -89,7 +94,7 @@ int mm_support(void)
|
||||
*/
|
||||
if (eax != 2)
|
||||
goto inteltest;
|
||||
cpuid(0x80000001, eax, ebx, ecx, edx);
|
||||
cpuid(0x80000001, &eax, &ebx, &ecx, &edx);
|
||||
if ((eax & 0x00800000) == 0)
|
||||
return 0;
|
||||
rval = MM_MMX;
|
||||
|
Loading…
Reference in New Issue
Block a user