Adapt fegetexcept etc. workarounds to work when debugging turned on.
authorChris Hanson <org/chris-hanson/cph>
Sun, 8 Sep 2019 07:31:51 +0000 (00:31 -0700)
committerChris Hanson <org/chris-hanson/cph>
Sun, 8 Sep 2019 07:31:51 +0000 (00:31 -0700)
src/microcode/floenv.c
src/microcode/floenv.h

index 59e6198235b526de8d3a2d63e8af5384b3cceecf..a8e6c1d73d5c6e16f01978c33ce8dc6d98e6390b 100644 (file)
@@ -33,6 +33,49 @@ USA.
 
 #include "floenv.h"
 
+#ifdef NEED_FEEXCEPT_WORKAROUND
+
+// From http://www-personal.umich.edu/~williams/archive/computation/fe-handling-example.c
+
+int fegetexcept(void)
+{
+  fenv_t fenv;
+  return (fegetenv (&fenv)) ? -1 : (fenv.__control & FE_ALL_EXCEPT);
+}
+
+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;
+}
+
+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 // NEED_FEEXCEPT_WORKAROUND
+
 #ifndef __GNUC__
 #  pragma STDC FENV_ACCESS ON
 #endif
index 3d0189c28c5d0ac5d310f899adc81cbc1b56b49b..331347781a2250cba3506b1b7635ab51062b6ac2 100644 (file)
@@ -46,47 +46,10 @@ USA.
 #    endif
 #    define HAVE_FEENABLEEXCEPT
 #    define HAVE_FEDISABLEEXCEPT
-
-// From http://www-personal.umich.edu/~williams/archive/computation/fe-handling-example.c
-
-inline int fegetexcept(void)
-{
-  fenv_t fenv;
-  return (fegetenv (&fenv)) ? -1 : (fenv.__control & FE_ALL_EXCEPT);
-}
-
-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;
-}
-
+#    define NEED_FEEXCEPT_WORKAROUND
+     extern int fegetexcept(void);
+     extern int feenableexcept(unsigned int);
+     extern int fedisableexcept(unsigned int);
 #  endif
 #elif ((!defined (CMPINTMD_EMULATES_FENV)) && (defined (HAVE_IEEEFP_H)))