]> sourceware.org Git - glibc.git/commitdiff
Use round functions not __round functions in glibc libm.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 27 Sep 2018 12:35:23 +0000 (12:35 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 27 Sep 2018 12:35:23 +0000 (12:35 +0000)
Continuing the move to use, within libm, public names for libm
functions that can be inlined as built-in functions on many
architectures, this patch moves calls to __round functions to call the
corresponding round names instead, with asm redirection to __round
when the calls are not inlined.

An additional complication arises in
sysdeps/ieee754/ldbl-128ibm/e_expl.c, where a call to roundl, with the
result converted to int, gets converted by the compiler to call
lroundl in the case of 32-bit long, so resulting in localplt test
failures.  It's logically correct to let the compiler make such an
optimization; an appropriate asm redirection of lroundl to __lroundl
is thus added to that file (it's not needed anywhere else).

Tested for x86_64, and with build-many-glibcs.py.

* include/math.h [!_ISOMAC && !(__FINITE_MATH_ONLY__ &&
__FINITE_MATH_ONLY__ > 0) && !NO_MATH_REDIRECT] (round): Redirect
using MATH_REDIRECT.
* sysdeps/aarch64/fpu/s_round.c: Define NO_MATH_REDIRECT before
header inclusion.
* sysdeps/aarch64/fpu/s_roundf.c: Likewise.
* sysdeps/ieee754/dbl-64/s_round.c: Likewise.
* sysdeps/ieee754/dbl-64/wordsize-64/s_round.c: Likewise.
* sysdeps/ieee754/float128/s_roundf128.c: Likewise.
* sysdeps/ieee754/flt-32/s_roundf.c: Likewise.
* sysdeps/ieee754/ldbl-128/s_roundl.c: Likewise.
* sysdeps/ieee754/ldbl-96/s_roundl.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_round.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_roundf.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_round.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf.c: Likewise.
* sysdeps/riscv/rv64/rvd/s_round.c: Likewise.
* sysdeps/riscv/rvf/s_roundf.c: Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_roundl.c: Likewise.
(round): Redirect to __round.
(__roundl): Call round instead of __round.
* sysdeps/powerpc/fpu/math_private.h [_ARCH_PWR5X] (__round):
Remove macro.
[_ARCH_PWR5X] (__roundf): Likewise.
* sysdeps/ieee754/dbl-64/e_gamma_r.c (gamma_positive): Use round
functions instead of __round variants.
* sysdeps/ieee754/flt-32/e_gammaf_r.c (gammaf_positive): Likewise.
* sysdeps/ieee754/ldbl-128/e_gammal_r.c (gammal_positive):
Likewise.
* sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c (gammal_positive):
Likewise.
* sysdeps/ieee754/ldbl-96/e_gammal_r.c (gammal_positive):
Likewise.
* sysdeps/x86/fpu/powl_helper.c (__powl_helper): Likewise.
* sysdeps/ieee754/ldbl-128ibm/e_expl.c (lroundl): Redirect to
__lroundl.
(__ieee754_expl): Call roundl instead of __roundl.

25 files changed:
ChangeLog
include/math.h
sysdeps/aarch64/fpu/s_round.c
sysdeps/aarch64/fpu/s_roundf.c
sysdeps/ieee754/dbl-64/e_gamma_r.c
sysdeps/ieee754/dbl-64/s_round.c
sysdeps/ieee754/dbl-64/wordsize-64/s_round.c
sysdeps/ieee754/float128/s_roundf128.c
sysdeps/ieee754/flt-32/e_gammaf_r.c
sysdeps/ieee754/flt-32/s_roundf.c
sysdeps/ieee754/ldbl-128/e_gammal_r.c
sysdeps/ieee754/ldbl-128/s_roundl.c
sysdeps/ieee754/ldbl-128ibm/e_expl.c
sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c
sysdeps/ieee754/ldbl-128ibm/s_roundl.c
sysdeps/ieee754/ldbl-96/e_gammal_r.c
sysdeps/ieee754/ldbl-96/s_roundl.c
sysdeps/powerpc/fpu/math_private.h
sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_round.c
sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_roundf.c
sysdeps/powerpc/powerpc64/fpu/multiarch/s_round.c
sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf.c
sysdeps/riscv/rv64/rvd/s_round.c
sysdeps/riscv/rvf/s_roundf.c
sysdeps/x86/fpu/powl_helper.c

index a5a64da8b8dd80f83dac3be96f013f2bcc08e999..4e438c88c4f9bfce1f411eebabc0adb29fd8ed23 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,43 @@
+2018-09-27  Joseph Myers  <joseph@codesourcery.com>
+
+       * include/math.h [!_ISOMAC && !(__FINITE_MATH_ONLY__ &&
+       __FINITE_MATH_ONLY__ > 0) && !NO_MATH_REDIRECT] (round): Redirect
+       using MATH_REDIRECT.
+       * sysdeps/aarch64/fpu/s_round.c: Define NO_MATH_REDIRECT before
+       header inclusion.
+       * sysdeps/aarch64/fpu/s_roundf.c: Likewise.
+       * sysdeps/ieee754/dbl-64/s_round.c: Likewise.
+       * sysdeps/ieee754/dbl-64/wordsize-64/s_round.c: Likewise.
+       * sysdeps/ieee754/float128/s_roundf128.c: Likewise.
+       * sysdeps/ieee754/flt-32/s_roundf.c: Likewise.
+       * sysdeps/ieee754/ldbl-128/s_roundl.c: Likewise.
+       * sysdeps/ieee754/ldbl-96/s_roundl.c: Likewise.
+       * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_round.c: Likewise.
+       * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_roundf.c: Likewise.
+       * sysdeps/powerpc/powerpc64/fpu/multiarch/s_round.c: Likewise.
+       * sysdeps/powerpc/powerpc64/fpu/multiarch/s_roundf.c: Likewise.
+       * sysdeps/riscv/rv64/rvd/s_round.c: Likewise.
+       * sysdeps/riscv/rvf/s_roundf.c: Likewise.
+       * sysdeps/ieee754/ldbl-128ibm/s_roundl.c: Likewise.
+       (round): Redirect to __round.
+       (__roundl): Call round instead of __round.
+       * sysdeps/powerpc/fpu/math_private.h [_ARCH_PWR5X] (__round):
+       Remove macro.
+       [_ARCH_PWR5X] (__roundf): Likewise.
+       * sysdeps/ieee754/dbl-64/e_gamma_r.c (gamma_positive): Use round
+       functions instead of __round variants.
+       * sysdeps/ieee754/flt-32/e_gammaf_r.c (gammaf_positive): Likewise.
+       * sysdeps/ieee754/ldbl-128/e_gammal_r.c (gammal_positive):
+       Likewise.
+       * sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c (gammal_positive):
+       Likewise.
+       * sysdeps/ieee754/ldbl-96/e_gammal_r.c (gammal_positive):
+       Likewise.
+       * sysdeps/x86/fpu/powl_helper.c (__powl_helper): Likewise.
+       * sysdeps/ieee754/ldbl-128ibm/e_expl.c (lroundl): Redirect to
+       __lroundl.
+       (__ieee754_expl): Call roundl instead of __roundl.
+
 2018-09-27  Andreas Schwab  <schwab@suse.de>
 
        [BZ #23717]
index f8482afc4449ee55b0b10210394eedba1f8e1b77..ca9a1f0cd626d58dcd3612b830d3e438fa6eb093 100644 (file)
@@ -105,6 +105,7 @@ MATH_REDIRECT (ceil, "__", MATH_REDIRECT_UNARY_ARGS)
 MATH_REDIRECT (floor, "__", MATH_REDIRECT_UNARY_ARGS)
 MATH_REDIRECT (rint, "__", MATH_REDIRECT_UNARY_ARGS)
 MATH_REDIRECT (trunc, "__", MATH_REDIRECT_UNARY_ARGS)
+MATH_REDIRECT (round, "__", MATH_REDIRECT_UNARY_ARGS)
 #  endif
 # endif
 
index 275b00f31836c744ee5bd7a4f70bb83cb2edea11..ae020d3afa56607563a38bc486e2b93256f49d37 100644 (file)
@@ -16,6 +16,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 #include <libm-alias-double.h>
 
index 201ffc54db244cff92557d05c44a511d6e235412..f87609b207173700efbec79373b53778f095cecf 100644 (file)
@@ -16,6 +16,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 #include <libm-alias-float.h>
 
index 2cfe6d640ed2cabb018d0a926f64687bbbc8eaf7..7707c062cba54dd9588bb7433e25b9fe41339e1c 100644 (file)
@@ -88,7 +88,7 @@ gamma_positive (double x, int *exp2_adj)
         starting by computing pow (X_ADJ, X_ADJ) with a power of 2
         factored out.  */
       double exp_adj = -eps;
-      double x_adj_int = __round (x_adj);
+      double x_adj_int = round (x_adj);
       double x_adj_frac = x_adj - x_adj_int;
       int x_adj_log2;
       double x_adj_mant = __frexp (x_adj, &x_adj_log2);
index fa9e83196e22dc5c723ce5edd477e5f52d4f4f8f..012b6dc43d60ae5380c12f929a41307deefc9316 100644 (file)
@@ -17,6 +17,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 
 #include <math_private.h>
index 3323621ce320d8ab1de139d2f99195f2807a0b8f..2dfd1ed3a978254d3c29137c01d45100a5f449dd 100644 (file)
@@ -17,6 +17,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 
 #include <math_private.h>
index 1eb36f2a5e415255869c284bb9184e8b9ee55dfe..d9f6fa47540a9a92f5ca84e3f6b32566c346b626 100644 (file)
@@ -1,2 +1,3 @@
+#define NO_MATH_REDIRECT
 #include <float128_private.h>
 #include "../ldbl-128/s_roundl.c"
index 7d9a6cbac466540f93ef1080af40d64803f66aaf..6a9e28a3096fbe1df8357233e76e1da33d17e218 100644 (file)
@@ -81,7 +81,7 @@ gammaf_positive (float x, int *exp2_adj)
         starting by computing pow (X_ADJ, X_ADJ) with a power of 2
         factored out.  */
       float exp_adj = -eps;
-      float x_adj_int = __roundf (x_adj);
+      float x_adj_int = roundf (x_adj);
       float x_adj_frac = x_adj - x_adj_int;
       int x_adj_log2;
       float x_adj_mant = __frexpf (x_adj, &x_adj_log2);
index 7c95125d9c4cd48f3c5386e0dbb91fcd771fc5e3..a411de69aa1ce5e47bc9ef18943f413d2b9610be 100644 (file)
@@ -17,6 +17,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 
 #include <math_private.h>
index 184798fb54eb9bed5de02f6cdf90bb327311a8f9..837395e1fd9408291413e10b19ef188c8c804add 100644 (file)
@@ -96,7 +96,7 @@ gammal_positive (_Float128 x, int *exp2_adj)
         starting by computing pow (X_ADJ, X_ADJ) with a power of 2
         factored out.  */
       _Float128 exp_adj = -eps;
-      _Float128 x_adj_int = __roundl (x_adj);
+      _Float128 x_adj_int = roundl (x_adj);
       _Float128 x_adj_frac = x_adj - x_adj_int;
       int x_adj_log2;
       _Float128 x_adj_mant = __frexpl (x_adj, &x_adj_log2);
index 22789cedf336f937b517ef4b455011456407b319..4f0184fcacbc9558bff92942232f62baf378f1d4 100644 (file)
@@ -18,6 +18,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 
 #include <math_private.h>
index a5024559dcf693f48a2d358ddf8165624edd4c46..0c33d880104aed7b945a00071b6840b186a5c326 100644 (file)
@@ -134,6 +134,11 @@ static const long double C[] = {
  1.98412698413981650382436541785404286E-04L,
 };
 
+/* Avoid local PLT entry use from (int) roundl (...) being converted
+   to a call to lroundl in the case of 32-bit long and roundl not
+   inlined.  */
+long int lroundl (long double) asm ("__lroundl");
+
 long double
 __ieee754_expl (long double x)
 {
@@ -149,15 +154,15 @@ __ieee754_expl (long double x)
 
       SET_RESTORE_ROUND (FE_TONEAREST);
 
-      n = __roundl (x*M_1_LN2);
+      n = roundl (x*M_1_LN2);
       x = x-n*M_LN2_0;
       xl = n*M_LN2_1;
 
-      tval1 = __roundl (x*TWO8);
+      tval1 = roundl (x*TWO8);
       x -= __expl_table[T_EXPL_ARG1+2*tval1];
       xl -= __expl_table[T_EXPL_ARG1+2*tval1+1];
 
-      tval2 = __roundl (x*TWO15);
+      tval2 = roundl (x*TWO15);
       x -= __expl_table[T_EXPL_ARG2+2*tval2];
       xl -= __expl_table[T_EXPL_ARG2+2*tval2+1];
 
index 36801213d402cd13e4e7ff01f228b10f8055525d..6361d3542889dc4fcf4ef79bb72837fb69f6b462 100644 (file)
@@ -95,7 +95,7 @@ gammal_positive (long double x, int *exp2_adj)
         starting by computing pow (X_ADJ, X_ADJ) with a power of 2
         factored out.  */
       long double exp_adj = -eps;
-      long double x_adj_int = __roundl (x_adj);
+      long double x_adj_int = roundl (x_adj);
       long double x_adj_frac = x_adj - x_adj_int;
       int x_adj_log2;
       long double x_adj_mant = __frexpl (x_adj, &x_adj_log2);
index 94a62dcd6cbd3f6acf6689afa41cc0232c505829..156be267a079cbfe5664760229021d1428e0a941 100644 (file)
 /* This has been coded in assembler because GCC makes such a mess of it
    when it's coded in C.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 #include <math_private.h>
 #include <math_ldbl_opt.h>
 #include <float.h>
 #include <ieee754.h>
 
+double round (double) asm ("__round");
+
 
 long double
 __roundl (long double x)
@@ -39,7 +42,7 @@ __roundl (long double x)
                        && __builtin_isless (__builtin_fabs (xh),
                                             __builtin_inf ()), 1))
     {
-      hi = __round (xh);
+      hi = round (xh);
       if (hi != xh)
        {
          /* The high part is not an integer; the low part only
@@ -62,7 +65,7 @@ __roundl (long double x)
       else
        {
          /* The high part is a nonzero integer.  */
-         lo = __round (xl);
+         lo = round (xl);
          if (fabs (lo - xl) == 0.5)
            {
              if (xh > 0 && xl < 0)
index b0970335b9c8b3242c317b5b189fa08ac452377f..49428eba445db2d886e9bb961c426b3aaaff8692 100644 (file)
@@ -89,7 +89,7 @@ gammal_positive (long double x, int *exp2_adj)
         starting by computing pow (X_ADJ, X_ADJ) with a power of 2
         factored out.  */
       long double exp_adj = -eps;
-      long double x_adj_int = __roundl (x_adj);
+      long double x_adj_int = roundl (x_adj);
       long double x_adj_frac = x_adj - x_adj_int;
       int x_adj_log2;
       long double x_adj_mant = __frexpl (x_adj, &x_adj_log2);
index c5c304cb2eea9bf65485d78c4b45d392032a1fe4..1eeed0195dbdf1cd1d1c5a17fcbc3368829e220f 100644 (file)
@@ -17,6 +17,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 
 #include <math_private.h>
index 7f2acbb83305a85a2c2080fa64ce22f5c5447f02..2ed56fa2ab3d4603da470f413f8d4a8ff59c2e34 100644 (file)
@@ -35,28 +35,4 @@ __ieee754_sqrtf128 (_Float128 __x)
 }
 #endif
 
-#if defined _ARCH_PWR5X
-
-# ifndef __round
-#  define __round(x)                   \
-    ({ double __z;                     \
-      __asm __volatile (               \
-       "       frin %0,%1\n"           \
-               : "=f" (__z)            \
-               : "f" (x));             \
-     __z; })
-# endif
-# ifndef __roundf
-#  define __roundf(x)                  \
-    ({ float __z;                      \
-     __asm __volatile (                        \
-       "       frin %0,%1\n"           \
-       "       frsp %0,%0\n"           \
-               : "=f" (__z)            \
-               : "f" (x));             \
-     __z; })
-# endif
-
-#endif /* defined _ARCH_PWR5X */
-
 #endif /* _PPC_MATH_PRIVATE_H_ */
index 65e78013157b6afcab6ebde9b22bac16fcf9e455..e5b27daf811870024a68510c7dfa2187eed687cd 100644 (file)
@@ -16,6 +16,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 #include <math_ldbl_opt.h>
 #include <shlib-compat.h>
index 0d923a2ca62cfba3b78765bda40fc677fe6c3b6a..659a989a702a35cb6939d296959e3e7cb742715f 100644 (file)
@@ -16,6 +16,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 #include <math_ldbl_opt.h>
 #include <shlib-compat.h>
index bfa4d8119ed133341a586d9feee02c7fb9b8cd35..cd9291bf745f14067d442aef8300c4c98ac5a782 100644 (file)
@@ -16,6 +16,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 #include <math_ldbl_opt.h>
 #include <shlib-compat.h>
index 3d7715684611afe3d93476658239206a74148ada..bd8b4a4cf92a5806bea7eaba1e1e1e79c8e88ba2 100644 (file)
@@ -16,6 +16,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 #include <math_ldbl_opt.h>
 #include <shlib-compat.h>
index b3e5bc4f0d24ab4c86d9b814752335c8959157b6..e375d4d0625bf4b02d342efe25076f22435c542a 100644 (file)
@@ -16,6 +16,7 @@
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 #include <math_private.h>
 #include <fenv_private.h>
index 87839de3fbdd79b178a51e0ff0cc83772313f5e4..685a8e3bebe42f67a6b2b411dcc2d9b64cbf7f96 100644 (file)
@@ -16,6 +16,7 @@
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 #include <math_private.h>
 #include <fenv_private.h>
index 651eedd7920a17e5e023f3ac50b50f9d2d7ce0ec..469fd0fb186d05887f0c036df4b60de2d54c01f9 100644 (file)
@@ -216,7 +216,7 @@ __powl_helper (long double x, long double y)
 
   /* Split the base-2 logarithm of the result into integer and
      fractional parts.  */
-  long double log2_res_int = __roundl (log2_res_hi);
+  long double log2_res_int = roundl (log2_res_hi);
   long double log2_res_frac = log2_res_hi - log2_res_int + log2_res_lo;
   /* If the integer part is very large, the computed fractional part
      may be outside the valid range for f2xm1.  */
This page took 0.13533 seconds and 5 git commands to generate.