diff options
author | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2015-01-27 13:16:39 -0500 |
---|---|---|
committer | Aurelien Jarno <aurelien@aurel32.net> | 2016-11-21 17:13:40 +0100 |
commit | a0b2d5b252477b6bc374390c14c3c8ed6aae420c (patch) | |
tree | 871954fbfb4779beace3db6f3fb6a1d57c33dca0 | |
parent | 7a609588a02281638e9a0cb57bed18966806349a (diff) | |
download | glibc-a0b2d5b252477b6bc374390c14c3c8ed6aae420c.zip glibc-a0b2d5b252477b6bc374390c14c3c8ed6aae420c.tar.gz glibc-a0b2d5b252477b6bc374390c14c3c8ed6aae420c.tar.bz2 |
powerpc: Fix fsqrt build in libm [BZ#16576]
Some powerpc64 processors (e5500 core for instance) does not provide the
fsqrt instruction, however current check to use in math_private.h is
__WORDSIZE and _ARCH_PWR4 (ISA 2.02). This is patch change it to use
the compiler flag _ARCH_PPCSQ (which is the same condition GCC uses to
decide whether to generate fsqrt instruction).
It fixes BZ#16576.
(cherry picked from commit 08cee2a464f614a6d4275b5af6c52481f1aa16e6)
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | NEWS | 10 | ||||
-rw-r--r-- | sysdeps/powerpc/fpu/e_sqrt.c | 17 | ||||
-rw-r--r-- | sysdeps/powerpc/fpu/e_sqrtf.c | 17 | ||||
-rw-r--r-- | sysdeps/powerpc/fpu/math_private.h | 32 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/fpu/e_sqrt.c | 30 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/fpu/e_sqrtf.c | 30 |
7 files changed, 46 insertions, 107 deletions
@@ -1,3 +1,20 @@ +2015-01-28 Adhemerval Zanellla <azanella@linux.vnet.ibm.com> + + [BZ #16576] + * sysdeps/powerpc/fpu/math_private.h [__CPU_HAS_FSQRT]: Remove define + and use _ARCH_PPCSQ instead. + (__ieee754_sqrt): Likewise. + (__ieee754_sqrtf): Likewise. + * sysdeps/powerpc/fpu/e_sqrt.c (__slow_ieee754_sqrt): Build only if + _ARCH_PPCSQ is defined. + (__ieee754_sqrt): Use _ARCH_PPCSQ to select wheter to use hardware + fsqrt instruction. + * sysdeps/powerpc/fpu/e_sqrtf.c (__ieee754_sqrtf): Build only if + _ARCH_PPCSQ is defined. + (__ieee754_sqrtf): Use _ARCH_PPCSQ to select wheter to use hardware + fsqrts instruction. + * sysdeps/powerpc/powerpc64/fpu/e_sqrt.c: Remove file. + 2016-08-15 Andreas Schwab <schwab@suse.de> [BZ #20435] @@ -9,11 +9,11 @@ Version 2.19.1 * The following bugs are resolved with this release: - 15946, 16009, 16545, 16574, 16623, 16657, 16695, 16743, 16758, 16759, - 16760, 16878, 16882, 16885, 16916, 16932, 16943, 16958, 17048, 17062, - 17069, 17079, 17137, 17153, 17213, 17263, 17269, 17325, 17523, 17555, - 17905, 18007, 18032, 18080, 18240, 18287, 18508, 18665, 18905, 18928, - 19018, 19779, 19791, 19879, 20010, 20112. + 15946, 16009, 16545, 16574, 16576, 16623, 16657, 16695, 16743, 16758, + 16759, 16760, 16878, 16882, 16885, 16916, 16932, 16943, 16958, 17048, + 17062, 17069, 17079, 17137, 17153, 17213, 17263, 17269, 17325, 17523, + 17555, 17905, 18007, 18032, 18080, 18240, 18287, 18508, 18665, 18905, + 18928, 19018, 19779, 19791, 19879, 20010, 20112. * A buffer overflow in gethostbyname_r and related functions performing DNS requests has been fixed. If the NSS functions were called with a diff --git a/sysdeps/powerpc/fpu/e_sqrt.c b/sysdeps/powerpc/fpu/e_sqrt.c index 0368e57..24dfe68 100644 --- a/sysdeps/powerpc/fpu/e_sqrt.c +++ b/sysdeps/powerpc/fpu/e_sqrt.c @@ -24,6 +24,7 @@ #include <sysdep.h> #include <ldsodefs.h> +#ifndef _ARCH_PPCSQ static const double almost_half = 0.5000000000000001; /* 0.5 + 2^-53 */ static const ieee_float_shape_type a_nan = {.word = 0x7fc00000 }; static const ieee_float_shape_type a_inf = {.word = 0x7f800000 }; @@ -152,6 +153,7 @@ __slow_ieee754_sqrt (double x) } return f_wash (x); } +#endif /* _ARCH_PPCSQ */ #undef __ieee754_sqrt double @@ -159,16 +161,11 @@ __ieee754_sqrt (double x) { double z; - /* If the CPU is 64-bit we can use the optional FP instructions. */ - if (__CPU_HAS_FSQRT) - { - /* Volatile is required to prevent the compiler from moving the - fsqrt instruction above the branch. */ - __asm __volatile (" fsqrt %0,%1\n" - :"=f" (z):"f" (x)); - } - else - z = __slow_ieee754_sqrt (x); +#ifdef _ARCH_PPCSQ + asm ("fsqrt %0,%1\n" :"=f" (z):"f" (x)); +#else + z = __slow_ieee754_sqrt (x); +#endif return z; } diff --git a/sysdeps/powerpc/fpu/e_sqrtf.c b/sysdeps/powerpc/fpu/e_sqrtf.c index fcc74ae..7d2bfb7 100644 --- a/sysdeps/powerpc/fpu/e_sqrtf.c +++ b/sysdeps/powerpc/fpu/e_sqrtf.c @@ -24,6 +24,7 @@ #include <sysdep.h> #include <ldsodefs.h> +#ifndef _ARCH_PPCSQ static const float almost_half = 0.50000006; /* 0.5 + 2^-24 */ static const ieee_float_shape_type a_nan = {.word = 0x7fc00000 }; static const ieee_float_shape_type a_inf = {.word = 0x7f800000 }; @@ -128,6 +129,7 @@ __slow_ieee754_sqrtf (float x) } return f_washf (x); } +#endif /* _ARCH_PPCSQ */ #undef __ieee754_sqrtf float @@ -135,16 +137,11 @@ __ieee754_sqrtf (float x) { double z; - /* If the CPU is 64-bit we can use the optional FP instructions. */ - if (__CPU_HAS_FSQRT) - { - /* Volatile is required to prevent the compiler from moving the - fsqrt instruction above the branch. */ - __asm __volatile (" fsqrts %0,%1\n" - :"=f" (z):"f" (x)); - } - else - z = __slow_ieee754_sqrtf (x); +#ifdef _ARCH_PPCSQ + asm ("fsqrts %0,%1\n" :"=f" (z):"f" (x)); +#else + z = __slow_ieee754_sqrtf (x); +#endif return z; } diff --git a/sysdeps/powerpc/fpu/math_private.h b/sysdeps/powerpc/fpu/math_private.h index dde153d..9048715 100644 --- a/sysdeps/powerpc/fpu/math_private.h +++ b/sysdeps/powerpc/fpu/math_private.h @@ -25,26 +25,17 @@ #include <fenv_private.h> #include_next <math_private.h> -# if __WORDSIZE == 64 || defined _ARCH_PWR4 -# define __CPU_HAS_FSQRT 1 -# else -# define __CPU_HAS_FSQRT ((GLRO(dl_hwcap) & PPC_FEATURE_64) != 0) -# endif - extern double __slow_ieee754_sqrt (double); extern __always_inline double __ieee754_sqrt (double __x) { double __z; - if (__CPU_HAS_FSQRT) - { - /* Volatile is required to prevent the compiler from moving the - fsqrt instruction above the branch. */ - __asm __volatile ("fsqrt %0,%1" : "=f" (__z) : "f" (__x)); - } - else - __z = __slow_ieee754_sqrt(__x); +#ifdef _ARCH_PPCSQ + asm ("fsqrt %0,%1" : "=f" (__z) : "f" (__x)); +#else + __z = __slow_ieee754_sqrt(__x); +#endif return __z; } @@ -55,14 +46,11 @@ __ieee754_sqrtf (float __x) { float __z; - if (__CPU_HAS_FSQRT) - { - /* Volatile is required to prevent the compiler from moving the - fsqrts instruction above the branch. */ - __asm __volatile ("fsqrts %0,%1" : "=f" (__z) : "f" (__x)); - } - else - __z = __slow_ieee754_sqrtf(__x); +#ifdef _ARCH_PPCSQ + asm ("fsqrts %0,%1" : "=f" (__z) : "f" (__x)); +#else + __z = __slow_ieee754_sqrtf(__x); +#endif return __z; } diff --git a/sysdeps/powerpc/powerpc64/fpu/e_sqrt.c b/sysdeps/powerpc/powerpc64/fpu/e_sqrt.c deleted file mode 100644 index 08d5f69..0000000 --- a/sysdeps/powerpc/powerpc64/fpu/e_sqrt.c +++ /dev/null @@ -1,30 +0,0 @@ -/* Double-precision floating point square root. - Copyright (C) 1997-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <math.h> -#include <math_private.h> - -#undef __ieee754_sqrt -double -__ieee754_sqrt (double x) -{ - double z; - __asm __volatile ("fsqrt %0,%1" : "=f" (z) : "f" (x)); - return z; -} -strong_alias (__ieee754_sqrt, __sqrt_finite) diff --git a/sysdeps/powerpc/powerpc64/fpu/e_sqrtf.c b/sysdeps/powerpc/powerpc64/fpu/e_sqrtf.c deleted file mode 100644 index 598e7cb..0000000 --- a/sysdeps/powerpc/powerpc64/fpu/e_sqrtf.c +++ /dev/null @@ -1,30 +0,0 @@ -/* Single-precision floating point square root. - Copyright (C) 1997-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <math.h> -#include <math_private.h> - -#undef __ieee754_sqrtf -float -__ieee754_sqrtf (float x) -{ - double z; - __asm ("fsqrts %0,%1" : "=f" (z) : "f" (x)); - return z; -} -strong_alias (__ieee754_sqrtf, __sqrtf_finite) |