changeset 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 20e680e7a490
children 1e131bc21101
files Makefile i386/cpuid.s i386/cputest.c
diffstat 3 files changed, 15 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Sat Aug 04 00:46:50 2001 +0000
+++ b/Makefile	Sun Aug 05 16:49:57 2001 +0000
@@ -25,7 +25,7 @@
 
 # i386 mmx specific stuff
 ifeq ($(TARGET_MMX),yes)
-ASM_OBJS += i386/fdct_mmx.o i386/sad_mmx.o i386/cpuid.o
+ASM_OBJS += i386/fdct_mmx.o i386/sad_mmx.o
 OBJS += i386/fdctdata.o i386/cputest.o \
 	i386/dsputil_mmx.o i386/mpegvideo_mmx.o
 endif
@@ -47,9 +47,6 @@
 %.o: %.c
 	$(CC) $(CFLAGS) -c -o $@ $< 
 
-i386/cpuid.o: i386/cpuid.s
-	$(CC) -c -o $@ $< 
-
 %.o: %.s
 	nasm -f elf -o $@ $<
 
--- a/i386/cpuid.s	Sat Aug 04 00:46:50 2001 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-	.file	"cpuid.s"
-	.version	"01.01"
-gcc2_compiled.:
-.text
-	.align 4
-        .globl   cpuid
-	.type	 cpuid,@function
-cpuid:
-	pushl %ebp
-	movl %esp,%ebp
-	pushl %edi
-	pushl %esi
-	pushl %ebx
-	movl 8(%ebp),%eax
-	movl 12(%ebp),%edi
-	movl 24(%ebp),%esi
-	cpuid
-	movl %eax,(%edi)
-	movl 16(%ebp),%eax
-	movl %ebx,(%eax)
-	movl 20(%ebp),%eax
-	movl %ecx,(%eax)
-	movl %edx,(%esi)
-	popl %ebx
-	popl %esi
-	popl %edi
-	leave
-	ret
-.Lfe1:
-	.size	 cpuid,.Lfe1-cpuid
-	.align 4
--- 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;