diff options
author | Joseph Myers <joseph@codesourcery.com> | 2016-03-08 00:27:21 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2016-03-08 00:27:21 +0000 |
commit | cc4084017e211cdeafef2d9036a130cbd6f2cadd (patch) | |
tree | 69622062ca16f8a49a64cb9c386740df34da9921 /sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c | |
parent | 920b35c92ed8f41796c090c2819434e56701da5b (diff) | |
download | glibc-cc4084017e211cdeafef2d9036a130cbd6f2cadd.tar.gz glibc-cc4084017e211cdeafef2d9036a130cbd6f2cadd.tar.xz glibc-cc4084017e211cdeafef2d9036a130cbd6f2cadd.zip |
Fix ldbl-128ibm remainderl equality test for zero low part (bug 19677).
The ldbl-128ibm implementation of remainderl has logic resulting in incorrect tests for equality of the absolute values of the arguments in the case of zero low parts. If the low parts are both zero but with different signs, this can wrongly cause equal arguments to be treated as different, resulting in turn in incorrect signs of zero result in nondefault rounding modes arising from the subtractions done when the arguments are not equal. This patch fixes the logic to convert -0 low parts into +0 before the comparison (remquo already has separate logic to deal with signs of zero results, so doesn't need such a change). Tests are added for remainderl and remquol similar to that for fmodl, and based on a refactoring of it, since the bug depends on low parts which should not be relied upon in tests not setting the representation explicitly (although in fact the bug shows up in test-ldouble with current GCC). Tested for powerpc. [BZ #19677] * sysdeps/ieee754/ldbl-128ibm/e_remainderl.c (__ieee754_remainderl): Put zero low parts in canonical form. * sysdeps/ieee754/ldbl-128ibm/test-fmodrem-ldbl-128ibm.c: New file. Based on sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c. * sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c: Replace with wrapper round test-fmodrem-ldbl-128ibm.c. * sysdeps/ieee754/ldbl-128ibm/test-remainderl-ldbl-128ibm.c: New file. * sysdeps/ieee754/ldbl-128ibm/test-remquol-ldbl-128ibm.c: Likewise. * sysdeps/ieee754/ldbl-128ibm/Makefile (tests): Add test-remainderl-ldbl-128ibm and test-remquol-ldbl-128ibm.
Diffstat (limited to 'sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c')
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c | 62 |
1 files changed, 3 insertions, 59 deletions
diff --git a/sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c b/sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c index 3717c90aba..73d4bc1632 100644 --- a/sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c +++ b/sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c @@ -16,62 +16,6 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ -#include <float.h> -#include <math.h> -#include <stdio.h> - -union u -{ - long double ld; - double d[2]; -}; - -volatile union u p1 = { .d = { DBL_MIN, 0.0 } }; -volatile union u p2 = { .d = { DBL_MIN, -0.0 } }; -volatile union u m1 = { .d = { -DBL_MIN, 0.0 } }; -volatile union u m2 = { .d = { -DBL_MIN, -0.0 } }; - -static int -test_fmodl (const char *s, long double x, long double y, long double expected) -{ - volatile long double r; - r = fmodl (x, y); - if (r != expected || copysignl (1.0, r) != copysignl (1.0, expected)) - { - printf ("FAIL: fmodl (%s)\n", s); - return 1; - } - else - { - printf ("PASS: fmodl (%s)\n", s); - return 0; - } -} - -#define TEST_FMODL(a, b, e) test_fmodl (#a ", " #b, a, b, e) - -static int -do_test (void) -{ - int result = 0; - result |= TEST_FMODL (p1.ld, p1.ld, 0.0L); - result |= TEST_FMODL (p1.ld, p2.ld, 0.0L); - result |= TEST_FMODL (p1.ld, m1.ld, 0.0L); - result |= TEST_FMODL (p1.ld, m2.ld, 0.0L); - result |= TEST_FMODL (p2.ld, p1.ld, 0.0L); - result |= TEST_FMODL (p2.ld, p2.ld, 0.0L); - result |= TEST_FMODL (p2.ld, m1.ld, 0.0L); - result |= TEST_FMODL (p2.ld, m2.ld, 0.0L); - result |= TEST_FMODL (m1.ld, p1.ld, -0.0L); - result |= TEST_FMODL (m1.ld, p2.ld, -0.0L); - result |= TEST_FMODL (m1.ld, m1.ld, -0.0L); - result |= TEST_FMODL (m1.ld, m2.ld, -0.0L); - result |= TEST_FMODL (m2.ld, p1.ld, -0.0L); - result |= TEST_FMODL (m2.ld, p2.ld, -0.0L); - result |= TEST_FMODL (m2.ld, m1.ld, -0.0L); - result |= TEST_FMODL (m2.ld, m2.ld, -0.0L); - return result; -} - -#define TEST_FUNCTION do_test () -#include "../../../test-skeleton.c" +#define FUNC fmodl +#define SETUP +#include "test-fmodrem-ldbl-128ibm.c" |