This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch, master, updated. glibc-2.15-1063-g25dbcb2
- From: schwab at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 26 May 2012 11:54:30 -0000
- Subject: GNU C Library master sources branch, master, updated. glibc-2.15-1063-g25dbcb2
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 25dbcb277a9dea5f241c0b888a30b9341310d941 (commit)
from d81dcb356909937b0c8e9c69ff0be27f51aaa07a (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=25dbcb277a9dea5f241c0b888a30b9341310d941
commit 25dbcb277a9dea5f241c0b888a30b9341310d941
Author: Andreas Schwab <schwab@linux-m68k.org>
Date: Fri May 25 11:57:33 2012 +0200
Optimize handling of denormals in logb/logbf/logbl
diff --git a/ChangeLog b/ChangeLog
index a4ae965..6831676 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2012-05-26 Andreas Schwab <schwab@linux-m68k.org>
+
+ * sysdeps/ieee754/dbl-64/s_logb.c (__logb): Optimize
+ handling of denormals.
+ * sysdeps/ieee754/dbl-64/wordsize-64/s_logb.c (__logb): Likewise.
+ * sysdeps/ieee754/flt-32/s_logbf.c (__logbf): Likewise.
+ * sysdeps/ieee754/ldbl-96/s_logbl.c (__logbl): Likewise.
+ * sysdeps/ieee754/ldbl-128/s_logbl.c (__logbl): Likewise.
+ * sysdeps/ieee754/ldbl-128ibm/s_logbl.c (__logbl): Likewise.
+ * sysdeps/powerpc/powerpc32/power7/fpu/s_logb.c (_logb): Likewise.
+ * sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c (_logbl):
+ Likewise.
+
2012-05-25 Marek Polacek <polacek@redhat.com>
[BZ #14152]
diff --git a/sysdeps/ieee754/dbl-64/s_logb.c b/sysdeps/ieee754/dbl-64/s_logb.c
index baa35e1..17aa94b 100644
--- a/sysdeps/ieee754/dbl-64/s_logb.c
+++ b/sysdeps/ieee754/dbl-64/s_logb.c
@@ -34,10 +34,12 @@ __logb (double x)
{
/* POSIX specifies that denormal number is treated as
though it were normalized. */
- int m1 = (ix == 0) ? 0 : __builtin_clz (ix);
- int m2 = (lx == 0) ? 0 : __builtin_clz (lx);
- int ma = (m1 == 0) ? m2 + 32 : m1;
- return -1022.0 + (double)(11 - ma);
+ int ma;
+ if (ix == 0)
+ ma = __builtin_clz (lx) + 32;
+ else
+ ma = __builtin_clz (ix);
+ rix -= ma - 12;
}
return (double) (rix - 1023);
}
diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_logb.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_logb.c
index 185dd05..40b8888 100644
--- a/sysdeps/ieee754/dbl-64/wordsize-64/s_logb.c
+++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_logb.c
@@ -36,8 +36,8 @@ __logb (double x)
return x * x;
if (__builtin_expect (ex == 0, 0))
{
- int m = (ix == 0) ? 0 : __builtin_clzll (ix);
- return -1022.0 + (double)(11 -m);
+ int m = __builtin_clzll (ix);
+ ex -= m - 12;
}
return (double) (ex - 1023);
}
diff --git a/sysdeps/ieee754/flt-32/s_logbf.c b/sysdeps/ieee754/flt-32/s_logbf.c
index 025c70d..e2b3aaa 100644
--- a/sysdeps/ieee754/flt-32/s_logbf.c
+++ b/sysdeps/ieee754/flt-32/s_logbf.c
@@ -31,8 +31,7 @@ __logbf (float x)
{
/* POSIX specifies that denormal number is treated as
though it were normalized. */
- int m = (ix == 0) ? 0 : __builtin_clz (ix);
- return -126.0 + (float)(8 - m);
+ rix -= __builtin_clz (ix) - 9;
}
return (float) (rix - 127);
}
diff --git a/sysdeps/ieee754/ldbl-128/s_logbl.c b/sysdeps/ieee754/ldbl-128/s_logbl.c
index cf6003e..3ba67b7 100644
--- a/sysdeps/ieee754/ldbl-128/s_logbl.c
+++ b/sysdeps/ieee754/ldbl-128/s_logbl.c
@@ -41,10 +41,12 @@ __logbl (long double x)
{
/* POSIX specifies that denormal number is treated as
though it were normalized. */
- int m1 = (hx == 0) ? 0 : __builtin_clzll (hx);
- int m2 = (lx == 0) ? 0 : __builtin_clzll (lx);
- int ma = (m1 == 0) ? m2 + 64 : m1;
- return -16382.0 + (long double)(15 - ma);
+ int ma;
+ if (hx == 0)
+ ma = __builtin_clzll (lx) + 64;
+ else
+ ma = __builtin_clzll (hx);
+ ex -= ma - 16;
}
return (long double) (ex - 16383);
}
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_logbl.c b/sysdeps/ieee754/ldbl-128ibm/s_logbl.c
index 678b6ca..92ce2c1 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_logbl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_logbl.c
@@ -30,7 +30,7 @@ __logbl (long double x)
GET_LDOUBLE_WORDS64 (hx, lx, x);
hx &= 0x7fffffffffffffffLL; /* high |x| */
- if ((hx | (lx & 0x7fffffffffffffffLL)) == 0)
+ if (hx == 0)
return -1.0 / fabs (x);
if (hx >= 0x7ff0000000000000LL)
return x * x;
@@ -38,10 +38,7 @@ __logbl (long double x)
{
/* POSIX specifies that denormal number is treated as
though it were normalized. */
- int m1 = (hx == 0) ? 0 : __builtin_clzll (hx);
- int m2 = (lx == 0) ? 0 : __builtin_clzll (lx);
- int ma = (m1 == 0) ? m2 + 64 : m1;
- return -1022.0 + (long double)(11 - ma);
+ rhx -= __builtin_clzll (hx) - 12;
}
return (long double) (rhx - 1023);
}
diff --git a/sysdeps/ieee754/ldbl-96/s_logbl.c b/sysdeps/ieee754/ldbl-96/s_logbl.c
index d8ad4bc..4289be1 100644
--- a/sysdeps/ieee754/ldbl-96/s_logbl.c
+++ b/sysdeps/ieee754/ldbl-96/s_logbl.c
@@ -38,10 +38,12 @@ __logbl (long double x)
{
/* POSIX specifies that denormal number is treated as
though it were normalized. */
- int m1 = (ix == 0) ? 0 : __builtin_clz (ix);
- int m2 = (lx == 0) ? 0 : __builtin_clz (lx);
- int ma = (m1 == 0) ? m2 + 32 : m1;
- return -16382.0 - (long double)(ma);
+ int ma;
+ if (ix == 0)
+ ma = __builtin_clz (lx) + 32;
+ else
+ ma = __builtin_clz (ix);
+ es -= ma - 1;
}
return (long double) (es - 16383);
}
diff --git a/sysdeps/powerpc/powerpc32/power7/fpu/s_logb.c b/sysdeps/powerpc/powerpc32/power7/fpu/s_logb.c
index fba4822..87176c3 100644
--- a/sysdeps/powerpc/powerpc32/power7/fpu/s_logb.c
+++ b/sysdeps/powerpc/powerpc32/power7/fpu/s_logb.c
@@ -55,13 +55,14 @@ __logb (double x)
/* POSIX specifies that denormal numbers are treated as
though they were normalized. */
int32_t lx, ix;
- int m1, m2, ma;
+ int 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);
+ EXTRACT_WORDS (ix, lx, x);
+ if (ix == 0)
+ ma = __builtin_clz (lx) + 32;
+ else
+ ma = __builtin_clz (ix);
+ return (double) (-1023 - (ma - 12));
}
/* Test to avoid logb_downward (0.0) == -0.0. */
return ret == -0.0 ? 0.0 : ret;
diff --git a/sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c b/sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c
index 03942ca..20c7d4e 100644
--- a/sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c
+++ b/sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c
@@ -56,14 +56,12 @@ __logbl (long double x)
return (xh * xh);
else if (__builtin_expect (ret == two10m1, 0))
{
+ /* POSIX specifies that denormal number is treated as
+ though it were normalized. */
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);
+ return (long double) (-1023 - (__builtin_clzll (hx) - 12));
}
/* Test to avoid logb_downward (0.0) == -0.0. */
return ret == -0.0 ? 0.0 : ret;
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 13 +++++++++++++
sysdeps/ieee754/dbl-64/s_logb.c | 10 ++++++----
sysdeps/ieee754/dbl-64/wordsize-64/s_logb.c | 4 ++--
sysdeps/ieee754/flt-32/s_logbf.c | 3 +--
sysdeps/ieee754/ldbl-128/s_logbl.c | 10 ++++++----
sysdeps/ieee754/ldbl-128ibm/s_logbl.c | 7 ++-----
sysdeps/ieee754/ldbl-96/s_logbl.c | 10 ++++++----
sysdeps/powerpc/powerpc32/power7/fpu/s_logb.c | 13 +++++++------
sysdeps/powerpc/powerpc32/power7/fpu/s_logbl.c | 8 +++-----
9 files changed, 46 insertions(+), 32 deletions(-)
hooks/post-receive
--
GNU C Library master sources