Message ID | 20190329133529.22523-13-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | powerpc floating-point optimization refactor | expand |
On Fri, Mar 29 2019, Adhemerval Zanella wrote: > > - The resulting binary difference on 32 bits architecture is minimum > for the non hotspot symbol. I don't actually understand what the impact on 32-bits platforms would be, so I can't comment on that, but, if this patch turns out to be problematic for 32-bits, we could patch sysdeps/ieee754/ldbl-opt files to be mindful of __WORDSIZE and selectively include files from sysdeps/ieee754/dbl-64 or sysdeps/ieee754/dbl-64/wordsize-64 (see attached patch for an explanation of what I mean). My point in raising this is that the subsequent patch [1] benefits from this current patch (or, alternatively, from the attached patch, since they have the same outcame, as expected). So, if this patch gets objections we could go with the alternative. [1] https://sourceware.org/ml/libc-alpha/2019-03/msg00674.html diff --git a/sysdeps/ieee754/ldbl-opt/s_finite.c b/sysdeps/ieee754/ldbl-opt/s_finite.c index 7d3ab0068d..85ad5e625a 100644 --- a/sysdeps/ieee754/ldbl-opt/s_finite.c +++ b/sysdeps/ieee754/ldbl-opt/s_finite.c @@ -1,5 +1,10 @@ +#include <limits.h> #include <math_ldbl_opt.h> +#if __WORDSIZE == 64 +#include <sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c> +#else #include <sysdeps/ieee754/dbl-64/s_finite.c> +#endif weak_alias (__finite, ___finite) #if IS_IN (libm) # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1) diff --git a/sysdeps/ieee754/ldbl-opt/s_isinf.c b/sysdeps/ieee754/ldbl-opt/s_isinf.c index 1f760a0320..da5dc01601 100644 --- a/sysdeps/ieee754/ldbl-opt/s_isinf.c +++ b/sysdeps/ieee754/ldbl-opt/s_isinf.c @@ -1,5 +1,10 @@ +#include <limits.h> #include <math_ldbl_opt.h> +#if __WORDSIZE == 64 +#include <sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c> +#else #include <sysdeps/ieee754/dbl-64/s_isinf.c> +#endif #if !IS_IN (libm) # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0); diff --git a/sysdeps/ieee754/ldbl-opt/s_isnan.c b/sysdeps/ieee754/ldbl-opt/s_isnan.c index 33f57f1955..99ee75ce34 100644 --- a/sysdeps/ieee754/ldbl-opt/s_isnan.c +++ b/sysdeps/ieee754/ldbl-opt/s_isnan.c @@ -1,5 +1,10 @@ +#include <limits.h> #include <math_ldbl_opt.h> +#if __WORDSIZE == 64 +#include <sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c> +#else #include <sysdeps/ieee754/dbl-64/s_isnan.c> +#endif #if !IS_IN (libm) # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0);
diff --git a/sysdeps/ieee754/dbl-64/s_isnan.c b/sysdeps/ieee754/dbl-64/s_isnan.c index 82723eeb8a..1f1535dea3 100644 --- a/sysdeps/ieee754/dbl-64/s_isnan.c +++ b/sysdeps/ieee754/dbl-64/s_isnan.c @@ -10,10 +10,6 @@ * ==================================================== */ -#if defined(LIBM_SCCS) && !defined(lint) -static char rcsid[] = "$NetBSD: s_isnan.c,v 1.8 1995/05/10 20:47:36 jtc Exp $"; -#endif - /* * isnan(x) returns 1 is x is nan, else 0; * no branching! @@ -23,17 +19,16 @@ static char rcsid[] = "$NetBSD: s_isnan.c,v 1.8 1995/05/10 20:47:36 jtc Exp $"; #include <math_private.h> #include <ldbl-classify-compat.h> #include <shlib-compat.h> +#include <stdint.h> -#undef __isnan int __isnan (double x) { - int32_t hx, lx; - EXTRACT_WORDS (hx, lx, x); - hx &= 0x7fffffff; - hx |= (uint32_t) (lx | (-lx)) >> 31; - hx = 0x7ff00000 - hx; - return (int) (((uint32_t) hx) >> 31); + int64_t hx; + EXTRACT_WORDS64 (hx, x); + hx &= UINT64_C (0x7fffffffffffffff); + hx = UINT64_C (0x7ff0000000000000) - hx; + return (int)(((uint64_t)hx)>>63); } hidden_def (__isnan) weak_alias (__isnan, isnan) diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c deleted file mode 100644 index cd805d157b..0000000000 --- a/sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c +++ /dev/null @@ -1,40 +0,0 @@ -/* @(#)s_isnan.c 5.1 93/09/24 */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * isnan(x) returns 1 is x is nan, else 0; - * no branching! - */ - -#include <math.h> -#include <math_private.h> -#include <ldbl-classify-compat.h> -#include <shlib-compat.h> -#include <stdint.h> - -#undef __isnan -int __isnan(double x) -{ - int64_t hx; - EXTRACT_WORDS64(hx,x); - hx &= UINT64_C(0x7fffffffffffffff); - hx = UINT64_C(0x7ff0000000000000) - hx; - return (int)(((uint64_t)hx)>>63); -} -hidden_def (__isnan) -weak_alias (__isnan, isnan) -#ifdef NO_LONG_DOUBLE -# if LDBL_CLASSIFY_COMPAT && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_23) -compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); -# endif -weak_alias (__isnan, isnanl) -#endif