From 60635c5d5120e1180fab363b566c9c28e00d548a Mon Sep 17 00:00:00 2001 From: Andre Pang Date: Sat, 6 Nov 2004 09:23:15 +0000 Subject: libmpeg2 compilation fixes for Mac OS X CVS patchset: 7105 CVS date: 2004/11/06 09:23:15 --- src/libmpeg2/cpu_state.c | 72 ++++++++++++++++++++++++++++++++++++-- src/libmpeg2/idct_altivec.c | 38 +++++++++++++------- src/libmpeg2/motion_comp_altivec.c | 19 ++++++---- src/libmpeg2/mpeg2_internal.h | 7 ++++ 4 files changed, 114 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/libmpeg2/cpu_state.c b/src/libmpeg2/cpu_state.c index db876cf98..433a85b85 100644 --- a/src/libmpeg2/cpu_state.c +++ b/src/libmpeg2/cpu_state.c @@ -1,6 +1,6 @@ /* * cpu_state.c - * Copyright (C) 2000-2002 Michel Lespinasse + * Copyright (C) 2000-2003 Michel Lespinasse * Copyright (C) 1999-2000 Aaron Holtzman * * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. @@ -40,6 +40,9 @@ static void state_restore_mmx (cpu_state_t * state) #endif #if defined (ARCH_PPC) && defined (ENABLE_ALTIVEC) + +#ifndef HOST_OS_DARWIN + static void state_save_altivec (cpu_state_t * state) { asm (" \n" @@ -97,7 +100,71 @@ static void state_restore_altivec (cpu_state_t * state) " lvx %v31, %r9, %r3 \n" ); } -#endif + +#else /* HOST_OS_DARWIN */ + +#define LI(a,b) "li r" #a "," #b "\n\t" +#define STVX0(a,b,c) "stvx v" #a ",0,r" #c "\n\t" +#define STVX(a,b,c) "stvx v" #a ",r" #b ",r" #c "\n\t" +#define LVX0(a,b,c) "lvx v" #a ",0,r" #c "\n\t" +#define LVX(a,b,c) "lvx v" #a ",r" #b ",r" #c "\n\t" + +static void state_save_altivec (cpu_state_t * state) +{ + asm (LI (9, 16) + STVX0 (20, 0, 3) + LI (11, 32) + STVX (21, 9, 3) + LI (9, 48) + STVX (22, 11, 3) + LI (11, 64) + STVX (23, 9, 3) + LI (9, 80) + STVX (24, 11, 3) + LI (11, 96) + STVX (25, 9, 3) + LI (9, 112) + STVX (26, 11, 3) + LI (11, 128) + STVX (27, 9, 3) + LI (9, 144) + STVX (28, 11, 3) + LI (11, 160) + STVX (29, 9, 3) + LI (9, 176) + STVX (30, 11, 3) + STVX (31, 9, 3)); +} + +static void state_restore_altivec (cpu_state_t * state) +{ + asm (LI (9, 16) + LVX0 (20, 0, 3) + LI (11, 32) + LVX (21, 9, 3) + LI (9, 48) + LVX (22, 11, 3) + LI (11, 64) + LVX (23, 9, 3) + LI (9, 80) + LVX (24, 11, 3) + LI (11, 96) + LVX (25, 9, 3) + LI (9, 112) + LVX (26, 11, 3) + LI (11, 128) + LVX (27, 9, 3) + LI (9, 144) + LVX (28, 11, 3) + LI (11, 160) + LVX (29, 9, 3) + LI (9, 176) + LVX (30, 11, 3) + LVX (31, 9, 3)); +} +#endif /* HOST_OS_DARWIN */ + +#endif /* defined (ARCH_PPC) && defined (ENABLE_ALTIVEC) */ void mpeg2_cpu_state_init (uint32_t mm_accel) { @@ -113,3 +180,4 @@ void mpeg2_cpu_state_init (uint32_t mm_accel) } #endif } + diff --git a/src/libmpeg2/idct_altivec.c b/src/libmpeg2/idct_altivec.c index 12c227aea..ffac29025 100644 --- a/src/libmpeg2/idct_altivec.c +++ b/src/libmpeg2/idct_altivec.c @@ -21,8 +21,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef __ALTIVEC__ - #include "config.h" #if defined (ARCH_PPC) && defined (ENABLE_ALTIVEC) @@ -32,13 +30,7 @@ #include "mpeg2_internal.h" #include "xineutils.h" -static int16_t constants[5][8] ATTR_ALIGN(16) = { - {23170, 13573, 6518, 21895, -23170, -21895, 32, 31}, - {16384, 22725, 21407, 19266, 16384, 19266, 21407, 22725}, - {22725, 31521, 29692, 26722, 22725, 26722, 29692, 31521}, - {21407, 29692, 27969, 25172, 21407, 25172, 27969, 29692}, - {19266, 26722, 25172, 22654, 19266, 22654, 25172, 26722} -}; +#ifndef HOST_OS_DARWIN /* * The asm code is generated with: @@ -497,6 +489,14 @@ void mpeg2_idct_add_altivec (int16_t * block, uint8_t * dest, int stride) ); } +static int16_t constants[5][8] ATTR_ALIGN(16) = { + {23170, 13573, 6518, 21895, -23170, -21895, 32, 31}, + {16384, 22725, 21407, 19266, 16384, 19266, 21407, 22725}, + {22725, 31521, 29692, 26722, 22725, 26722, 29692, 31521}, + {21407, 29692, 27969, 25172, 21407, 25172, 27969, 29692}, + {19266, 26722, 25172, 22654, 19266, 22654, 25172, 26722} +}; + void mpeg2_idct_altivec_init (void) { int i, j; @@ -512,9 +512,7 @@ void mpeg2_idct_altivec_init (void) } } -#endif /* ARCH_PPC */ - -#else /* __ALTIVEC__ */ +#else /* HOST_OS_DARWIN */ #define vector_s16_t vector signed short #define vector_u16_t vector unsigned short @@ -694,6 +692,20 @@ void mpeg2_idct_add_altivec (vector_s16_t * block, unsigned char * dest, memset (block, 0, 64 * sizeof (signed short)); } -#endif /* __ALTIVEC__ */ +void mpeg2_idct_altivec_init (void) +{ + int i, j; + + /* the altivec idct uses a transposed input, so we patch scan tables */ + for (i = 0; i < 64; i++) { + j = mpeg2_scan_norm[i]; + mpeg2_scan_norm[i] = (j >> 3) | ((j & 7) << 3); + j = mpeg2_scan_alt[i]; + mpeg2_scan_alt[i] = (j >> 3) | ((j & 7) << 3); + } +} + +#endif /* HOST_OS_DARWIN */ +#endif /* ARCH_PPC && ENABLED_ALTIVEC */ diff --git a/src/libmpeg2/motion_comp_altivec.c b/src/libmpeg2/motion_comp_altivec.c index 8ad951f1a..15adc5798 100644 --- a/src/libmpeg2/motion_comp_altivec.c +++ b/src/libmpeg2/motion_comp_altivec.c @@ -21,20 +21,20 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef __ALTIVEC__ - #include "config.h" -#if defined (ARCH_PPC) && defined (ENABLE_ALTIVEC) +#ifndef HOST_OS_DARWIN -#include +#if defined (ARCH_PPC) && defined (ENABLE_ALTIVEC) #include "mpeg2_internal.h" +#include + /* * The asm code is generated with: * - * gcc-2.95 -fvec -D__ALTIVEC__ -O9 -fomit-frame-pointer -mregnames -S + * gcc-2.95 -fvec -DHOST_OS_DARWIN -O9 -fomit-frame-pointer -mregnames -S * motion_comp_altivec.c * * sed 's/.L/._L/g' motion_comp_altivec.s | @@ -1067,7 +1067,9 @@ MPEG2_MC_EXTERN (altivec) #endif /* ARCH_PPC */ -#else /* __ALTIVEC__ */ +#else /* HOST_OS_DARWIN */ + +#include "mpeg2_internal.h" #define vector_s16_t vector signed short #define vector_u16_t vector unsigned short @@ -2019,4 +2021,7 @@ void MC_avg_xy_8_altivec (unsigned char * dest, unsigned char * ref, vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest); } -#endif /* __ALTIVEC__ */ +MPEG2_MC_EXTERN (altivec) + +#endif /* HOST_OS_DARWIN */ + diff --git a/src/libmpeg2/mpeg2_internal.h b/src/libmpeg2/mpeg2_internal.h index 27611e132..f279cd626 100644 --- a/src/libmpeg2/mpeg2_internal.h +++ b/src/libmpeg2/mpeg2_internal.h @@ -239,8 +239,15 @@ void mpeg2_zero_block_mmx (int16_t * block); void mpeg2_idct_mmx_init (void); /* idct_altivec.c */ +#ifndef HOST_OS_DARWIN void mpeg2_idct_copy_altivec (int16_t * block, uint8_t * dest, int stride); void mpeg2_idct_add_altivec (int16_t * block, uint8_t * dest, int stride); +#else /* HOST_OS_DARWIN */ +void mpeg2_idct_copy_altivec (vector signed short * block, unsigned char * dest, + int stride); +void mpeg2_idct_add_altivec (vector signed short * block, unsigned char * dest, + int stride); +#endif /* HOST_OS_DARWIN */ void mpeg2_idct_altivec_init (void); /* motion_comp.c */ -- cgit v1.2.3