This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch, master, updated. glibc-2.15-874-g777b1ee


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  777b1eea9df942aebc5ba38566111e667ddaaf91 (commit)
      from  62f9bae74361ce47ec0246791e0014a620124705 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=777b1eea9df942aebc5ba38566111e667ddaaf91

commit 777b1eea9df942aebc5ba38566111e667ddaaf91
Author: Adhemerval Zanella <azanella@linux.vnet.ibm.com>
Date:   Tue May 15 10:32:28 2012 -0500

    PowerPC - logb[f|l] optimization for POWER7
    
    This patch provides optimized logb (1.2x on PPC32 and 2.5x on PPC64),
    logbf (1.1x on PPC32 and 2.2x on PPC64), and logbl (1.3x on PPC32 and
    50% on PPC64) for the POWER7 processor.

diff --git a/ChangeLog b/ChangeLog
index 51288eb..7a1c154 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2012-05-15  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>
+
+	* sysdeps/powerpc/powerpc32/power7/fpu/s_logb.c: New file. Optimized
+	logb for POWER7.
+	* sysdeps/powerpc/powerpc32/power7/fpu/s_logbf.c: New file. Optimized
+	logbf for POWER7.
+	* sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c: New file. Optimized
+	logbl for POWER7.
+	* sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c: New file. Use
+	powerpc32/power7/fpu/s_logb.c via #include.
+	* sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c: New file. Use
+	powerpc32/power7/fpu/s_logbf.c via #include.
+	* sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c: New file. Use
+	powerpc32/power7/fpu/s_logbl.c via #include.
+
 2012-05-15  Joseph Myers  <joseph@codesourcery.com>
 
 	* README.libm: Remove file.
diff --git a/sysdeps/powerpc/powerpc32/power7/fpu/s_logb.c b/sysdeps/powerpc/powerpc32/power7/fpu/s_logb.c
new file mode 100644
index 0000000..71ee148
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power7/fpu/s_logb.c
@@ -0,0 +1,75 @@
+/* logb(). PowerPC/POWER7 version.
+   Copyright (C) 2012 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_private.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))
+    /* Raise FE_DIVBYZERO and return -HUGE_VAL[LF].  */
+    return -1.0 / __builtin_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))
+    /* Multiplication is used to set logb (+-INF) = INF.  */
+    return (x * x);
+  else if (__builtin_expect (ret == two10m1, 0))
+    {
+      /* POSIX specifies that denormal numbers are treated as
+         though they were normalized.  */
+      int32_t lx, ix;
+      int m1, m2, ma;
+
+      EXTRACT_WORDS (ix , lx, x);
+      m1 = (ix == 0) ? 0 : __builtin_clz (ix);
+      m2 = (lx == 0) ? 0 : __builtin_clz (lx);
+      ma = (m1 == 0) ? m2 + 32 : m1;
+      return -1022.0 + (double)(11 - ma);
+    }
+  /* Test to avoid logb_downward (0.0) == -0.0.  */
+  return ret == -0.0 ? 0.0 : ret;
+}
+
+weak_alias (__logb, logb)
+
+#ifdef NO_LONG_DOUBLE
+strong_alias (__logb, __logbl)
+weak_alias (__logb, logbl)
+#endif
diff --git a/sysdeps/powerpc/powerpc32/power7/fpu/s_logbf.c b/sysdeps/powerpc/powerpc32/power7/fpu/s_logbf.c
new file mode 100644
index 0000000..aa8499a
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power7/fpu/s_logbf.c
@@ -0,0 +1,60 @@
+/* logbf(). PowerPC/POWER7 version.
+   Copyright (C) 2012 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_private.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))
+    /* Raise FE_DIVBYZERO and return -HUGE_VAL[LF].  */
+    return -1.0 / __builtin_fabsf (x);
+
+  /* ret = x & 0x7f800000;  */
+  asm (
+    "xxland %x0,%x1,%x2\n"
+    "fcfid  %0,%0"
+    : "=f"(ret)
+    : "f" (x), "f" (mask.d));
+  /* ret = (ret >> 52) - 1023.0, since ret is double.  */
+  ret = (ret * two1div52) + two10m1;
+  if (__builtin_expect (ret > -two7m1, 0))
+    /* Multiplication is used to set logb (+-INF) = INF.  */
+    return (x * x);
+  /* Since operations are done with double we don't need
+     additional tests for subnormal numbers.
+     The test is to avoid logb_downward (0.0) == -0.0.  */
+  return ret == -0.0 ? 0.0 : ret;
+}
+weak_alias (__logbf, logbf)
diff --git a/sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c b/sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c
new file mode 100644
index 0000000..03942ca
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c
@@ -0,0 +1,72 @@
+/* logbl(). PowerPC/POWER7 version.
+   Copyright (C) 2012 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>
+#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)
+{
+  double xh, xl;
+  double ret;
+
+  if (__builtin_expect (x == 0.0L, 0))
+    /* Raise FE_DIVBYZERO and return -HUGE_VAL[LF].  */
+    return -1.0L / __builtin_fabsl (x);
+
+  ldbl_unpack (x, &xh, &xl);
+  /* 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))
+    /* Multiplication is used to set logb (+-INF) = INF.  */
+    return (xh * xh);
+  else if (__builtin_expect (ret == two10m1, 0))
+    {
+      int64_t lx, hx;
+      int m1, m2, ma;
+
+      GET_LDOUBLE_WORDS64 (hx, lx, x);
+      m1 = (hx == 0) ? 0 : __builtin_clzll (hx);
+      m2 = (lx == 0) ? 0 : __builtin_clzll (lx);
+      ma = (m1 == 0) ? m2 + 64 : m1;
+      return -1022.0 + (double)(11 - ma);
+    }
+  /* Test to avoid logb_downward (0.0) == -0.0.  */
+  return ret == -0.0 ? 0.0 : ret;
+}
+
+long_double_symbol (libm, __logbl, logbl);
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c b/sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c
new file mode 100644
index 0000000..ff3a9e0
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c
@@ -0,0 +1 @@
+#include <sysdeps/powerpc/powerpc32/power7/fpu/s_logb.c>
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c b/sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c
new file mode 100644
index 0000000..e79a28f
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c
@@ -0,0 +1 @@
+#include <sysdeps/powerpc/powerpc32/power7/fpu/s_logbf.c>
diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c b/sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c
new file mode 100644
index 0000000..463e411
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c
@@ -0,0 +1 @@
+#include <sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c>

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                      |   15 +++++
 sysdeps/powerpc/powerpc32/power7/fpu/s_logb.c  |   75 ++++++++++++++++++++++++
 sysdeps/powerpc/powerpc32/power7/fpu/s_logbf.c |   60 +++++++++++++++++++
 sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c |   72 +++++++++++++++++++++++
 sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c  |    1 +
 sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c |    1 +
 sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c |    1 +
 7 files changed, 225 insertions(+), 0 deletions(-)
 create mode 100644 sysdeps/powerpc/powerpc32/power7/fpu/s_logb.c
 create mode 100644 sysdeps/powerpc/powerpc32/power7/fpu/s_logbf.c
 create mode 100644 sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c
 create mode 100644 sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c
 create mode 100644 sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c
 create mode 100644 sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]