about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog31
-rw-r--r--sysdeps/mips/bits/fenv.h42
-rw-r--r--sysdeps/mips/mips64/sfp-machine.h9
-rw-r--r--sysdeps/mips/nofpu/fesetenv.c8
-rw-r--r--sysdeps/mips/nofpu/feupdateenv.c8
5 files changed, 82 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index d8994e7eaa..b4aefd64da 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,34 @@
+2018-08-02  Joseph Myers  <joseph@codesourcery.com>
+
+	[BZ #23479]
+	* sysdeps/mips/bits/fenv.h (FE_INEXACT): Define only if
+	[__mips_hard_float].
+	(FE_UNDERFLOW): Likewise.
+	(FE_OVERFLOW): Likewise.
+	(FE_DIVBYZERO): Likewise.
+	(FE_INVALID): Likewise.
+	(FE_ALL_EXCEPT): Define to 0 if [!__mips_hard_float].
+	(FE_TOWARDZERO): Define only if [__mips_hard_float].
+	(FE_UPWARD): Likewise.
+	(FE_DOWNWARD): Likewise.
+	(__FE_UNDEFINED): Define if [!__mips_hard_float]
+	(FE_NOMASK_ENV): Define only if [__mips_hard_float].
+	* sysdeps/mips/mips64/sfp-machine.h (_FP_DECL_EX): Define only if
+	[__mips_hard_float].
+	(FP_ROUNDMODE): Likewise.
+	(FP_RND_NEAREST): Likewise.
+	(FP_RND_ZERO): Likewise.
+	(FP_RND_PINF): Likewise.
+	(FP_RND_MINF): Likewise.
+	(FP_EX_INVALID): Likewise.
+	(FP_EX_OVERFLOW): Likewise.
+	(FP_EX_UNDERFLOW): Likewise.
+	(FP_EX_DIVZERO): Likewise.
+	(FP_EX_INEXACT): Likewise.
+	(FP_INIT_ROUNDMODE): Likewise.
+	* sysdeps/mips/nofpu/fesetenv.c: New file.
+	* sysdeps/mips/nofpu/feupdateenv.c: Likewise.
+
 2018-08-01  Joseph Myers  <joseph@codesourcery.com>
 
 	* math/test-misc.c (do_test) [LDBL_MANT_DIG > DBL_MANT_DIG]: Make
diff --git a/sysdeps/mips/bits/fenv.h b/sysdeps/mips/bits/fenv.h
index 37d0a9e64d..767595d5a7 100644
--- a/sysdeps/mips/bits/fenv.h
+++ b/sysdeps/mips/bits/fenv.h
@@ -20,28 +20,30 @@
 #endif
 
 
+#ifdef __mips_hard_float
+
 /* Define bits representing the exception.  We use the bit positions
    of the appropriate bits in the FPU control word.  */
 enum
   {
     FE_INEXACT =
-#define FE_INEXACT	0x04
+# define FE_INEXACT	0x04
       FE_INEXACT,
     FE_UNDERFLOW =
-#define FE_UNDERFLOW	0x08
+# define FE_UNDERFLOW	0x08
       FE_UNDERFLOW,
     FE_OVERFLOW =
-#define FE_OVERFLOW	0x10
+# define FE_OVERFLOW	0x10
       FE_OVERFLOW,
     FE_DIVBYZERO =
-#define FE_DIVBYZERO	0x20
+# define FE_DIVBYZERO	0x20
       FE_DIVBYZERO,
     FE_INVALID =
-#define FE_INVALID	0x40
+# define FE_INVALID	0x40
       FE_INVALID,
   };
 
-#define FE_ALL_EXCEPT \
+# define FE_ALL_EXCEPT \
 	(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
 
 /* The MIPS FPU supports all of the four defined rounding modes.  We
@@ -50,19 +52,37 @@ enum
 enum
   {
     FE_TONEAREST =
-#define FE_TONEAREST	0x0
+# define FE_TONEAREST	0x0
       FE_TONEAREST,
     FE_TOWARDZERO =
-#define FE_TOWARDZERO	0x1
+# define FE_TOWARDZERO	0x1
       FE_TOWARDZERO,
     FE_UPWARD =
-#define FE_UPWARD	0x2
+# define FE_UPWARD	0x2
       FE_UPWARD,
     FE_DOWNWARD =
-#define FE_DOWNWARD	0x3
+# define FE_DOWNWARD	0x3
       FE_DOWNWARD
   };
 
+#else
+
+/* In the soft-float case, only rounding to nearest is supported, with
+   no exceptions.  */
+
+enum
+  {
+    __FE_UNDEFINED = -1,
+
+    FE_TONEAREST =
+# define FE_TONEAREST	0x0
+      FE_TONEAREST
+  };
+
+# define FE_ALL_EXCEPT 0
+
+#endif
+
 
 /* Type representing exception flags.  */
 typedef unsigned short int fexcept_t;
@@ -79,7 +99,7 @@ fenv_t;
 /* If the default argument is used we use this value.  */
 #define FE_DFL_ENV	((const fenv_t *) -1)
 
-#ifdef __USE_GNU
+#if defined __USE_GNU && defined __mips_hard_float
 /* Floating-point environment where none of the exception is masked.  */
 # define FE_NOMASK_ENV  ((const fenv_t *) -2)
 #endif
diff --git a/sysdeps/mips/mips64/sfp-machine.h b/sysdeps/mips/mips64/sfp-machine.h
index 35cc4ddeb1..c769ee81f6 100644
--- a/sysdeps/mips/mips64/sfp-machine.h
+++ b/sysdeps/mips/mips64/sfp-machine.h
@@ -74,6 +74,10 @@
   } while (0)
 #endif
 
+#define _FP_TININESS_AFTER_ROUNDING 1
+
+#ifdef __mips_hard_float
+
 #define _FP_DECL_EX		fpu_control_t _fcw
 
 #define FP_ROUNDMODE		(_fcw & 0x3)
@@ -89,9 +93,6 @@
 #define FP_EX_DIVZERO		FE_DIVBYZERO
 #define FP_EX_INEXACT		FE_INEXACT
 
-#define _FP_TININESS_AFTER_ROUNDING 1
-
-#ifdef __mips_hard_float
 #define FP_INIT_ROUNDMODE			\
 do {						\
   _FPU_GETCW (_fcw);				\
@@ -103,6 +104,4 @@ do {						\
     _FPU_SETCW (_fcw | _fex | (_fex << 10));	\
 } while (0)
 #define FP_TRAPPING_EXCEPTIONS ((_fcw >> 5) & 0x7c)
-#else
-#define FP_INIT_ROUNDMODE	_fcw = FP_RND_NEAREST
 #endif
diff --git a/sysdeps/mips/nofpu/fesetenv.c b/sysdeps/mips/nofpu/fesetenv.c
new file mode 100644
index 0000000000..4667e76629
--- /dev/null
+++ b/sysdeps/mips/nofpu/fesetenv.c
@@ -0,0 +1,8 @@
+/* MIPS bits/fenv.h used to define exception macros for soft-float
+   despite that not supporting exceptions.  Ensure use of the old
+   FE_NOMASK_ENV value still produces errors (see bug 17088).  */
+#include <fenv.h>
+#undef FE_ALL_EXCEPT
+#define FE_ALL_EXCEPT 0x7c
+#define FE_NOMASK_ENV ((const fenv_t *) -2)
+#include <math/fesetenv.c>
diff --git a/sysdeps/mips/nofpu/feupdateenv.c b/sysdeps/mips/nofpu/feupdateenv.c
new file mode 100644
index 0000000000..9a7e316565
--- /dev/null
+++ b/sysdeps/mips/nofpu/feupdateenv.c
@@ -0,0 +1,8 @@
+/* MIPS bits/fenv.h used to define exception macros for soft-float
+   despite that not supporting exceptions.  Ensure use of the old
+   FE_NOMASK_ENV value still produces errors (see bug 17088).  */
+#include <fenv.h>
+#undef FE_ALL_EXCEPT
+#define FE_ALL_EXCEPT 0x7c
+#define FE_NOMASK_ENV ((const fenv_t *) -2)
+#include <math/feupdateenv.c>