#define X87_CW_IC (1<<12) /* infinity control flag */
+#ifdef _M_AMD64
+unsigned int __getfpcw87(void);
+void __setfpcw87(unsigned int);
+#endif
+
/*
* @implemented
*/
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];
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];
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");