+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
#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
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;
/* 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
} 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)
#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); \
_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
--- /dev/null
+/* 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>
--- /dev/null
+/* 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>