From b9d8c47472d4acbd6b1be59c3731ecbfb790b5ce Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 5 Sep 2018 11:53:35 +0000 Subject: [PATCH] Move float128 inlines from sysdeps/generic/math_private.h to include/math.h. Continuing the cleanup of math_private.h, with a view to it becoming the header for the APIs defined therein and not also a header with inline variants of math.h APIs, this patch moves inline definitions of __isinff128 and fabsf128 to include/math.h, so that any users of math.h in glibc automatically get the optimized functions rather than quietly missing them if they do not also include math_private.h. Tested for x86_64 and x86, and with build-many-glibcs.py with GCC 6. There are changes to installed stripped libc.so on configurations with distinct _Float128, because of __printf_fp_l code that now gets the __isinff128 inline where previously it called the out-of-line function because of the lack of a math_private.h call. It seems appropriate that this code does get the inline (as it would automatically with GCC 7 and later when the built-in function is used) rather than being the only place in glibc that does not. * sysdeps/generic/math_private.h [__HAVE_DISTINCT_FLOAT128 && !__GNUC_PREREQ (7, 0)] (__isinff128): Move this inline function .... [__HAVE_DISTINCT_FLOAT128] (fabsf128): And this one .... * include/math.h [!_ISOMAC]: To here.... --- ChangeLog | 8 ++++++++ include/math.h | 23 +++++++++++++++++++++++ sysdeps/generic/math_private.h | 23 ----------------------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index 70ebfcea18..4fd46f0278 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2018-09-05 Joseph Myers + + * sysdeps/generic/math_private.h + [__HAVE_DISTINCT_FLOAT128 && !__GNUC_PREREQ (7, 0)] (__isinff128): + Move this inline function .... + [__HAVE_DISTINCT_FLOAT128] (fabsf128): And this one .... + * include/math.h [!_ISOMAC]: To here.... + 2018-09-04 Joseph Myers * sysdeps/generic/fenv_private.h [FE_ALL_EXCEPT == 0]: Move this diff --git a/include/math.h b/include/math.h index e21d34b868..9ab7aa4403 100644 --- a/include/math.h +++ b/include/math.h @@ -54,6 +54,29 @@ libm_hidden_proto (__expf128) libm_hidden_proto (__expm1f128) # endif +# if __HAVE_DISTINCT_FLOAT128 + +/* __builtin_isinf_sign is broken in GCC < 7 for float128. */ +# if ! __GNUC_PREREQ (7, 0) +# include +extern inline int +__isinff128 (_Float128 x) +{ + int64_t hx, lx; + GET_FLOAT128_WORDS64 (hx, lx, x); + lx |= (hx & 0x7fffffffffffffffLL) ^ 0x7fff000000000000LL; + lx |= -lx; + return ~(lx >> 63) & (hx >> 62); +} +# endif + +extern inline _Float128 +fabsf128 (_Float128 x) +{ + return __builtin_fabsf128 (x); +} +# endif + # if !(defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0) # ifndef NO_MATH_REDIRECT /* Declare sqrt for use within GLIBC. Compilers typically inline sqrt as a diff --git a/sysdeps/generic/math_private.h b/sysdeps/generic/math_private.h index 220367b9de..c79b65fa6e 100644 --- a/sysdeps/generic/math_private.h +++ b/sysdeps/generic/math_private.h @@ -222,29 +222,6 @@ do { \ # undef _Mdouble_ #endif -#if __HAVE_DISTINCT_FLOAT128 - -/* __builtin_isinf_sign is broken in GCC < 7 for float128. */ -# if ! __GNUC_PREREQ (7, 0) -# include -extern inline int -__isinff128 (_Float128 x) -{ - int64_t hx, lx; - GET_FLOAT128_WORDS64 (hx, lx, x); - lx |= (hx & 0x7fffffffffffffffLL) ^ 0x7fff000000000000LL; - lx |= -lx; - return ~(lx >> 63) & (hx >> 62); -} -# endif - -extern inline _Float128 -fabsf128 (_Float128 x) -{ - return __builtin_fabsf128 (x); -} -#endif - /* Prototypes for functions of the IBM Accurate Mathematical Library. */