From: Michel L. <wa...@us...> - 2001-09-12 05:50:52
|
Update of /cvsroot/libmpeg2/mpeg2dec/src In directory usw-pr-cvs1:/tmp/cvs-serv28781/src Modified Files: cpu_accel.c Log Message: First pass of checkins for altivec IDCT. This should build on any compiler; however you will need a fairly recent version of binutils with support for altivec assembly. This is very untested, so if it breaks you get to keep both pieces :) Index: cpu_accel.c =================================================================== RCS file: /cvsroot/libmpeg2/mpeg2dec/src/cpu_accel.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- cpu_accel.c 2001/09/04 08:40:47 1.2 +++ cpu_accel.c 2001/09/12 05:50:46 1.3 @@ -26,7 +26,7 @@ #include "mm_accel.h" #ifdef ARCH_X86 -static uint32_t x86_accel (void) +static uint32_t arch_accel (void) { uint32_t eax, ebx, ecx, edx; int AMD; @@ -101,17 +101,52 @@ return caps; } -#endif +#endif /* ARCH_X86 */ + +#ifdef ARCH_PPC +#include <signal.h> +#include <setjmp.h> + +static sigjmp_buf jmpbuf; +static volatile sig_atomic_t canjump = 0; + +static RETSIGTYPE sigill_handler (int sig) +{ + if (!canjump) { + signal (sig, SIG_DFL); + raise (sig); + } + + canjump = 0; + siglongjump (jmpbuf, 1); +} +static uint32_t arch_accel (void) +{ + signal (SIGILL, sigill_handler); + if (sigsetjmp (jmpbuf, 1)) { + signal (SIGILL, SIG_DFL); + return 0; + } + + canjump = 1; + + asm volatile ("mtspr 256,%0" :: "r" (-1)); + + signal (SIGILL, SIG_DFL); + return MM_ACCEL_PPC_ALTIVEC; +} +#endif /* ARCH_PPC */ + uint32_t mm_accel (void) { -#ifdef ARCH_X86 +#if defined (ARCH_X86) || defined (ARCH_PPC) static int got_accel = 0; static uint32_t accel; if (!got_accel) { got_accel = 1; - accel = x86_accel (); + accel = arch_accel (); } return accel; |