Alexandre Julliard : msvcrt: Implemented _clearfp for SSE2 and x86_64.
Alexandre Julliard
julliard at winehq.org
Wed Jan 26 10:43:53 CST 2011
Module: wine
Branch: master
Commit: 98d7a021d62b4ad3d880f35888f8ae7b7f7b26b5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=98d7a021d62b4ad3d880f35888f8ae7b7f7b26b5
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jan 25 21:59:45 2011 +0100
msvcrt: Implemented _clearfp for SSE2 and x86_64.
---
dlls/msvcrt/math.c | 31 ++++++++++++++++++++++++++-----
1 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index 988ccc7..6755fbb 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -835,13 +835,34 @@ unsigned int CDECL _statusfp(void)
*/
unsigned int CDECL _clearfp(void)
{
- unsigned int retVal = _statusfp();
-#if defined(__GNUC__) && defined(__i386__)
- __asm__ __volatile__( "fnclex" );
+ unsigned int flags = 0;
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+ unsigned long fpword;
+
+ __asm__ __volatile__( "fnstsw %0; fnclex" : "=m" (fpword) );
+ if (fpword & 0x1) flags |= MSVCRT__SW_INVALID;
+ if (fpword & 0x2) flags |= MSVCRT__SW_DENORMAL;
+ if (fpword & 0x4) flags |= MSVCRT__SW_ZERODIVIDE;
+ if (fpword & 0x8) flags |= MSVCRT__SW_OVERFLOW;
+ if (fpword & 0x10) flags |= MSVCRT__SW_UNDERFLOW;
+ if (fpword & 0x20) flags |= MSVCRT__SW_INEXACT;
+
+ if (sse2_supported)
+ {
+ __asm__ __volatile__( "stmxcsr %0" : "=m" (fpword) );
+ if (fpword & 0x1) flags |= MSVCRT__SW_INVALID;
+ if (fpword & 0x2) flags |= MSVCRT__SW_DENORMAL;
+ if (fpword & 0x4) flags |= MSVCRT__SW_ZERODIVIDE;
+ if (fpword & 0x8) flags |= MSVCRT__SW_OVERFLOW;
+ if (fpword & 0x10) flags |= MSVCRT__SW_UNDERFLOW;
+ if (fpword & 0x20) flags |= MSVCRT__SW_INEXACT;
+ fpword &= ~0x3f;
+ __asm__ __volatile__( "ldmxcsr %0" : : "m" (fpword) );
+ }
#else
- FIXME(":Not Implemented\n");
+ FIXME( "not implemented\n" );
#endif
- return retVal;
+ return flags;
}
/*********************************************************************
More information about the wine-cvs
mailing list