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