Alexandre Julliard : msvcrt: Implemented _statusfp2.

Alexandre Julliard julliard at winehq.org
Wed Jan 26 10:43:53 CST 2011


Module: wine
Branch: master
Commit: 4b17ec7405334d15a70539edd9a219c423614cab
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4b17ec7405334d15a70539edd9a219c423614cab

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Jan 25 21:39:29 2011 +0100

msvcrt: Implemented _statusfp2.

---

 dlls/msvcr100/msvcr100.spec |    2 +-
 dlls/msvcr80/msvcr80.spec   |    2 +-
 dlls/msvcr90/msvcr90.spec   |    2 +-
 dlls/msvcrt/math.c          |   67 ++++++++++++++++++++++++++++++++++--------
 dlls/msvcrt/msvcrt.spec     |    1 +
 5 files changed, 58 insertions(+), 16 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 2569325..1a5577b 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1128,7 +1128,7 @@
 @ cdecl _stat64(str ptr) msvcrt._stat64
 @ cdecl _stat64i32(str ptr) msvcr90._stat64i32
 @ cdecl _statusfp() msvcrt._statusfp
-@ stub _statusfp2
+@ cdecl -arch=i386 _statusfp2(ptr ptr) msvcrt._statusfp2
 @ stub _strcoll_l
 @ cdecl _strdate(ptr) msvcrt._strdate
 @ cdecl _strdate_s(ptr long) msvcrt._strdate_s
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 6a0bcf6..014bdb5 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -982,7 +982,7 @@
 @ cdecl _stat64(str ptr) msvcrt._stat64
 @ cdecl _stat64i32(str ptr) msvcr90._stat64i32
 @ cdecl _statusfp() msvcrt._statusfp
-@ stub _statusfp2
+@ cdecl -arch=i386 _statusfp2(ptr ptr) msvcrt._statusfp2
 @ stub _strcoll_l
 @ cdecl _strdate(ptr) msvcrt._strdate
 @ cdecl _strdate_s(ptr long) msvcrt._strdate_s
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 7d17a24..b06159b 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -968,7 +968,7 @@
 @ cdecl _stat64(str ptr) msvcrt._stat64
 @ cdecl _stat64i32(str ptr)
 @ cdecl _statusfp() msvcrt._statusfp
-@ stub _statusfp2
+@ cdecl -arch=i386 _statusfp2(ptr ptr) msvcrt._statusfp2
 @ stub _strcoll_l
 @ cdecl _strdate(ptr) msvcrt._strdate
 @ cdecl _strdate_s(ptr long) msvcrt._strdate_s
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index cb49756..988ccc7 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -768,25 +768,66 @@ void CDECL MSVCRT___setusermatherr(MSVCRT_matherr_func func)
 }
 
 /**********************************************************************
+ *		_statusfp2 (MSVCRT.@)
+ *
+ * Not exported by native msvcrt, added in msvcr80.
+ */
+#if defined(__i386__) || defined(__x86_64__)
+void CDECL _statusfp2( unsigned int *x86_sw, unsigned int *sse2_sw )
+{
+#ifdef __GNUC__
+    unsigned int flags;
+    unsigned long fpword;
+
+    if (x86_sw)
+    {
+        __asm__ __volatile__( "fstsw %0" : "=m" (fpword) );
+        flags = 0;
+        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;
+        *x86_sw = flags;
+    }
+
+    if (!sse2_sw) return;
+
+    if (sse2_supported)
+    {
+        __asm__ __volatile__( "stmxcsr %0" : "=m" (fpword) );
+        flags = 0;
+        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;
+        *sse2_sw = flags;
+    }
+    else *sse2_sw = 0;
+#else
+    FIXME( "not implemented\n" );
+#endif
+}
+#endif
+
+/**********************************************************************
  *		_statusfp (MSVCRT.@)
  */
 unsigned int CDECL _statusfp(void)
 {
-   unsigned int retVal = 0;
-#if defined(__GNUC__) && defined(__i386__)
-  unsigned int fpword;
-
-  __asm__ __volatile__( "fstsw %0" : "=m" (fpword) : );
-  if (fpword & 0x1)  retVal |= MSVCRT__SW_INVALID;
-  if (fpword & 0x2)  retVal |= MSVCRT__SW_DENORMAL;
-  if (fpword & 0x4)  retVal |= MSVCRT__SW_ZERODIVIDE;
-  if (fpword & 0x8)  retVal |= MSVCRT__SW_OVERFLOW;
-  if (fpword & 0x10) retVal |= MSVCRT__SW_UNDERFLOW;
-  if (fpword & 0x20) retVal |= MSVCRT__SW_INEXACT;
+#if defined(__i386__) || defined(__x86_64__)
+    unsigned int x86_sw, sse2_sw;
+
+    _statusfp2( &x86_sw, &sse2_sw );
+    /* FIXME: there's no definition for ambiguous status, just return all status bits for now */
+    return x86_sw | sse2_sw;
 #else
-  FIXME(":Not implemented!\n");
+    FIXME( "not implemented\n" );
+    return 0;
 #endif
-  return retVal;
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index ebf988d..02f7b89 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -1485,5 +1485,6 @@
 @ cdecl _set_abort_behavior(long long) MSVCRT__set_abort_behavior
 @ cdecl _set_invalid_parameter_handler(ptr)
 @ cdecl _set_purecall_handler(ptr)
+@ cdecl -arch=i386 _statusfp2(ptr ptr)
 @ cdecl _wcstod_l(wstr ptr) MSVCRT__wcstod_l
 @ cdecl _wdupenv_s(ptr ptr str)




More information about the wine-cvs mailing list