From: Miguel F. <mig...@us...> - 2001-11-18 23:00:37
|
Update of /cvsroot/xine/xine-lib/src/xine-utils In directory usw-pr-cvs1:/tmp/cvs-serv32213/src/xine-utils Modified Files: cpu_accel.c memcpy.c Log Message: test OS support for SSE instructions Index: cpu_accel.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-utils/cpu_accel.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- cpu_accel.c 2001/11/18 00:05:06 1.3 +++ cpu_accel.c 2001/11/18 23:00:34 1.4 @@ -21,7 +21,10 @@ #include "config.h" +#include <stdio.h> #include <inttypes.h> +#include <signal.h> +#include <setjmp.h> #include "attributes.h" #include "xineutils.h" @@ -86,8 +89,11 @@ caps = MM_ACCEL_X86_MMX; if (edx & 0x02000000) /* SSE - identical to AMD MMX extensions */ - caps = MM_ACCEL_X86_MMX | MM_ACCEL_X86_MMXEXT; + caps = MM_ACCEL_X86_SSE | MM_ACCEL_X86_MMXEXT; + if (edx & 0x04000000) /* SSE2 */ + caps |= MM_ACCEL_X86_SSE2; + cpuid (0x80000000, eax, ebx, ecx, edx); if (eax < 0x80000001) /* no extended capabilities */ return caps; @@ -105,6 +111,13 @@ #endif +static jmp_buf sigill_return; + +static void sigill_handler (int n) { + printf ("cpu_accel: OS doesn't support SSE instructions.\n"); + longjmp(sigill_return, 1); +} + uint32_t xine_mm_accel (void) { #ifdef ARCH_X86 @@ -113,7 +126,19 @@ if (!got_accel) { got_accel = 1; + accel = x86_accel (); + + /* test OS support for SSE */ + if( accel & MM_ACCEL_X86_SSE ) { + if (setjmp(sigill_return)) { + accel &= ~(MM_ACCEL_X86_SSE|MM_ACCEL_X86_SSE2); + } else { + signal (SIGILL, sigill_handler); + __asm __volatile ("xorps %xmm0, %xmm0"); + signal (SIGILL, SIG_DFL); + } + } } return accel; Index: memcpy.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-utils/memcpy.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- memcpy.c 2001/11/18 03:53:25 1.10 +++ memcpy.c 2001/11/18 23:00:34 1.11 @@ -35,8 +35,6 @@ #include <stdlib.h> #include <string.h> -#include <signal.h> -#include <setjmp.h> #include "xine_internal.h" #include "xineutils.h" @@ -368,9 +366,7 @@ { "linux kernel memcpy()", linux_kernel_memcpy, 0, 0 }, { "MMX optimized memcpy()", mmx_memcpy, 0, MM_MMX }, { "MMXEXT optimized memcpy()", mmx2_memcpy, 0, MM_MMXEXT }, -# ifndef __FreeBSD__ { "SSE optimized memcpy()", sse_memcpy, 0, MM_MMXEXT|MM_SSE }, -# endif #endif /* ARCH_X86 */ { NULL, NULL, 0, 0 } }; @@ -391,16 +387,7 @@ } #endif -static jmp_buf sigill_return; -static void sigill_handler (int n) { - - printf ("memcpy: SIGILL catched\n"); - - longjmp(sigill_return, 1); -} - - #define BUFSIZE 1024*1024 void xine_probe_fast_memcpy(config_values_t *config) { @@ -408,8 +395,11 @@ char *buf1, *buf2; int i, j, best; static int config_flags = -1; - static char *memcpy_methods[] = {"probe", "glibc", "kernel", - "mmx", "mmxext", "sse", NULL}; + static char *memcpy_methods[] = {"probe", "glibc", +#ifdef ARCH_X86 + "kernel", "mmx", "mmxext", "sse", +#endif + NULL}; #ifdef ARCH_X86 config_flags = xine_mm_accel(); @@ -453,19 +443,12 @@ memcpy_method[i].cpu_require ) continue; - if (setjmp(sigill_return)) - continue; - - signal (SIGILL, sigill_handler); - t = rdtsc(); for(j=0;j<50;j++) { memcpy_method[i].function(buf2,buf1,BUFSIZE); memcpy_method[i].function(buf1,buf2,BUFSIZE); } - signal (SIGILL, SIG_DFL); - t = rdtsc() - t; memcpy_method[i].time = t; |