similarity index 56%
rename from sysdeps/powerpc/power7/fpu/s_logb.c
rename to sysdeps/powerpc/fpu/s_logb.c
@@ -1,4 +1,4 @@
-/* logb(). PowerPC/POWER7 version.
+/* Get exponent of a floating-point value. PowerPC version.
Copyright (C) 2012-2019 Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -16,59 +16,49 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <math.h>
-#include <math_private.h>
-#include <math_ldbl_opt.h>
-#include <libm-alias-double.h>
+/* ISA 2.07 provides fast GPR to FP instruction (mfvsr{d,wz}) which make
+ generic implementation faster. */
+#if defined(_ARCH_PWR8) || !defined(_ARCH_PWR7)
+# include <sysdeps/ieee754/dbl-64/s_logb.c>
+#else
+# include <math.h>
+# include <math_private.h>
+# include <math_ldbl_opt.h>
+# include <libm-alias-double.h>
/* This implementation avoids FP to INT conversions by using VSX
bitwise instructions over FP values. */
-
-static const double two1div52 = 2.220446049250313e-16; /* 1/2**52 */
-static const double two10m1 = -1023.0; /* 2**10 -1 */
-
-/* FP mask to extract the exponent. */
-static const union {
- unsigned long long mask;
- double d;
-} mask = { 0x7ff0000000000000ULL };
-
double
__logb (double x)
{
double ret;
- if (__builtin_expect (x == 0.0, 0))
+ if (__glibc_unlikely (x == 0.0))
/* Raise FE_DIVBYZERO and return -HUGE_VAL[LF]. */
- return -1.0 / __builtin_fabs (x);
+ return -1.0 / fabs (x);
- /* ret = x & 0x7ff0000000000000; */
- asm (
- "xxland %x0,%x1,%x2\n"
- "fcfid %0,%0"
- : "=f" (ret)
- : "f" (x), "f" (mask.d));
- /* ret = (ret >> 52) - 1023.0; */
- ret = (ret * two1div52) + two10m1;
- if (__builtin_expect (ret > -two10m1, 0))
+ /* Mask to extract the exponent. */
+ asm ("xxland %x0,%x1,%x2\n"
+ "fcfid %0,%0"
+ : "=d" (ret)
+ : "d" (x), "d" (0x7ff0000000000000ULL));
+ ret = (ret * 0x1p-52) - 1023.0;
+ if (ret > 1023.0)
/* Multiplication is used to set logb (+-INF) = INF. */
return (x * x);
- else if (__builtin_expect (ret == two10m1, 0))
+ else if (ret == -1023.0)
{
/* POSIX specifies that denormal numbers are treated as
though they were normalized. */
- int32_t lx, ix;
- int ma;
-
- EXTRACT_WORDS (ix, lx, x);
- ix &= 0x7fffffff;
- if (ix == 0)
- ma = __builtin_clz (lx) + 32;
- else
- ma = __builtin_clz (ix);
- return (double) (-1023 - (ma - 12));
+ int64_t ix;
+ EXTRACT_WORDS64 (ix, x);
+ ix &= UINT64_C (0x7fffffffffffffff);
+ return (double) (-1023 - (__builtin_clzll (ix) - 12));
}
/* Test to avoid logb_downward (0.0) == -0.0. */
return ret == -0.0 ? 0.0 : ret;
}
+# ifndef __logb
libm_alias_double (__logb, logb)
+# endif
+#endif
similarity index 67%
rename from sysdeps/powerpc/power7/fpu/s_logbf.c
rename to sysdeps/powerpc/fpu/s_logbf.c
@@ -1,4 +1,4 @@
-/* logbf(). PowerPC/POWER7 version.
+/* Get exponent of a floating-point value. PowerPC version.
Copyright (C) 2012-2019 Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -16,40 +16,33 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <libm-alias-float.h>
-
+/* ISA 2.07 provides fast GPR to FP instruction (mfvsr{d,wz}) which make
+ generic implementation faster. */
+#if defined(_ARCH_PWR8) || !defined(_ARCH_PWR7)
+# include <sysdeps/ieee754/flt-32/s_logbf.c>
+#else
+# include <math.h>
+# include <libm-alias-float.h>
/* This implementation avoids FP to INT conversions by using VSX
bitwise instructions over FP values. */
-
-static const double two1div52 = 2.220446049250313e-16; /* 1/2**52 */
-static const double two10m1 = -1023.0; /* -2**10 + 1 */
-static const double two7m1 = -127.0; /* -2**7 + 1 */
-
-/* FP mask to extract the exponent. */
-static const union {
- unsigned long long mask;
- double d;
-} mask = { 0x7ff0000000000000ULL };
-
float
__logbf (float x)
{
/* VSX operation are all done internally as double. */
double ret;
- if (__builtin_expect (x == 0.0, 0))
+ if (__glibc_unlikely (x == 0.0))
/* Raise FE_DIVBYZERO and return -HUGE_VAL[LF]. */
- return -1.0 / __builtin_fabsf (x);
+ return -1.0 / fabs (x);
- /* ret = x & 0x7f800000; */
- asm (
- "xxland %x0,%x1,%x2\n"
- "fcfid %0,%0"
- : "=f"(ret)
- : "f" (x), "f" (mask.d));
+ /* mask to extract the exponent. */
+ asm ("xxland %x0,%x1,%x2\n"
+ "fcfid %0,%0"
+ : "=d"(ret)
+ : "d" (x), "d" (0x7ff0000000000000ULL));
/* ret = (ret >> 52) - 1023.0, since ret is double. */
- ret = (ret * two1div52) + two10m1;
- if (__builtin_expect (ret > -two7m1, 0))
+ ret = (ret * 0x1p-52) - 1023.0;
+ if (ret > 127.0)
/* Multiplication is used to set logb (+-INF) = INF. */
return (x * x);
/* Since operations are done with double we don't need
@@ -57,4 +50,7 @@ __logbf (float x)
The test is to avoid logb_downward (0.0) == -0.0. */
return ret == -0.0 ? 0.0 : ret;
}
+# ifndef __logbf
libm_alias_float (__logb, logb)
+# endif
+#endif
similarity index 72%
rename from sysdeps/powerpc/power7/fpu/s_logbl.c
rename to sysdeps/powerpc/fpu/s_logbl.c
@@ -1,4 +1,4 @@
-/* logbl(). PowerPC/POWER7 version.
+/* Get exponent of a floating-point value. PowerPC version.
Copyright (C) 2012-2019 Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -16,22 +16,17 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <math.h>
-#include <math_private.h>
-#include <math_ldbl_opt.h>
+/* ISA 2.07 provides fast GPR to FP instruction (mfvsr{d,wz}) which make
+ generic implementation faster. */
+#if defined(_ARCH_PWR8) || !defined(_ARCH_PWR7)
+# include <./sysdeps/ieee754/ldbl-128ibm/s_logbl.c>
+#else
+# include <math.h>
+# include <math_private.h>
+# include <math_ldbl_opt.h>
/* This implementation avoids FP to INT conversions by using VSX
bitwise instructions over FP values. */
-
-static const double two1div52 = 2.220446049250313e-16; /* 1/2**52 */
-static const double two10m1 = -1023.0; /* 2**10 -1 */
-
-/* FP mask to extract the exponent. */
-static const union {
- unsigned long long mask;
- double d;
-} mask = { 0x7ff0000000000000ULL };
-
long double
__logbl (long double x)
{
@@ -39,24 +34,23 @@ __logbl (long double x)
double ret;
int64_t hx;
- if (__builtin_expect (x == 0.0L, 0))
+ if (__glibc_unlikely (x == 0.0))
/* Raise FE_DIVBYZERO and return -HUGE_VAL[LF]. */
return -1.0L / __builtin_fabsl (x);
ldbl_unpack (x, &xh, &xl);
EXTRACT_WORDS64 (hx, xh);
- /* ret = x & 0x7ff0000000000000; */
- asm (
- "xxland %x0,%x1,%x2\n"
- "fcfid %0,%0"
- : "=f" (ret)
- : "f" (xh), "f" (mask.d));
- /* ret = (ret >> 52) - 1023.0; */
- ret = (ret * two1div52) + two10m1;
- if (__builtin_expect (ret > -two10m1, 0))
+
+ /* Mask to extract the exponent. */
+ asm ("xxland %x0,%x1,%x2\n"
+ "fcfid %0,%0"
+ : "=d" (ret)
+ : "d" (xh), "d" (0x7ff0000000000000ULL));
+ ret = (ret * 0x1p-52) - 1023.0;
+ if (ret > 1023.0)
/* Multiplication is used to set logb (+-INF) = INF. */
return (xh * xh);
- else if (__builtin_expect (ret == two10m1, 0))
+ else if (ret == -1023.0)
{
/* POSIX specifies that denormal number is treated as
though it were normalized. */
@@ -78,6 +72,7 @@ __logbl (long double x)
/* Test to avoid logb_downward (0.0) == -0.0. */
return ret == -0.0 ? 0.0 : ret;
}
-#ifndef __logbl
+# ifndef __logbl
long_double_symbol (libm, __logbl, logbl);
+# endif
#endif
@@ -16,16 +16,5 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <math.h>
-#include <math_ldbl_opt.h>
-
-#undef weak_alias
-#define weak_alias(a, b)
-#undef strong_alias
-#define strong_alias(a, b)
-#undef compat_symbol
-#define compat_symbol(lib, name, alias, ver)
-
#define __logb __logb_power7
-
-#include <sysdeps/powerpc/power7/fpu/s_logb.c>
+#include <sysdeps/powerpc/fpu/s_logb.c>
@@ -16,11 +16,5 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <math.h>
-
-#undef weak_alias
-#define weak_alias(a, b)
-
#define __logbf __logbf_power7
-
-#include <sysdeps/powerpc/power7/fpu/s_logbf.c>
+#include <sysdeps/powerpc/fpu/s_logbf.c>
@@ -17,5 +17,4 @@
<http://www.gnu.org/licenses/>. */
#define __logbl __logbl_power7
-
-#include <sysdeps/powerpc/power7/fpu/s_logbl.c>
+#include <sysdeps/powerpc/fpu/s_logbl.c>
@@ -32,6 +32,12 @@ libm-sysdep_routines += s_ceil-power5+ \
s_llround-power5+ \
s_llround-ppc64 \
s_llroundf-ppc64 \
+ s_logb-power7 \
+ s_logbf-power7 \
+ s_logbl-power7 \
+ s_logb-ppc64 \
+ s_logbf-ppc64 \
+ s_logbl-ppc64 \
$(sysdep_calls:s_%=m_%)
CFLAGS-s_ceil-power5+.c = -mcpu=power5+
@@ -48,6 +54,10 @@ CFLAGS-s_llround-power5+.c += -mcpu=power5+
CFLAGS-s_modf-power5+.c += -mcpu=power5+
CFLAGS-s_modff-power5+.c += -mcpu=power5+
+CFLAGS-s_logbf-power7.c = -mcpu=power7
+CFLAGS-s_logbl-power7.c = -mcpu=power7
+CFLAGS-s_logb-power7.c = -mcpu=power7
+
# These files quiet sNaNs in a way that is optimized away without
# -fsignaling-nans.
CFLAGS-s_modf-ppc64.c += -fsignaling-nans
similarity index 91%
rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-power7.c
rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logb-power7.c
@@ -16,4 +16,5 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logb-power7.c>
+#define __logb __logb_power7
+#include <sysdeps/powerpc/fpu/s_logb.c>
similarity index 100%
rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-ppc64.c
rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logb-ppc64.c
similarity index 100%
rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb.c
rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logb.c
similarity index 91%
rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-power7.c
rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbf-power7.c
@@ -16,4 +16,5 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logbf-power7.c>
+#define __logbf __logbf_power7
+#include <sysdeps/powerpc/fpu/s_logbf.c>
similarity index 100%
rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-ppc64.c
rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbf-ppc64.c
similarity index 100%
rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf.c
rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbf.c
similarity index 91%
rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-power7.c
rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbl-power7.c
@@ -16,4 +16,5 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logbl-power7.c>
+#define __logbl __logbl_power7
+#include <sysdeps/powerpc/fpu/s_logbl.c>
similarity index 100%
rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-ppc64.c
rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbl-ppc64.c
similarity index 100%
rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl.c
rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbl.c
deleted file mode 100644
@@ -1,11 +0,0 @@
-ifeq ($(subdir),math)
-sysdep_routines += $(sysdep_calls)
-libm-sysdep_routines += s_logb-power7 s_logbf-power7 \
- s_logbl-power7 s_logb-ppc64 s_logbf-ppc64 \
- s_logbl-ppc64 \
- $(sysdep_calls:s_%=m_%)
-
-CFLAGS-s_logbf-power7.c = -mcpu=power7
-CFLAGS-s_logbl-power7.c = -mcpu=power7
-CFLAGS-s_logb-power7.c = -mcpu=power7
-endif
deleted file mode 100644
@@ -1 +0,0 @@
-#include <sysdeps/powerpc/power7/fpu/s_logb.c>
deleted file mode 100644
@@ -1 +0,0 @@
-#include <sysdeps/powerpc/power7/fpu/s_logbf.c>
deleted file mode 100644
@@ -1 +0,0 @@
-#include <sysdeps/powerpc/power7/fpu/s_logbl.c>