Use round functions not __round functions in glibc libm.

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.
This commit is contained in:
Joseph Myers 2018-09-27 12:35:23 +00:00
parent f841c97e51
commit 9755bc4686
25 changed files with 74 additions and 35 deletions

View File

@ -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]

View 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

View 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>

View 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>

View 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);

View 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>

View 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>

View File

@ -1,2 +1,3 @@
#define NO_MATH_REDIRECT
#include <float128_private.h>
#include "../ldbl-128/s_roundl.c"

View 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);

View 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>

View 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);

View 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>

View 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];

View 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);

View File

@ -20,12 +20,15 @@
/* 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)

View 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);

View 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>

View 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_ */

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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. */