changeset 9122:5ba896a38d75

The two attached patches *should* allow for proper compilation of the AltiVec stuff on both Darwin and non-Darwin system. They've only been tested for compilation on Debian using Debian's gcc-3.2. Romain Dolbeau <dolbeau@irisa.fr>
author arpi
date Mon, 27 Jan 2003 21:47:25 +0000
parents 57605e30cda4
children 0f52526cb69a
files Makefile cpudetect.c liba52/Makefile liba52/imdct.c mp3lib/Makefile mp3lib/dct64_altivec.c
diffstat 6 files changed, 54 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Mon Jan 27 20:46:45 2003 +0000
+++ b/Makefile	Mon Jan 27 21:47:25 2003 +0000
@@ -41,7 +41,11 @@
 CFLAGS = $(OPTFLAGS) -Ilibmpdemux -Iloader -Ilibvo $(FREETYPE_INC) $(EXTRA_INC) $(CDPARANOIA_INC) $(SDL_INC) # -Wall
 
 ifeq ($(TARGET_ALTIVEC),yes)
+ifeq ($(TARGET_OS),Darwin)
 CFLAGS += -faltivec
+else
+CFLAGS += -maltivec -mabi=altivec
+endif
 endif
 
 PARTS = libmpdemux libmpcodecs mp3lib liba52 libmpeg2 libavcodec libao2 drivers linux postproc input libvo libaf
--- a/cpudetect.c	Mon Jan 27 20:46:45 2003 +0000
+++ b/cpudetect.c	Mon Jan 27 21:47:25 2003 +0000
@@ -492,7 +492,7 @@
             canjump = 1;
             
             asm volatile ("mtspr 256, %0\n\t"
-                          "vand v0, v0, v0"
+                          "vand %%v0, %%v0, %%v0"
                           :
                           : "r" (-1));
             
--- a/liba52/Makefile	Mon Jan 27 20:46:45 2003 +0000
+++ b/liba52/Makefile	Mon Jan 27 21:47:25 2003 +0000
@@ -8,7 +8,11 @@
 
 CFLAGS  = $(MLIB_INC) $(OPTFLAGS) 
 ifeq ($(TARGET_ALTIVEC),yes)
+ifeq ($(TARGET_OS),Darwin)
     CFLAGS+= -faltivec
+else
+    CFLAGS+= -maltivec -mabi=altivec
+endif
 endif
 
 .SUFFIXES: .c .o
--- a/liba52/imdct.c	Mon Jan 27 20:46:45 2003 +0000
+++ b/liba52/imdct.c	Mon Jan 27 21:47:25 2003 +0000
@@ -387,6 +387,10 @@
 
 #ifdef HAVE_ALTIVEC
 
+#ifndef SYS_DARWIN
+#include <altivec.h>
+#endif
+
 // used to build registers permutation vectors (vcprm)
 // the 's' are for words in the _s_econd vector
 #define WORD_0 0x00,0x01,0x02,0x03
@@ -398,7 +402,11 @@
 #define WORD_s2 0x18,0x19,0x1a,0x1b
 #define WORD_s3 0x1c,0x1d,0x1e,0x1f
 
+#ifdef SYS_DARWIN
 #define vcprm(a,b,c,d) (const vector unsigned char)(WORD_ ## a, WORD_ ## b, WORD_ ## c, WORD_ ## d)
+#else
+#define vcprm(a,b,c,d) (const vector unsigned char){WORD_ ## a, WORD_ ## b, WORD_ ## c, WORD_ ## d}
+#endif
 
 // vcprmle is used to keep the same index as in the SSE version.
 // it's the same as vcprm, with the index inversed
@@ -410,7 +418,18 @@
 #define FLOAT_n -1.
 #define FLOAT_p 1.
 
+#ifdef SYS_DARWIN
 #define vcii(a,b,c,d) (const vector float)(FLOAT_ ## a, FLOAT_ ## b, FLOAT_ ## c, FLOAT_ ## d)
+#else
+#define vcii(a,b,c,d) (const vector float){FLOAT_ ## a, FLOAT_ ## b, FLOAT_ ## c, FLOAT_ ## d}
+#endif
+
+#ifdef SYS_DARWIN
+#define FOUROF(a) (a)
+#else
+#define FOUROF(a) {a,a,a,a}
+#endif
+
 
 void
 imdct_do_512_altivec(sample_t data[],sample_t delay[], sample_t bias)
@@ -601,7 +620,7 @@
         int p = k + i;
         int q = p + two_m;
         vector float vecp, vecq, vecw, temp1, temp2, temp3, temp4;
-        const vector float vczero = (const vector float)(0);
+        const vector float vczero = (const vector float)FOUROF(0.);
         // first compute buf[q] and buf[q+1]
         vecq = vec_ld(q << 3, (float*)buf);
         vecw = vec_ld(0, (float*)&(w[m][k]));
@@ -658,7 +677,7 @@
 #else
     vector float bufv_0, bufv_2, cosv, sinv, temp1, temp2;
     vector float temp0022, temp1133, tempCS01;
-    const vector float vczero = (const vector float)(0);
+    const vector float vczero = (const vector float)FOUROF(0.);
 
     bufv_0 = vec_ld((i + 0) << 3, (float*)buf);
     bufv_2 = vec_ld((i + 2) << 3, (float*)buf);
--- a/mp3lib/Makefile	Mon Jan 27 20:46:45 2003 +0000
+++ b/mp3lib/Makefile	Mon Jan 27 21:47:25 2003 +0000
@@ -26,7 +26,11 @@
 ifeq ($(TARGET_ALTIVEC),yes)
 SRCS += dct64_altivec.c
 OBJS += dct64_altivec.o
+ifeq ($(TARGET_OS),Darwin)
 CFLAGS += -faltivec
+else
+CFLAGS += -maltivec -mabi=altivec
+endif
 endif
 endif
 
--- a/mp3lib/dct64_altivec.c	Mon Jan 27 20:46:45 2003 +0000
+++ b/mp3lib/dct64_altivec.c	Mon Jan 27 21:47:25 2003 +0000
@@ -13,6 +13,10 @@
 
 #ifdef HAVE_ALTIVEC
 
+#ifndef SYS_DARWIN
+#include <altivec.h>
+#endif
+
 // used to build registers permutation vectors (vcprm)
 // the 's' are for words in the _s_econd vector
 #define WORD_0 0x00,0x01,0x02,0x03
@@ -24,7 +28,11 @@
 #define WORD_s2 0x18,0x19,0x1a,0x1b
 #define WORD_s3 0x1c,0x1d,0x1e,0x1f
 
+#ifdef SYS_DARWIN
 #define vcprm(a,b,c,d) (const vector unsigned char)(WORD_ ## a, WORD_ ## b, WORD_ ## c, WORD_ ## d)
+#else
+#define vcprm(a,b,c,d) (const vector unsigned char){WORD_ ## a, WORD_ ## b, WORD_ ## c, WORD_ ## d}
+#endif
 
 // vcprmle is used to keep the same index as in the SSE version.
 // it's the same as vcprm, with the index inversed
@@ -36,7 +44,17 @@
 #define FLOAT_n -1.
 #define FLOAT_p 1.
 
+#ifdef SYS_DARWIN
 #define vcii(a,b,c,d) (const vector float)(FLOAT_ ## a, FLOAT_ ## b, FLOAT_ ## c, FLOAT_ ## d)
+#else
+#define vcii(a,b,c,d) (const vector float){FLOAT_ ## a, FLOAT_ ## b, FLOAT_ ## c, FLOAT_ ## d}
+#endif
+
+#ifdef SYS_DARWIN
+#define FOUROF(a) (a)
+#else
+#define FOUROF(a) {a,a,a,a}
+#endif
 
 void dct64_altivec(real *a,real *b,real *c)
 {
@@ -47,7 +65,7 @@
   real *out1 = b;
   real *samples = c;
 
-  const vector float vczero = (const vector float)(0.);
+  const vector float vczero = (const vector float)FOUROF(0.);
   const vector unsigned char reverse = (const vector unsigned char)vcprm(3,2,1,0);
 
 
@@ -521,5 +539,5 @@
   out1[0x10*15] = b1[0x1F];
 }
 
-#endif HAVE_ALTIVEC
+#endif /* HAVE_ALTIVEC */