]> sourceware.org Git - glibc.git/commitdiff
Move fenv.h override inline functions to generic math_private.h.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 1 Feb 2018 20:54:44 +0000 (20:54 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 1 Feb 2018 20:54:44 +0000 (20:54 +0000)
The tile version of math_private.h defines some inline functions for
fenv.h functions, to optimize away internal calls to these functions
that do nothing given no support for floating-point exceptions and
rounding modes.  (Some functions may have error cases for invalid
arguments, but those aren't applicable to the internal calls from
within glibc.)  Other configurations lacking support for exceptions
and rounding modes lack such inline functions.  This patch moves them
to the generic math_private.h, appropriately conditioned, so that all
such configurations can benefit from the.

include/fenv.h is made to check whether there are any non-default
rounding modes; that needs to be done there, rather than later,
because get-rounding-mode.h defines values for otherwise unsupported
FE_* rounding modes.  It also gives an error for FE_TONEAREST
undefined, a case that already did not work for building the glibc
testsuite; the convention has by now been established that all
architectures need to provide a version of bits/fenv.h that at least
defines FE_TONEAREST.

Tested with build-many-glibcs.py.  As expected, installed stripped
shared libraries are unchanged for tile and for architectures
supporting exceptions and rounding modes, but changed for non-tile
architectures not supporting exceptions and rounding modes that
previously lacked this optimization (e.g. Nios II libm.so is about 1kB
smaller).

The optimization is not in fact complete (does not cover feholdexcept
/ __feholdexcept, so a few calls to those remain unnecessarily within
libm even after this patch), but that can be dealt with separately.

* include/fenv.h [!_ISOMAC && !FE_TONEAREST]: Give #error.
[!_ISOMAC] (FE_HAVE_ROUNDING_MODES): New macro.
* sysdeps/generic/math_private.h
[!FE_HAVE_ROUNDING_MODES && FE_ALL_EXCEPT == 0] (fegetenv): New
inline function.
[!FE_HAVE_ROUNDING_MODES && FE_ALL_EXCEPT == 0] (__fegetenv):
Likewise.
[!FE_HAVE_ROUNDING_MODES && FE_ALL_EXCEPT == 0] (fesetenv):
Likewise.
[!FE_HAVE_ROUNDING_MODES && FE_ALL_EXCEPT == 0] (__fesetenv):
Likewise.
[!FE_HAVE_ROUNDING_MODES && FE_ALL_EXCEPT == 0] (feupdateenv):
Likewise.
[!FE_HAVE_ROUNDING_MODES && FE_ALL_EXCEPT == 0] (__feupdateenv):
Likewise.
[!FE_HAVE_ROUNDING_MODES] (fegetround): Likewise.
[!FE_HAVE_ROUNDING_MODES] (__fegetround): Likewise.
[!FE_HAVE_ROUNDING_MODES] (fesetround): Likewise.
[!FE_HAVE_ROUNDING_MODES] (__fesetround): Likewise.
* sysdeps/tile/math_private.h (fegetenv): Remove inline function.
(__fegetenv): Likewise.
(fesetenv): Likewise.
(__fesetenv): Likewise.
(feupdateenv): Likewise.
(__feupdateenv): Likewise.
(fegetround): Likewise.
(__fegetround): Likewise.
(fesetround): Likewise.
(__fesetround): Likewise.

ChangeLog
include/fenv.h
sysdeps/generic/math_private.h
sysdeps/tile/math_private.h

index 4a574f52c3e2239d62435288e59c8eb9340791d3..980c5cbaf347cc091ca6c9100dccc98cde2cd050 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,35 @@
 2018-02-01  Joseph Myers  <joseph@codesourcery.com>
 
+       * include/fenv.h [!_ISOMAC && !FE_TONEAREST]: Give #error.
+       [!_ISOMAC] (FE_HAVE_ROUNDING_MODES): New macro.
+       * sysdeps/generic/math_private.h
+       [!FE_HAVE_ROUNDING_MODES && FE_ALL_EXCEPT == 0] (fegetenv): New
+       inline function.
+       [!FE_HAVE_ROUNDING_MODES && FE_ALL_EXCEPT == 0] (__fegetenv):
+       Likewise.
+       [!FE_HAVE_ROUNDING_MODES && FE_ALL_EXCEPT == 0] (fesetenv):
+       Likewise.
+       [!FE_HAVE_ROUNDING_MODES && FE_ALL_EXCEPT == 0] (__fesetenv):
+       Likewise.
+       [!FE_HAVE_ROUNDING_MODES && FE_ALL_EXCEPT == 0] (feupdateenv):
+       Likewise.
+       [!FE_HAVE_ROUNDING_MODES && FE_ALL_EXCEPT == 0] (__feupdateenv):
+       Likewise.
+       [!FE_HAVE_ROUNDING_MODES] (fegetround): Likewise.
+       [!FE_HAVE_ROUNDING_MODES] (__fegetround): Likewise.
+       [!FE_HAVE_ROUNDING_MODES] (fesetround): Likewise.
+       [!FE_HAVE_ROUNDING_MODES] (__fesetround): Likewise.
+       * sysdeps/tile/math_private.h (fegetenv): Remove inline function.
+       (__fegetenv): Likewise.
+       (fesetenv): Likewise.
+       (__fesetenv): Likewise.
+       (feupdateenv): Likewise.
+       (__feupdateenv): Likewise.
+       (fegetround): Likewise.
+       (__fegetround): Likewise.
+       (fesetround): Likewise.
+       (__fesetround): Likewise.
+
        * sysdeps/generic/math_private.h [FE_ALL_EXCEPT == 0]
        (feraiseexcept): New macro.
        [FE_ALL_EXCEPT == 0] (__feraiseexcept): Likewise.
index de4d46f8b7f506006022b531a1651f4bcdd7b005..76679e1e1837d9b2ea3538df66b4981deaa045cb 100644 (file)
@@ -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
index acfbd9b6ccf49a9799d3195e4807c06d34a9275c..f93cf6927ed7b1d381f7cd0054ef372c9df3d372 100644 (file)
@@ -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_ */
index 6dc43f4228460bbf3a42b55cf0832ef59b06ac79..32b549ff4e4d91c0a725b5c224c6e42c7bbb7821 100644 (file)
@@ -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; })
 
 #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
This page took 0.090453 seconds and 5 git commands to generate.