Index: /trunk/source/lisp-kernel/x86-exceptions.c
===================================================================
--- /trunk/source/lisp-kernel/x86-exceptions.c	(revision 14425)
+++ /trunk/source/lisp-kernel/x86-exceptions.c	(revision 14426)
@@ -3414,4 +3414,29 @@
         break;
       }
+#if WORD_SIZE==64
+      if ((signum==SIGFPE) && 
+          (code != FPE_INTDIV) && 
+          (tcr->valence != TCR_STATE_LISP)) {
+        mach_msg_type_number_t thread_state_count = x86_FLOAT_STATE64_COUNT;
+        x86_float_state64_t fs;
+
+        thread_get_state(thread,
+                         x86_FLOAT_STATE64,
+                         (thread_state_t)&fs,
+                         &thread_state_count);
+        
+        if (! (tcr->flags & (1<<TCR_FLAG_BIT_FOREIGN_FPE))) {
+          tcr->flags |= (1<<TCR_FLAG_BIT_FOREIGN_FPE);
+          tcr->lisp_mxcsr = (fs.__fpu_mxcsr & ~MXCSR_STATUS_MASK);
+        }
+        fs.__fpu_mxcsr &= ~MXCSR_STATUS_MASK;
+        fs.__fpu_mxcsr |= MXCSR_CONTROL_MASK;
+        thread_set_state(thread,
+                         x86_FLOAT_STATE64,
+                         (thread_state_t)&fs,
+                         x86_FLOAT_STATE64_COUNT);
+        return 0;
+      }
+#endif
       if (signum) {
         kret = setup_signal_frame(thread,
