Work at SourceForge, help us to make it a better place! We have an immediate need for a Support Technician in our San Francisco or Denver office.

Close

Diff of /src/runtime/x86-64-darwin-os.c [987e39] .. [f60e99] Maximize Restore

  Switch to side-by-side view

--- a/src/runtime/x86-64-darwin-os.c
+++ b/src/runtime/x86-64-darwin-os.c
@@ -48,6 +48,9 @@
 #define ss __ss
 #define es __es
 #define fs __fs
+
+#define fpu_fcw __fpu_fcw
+#define fpu_mxcsr __fpu_mxcsr
 
 #else
 
@@ -587,4 +590,19 @@
     return ret;
 }
 
-#endif
+void
+os_restore_fp_control(os_context_t *context)
+{
+    /* KLUDGE: The x87 FPU control word is some nasty bitfield struct
+     * thing.  Rather than deal with that, just grab it as a 16-bit
+     * integer. */
+    unsigned short fpu_control_word =
+        *((unsigned short *)&context->uc_mcontext->fs.fpu_fcw);
+    /* reset exception flags and restore control flags on SSE2 FPU */
+    unsigned int temp = (context->uc_mcontext->fs.fpu_mxcsr) & ~0x3F;
+    asm ("ldmxcsr %0" : : "m" (temp));
+    /* same for x87 FPU. */
+    asm ("fldcw %0" : : "m" (fpu_control_word));
+}
+
+#endif