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