# HG changeset patch # User diego # Date 1203876568 0 # Node ID 6ede4d6afa41de6598571f0f434070518d9a3d48 # Parent fd7888eb149b51e9557726deafb0dd7bd8c14b67 Enable SSE detection on OS/2. patch by KO Myung-Hun, komh chollian net diff -r fd7888eb149b -r 6ede4d6afa41 cpudetect.c --- a/cpudetect.c Sun Feb 24 18:04:34 2008 +0000 +++ b/cpudetect.c Sun Feb 24 18:09:28 2008 +0000 @@ -33,6 +33,11 @@ #include #endif +#ifdef __OS2__ +#define INCL_DOS +#include +#endif + #ifdef __AMIGAOS4__ #include #endif @@ -183,7 +188,8 @@ /* FIXME: Does SSE2 need more OS support, too? */ #if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \ || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) \ - || defined(__APPLE__) || defined(__CYGWIN__) || defined(__MINGW32__) + || defined(__APPLE__) || defined(__CYGWIN__) || defined(__MINGW32__) \ + || defined(__OS2__) if (caps->hasSSE) check_os_katmai_support(); if (!caps->hasSSE) @@ -321,6 +327,24 @@ } #endif /* WIN32 */ +#ifdef __OS2__ +ULONG _System os2_sig_handler_sse( PEXCEPTIONREPORTRECORD p1, + PEXCEPTIONREGISTRATIONRECORD p2, + PCONTEXTRECORD p3, + PVOID p4 ) +{ + if(p1->ExceptionNum == XCPT_ILLEGAL_INSTRUCTION){ + mp_msg(MSGT_CPUDETECT, MSGL_V, "SIGILL, "); + + p3->ctx_RegEip += 3; + gCpuCaps.hasSSE = 0; + + return XCPT_CONTINUE_EXECUTION; + } + return XCPT_CONTINUE_SEARCH; +} +#endif + /* If we're running on a processor that can do SSE, let's see if we * are allowed to or not. This will catch 2.4.0 or later kernels that * haven't been configured for a Pentium III but are running on one, @@ -391,6 +415,16 @@ if ( gCpuCaps.hasSSE ) mp_msg(MSGT_CPUDETECT,MSGL_V, "yes.\n" ); else mp_msg(MSGT_CPUDETECT,MSGL_V, "no!\n" ); } +#elif defined(__OS2__) + EXCEPTIONREGISTRATIONRECORD RegRec = { 0, &os2_sig_handler_sse }; + if ( gCpuCaps.hasSSE ) { + mp_msg(MSGT_CPUDETECT,MSGL_V, "Testing OS support for SSE... " ); + DosSetExceptionHandler( &RegRec ); + __asm __volatile ("xorps %xmm0, %xmm0"); + DosUnsetExceptionHandler( &RegRec ); + if ( gCpuCaps.hasSSE ) mp_msg(MSGT_CPUDETECT,MSGL_V, "yes.\n" ); + else mp_msg(MSGT_CPUDETECT,MSGL_V, "no!\n" ); + } #elif defined(__linux__) #if defined(_POSIX_SOURCE) struct sigaction saved_sigill;