This change implements fenv.h functions feenableexcept(), fedisableexcept()
and fegetexcept() as wrappers around the __mingw_controlfp() function.

This can be useful for testing SIGFPU signal handler.
---
 mingw-w64-crt/Makefile.am            | 1 +
 mingw-w64-crt/misc/fedisableexcept.c | 8 ++++++++
 mingw-w64-crt/misc/feenableexcept.c  | 8 ++++++++
 mingw-w64-crt/misc/fegetexcept.c     | 8 ++++++++
 mingw-w64-headers/crt/fenv.h         | 6 ++++++
 5 files changed, 31 insertions(+)
 create mode 100644 mingw-w64-crt/misc/fedisableexcept.c
 create mode 100644 mingw-w64-crt/misc/feenableexcept.c
 create mode 100644 mingw-w64-crt/misc/fegetexcept.c

diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index ff032f953493..379a30d705a5 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -1236,6 +1236,7 @@ src_libmingwex=\
   misc/dirname.c \
   misc/feclearexcept.c   misc/fegetenv.c            misc/fegetexceptflag.c  
misc/fegetround.c            misc/feholdexcept.c    \
   misc/feraiseexcept.c   misc/fesetenv.c            misc/fesetexceptflag.c  
misc/fesetround.c            misc/fetestexcept.c    \
+  misc/feenableexcept.c  misc/fedisableexcept.c     misc/fegetexcept.c \
   misc/mingw_controlfp.c \
   misc/mingw_setfp.c \
   misc/feupdateenv.c                                misc/fwide.c            
misc/getlogin.c              misc/getopt.c          \
diff --git a/mingw-w64-crt/misc/fedisableexcept.c 
b/mingw-w64-crt/misc/fedisableexcept.c
new file mode 100644
index 000000000000..29b905e3d84f
--- /dev/null
+++ b/mingw-w64-crt/misc/fedisableexcept.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <fenv.h>
+#include <internal.h>
+
+int __cdecl fedisableexcept(int excepts)
+{
+  return __mingw_controlfp(excepts & FE_ALL_EXCEPT, excepts & FE_ALL_EXCEPT) & 
FE_ALL_EXCEPT;
+}
diff --git a/mingw-w64-crt/misc/feenableexcept.c 
b/mingw-w64-crt/misc/feenableexcept.c
new file mode 100644
index 000000000000..8a40bd5fdc6b
--- /dev/null
+++ b/mingw-w64-crt/misc/feenableexcept.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <fenv.h>
+#include <internal.h>
+
+int __cdecl feenableexcept(int excepts)
+{
+  return __mingw_controlfp(0, excepts & FE_ALL_EXCEPT) & FE_ALL_EXCEPT;
+}
diff --git a/mingw-w64-crt/misc/fegetexcept.c b/mingw-w64-crt/misc/fegetexcept.c
new file mode 100644
index 000000000000..ced9f50b0e65
--- /dev/null
+++ b/mingw-w64-crt/misc/fegetexcept.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <fenv.h>
+#include <internal.h>
+
+int __cdecl fegetexcept(void)
+{
+  return __mingw_controlfp(0, 0) & FE_ALL_EXCEPT;
+}
diff --git a/mingw-w64-headers/crt/fenv.h b/mingw-w64-headers/crt/fenv.h
index b4ab0718cdf7..21d6fef0b72b 100644
--- a/mingw-w64-headers/crt/fenv.h
+++ b/mingw-w64-headers/crt/fenv.h
@@ -99,6 +99,12 @@ extern int __cdecl fesetenv(const fenv_t * );
 extern int __cdecl feupdateenv(const fenv_t *);
 extern int __cdecl feholdexcept(fenv_t *);
 
+#ifdef _GNU_SOURCE
+extern int __cdecl feenableexcept(int excepts);
+extern int __cdecl fedisableexcept(int excepts);
+extern int __cdecl fegetexcept(void);
+#endif
+
 #ifdef __cplusplus
 }
 #endif
-- 
2.20.1



_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to