Add patch from internet to enable/disable FP traps on macOS.
authorChris Hanson <org/chris-hanson/cph>
Thu, 15 Nov 2018 05:19:09 +0000 (21:19 -0800)
committerChris Hanson <org/chris-hanson/cph>
Thu, 15 Nov 2018 05:19:09 +0000 (21:19 -0800)
src/microcode/floenv.h

index 4d0ad90ebd7c82197dd61dbba95f570e69102fd9..15f424d77134989c7c072e2a86c8cf2fc5c3b33f 100644 (file)
@@ -42,6 +42,43 @@ USA.
 #  endif
 #  ifdef __APPLE__
 #    undef HAVE_FEGETEXCEPT
+#    define HAVE_FEENABLEEXCEPT
+#    define HAVE_FEDISABLEEXCEPT
+
+// From http://www-personal.umich.edu/~williams/archive/computation/fe-handling-example.c
+
+inline int feenableexcept(unsigned int excepts)
+{
+    fenv_t fenv;
+    if (fegetenv (&fenv))
+      return -1;
+
+    unsigned int new_excepts = excepts & FE_ALL_EXCEPT;
+    unsigned int old_excepts = fenv.__control & FE_ALL_EXCEPT;
+
+    // unmask
+    fenv.__control &= ~new_excepts;
+    fenv.__mxcsr   &= ~(new_excepts << 7);
+
+    return (fesetenv (&fenv)) ? -1 : old_excepts;
+}
+
+inline int fedisableexcept(unsigned int excepts)
+{
+    fenv_t fenv;
+    if (fegetenv (&fenv))
+      return -1;
+
+    unsigned int new_excepts = excepts & FE_ALL_EXCEPT;
+    unsigned int old_excepts = fenv.__control & FE_ALL_EXCEPT;
+
+    // mask
+    fenv.__control |= new_excepts;
+    fenv.__mxcsr   |= new_excepts << 7;
+
+    return (fesetenv (&fenv)) ? -1 : old_excepts;
+}
+
 #  endif
 #elif ((!defined (CMPINTMD_EMULATES_FENV)) && (defined (HAVE_IEEEFP_H)))