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