aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2001-07-24 20:37:52 +0000
committerFabrice Bellard <fabrice@bellard.org>2001-07-24 20:37:52 +0000
commita9e3707d6bcaa21754c50625cac9bfa212686b12 (patch)
tree49e0c2ca3d4647af546fa2c5bd40b351cc8758c3
parentd771bcae33d7503796235d2199186a821582cd09 (diff)
downloadffmpeg-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.c29
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;