aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2012-03-22 12:52:50 +0000
committerJoseph Myers <joseph@codesourcery.com>2012-03-22 12:52:50 +0000
commitc0df8e693f34b535bd6ee1b691bc4ca6bc3b4579 (patch)
tree9cc7aef340a2766375fb6b317c61df7c1df9b1b5
parente4d91429aefd7f3ad97457f8935cf675aacfde2a (diff)
downloadglibc-c0df8e693f34b535bd6ee1b691bc4ca6bc3b4579.tar
glibc-c0df8e693f34b535bd6ee1b691bc4ca6bc3b4579.tar.gz
glibc-c0df8e693f34b535bd6ee1b691bc4ca6bc3b4579.tar.bz2
glibc-c0df8e693f34b535bd6ee1b691bc4ca6bc3b4579.zip
Fix low-part sign handling in sin/cos for ldbl-128 and ldbl-128ibm.
-rw-r--r--ChangeLog13
-rw-r--r--sysdeps/ieee754/ldbl-128/k_cosl.c6
-rw-r--r--sysdeps/ieee754/ldbl-128/k_sincosl.c6
-rw-r--r--sysdeps/ieee754/ldbl-128/k_sinl.c2
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/k_cosl.c6
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/k_sincosl.c6
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/k_sinl.c2
7 files changed, 35 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 33bb4f89d0..a993315e9e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2012-03-22 Joseph Myers <joseph@codesourcery.com>
+
+ * sysdeps/ieee754/ldbl-128/k_cosl.c (__kernel_cosl): Negate y if
+ negating x to take absolute value.
+ * sysdeps/ieee754/ldbl-128/k_sincosl.c (__kernel_sincosl):
+ Likewise.
+ * sysdeps/ieee754/ldbl-128ibm/k_cosl.c (__kernel_cosl): Likewise.
+ * sysdeps/ieee754/ldbl-128ibm/k_sincosl.c (__kernel_sincosl):
+ Likewise.
+ * sysdeps/ieee754/ldbl-128/k_sinl.c (__kernel_sinl): Negate y when
+ computing low part if x was negated.
+ * sysdeps/ieee754/ldbl-128ibm/k_sinl.c (__kernel_sinl): Likewise.
+
2012-03-21 H.J. Lu <hongjiu.lu@intel.com>
* elf/tst-auditmod1.c: Support la_x32_gnu_pltenter and
diff --git a/sysdeps/ieee754/ldbl-128/k_cosl.c b/sysdeps/ieee754/ldbl-128/k_cosl.c
index 4cb9dd1f56..aa447ec1db 100644
--- a/sysdeps/ieee754/ldbl-128/k_cosl.c
+++ b/sysdeps/ieee754/ldbl-128/k_cosl.c
@@ -105,7 +105,11 @@ __kernel_cosl(long double x, long double y)
cosl(h+l) = cosl(h)cosl(l) - sinl(h)sinl(l). */
index = 0x3ffe - (tix >> 16);
hix = (tix + (0x200 << index)) & (0xfffffc00 << index);
- x = fabsl (x);
+ if (signbit (x))
+ {
+ x = -x;
+ y = -y;
+ }
switch (index)
{
case 0: index = ((45 << 10) + hix - 0x3ffe0000) >> 8; break;
diff --git a/sysdeps/ieee754/ldbl-128/k_sincosl.c b/sysdeps/ieee754/ldbl-128/k_sincosl.c
index 98c5d62780..00a21c45d1 100644
--- a/sysdeps/ieee754/ldbl-128/k_sincosl.c
+++ b/sysdeps/ieee754/ldbl-128/k_sincosl.c
@@ -132,7 +132,11 @@ __kernel_sincosl(long double x, long double y, long double *sinx, long double *c
cosl(h+l) = cosl(h)cosl(l) - sinl(h)sinl(l). */
index = 0x3ffe - (tix >> 16);
hix = (tix + (0x200 << index)) & (0xfffffc00 << index);
- x = fabsl (x);
+ if (signbit (x))
+ {
+ x = -x;
+ y = -y;
+ }
switch (index)
{
case 0: index = ((45 << 10) + hix - 0x3ffe0000) >> 8; break;
diff --git a/sysdeps/ieee754/ldbl-128/k_sinl.c b/sysdeps/ieee754/ldbl-128/k_sinl.c
index 6eaf878d94..1f0ca8c7f9 100644
--- a/sysdeps/ieee754/ldbl-128/k_sinl.c
+++ b/sysdeps/ieee754/ldbl-128/k_sinl.c
@@ -116,7 +116,7 @@ __kernel_sinl(long double x, long double y, int iy)
SET_LDOUBLE_WORDS64(h, ((u_int64_t)hix) << 32, 0);
if (iy)
- l = y - (h - x);
+ l = (ix < 0 ? -y : y) - (h - x);
else
l = x - h;
z = l * l;
diff --git a/sysdeps/ieee754/ldbl-128ibm/k_cosl.c b/sysdeps/ieee754/ldbl-128ibm/k_cosl.c
index 52414319a6..fc01374688 100644
--- a/sysdeps/ieee754/ldbl-128ibm/k_cosl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/k_cosl.c
@@ -123,7 +123,11 @@ __kernel_cosl(long double x, long double y)
index = 0x3fe - (tix >> 20);
hix = (tix + (0x200 << index)) & (0xfffffc00 << index);
- x = fabsl (x);
+ if (signbit (x))
+ {
+ x = -x;
+ y = -y;
+ }
switch (index)
{
case 0: index = ((45 << 14) + hix - 0x3fe00000) >> 12; break;
diff --git a/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c b/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c
index f3dd954887..98fe07d7a7 100644
--- a/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c
@@ -151,7 +151,11 @@ __kernel_sincosl(long double x, long double y, long double *sinx, long double *c
index = 0x3fe - (tix >> 20);
hix = (tix + (0x2000 << index)) & (0xffffc000 << index);
- x = fabsl (x);
+ if (signbit (x))
+ {
+ x = -x;
+ y = -y;
+ }
switch (index)
{
case 0: index = ((45 << 14) + hix - 0x3fe00000) >> 12; break;
diff --git a/sysdeps/ieee754/ldbl-128ibm/k_sinl.c b/sysdeps/ieee754/ldbl-128ibm/k_sinl.c
index 484b65fc8e..94aba0b62d 100644
--- a/sysdeps/ieee754/ldbl-128ibm/k_sinl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/k_sinl.c
@@ -134,7 +134,7 @@ __kernel_sinl(long double x, long double y, int iy)
*/
SET_LDOUBLE_WORDS64(h, ((u_int64_t)hix) << 32, 0);
if (iy)
- l = y - (h - x);
+ l = (ix < 0 ? -y : y) - (h - x);
else
l = x - h;
z = l * l;