Skip to content

Commit

Permalink
Fix ldbl-128ibm remainderl, remquol equality tests (bug 19603).
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Joseph Myers committed Feb 19, 2016
1 parent 0fed79a commit 9120a57
Showing 4 changed files with 16 additions and 0 deletions.
10 changes: 10 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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]
2 changes: 2 additions & 0 deletions math/libm-test.inc
Original file line number Diff line number Diff line change
@@ -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),
2 changes: 2 additions & 0 deletions sysdeps/ieee754/ldbl-128ibm/e_remainderl.c
Original file line number Diff line number Diff line change
@@ -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 */
2 changes: 2 additions & 0 deletions sysdeps/ieee754/ldbl-128ibm/s_remquol.c
Original file line number Diff line number Diff line change
@@ -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. */

0 comments on commit 9120a57

Please sign in to comment.