diff options
author | Fabrice Bellard <fabrice@bellard.org> | 2001-07-24 20:37:52 +0000 |
---|---|---|
committer | Fabrice Bellard <fabrice@bellard.org> | 2001-07-24 20:37:52 +0000 |
commit | a9e3707d6bcaa21754c50625cac9bfa212686b12 (patch) | |
tree | 49e0c2ca3d4647af546fa2c5bd40b351cc8758c3 | |
parent | d771bcae33d7503796235d2199186a821582cd09 (diff) | |
download | ffmpeg-a9e3707d6bcaa21754c50625cac9bfa212686b12.tar.gz |
fixed cpuid macro to allow PIC compiling
Originally committed as revision 10 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/i386/cputest.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/libavcodec/i386/cputest.c b/libavcodec/i386/cputest.c index 9181f413d5..78f36440f1 100644 --- a/libavcodec/i386/cputest.c +++ b/libavcodec/i386/cputest.c @@ -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; |