]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix ldbl-128ibm remainderl, remquol equality tests (bug 19603).
authorJoseph Myers <joseph@codesourcery.com>
Fri, 19 Feb 2016 00:55:46 +0000 (00:55 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 19 Feb 2016 00:55:46 +0000 (00:55 +0000)
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.

ChangeLog
math/libm-test.inc
sysdeps/ieee754/ldbl-128ibm/e_remainderl.c
sysdeps/ieee754/ldbl-128ibm/s_remquol.c

index 3e480edb1ae4b88b131da05efe3f20b84b0474dd..32fae2de244e1a519e004d9b9f01ad395fb13f26 100644 (file)
--- 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]
index 3f0610d1b4f8776adbb29bf514b5297f8b907df5..c9925fddb75815ad52ca585bbbd7168a0b432cc5 100644 (file)
@@ -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),
index 800416f29a2d40b7e60f9631ea45a05208e45975..1dc59a4785a8c5ec6df642f3aae9ab2294160e0f 100644 (file)
@@ -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 */
index 20e17cc82341191e55079fe6d99cc87c9437c833..14b27ca616398430f333c14c6e5e304b2a3cb6a7 100644 (file)
@@ -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.  */