@@ -42,6 +42,21 @@ struct rm_ctx
fenv_t env;
bool updated_status;
};
+
+/* Track whether rounding mode macros were defined, since
+ get-rounding-mode.h may define default versions if they weren't.
+ FE_TONEAREST must always be defined (even if no changes of rounding
+ mode are supported, glibc requires it to be defined to represent
+ the default rounding mode). */
+# ifndef FE_TONEAREST
+# error "FE_TONEAREST not defined"
+# endif
+# if defined FE_DOWNWARD || defined FE_TOWARDZERO || defined FE_UPWARD
+# define FE_HAVE_ROUNDING_MODES 1
+# else
+# define FE_HAVE_ROUNDING_MODES 0
+# endif
+
#endif
#endif
@@ -654,4 +654,72 @@ libc_feresetround_noex_ctx (struct rm_ctx *ctx)
# define __feraiseexcept(excepts) ((void) 0)
#endif
+/* Similarly, most <fenv.h> functions have trivial implementations in
+ the absence of support for floating-point exceptions and rounding
+ modes. */
+
+#if !FE_HAVE_ROUNDING_MODES
+# if FE_ALL_EXCEPT == 0
+extern inline int
+fegetenv (fenv_t *__e)
+{
+ return 0;
+}
+
+extern inline int
+__fegetenv (fenv_t *__e)
+{
+ return 0;
+}
+
+extern inline int
+fesetenv (const fenv_t *__e)
+{
+ return 0;
+}
+
+extern inline int
+__fesetenv (const fenv_t *__e)
+{
+ return 0;
+}
+
+extern inline int
+feupdateenv (const fenv_t *__e)
+{
+ return 0;
+}
+
+extern inline int
+__feupdateenv (const fenv_t *__e)
+{
+ return 0;
+}
+# endif
+
+extern inline int
+fegetround (void)
+{
+ return FE_TONEAREST;
+}
+
+extern inline int
+__fegetround (void)
+{
+ return FE_TONEAREST;
+}
+
+extern inline int
+fesetround (int __d)
+{
+ return 0;
+}
+
+extern inline int
+__fesetround (int __d)
+{
+ return 0;
+}
+#endif
+
#endif /* _MATH_PRIVATE_H_ */
@@ -15,9 +15,7 @@
success in every case.
The overrides for libc_ functions must happen before we include
- the generic math_private.h, and the overrides for regular
- <fenv.h> functions must happen afterwards, to avoid clashing with
- the declarations of those functions. */
+ the generic math_private.h. */
#define libc_fesetround(rnd) ({ 0; })
#define libc_fetestexcept(exc) ({ 0; })
@@ -26,15 +24,4 @@
#include_next <math_private.h>
-extern inline int fegetenv (fenv_t *__e) { return 0; }
-extern inline int __fegetenv (fenv_t *__e) { return 0; }
-extern inline int fesetenv (const fenv_t *__e) { return 0; }
-extern inline int __fesetenv (const fenv_t *__e) { return 0; }
-extern inline int feupdateenv (const fenv_t *__e) { return 0; }
-extern inline int __feupdateenv (const fenv_t *__e) { return 0; }
-extern inline int fegetround (void) { return FE_TONEAREST; }
-extern inline int __fegetround (void) { return FE_TONEAREST; }
-extern inline int fesetround (int __d) { return 0; }
-extern inline int __fesetround (int __d) { return 0; }
-
#endif