summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>2015-01-27 13:16:39 -0500
committerAurelien Jarno <aurelien@aurel32.net>2016-11-21 17:13:40 +0100
commita0b2d5b252477b6bc374390c14c3c8ed6aae420c (patch)
tree871954fbfb4779beace3db6f3fb6a1d57c33dca0
parent7a609588a02281638e9a0cb57bed18966806349a (diff)
downloadglibc-a0b2d5b252477b6bc374390c14c3c8ed6aae420c.tar.gz
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--ChangeLog17
-rw-r--r--NEWS10
-rw-r--r--sysdeps/powerpc/fpu/e_sqrt.c17
-rw-r--r--sysdeps/powerpc/fpu/e_sqrtf.c17
-rw-r--r--sysdeps/powerpc/fpu/math_private.h32
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/e_sqrt.c30
-rw-r--r--sysdeps/powerpc/powerpc64/fpu/e_sqrtf.c30
7 files changed, 46 insertions, 107 deletions
diff --git a/ChangeLog b/ChangeLog
index 30da116ced..92b8a2e35c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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]
diff --git a/NEWS b/NEWS
index a1bb8341ea..f62b876d81 100644
--- a/NEWS
+++ b/NEWS
@@ -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 0368e57e92..24dfe68625 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 fcc74aeb19..7d2bfb7b04 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 dde153d37a..904871506d 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 08d5f69ad2..0000000000
--- 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 598e7cb270..0000000000
--- 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)