_control87/_controlfp fixes
Jukka Heinonen
jhei at iki.fi
Sat Aug 11 01:58:53 CDT 2001
The following patch fixes a few bugs in _control87 and it also
makes _controlfp to work as it is supposed to.
After the patch, DeusEx gets over division by zero exception
(which previously caused exception due to _control87 bugs) and
happily runs until it dies in X11 error.
Changelog:
Fixed _control87 return value, use of wrong assembler command to
get fp control word and a bug that inverted _IC_AFFINE flag.
Made _controlfp work as specified in MSDN.
Index: wine/dlls/msvcrt/math.c
===================================================================
RCS file: /home/wine/wine/dlls/msvcrt/math.c,v
retrieving revision 1.9
diff -u -r1.9 math.c
--- wine/dlls/msvcrt/math.c 2001/05/09 17:31:32 1.9
+++ wine/dlls/msvcrt/math.c 2001/08/11 06:44:53
@@ -486,10 +486,15 @@
unsigned int _control87(unsigned int newval, unsigned int mask)
{
#if defined(__GNUC__) && defined(__i386__)
- unsigned int fpword, flags = 0;
+ unsigned int fpword = 0;
+ unsigned int flags = 0;
+ TRACE("(%08x, %08x): Called\n", newval, mask);
+
/* Get fp control word */
- __asm__ __volatile__( "fstsw %0" : "=m" (fpword) : );
+ __asm__ __volatile__( "fstcw %0" : "=m" (fpword) : );
+
+ TRACE("Control word before : %08x\n", fpword);
/* Convert into mask constants */
if (fpword & 0x1) flags |= _EM_INVALID;
@@ -531,13 +536,17 @@
case _PC_53: fpword |= 0x200; break;
case _PC_24: fpword |= 0x0; break;
}
- if (!(flags & _IC_AFFINE)) fpword |= 0x1000;
+ if (flags & _IC_AFFINE) fpword |= 0x1000;
+
+ TRACE("Control word after : %08x\n", fpword);
/* Put fp control word */
__asm__ __volatile__( "fldcw %0" : : "m" (fpword) );
- return fpword;
+
+ return flags;
#else
- return _controlfp( newval, mask );
+ FIXME(":Not Implemented!\n");
+ return 0;
#endif
}
@@ -546,12 +555,7 @@
*/
unsigned int _controlfp(unsigned int newval, unsigned int mask)
{
-#if defined(__GNUC__) && defined(__i386__)
- return _control87( newval, mask );
-#else
- FIXME(":Not Implemented!\n");
- return 0;
-#endif
+ return _control87( newval, mask & ~_EM_DENORMAL );
}
/*********************************************************************
--
Jukka Heinonen <http://www.iki.fi/jhei/>
More information about the wine-patches
mailing list