about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2016-02-19 00:55:46 +0000
committerJoseph Myers <joseph@codesourcery.com>2016-02-19 00:55:46 +0000
commit9120a57f4819965fa976d5de3b1d27b284319ed1 (patch)
tree3b5cc8cad1e09a47f23d9072009fb8545de34cfd
parent0fed79a8279bb4d4483895a742457946faf89594 (diff)
downloadglibc-9120a57f4819965fa976d5de3b1d27b284319ed1.tar.gz
glibc-9120a57f4819965fa976d5de3b1d27b284319ed1.tar.xz
glibc-9120a57f4819965fa976d5de3b1d27b284319ed1.zip
Fix ldbl-128ibm remainderl, remquol equality tests (bug 19603).
The ldbl-128ibm implementations of remainderl and remquol have logic
resulting in incorrect tests for equality of the absolute values of
the arguments.  Equality is tested based on the integer
representations of the high and low parts, with the sign bit masked
off the high part - but when this changes the sign of the high part,
the sign of the low part needs to be changed as well, and failure to
do this means arguments are wrongly treated as equal when they are
not.

This patch fixes the logic to adjust signs of low parts as needed.
Tested for powerpc.

	[BZ #19603]
	* sysdeps/ieee754/ldbl-128ibm/e_remainderl.c
	(__ieee754_remainderl): Adjust sign of integer version of low part
	when taking absolute value of high part.
	* sysdeps/ieee754/ldbl-128ibm/s_remquol.c (__remquol): Likewise.
	* math/libm-test.inc (remainder_test_data): Add another test.
	(remquo_test_data): Likewise.
-rw-r--r--ChangeLog10
-rw-r--r--math/libm-test.inc2
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/e_remainderl.c2
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_remquol.c2
4 files changed, 16 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 3e480edb1a..32fae2de24 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2016-02-19  Joseph Myers  <joseph@codesourcery.com>
+
+	[BZ #19603]
+	* sysdeps/ieee754/ldbl-128ibm/e_remainderl.c
+	(__ieee754_remainderl): Adjust sign of integer version of low part
+	when taking absolute value of high part.
+	* sysdeps/ieee754/ldbl-128ibm/s_remquol.c (__remquol): Likewise.
+	* math/libm-test.inc (remainder_test_data): Add another test.
+	(remquo_test_data): Likewise.
+
 2016-02-18  Joseph Myers  <joseph@codesourcery.com>
 
 	[BZ #19602]
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 3f0610d1b4..c9925fddb7 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -10392,6 +10392,7 @@ static const struct test_ff_f_data remainder_test_data[] =
     TEST_ff_f (remainder, 3.0, 2.0, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 #if defined TEST_LDOUBLE && LDBL_MANT_DIG >= 56
     TEST_ff_f (remainder, -0x1.80000000000002p1L, 2.0, 0x1.fffffffffffff8p-1L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (remainder, 0x0.ffffffffffffffp0L, -0x1.00000000000001p0L, -0x1p-55L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 #endif
 
     TEST_ff_f (remainder, 3419, 360, 179, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
@@ -10530,6 +10531,7 @@ static const struct test_ffI_f1_data remquo_test_data[] =
     TEST_ffI_f1 (remquo, 3, 2, -1, 2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 #if defined TEST_LDOUBLE && LDBL_MANT_DIG >= 56
     TEST_ffI_f1 (remquo, -0x1.80000000000002p1L, 2.0, 0x1.fffffffffffff8p-1L, -2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ffI_f1 (remquo, 0x0.ffffffffffffffp0L, -0x1.00000000000001p0L, -0x1p-55L, -1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 #endif
 
     TEST_ffI_f1 (remquo, 3419, 360, 179, 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
diff --git a/sysdeps/ieee754/ldbl-128ibm/e_remainderl.c b/sysdeps/ieee754/ldbl-128ibm/e_remainderl.c
index 800416f29a..1dc59a4785 100644
--- a/sysdeps/ieee754/ldbl-128ibm/e_remainderl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/e_remainderl.c
@@ -42,7 +42,9 @@ __ieee754_remainderl(long double x, long double p)
 	EXTRACT_WORDS64 (hp, phi);
 	EXTRACT_WORDS64 (lp, plo);
 	sx = hx&0x8000000000000000ULL;
+	lp ^= hp & 0x8000000000000000ULL;
 	hp &= 0x7fffffffffffffffLL;
+	lx ^= sx;
 	hx &= 0x7fffffffffffffffLL;
 
     /* purge off exception values */
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_remquol.c b/sysdeps/ieee754/ldbl-128ibm/s_remquol.c
index 20e17cc823..14b27ca616 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_remquol.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_remquol.c
@@ -43,7 +43,9 @@ __remquol (long double x, long double y, int *quo)
   EXTRACT_WORDS64 (ly, ylo);
   sx = hx & 0x8000000000000000ULL;
   qs = sx ^ (hy & 0x8000000000000000ULL);
+  ly ^= hy & 0x8000000000000000ULL;
   hy &= 0x7fffffffffffffffLL;
+  lx ^= sx;
   hx &= 0x7fffffffffffffffLL;
 
   /* Purge off exception values.  */