diff i386/cputest.c @ 22:c31fb57d17a6 libavcodec

Suppressing external gas stuff to improve portability to Win32
author nickols_k
date Sun, 05 Aug 2001 16:49:57 +0000
parents 89bc3bf1a031
children ab64a3fc62bf
line wrap: on
line diff
--- a/i386/cputest.c	Sat Aug 04 00:46:50 2001 +0000
+++ b/i386/cputest.c	Sun Aug 05 16:49:57 2001 +0000
@@ -4,8 +4,15 @@
 #include <stdlib.h>
 #include "../dsputil.h"
 
-/* need this external function to solve -fPIC ebx issues ! */
-extern void cpuid(int index, int *eax, int *ebx, int *ecx, int *edx);
+/* ebx saving is necessary for PIC. gcc seems unable to see it alone */
+#define cpuid(index,eax,ebx,ecx,edx)\
+    asm ("movl %%ebx, %%esi\n\t"\
+         "cpuid\n\t"\
+         "xchgl %%ebx, %%esi"\
+         : "=a" (eax), "=S" (ebx),\
+           "=c" (ecx), "=d" (edx)\
+         : "0" (index)\
+         : "cc")\
 
 /* Function to test if multimedia instructions are supported...  */
 int mm_support(void)
@@ -37,7 +44,7 @@
     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 &&
@@ -45,7 +52,7 @@
         
         /* intel */
     inteltest:
-        cpuid(1, &eax, &ebx, &ecx, &edx);
+        cpuid(1, eax, ebx, ecx, edx);
         if ((edx & 0x00800000) == 0)
             return 0;
         rval = MM_MMX;
@@ -58,10 +65,10 @@
                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;
@@ -84,7 +91,7 @@
         */
         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;