_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