[MSVCRT]
[reactos.git] / reactos / lib / sdk / crt / float / i386 / cntrlfp.c
index 75d5c0a..f3c3ccf 100644 (file)
 
 #define X87_CW_IC          (1<<12)  /* infinity control flag */
 
+#ifdef _M_AMD64
+unsigned int __getfpcw87(void);
+void __setfpcw87(unsigned int);
+#endif
+
 /*
  * @implemented
  */
@@ -43,7 +48,9 @@ unsigned int CDECL _control87(unsigned int newval, unsigned int mask)
   TRACE("(%08x, %08x): Called\n", newval, mask);
 
   /* Get fp control word */
-#if defined(__GNUC__)
+#ifdef _M_AMD64
+  fpword = __getfpcw87();
+#elif defined(__GNUC__)
   __asm__ __volatile__( "fstcw %0" : "=m" (fpword) : );
 #else
   __asm fstcw [fpword];
@@ -96,7 +103,9 @@ unsigned int CDECL _control87(unsigned int newval, unsigned int mask)
   TRACE("Control word after  : %08x\n", fpword);
 
   /* Put fp control word */
-#if defined(__GNUC__)
+#ifdef _M_AMD64
+  __setfpcw87(fpword);
+#elif defined(__GNUC__)
   __asm__ __volatile__( "fldcw %0" : : "m" (fpword) );
 #else
   __asm fldcw [fpword];
@@ -111,15 +120,15 @@ unsigned int CDECL _control87(unsigned int newval, unsigned int mask)
 int CDECL _controlfp_s(unsigned int *cur, unsigned int newval, unsigned int mask)
 {
 #ifdef __i386__
-    unsigned int flags;
-
-    FIXME("(%p %u %u) semi-stub\n", cur, newval, mask);
-
-    flags = _control87( newval, mask & ~_EM_DENORMAL );
-
-    if(cur)
-        *cur = flags;
-
+    unsigned int val;
+
+    if (!MSVCRT_CHECK_PMT( !(newval & mask & ~(_MCW_EM | _MCW_IC | _MCW_RC | _MCW_PC | _MCW_DN))))
+    {
+        if (cur) *cur = _controlfp( 0, 0 );  /* retrieve it anyway */
+        return MSVCRT_EINVAL;
+    }
+    val = _controlfp( newval, mask );
+    if (cur) *cur = val;
     return 0;
 #else
     FIXME(":Not Implemented!\n");