From eaf5ad0bc4a67bf40999e22db6f583ebc3a806ba Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 26 Oct 2016 23:14:31 +0000 Subject: Add canonicalize, canonicalizef, canonicalizel. TS 18661-1 defines canonicalize functions to produce a canonical version of a floating-point representation. This patch implements these functions for glibc. As with the iscanonical macro, these functions are oriented to the decimal floating-point case, where some values have both canonical and noncanonical representations. However, the functions have a return value that says whether they succeeded in storing a canonical result; thus, they can fail for the case of an invalid representation (while still not making any particular choice from among multiple equally canonical valid representations of the same value). Since no floating-point formats in glibc actually have noncanonical valid representations, a type-generic implementation of these functions can be used that expects iscanonical to return 0 only for invalid representations. Now that iscanonical is used within libm.so, libm_hidden_proto / libm_hidden_def are added for __iscanonicall. The definition of these functions is intended to correspond to a convertFormat operation to the same floating-point format. Thus, they convert signaling NaNs to quiet NaNs, raising the "invalid" exception. Such a conversion "should" produce "the canonical version of that signaling NaN made quiet". libm-test.inc is made to check NaN payloads for the output of these functions, a new feature (at some point manipulation functions such as fabs and copysign should have tests added that verify payload preservation for them). As however some architectures may not follow the recommended practice of preserving NaN payloads when converting a signaling NaN to quiet, a new math-tests.h macro SNAN_TESTS_PRESERVE_PAYLOAD is added, and defined to 0 for non-NAN2008 MIPS; any other architectures seeing test failures for lack of payload preservation in this case should also define this macro to 0. (If any cases arise where the sign isn't preserved either, those should have a similar macro added.) The ldbl-96 and ldbl-128ibm tests of iscanonical are renamed and adapted to test canonicalizel as well on the same representations. Tested for x86_64, x86, mips64 and powerpc. * math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (canonicalize): New declaration. * math/Versions (canonicalize): New libm symbol at version GLIBC_2.25. (canonicalizef): Likewise. (canonicalizel): Likewise. * math/Makefile (gen-libm-calls): Add s_canonicalizeF. * math/s_canonicalize_template.c: New file. * math/libm-test.inc: Update comment on functions tested and testing of NaN payloads. (TEST_NAN_PAYLOAD): New macro. (NO_TEST_INLINE): Update value. (XFAIL_TEST): Likewise. (ERRNO_UNCHANGED): Likewise. (ERRNO_EDOM): Likewise. (ERRNO_ERANGE): Likewise. (IGNORE_RESULT): Likewise. (NON_FINITE): Likewise. (TEST_SNAN): Likewise. (NO_TEST_MATHVEC): Likewise. (TEST_NAN_PAYLOAD_CANONICALIZE): New macro. (check_float_internal): Check NaN payloads if TEST_NAN_PAYLOAD. (struct test_Ffp_b1_data): New type. (RUN_TEST_Ffp_b1): New macro. (RUN_TEST_LOOP_Ffp_b1): Likewise. (canonicalize_test_data): New array. (canonicalize_test): New function. (main): Call canonicalize_test. * manual/arith.texi (FP Bit Twiddling): Document canonicalize, canonicalizef and canonicalizel. * manual/libm-err-tab.pl: Update comment on interfaces without ulps tabulated. * sysdeps/ieee754/ldbl-opt/nldbl-canonicalize.c: New file. * sysdeps/ieee754/ldbl-opt/s_canonicalizel.c: Likewise. * sysdeps/ieee754/ldbl-opt/Makefile (libnldbl-calls): Add canonicalize. (CFLAGS-nldbl-canonicalize.c): New variable. * sysdeps/ieee754/ldbl-128ibm/test-iscanonical-ldbl-128ibm.c: Move to ... * sysdeps/ieee754/ldbl-128ibm/test-canonical-ldbl-128ibm.c: ... here. (do_test): Also test canonicalizel. * sysdeps/ieee754/ldbl-128ibm/Makefile (tests): Change test-iscanonical-ldbl-128ibm to test-canonical-ldbl-128ibm. * sysdeps/ieee754/ldbl-128ibm/include/bits/iscanonical.h: New file. * sysdeps/ieee754/ldbl-128ibm/s_iscanonicall.c (__iscanonicall): Use libm_hidden_def. * sysdeps/ieee754/ldbl-96/test-iscanonical-ldbl-96.c: Move to ... * sysdeps/ieee754/ldbl-96/test-canonical-ldbl-96.c: ... here. (do_test): Also test canonicalizel. * sysdeps/ieee754/ldbl-96/Makefile (tests): Change test-iscanonical-ldbl-96 to test-canonical-ldbl-96. * sysdeps/ieee754/ldbl-96/include/bits/iscanonical.h: New file. * sysdeps/ieee754/ldbl-96/s_iscanonicall.c (__iscanonicall): Use libm_hidden_def. * sysdeps/generic/math-tests.h (SNAN_TESTS_PRESERVE_PAYLOAD): New macro. * sysdeps/mips/math-tests.h [__mips_hard_float && !__mips_nan2008] (SNAN_TESTS_PRESERVE_PAYLOAD): Likewise. * sysdeps/nacl/libm.abilist: Update. * sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise. --- sysdeps/generic/math-tests.h | 8 + sysdeps/ieee754/ldbl-128ibm/Makefile | 2 +- .../ieee754/ldbl-128ibm/include/bits/iscanonical.h | 5 + sysdeps/ieee754/ldbl-128ibm/s_iscanonicall.c | 1 + .../ldbl-128ibm/test-canonical-ldbl-128ibm.c | 230 +++++++++++++++++++++ .../ldbl-128ibm/test-iscanonical-ldbl-128ibm.c | 203 ------------------ sysdeps/ieee754/ldbl-96/Makefile | 2 +- sysdeps/ieee754/ldbl-96/include/bits/iscanonical.h | 5 + sysdeps/ieee754/ldbl-96/s_iscanonicall.c | 1 + sysdeps/ieee754/ldbl-96/test-canonical-ldbl-96.c | 141 +++++++++++++ sysdeps/ieee754/ldbl-96/test-iscanonical-ldbl-96.c | 114 ---------- sysdeps/ieee754/ldbl-opt/Makefile | 4 +- sysdeps/ieee754/ldbl-opt/nldbl-canonicalize.c | 26 +++ sysdeps/ieee754/ldbl-opt/s_canonicalizel.c | 5 + sysdeps/mips/math-tests.h | 6 + sysdeps/nacl/libm.abilist | 3 + sysdeps/unix/sysv/linux/aarch64/libm.abilist | 3 + sysdeps/unix/sysv/linux/alpha/libm.abilist | 3 + sysdeps/unix/sysv/linux/arm/libm.abilist | 3 + sysdeps/unix/sysv/linux/hppa/libm.abilist | 3 + sysdeps/unix/sysv/linux/i386/libm.abilist | 3 + sysdeps/unix/sysv/linux/ia64/libm.abilist | 3 + sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist | 3 + sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist | 3 + sysdeps/unix/sysv/linux/microblaze/libm.abilist | 3 + sysdeps/unix/sysv/linux/mips/mips32/libm.abilist | 3 + sysdeps/unix/sysv/linux/mips/mips64/libm.abilist | 3 + sysdeps/unix/sysv/linux/nios2/libm.abilist | 3 + .../sysv/linux/powerpc/powerpc32/fpu/libm.abilist | 3 + .../linux/powerpc/powerpc32/nofpu/libm.abilist | 3 + .../sysv/linux/powerpc/powerpc64/libm-le.abilist | 3 + .../unix/sysv/linux/powerpc/powerpc64/libm.abilist | 3 + sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist | 3 + sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist | 3 + sysdeps/unix/sysv/linux/sh/libm.abilist | 3 + sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist | 3 + sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist | 3 + .../sysv/linux/tile/tilegx/tilegx32/libm.abilist | 3 + .../sysv/linux/tile/tilegx/tilegx64/libm.abilist | 3 + sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist | 3 + sysdeps/unix/sysv/linux/x86_64/64/libm.abilist | 3 + sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist | 3 + 42 files changed, 514 insertions(+), 320 deletions(-) create mode 100644 sysdeps/ieee754/ldbl-128ibm/include/bits/iscanonical.h create mode 100644 sysdeps/ieee754/ldbl-128ibm/test-canonical-ldbl-128ibm.c delete mode 100644 sysdeps/ieee754/ldbl-128ibm/test-iscanonical-ldbl-128ibm.c create mode 100644 sysdeps/ieee754/ldbl-96/include/bits/iscanonical.h create mode 100644 sysdeps/ieee754/ldbl-96/test-canonical-ldbl-96.c delete mode 100644 sysdeps/ieee754/ldbl-96/test-iscanonical-ldbl-96.c create mode 100644 sysdeps/ieee754/ldbl-opt/nldbl-canonicalize.c create mode 100644 sysdeps/ieee754/ldbl-opt/s_canonicalizel.c (limited to 'sysdeps') diff --git a/sysdeps/generic/math-tests.h b/sysdeps/generic/math-tests.h index 974dda403a..52f4eaee4e 100644 --- a/sysdeps/generic/math-tests.h +++ b/sysdeps/generic/math-tests.h @@ -41,6 +41,14 @@ # define SNAN_TESTS_TYPE_CAST 1 #endif +/* Indicate whether operations on signaling NaNs preserve the payload + (if possible; it is not possible with a zero payload if the high + bit is set for signaling NaNs) when generating a quiet NaN, and + this should be tested. */ +#ifndef SNAN_TESTS_PRESERVE_PAYLOAD +# define SNAN_TESTS_PRESERVE_PAYLOAD 1 +#endif + /* Indicate whether to run tests involving a given rounding mode for a given floating-point type, given that fesetround succeeds for that mode. All are run if fesetround succeeds unless overridden. */ diff --git a/sysdeps/ieee754/ldbl-128ibm/Makefile b/sysdeps/ieee754/ldbl-128ibm/Makefile index eb625a7234..bdba6cc6b5 100644 --- a/sysdeps/ieee754/ldbl-128ibm/Makefile +++ b/sysdeps/ieee754/ldbl-128ibm/Makefile @@ -11,6 +11,6 @@ endif ifeq ($(subdir),math) tests += test-fmodl-ldbl-128ibm test-remainderl-ldbl-128ibm \ - test-remquol-ldbl-128ibm test-iscanonical-ldbl-128ibm \ + test-remquol-ldbl-128ibm test-canonical-ldbl-128ibm \ test-totalorderl-ldbl-128ibm endif diff --git a/sysdeps/ieee754/ldbl-128ibm/include/bits/iscanonical.h b/sysdeps/ieee754/ldbl-128ibm/include/bits/iscanonical.h new file mode 100644 index 0000000000..bee080bd29 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm/include/bits/iscanonical.h @@ -0,0 +1,5 @@ +#include_next + +#ifndef _ISOMAC +libm_hidden_proto (__iscanonicall) +#endif diff --git a/sysdeps/ieee754/ldbl-128ibm/s_iscanonicall.c b/sysdeps/ieee754/ldbl-128ibm/s_iscanonicall.c index 100b4014e1..63ddb82402 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_iscanonicall.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_iscanonicall.c @@ -57,3 +57,4 @@ __iscanonicall (long double x) int expdiff = hexp - lexp; return expdiff > 53 || (expdiff == 53 && low_p2 && (ix & 1) == 0); } +libm_hidden_def (__iscanonicall) diff --git a/sysdeps/ieee754/ldbl-128ibm/test-canonical-ldbl-128ibm.c b/sysdeps/ieee754/ldbl-128ibm/test-canonical-ldbl-128ibm.c new file mode 100644 index 0000000000..1fe1bc4555 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm/test-canonical-ldbl-128ibm.c @@ -0,0 +1,230 @@ +/* Test iscanonical and canonicalizel for ldbl-128ibm. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include + +struct test +{ + double hi, lo; + bool canonical; +}; + +static const struct test tests[] = + { + { __builtin_nan (""), 0.0, true }, + { __builtin_nan (""), DBL_MAX, true }, + { __builtin_nan (""), __builtin_inf (), true }, + { __builtin_nan (""), __builtin_nan (""), true }, + { __builtin_nan (""), __builtin_nans (""), true }, + { __builtin_nans (""), 0.0, true }, + { __builtin_nans (""), DBL_MAX, true }, + { __builtin_nans (""), __builtin_inf (), true }, + { __builtin_nans (""), __builtin_nan (""), true }, + { __builtin_nans (""), __builtin_nans (""), true }, + { __builtin_inf (), 0.0, true }, + { __builtin_inf (), -0.0, true }, + { -__builtin_inf (), 0.0, true }, + { -__builtin_inf (), -0.0, true }, + { __builtin_inf (), DBL_TRUE_MIN, false }, + { __builtin_inf (), -DBL_TRUE_MIN, false }, + { -__builtin_inf (), DBL_TRUE_MIN, false }, + { -__builtin_inf (), -DBL_TRUE_MIN, false }, + { __builtin_inf (), DBL_MIN, false }, + { __builtin_inf (), -DBL_MIN, false }, + { -__builtin_inf (), DBL_MIN, false }, + { -__builtin_inf (), -DBL_MIN, false }, + { __builtin_inf (), __builtin_inf (), false }, + { __builtin_inf (), -__builtin_inf (), false }, + { -__builtin_inf (), __builtin_inf (), false }, + { -__builtin_inf (), -__builtin_inf (), false }, + { __builtin_inf (), __builtin_nan (""), false }, + { __builtin_inf (), -__builtin_nan (""), false }, + { -__builtin_inf (), __builtin_nan (""), false }, + { -__builtin_inf (), -__builtin_nan (""), false }, + { 0.0, 0.0, true }, + { 0.0, -0.0, true }, + { -0.0, 0.0, true }, + { -0.0, -0.0, true }, + { 0.0, DBL_TRUE_MIN, false }, + { 0.0, -DBL_TRUE_MIN, false }, + { -0.0, DBL_TRUE_MIN, false }, + { -0.0, -DBL_TRUE_MIN, false }, + { 0.0, DBL_MAX, false }, + { 0.0, -DBL_MAX, false }, + { -0.0, DBL_MAX, false }, + { -0.0, -DBL_MAX, false }, + { 0.0, __builtin_inf (), false }, + { 0.0, -__builtin_inf (), false }, + { -0.0, __builtin_inf (), false }, + { -0.0, -__builtin_inf (), false }, + { 0.0, __builtin_nan (""), false }, + { 0.0, -__builtin_nan (""), false }, + { -0.0, __builtin_nan (""), false }, + { -0.0, -__builtin_nan (""), false }, + { 1.0, 0.0, true }, + { 1.0, -0.0, true }, + { -1.0, 0.0, true }, + { -1.0, -0.0, true }, + { 1.0, DBL_TRUE_MIN, true }, + { 1.0, -DBL_TRUE_MIN, true }, + { -1.0, DBL_TRUE_MIN, true }, + { -1.0, -DBL_TRUE_MIN, true }, + { 1.0, DBL_MAX, false }, + { 1.0, -DBL_MAX, false }, + { -1.0, DBL_MAX, false }, + { -1.0, -DBL_MAX, false }, + { 1.0, __builtin_inf (), false }, + { 1.0, -__builtin_inf (), false }, + { -1.0, __builtin_inf (), false }, + { -1.0, -__builtin_inf (), false }, + { 1.0, __builtin_nan (""), false }, + { 1.0, -__builtin_nan (""), false }, + { -1.0, __builtin_nan (""), false }, + { -1.0, -__builtin_nan (""), false }, + { 0x1p1023, 0x1.1p969, true }, + { 0x1p1023, -0x1.1p969, true }, + { -0x1p1023, 0x1.1p969, true }, + { -0x1p1023, -0x1.1p969, true }, + { 0x1p1023, 0x1.1p970, false }, + { 0x1p1023, -0x1.1p970, false }, + { -0x1p1023, 0x1.1p970, false }, + { -0x1p1023, -0x1.1p970, false }, + { 0x1p1023, 0x1p970, true }, + { 0x1p1023, -0x1p970, true }, + { -0x1p1023, 0x1p970, true }, + { -0x1p1023, -0x1p970, true }, + { 0x1.0000000000001p1023, 0x1p970, false }, + { 0x1.0000000000001p1023, -0x1p970, false }, + { -0x1.0000000000001p1023, 0x1p970, false }, + { -0x1.0000000000001p1023, -0x1p970, false }, + { 0x1p-969, 0x1.1p-1023, true }, + { 0x1p-969, -0x1.1p-1023, true }, + { -0x1p-969, 0x1.1p-1023, true }, + { -0x1p-969, -0x1.1p-1023, true }, + { 0x1p-969, 0x1.1p-1022, false }, + { 0x1p-969, -0x1.1p-1022, false }, + { -0x1p-969, 0x1.1p-1022, false }, + { -0x1p-969, -0x1.1p-1022, false }, + { 0x1p-969, 0x1p-1022, true }, + { 0x1p-969, -0x1p-1022, true }, + { -0x1p-969, 0x1p-1022, true }, + { -0x1p-969, -0x1p-1022, true }, + { 0x1.0000000000001p-969, 0x1p-1022, false }, + { 0x1.0000000000001p-969, -0x1p-1022, false }, + { -0x1.0000000000001p-969, 0x1p-1022, false }, + { -0x1.0000000000001p-969, -0x1p-1022, false }, + { 0x1p-970, 0x1.1p-1024, true }, + { 0x1p-970, -0x1.1p-1024, true }, + { -0x1p-970, 0x1.1p-1024, true }, + { -0x1p-970, -0x1.1p-1024, true }, + { 0x1p-970, 0x1.1p-1023, false }, + { 0x1p-970, -0x1.1p-1023, false }, + { -0x1p-970, 0x1.1p-1023, false }, + { -0x1p-970, -0x1.1p-1023, false }, + { 0x1p-970, 0x1p-1023, true }, + { 0x1p-970, -0x1p-1023, true }, + { -0x1p-970, 0x1p-1023, true }, + { -0x1p-970, -0x1p-1023, true }, + { 0x1.0000000000001p-970, 0x1p-1023, false }, + { 0x1.0000000000001p-970, -0x1p-1023, false }, + { -0x1.0000000000001p-970, 0x1p-1023, false }, + { -0x1.0000000000001p-970, -0x1p-1023, false }, + { 0x1p-1000, 0x1.1p-1054, true }, + { 0x1p-1000, -0x1.1p-1054, true }, + { -0x1p-1000, 0x1.1p-1054, true }, + { -0x1p-1000, -0x1.1p-1054, true }, + { 0x1p-1000, 0x1.1p-1053, false }, + { 0x1p-1000, -0x1.1p-1053, false }, + { -0x1p-1000, 0x1.1p-1053, false }, + { -0x1p-1000, -0x1.1p-1053, false }, + { 0x1p-1000, 0x1p-1053, true }, + { 0x1p-1000, -0x1p-1053, true }, + { -0x1p-1000, 0x1p-1053, true }, + { -0x1p-1000, -0x1p-1053, true }, + { 0x1.0000000000001p-1000, 0x1p-1053, false }, + { 0x1.0000000000001p-1000, -0x1p-1053, false }, + { -0x1.0000000000001p-1000, 0x1p-1053, false }, + { -0x1.0000000000001p-1000, -0x1p-1053, false }, + { 0x1p-1021, 0x1p-1074, true }, + { 0x1p-1021, -0x1p-1074, true }, + { -0x1p-1021, 0x1p-1074, true }, + { -0x1p-1021, -0x1p-1074, true }, + { 0x1.0000000000001p-1021, 0x1p-1074, false }, + { 0x1.0000000000001p-1021, -0x1p-1074, false }, + { -0x1.0000000000001p-1021, 0x1p-1074, false }, + { -0x1.0000000000001p-1021, -0x1p-1074, false }, + { 0x1p-1022, 0x1p-1074, false }, + { 0x1p-1022, -0x1p-1074, false }, + { -0x1p-1022, 0x1p-1074, false }, + { -0x1p-1022, -0x1p-1074, false }, + }; + +static int +do_test (void) +{ + int result = 0; + + for (size_t i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) + { + long double ld = ldbl_pack (tests[i].hi, tests[i].lo); + bool canonical = iscanonical (ld); + if (canonical == tests[i].canonical) + { + printf ("PASS: iscanonical test %zu\n", i); + long double ldc = 12345.0L; + bool canonicalize_ret = canonicalizel (&ldc, &ld); + if (canonicalize_ret == !canonical) + { + printf ("PASS: canonicalizel test %zu\n", i); + bool canon_ok; + if (!canonical) + canon_ok = ldc == 12345.0L; + else if (isnan (ld)) + canon_ok = isnan (ldc) && !issignaling (ldc); + else + canon_ok = ldc == ld; + if (canon_ok) + printf ("PASS: canonicalized value test %zu\n", i); + else + { + printf ("FAIL: canonicalized value test %zu\n", i); + result = 1; + } + } + else + { + printf ("FAIL: canonicalizel test %zu\n", i); + result = 1; + } + } + else + { + printf ("FAIL: iscanonical test %zu\n", i); + result = 1; + } + } + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/sysdeps/ieee754/ldbl-128ibm/test-iscanonical-ldbl-128ibm.c b/sysdeps/ieee754/ldbl-128ibm/test-iscanonical-ldbl-128ibm.c deleted file mode 100644 index fc16250f5c..0000000000 --- a/sysdeps/ieee754/ldbl-128ibm/test-iscanonical-ldbl-128ibm.c +++ /dev/null @@ -1,203 +0,0 @@ -/* Test iscanonical for ldbl-128ibm. - Copyright (C) 2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include -#include -#include - -struct test -{ - double hi, lo; - bool canonical; -}; - -static const struct test tests[] = - { - { __builtin_nan (""), 0.0, true }, - { __builtin_nan (""), DBL_MAX, true }, - { __builtin_nan (""), __builtin_inf (), true }, - { __builtin_nan (""), __builtin_nan (""), true }, - { __builtin_nan (""), __builtin_nans (""), true }, - { __builtin_nans (""), 0.0, true }, - { __builtin_nans (""), DBL_MAX, true }, - { __builtin_nans (""), __builtin_inf (), true }, - { __builtin_nans (""), __builtin_nan (""), true }, - { __builtin_nans (""), __builtin_nans (""), true }, - { __builtin_inf (), 0.0, true }, - { __builtin_inf (), -0.0, true }, - { -__builtin_inf (), 0.0, true }, - { -__builtin_inf (), -0.0, true }, - { __builtin_inf (), DBL_TRUE_MIN, false }, - { __builtin_inf (), -DBL_TRUE_MIN, false }, - { -__builtin_inf (), DBL_TRUE_MIN, false }, - { -__builtin_inf (), -DBL_TRUE_MIN, false }, - { __builtin_inf (), DBL_MIN, false }, - { __builtin_inf (), -DBL_MIN, false }, - { -__builtin_inf (), DBL_MIN, false }, - { -__builtin_inf (), -DBL_MIN, false }, - { __builtin_inf (), __builtin_inf (), false }, - { __builtin_inf (), -__builtin_inf (), false }, - { -__builtin_inf (), __builtin_inf (), false }, - { -__builtin_inf (), -__builtin_inf (), false }, - { __builtin_inf (), __builtin_nan (""), false }, - { __builtin_inf (), -__builtin_nan (""), false }, - { -__builtin_inf (), __builtin_nan (""), false }, - { -__builtin_inf (), -__builtin_nan (""), false }, - { 0.0, 0.0, true }, - { 0.0, -0.0, true }, - { -0.0, 0.0, true }, - { -0.0, -0.0, true }, - { 0.0, DBL_TRUE_MIN, false }, - { 0.0, -DBL_TRUE_MIN, false }, - { -0.0, DBL_TRUE_MIN, false }, - { -0.0, -DBL_TRUE_MIN, false }, - { 0.0, DBL_MAX, false }, - { 0.0, -DBL_MAX, false }, - { -0.0, DBL_MAX, false }, - { -0.0, -DBL_MAX, false }, - { 0.0, __builtin_inf (), false }, - { 0.0, -__builtin_inf (), false }, - { -0.0, __builtin_inf (), false }, - { -0.0, -__builtin_inf (), false }, - { 0.0, __builtin_nan (""), false }, - { 0.0, -__builtin_nan (""), false }, - { -0.0, __builtin_nan (""), false }, - { -0.0, -__builtin_nan (""), false }, - { 1.0, 0.0, true }, - { 1.0, -0.0, true }, - { -1.0, 0.0, true }, - { -1.0, -0.0, true }, - { 1.0, DBL_TRUE_MIN, true }, - { 1.0, -DBL_TRUE_MIN, true }, - { -1.0, DBL_TRUE_MIN, true }, - { -1.0, -DBL_TRUE_MIN, true }, - { 1.0, DBL_MAX, false }, - { 1.0, -DBL_MAX, false }, - { -1.0, DBL_MAX, false }, - { -1.0, -DBL_MAX, false }, - { 1.0, __builtin_inf (), false }, - { 1.0, -__builtin_inf (), false }, - { -1.0, __builtin_inf (), false }, - { -1.0, -__builtin_inf (), false }, - { 1.0, __builtin_nan (""), false }, - { 1.0, -__builtin_nan (""), false }, - { -1.0, __builtin_nan (""), false }, - { -1.0, -__builtin_nan (""), false }, - { 0x1p1023, 0x1.1p969, true }, - { 0x1p1023, -0x1.1p969, true }, - { -0x1p1023, 0x1.1p969, true }, - { -0x1p1023, -0x1.1p969, true }, - { 0x1p1023, 0x1.1p970, false }, - { 0x1p1023, -0x1.1p970, false }, - { -0x1p1023, 0x1.1p970, false }, - { -0x1p1023, -0x1.1p970, false }, - { 0x1p1023, 0x1p970, true }, - { 0x1p1023, -0x1p970, true }, - { -0x1p1023, 0x1p970, true }, - { -0x1p1023, -0x1p970, true }, - { 0x1.0000000000001p1023, 0x1p970, false }, - { 0x1.0000000000001p1023, -0x1p970, false }, - { -0x1.0000000000001p1023, 0x1p970, false }, - { -0x1.0000000000001p1023, -0x1p970, false }, - { 0x1p-969, 0x1.1p-1023, true }, - { 0x1p-969, -0x1.1p-1023, true }, - { -0x1p-969, 0x1.1p-1023, true }, - { -0x1p-969, -0x1.1p-1023, true }, - { 0x1p-969, 0x1.1p-1022, false }, - { 0x1p-969, -0x1.1p-1022, false }, - { -0x1p-969, 0x1.1p-1022, false }, - { -0x1p-969, -0x1.1p-1022, false }, - { 0x1p-969, 0x1p-1022, true }, - { 0x1p-969, -0x1p-1022, true }, - { -0x1p-969, 0x1p-1022, true }, - { -0x1p-969, -0x1p-1022, true }, - { 0x1.0000000000001p-969, 0x1p-1022, false }, - { 0x1.0000000000001p-969, -0x1p-1022, false }, - { -0x1.0000000000001p-969, 0x1p-1022, false }, - { -0x1.0000000000001p-969, -0x1p-1022, false }, - { 0x1p-970, 0x1.1p-1024, true }, - { 0x1p-970, -0x1.1p-1024, true }, - { -0x1p-970, 0x1.1p-1024, true }, - { -0x1p-970, -0x1.1p-1024, true }, - { 0x1p-970, 0x1.1p-1023, false }, - { 0x1p-970, -0x1.1p-1023, false }, - { -0x1p-970, 0x1.1p-1023, false }, - { -0x1p-970, -0x1.1p-1023, false }, - { 0x1p-970, 0x1p-1023, true }, - { 0x1p-970, -0x1p-1023, true }, - { -0x1p-970, 0x1p-1023, true }, - { -0x1p-970, -0x1p-1023, true }, - { 0x1.0000000000001p-970, 0x1p-1023, false }, - { 0x1.0000000000001p-970, -0x1p-1023, false }, - { -0x1.0000000000001p-970, 0x1p-1023, false }, - { -0x1.0000000000001p-970, -0x1p-1023, false }, - { 0x1p-1000, 0x1.1p-1054, true }, - { 0x1p-1000, -0x1.1p-1054, true }, - { -0x1p-1000, 0x1.1p-1054, true }, - { -0x1p-1000, -0x1.1p-1054, true }, - { 0x1p-1000, 0x1.1p-1053, false }, - { 0x1p-1000, -0x1.1p-1053, false }, - { -0x1p-1000, 0x1.1p-1053, false }, - { -0x1p-1000, -0x1.1p-1053, false }, - { 0x1p-1000, 0x1p-1053, true }, - { 0x1p-1000, -0x1p-1053, true }, - { -0x1p-1000, 0x1p-1053, true }, - { -0x1p-1000, -0x1p-1053, true }, - { 0x1.0000000000001p-1000, 0x1p-1053, false }, - { 0x1.0000000000001p-1000, -0x1p-1053, false }, - { -0x1.0000000000001p-1000, 0x1p-1053, false }, - { -0x1.0000000000001p-1000, -0x1p-1053, false }, - { 0x1p-1021, 0x1p-1074, true }, - { 0x1p-1021, -0x1p-1074, true }, - { -0x1p-1021, 0x1p-1074, true }, - { -0x1p-1021, -0x1p-1074, true }, - { 0x1.0000000000001p-1021, 0x1p-1074, false }, - { 0x1.0000000000001p-1021, -0x1p-1074, false }, - { -0x1.0000000000001p-1021, 0x1p-1074, false }, - { -0x1.0000000000001p-1021, -0x1p-1074, false }, - { 0x1p-1022, 0x1p-1074, false }, - { 0x1p-1022, -0x1p-1074, false }, - { -0x1p-1022, 0x1p-1074, false }, - { -0x1p-1022, -0x1p-1074, false }, - }; - -static int -do_test (void) -{ - int result = 0; - - for (size_t i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) - { - long double ld = ldbl_pack (tests[i].hi, tests[i].lo); - bool canonical = iscanonical (ld); - if (canonical == tests[i].canonical) - printf ("PASS: test %zu\n", i); - else - { - printf ("FAIL: test %zu\n", i); - result = 1; - } - } - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/sysdeps/ieee754/ldbl-96/Makefile b/sysdeps/ieee754/ldbl-96/Makefile index 931976d7b1..dcbfbbac25 100644 --- a/sysdeps/ieee754/ldbl-96/Makefile +++ b/sysdeps/ieee754/ldbl-96/Makefile @@ -17,5 +17,5 @@ # . ifeq ($(subdir),math) -tests += test-iscanonical-ldbl-96 test-totalorderl-ldbl-96 +tests += test-canonical-ldbl-96 test-totalorderl-ldbl-96 endif diff --git a/sysdeps/ieee754/ldbl-96/include/bits/iscanonical.h b/sysdeps/ieee754/ldbl-96/include/bits/iscanonical.h new file mode 100644 index 0000000000..bee080bd29 --- /dev/null +++ b/sysdeps/ieee754/ldbl-96/include/bits/iscanonical.h @@ -0,0 +1,5 @@ +#include_next + +#ifndef _ISOMAC +libm_hidden_proto (__iscanonicall) +#endif diff --git a/sysdeps/ieee754/ldbl-96/s_iscanonicall.c b/sysdeps/ieee754/ldbl-96/s_iscanonicall.c index f820030dc0..91ce80d4f1 100644 --- a/sysdeps/ieee754/ldbl-96/s_iscanonicall.c +++ b/sysdeps/ieee754/ldbl-96/s_iscanonicall.c @@ -41,3 +41,4 @@ __iscanonicall (long double x) the high bit to be set. */ return ix == 0 || ix == 0x7fff || mant_high; } +libm_hidden_def (__iscanonicall) diff --git a/sysdeps/ieee754/ldbl-96/test-canonical-ldbl-96.c b/sysdeps/ieee754/ldbl-96/test-canonical-ldbl-96.c new file mode 100644 index 0000000000..ce6dc5b3fa --- /dev/null +++ b/sysdeps/ieee754/ldbl-96/test-canonical-ldbl-96.c @@ -0,0 +1,141 @@ +/* Test iscanonical and canonicalizel for ldbl-96. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include + +struct test +{ + bool sign; + uint16_t exponent; + bool high; + uint64_t mantissa; + bool canonical; +}; + +#define M68K_VARIANT (LDBL_MIN_EXP == -16382) + +static const struct test tests[] = + { + { false, 0, true, 0, M68K_VARIANT }, + { true, 0, true, 0, M68K_VARIANT }, + { false, 0, true, 1, M68K_VARIANT }, + { true, 0, true, 1, M68K_VARIANT }, + { false, 0, true, 0x100000000ULL, M68K_VARIANT }, + { true, 0, true, 0x100000000ULL, M68K_VARIANT }, + { false, 0, false, 0, true }, + { true, 0, false, 0, true }, + { false, 0, false, 1, true }, + { true, 0, false, 1, true }, + { false, 0, false, 0x100000000ULL, true }, + { true, 0, false, 0x100000000ULL, true }, + { false, 1, true, 0, true }, + { true, 1, true, 0, true }, + { false, 1, true, 1, true }, + { true, 1, true, 1, true }, + { false, 1, true, 0x100000000ULL, true }, + { true, 1, true, 0x100000000ULL, true }, + { false, 1, false, 0, false }, + { true, 1, false, 0, false }, + { false, 1, false, 1, false }, + { true, 1, false, 1, false }, + { false, 1, false, 0x100000000ULL, false }, + { true, 1, false, 0x100000000ULL, false }, + { false, 0x7ffe, true, 0, true }, + { true, 0x7ffe, true, 0, true }, + { false, 0x7ffe, true, 1, true }, + { true, 0x7ffe, true, 1, true }, + { false, 0x7ffe, true, 0x100000000ULL, true }, + { true, 0x7ffe, true, 0x100000000ULL, true }, + { false, 0x7ffe, false, 0, false }, + { true, 0x7ffe, false, 0, false }, + { false, 0x7ffe, false, 1, false }, + { true, 0x7ffe, false, 1, false }, + { false, 0x7ffe, false, 0x100000000ULL, false }, + { true, 0x7ffe, false, 0x100000000ULL, false }, + { false, 0x7fff, true, 0, true }, + { true, 0x7fff, true, 0, true }, + { false, 0x7fff, true, 1, true }, + { true, 0x7fff, true, 1, true }, + { false, 0x7fff, true, 0x100000000ULL, true }, + { true, 0x7fff, true, 0x100000000ULL, true }, + { false, 0x7fff, false, 0, M68K_VARIANT }, + { true, 0x7fff, false, 0, M68K_VARIANT }, + { false, 0x7fff, false, 1, M68K_VARIANT }, + { true, 0x7fff, false, 1, M68K_VARIANT }, + { false, 0x7fff, false, 0x100000000ULL, M68K_VARIANT }, + { true, 0x7fff, false, 0x100000000ULL, M68K_VARIANT }, + }; + +static int +do_test (void) +{ + int result = 0; + + for (size_t i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) + { + long double ld; + SET_LDOUBLE_WORDS (ld, tests[i].exponent | (tests[i].sign << 15), + (tests[i].mantissa >> 32) | (tests[i].high << 31), + tests[i].mantissa & 0xffffffffULL); + bool canonical = iscanonical (ld); + if (canonical == tests[i].canonical) + { + printf ("PASS: iscanonical test %zu\n", i); + long double ldc = 12345.0L; + bool canonicalize_ret = canonicalizel (&ldc, &ld); + if (canonicalize_ret == !canonical) + { + printf ("PASS: canonicalizel test %zu\n", i); + bool canon_ok; + if (!canonical) + canon_ok = ldc == 12345.0L; + else if (isnan (ld)) + canon_ok = isnan (ldc) && !issignaling (ldc); + else + canon_ok = ldc == ld; + if (canon_ok) + printf ("PASS: canonicalized value test %zu\n", i); + else + { + printf ("FAIL: canonicalized value test %zu\n", i); + result = 1; + } + } + else + { + printf ("FAIL: canonicalizel test %zu\n", i); + result = 1; + } + } + else + { + printf ("FAIL: iscanonical test %zu\n", i); + result = 1; + } + } + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/sysdeps/ieee754/ldbl-96/test-iscanonical-ldbl-96.c b/sysdeps/ieee754/ldbl-96/test-iscanonical-ldbl-96.c deleted file mode 100644 index 6827aa8108..0000000000 --- a/sysdeps/ieee754/ldbl-96/test-iscanonical-ldbl-96.c +++ /dev/null @@ -1,114 +0,0 @@ -/* Test iscanonical for ldbl-96. - Copyright (C) 2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include -#include -#include -#include - -struct test -{ - bool sign; - uint16_t exponent; - bool high; - uint64_t mantissa; - bool canonical; -}; - -#define M68K_VARIANT (LDBL_MIN_EXP == -16382) - -static const struct test tests[] = - { - { false, 0, true, 0, M68K_VARIANT }, - { true, 0, true, 0, M68K_VARIANT }, - { false, 0, true, 1, M68K_VARIANT }, - { true, 0, true, 1, M68K_VARIANT }, - { false, 0, true, 0x100000000ULL, M68K_VARIANT }, - { true, 0, true, 0x100000000ULL, M68K_VARIANT }, - { false, 0, false, 0, true }, - { true, 0, false, 0, true }, - { false, 0, false, 1, true }, - { true, 0, false, 1, true }, - { false, 0, false, 0x100000000ULL, true }, - { true, 0, false, 0x100000000ULL, true }, - { false, 1, true, 0, true }, - { true, 1, true, 0, true }, - { false, 1, true, 1, true }, - { true, 1, true, 1, true }, - { false, 1, true, 0x100000000ULL, true }, - { true, 1, true, 0x100000000ULL, true }, - { false, 1, false, 0, false }, - { true, 1, false, 0, false }, - { false, 1, false, 1, false }, - { true, 1, false, 1, false }, - { false, 1, false, 0x100000000ULL, false }, - { true, 1, false, 0x100000000ULL, false }, - { false, 0x7ffe, true, 0, true }, - { true, 0x7ffe, true, 0, true }, - { false, 0x7ffe, true, 1, true }, - { true, 0x7ffe, true, 1, true }, - { false, 0x7ffe, true, 0x100000000ULL, true }, - { true, 0x7ffe, true, 0x100000000ULL, true }, - { false, 0x7ffe, false, 0, false }, - { true, 0x7ffe, false, 0, false }, - { false, 0x7ffe, false, 1, false }, - { true, 0x7ffe, false, 1, false }, - { false, 0x7ffe, false, 0x100000000ULL, false }, - { true, 0x7ffe, false, 0x100000000ULL, false }, - { false, 0x7fff, true, 0, true }, - { true, 0x7fff, true, 0, true }, - { false, 0x7fff, true, 1, true }, - { true, 0x7fff, true, 1, true }, - { false, 0x7fff, true, 0x100000000ULL, true }, - { true, 0x7fff, true, 0x100000000ULL, true }, - { false, 0x7fff, false, 0, M68K_VARIANT }, - { true, 0x7fff, false, 0, M68K_VARIANT }, - { false, 0x7fff, false, 1, M68K_VARIANT }, - { true, 0x7fff, false, 1, M68K_VARIANT }, - { false, 0x7fff, false, 0x100000000ULL, M68K_VARIANT }, - { true, 0x7fff, false, 0x100000000ULL, M68K_VARIANT }, - }; - -static int -do_test (void) -{ - int result = 0; - - for (size_t i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) - { - long double ld; - SET_LDOUBLE_WORDS (ld, tests[i].exponent | (tests[i].sign << 15), - (tests[i].mantissa >> 32) | (tests[i].high << 31), - tests[i].mantissa & 0xffffffffULL); - bool canonical = iscanonical (ld); - if (canonical == tests[i].canonical) - printf ("PASS: test %zu\n", i); - else - { - printf ("FAIL: test %zu\n", i); - result = 1; - } - } - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/sysdeps/ieee754/ldbl-opt/Makefile b/sysdeps/ieee754/ldbl-opt/Makefile index e97abdc44d..745fa4c8cf 100644 --- a/sysdeps/ieee754/ldbl-opt/Makefile +++ b/sysdeps/ieee754/ldbl-opt/Makefile @@ -42,7 +42,8 @@ libnldbl-calls = asprintf dprintf fprintf fscanf fwprintf fwscanf iovfscanf \ isoc99_vscanf isoc99_vfscanf isoc99_vsscanf \ isoc99_wscanf isoc99_fwscanf isoc99_swscanf \ isoc99_vwscanf isoc99_vfwscanf isoc99_vswscanf \ - nextup nextdown totalorder totalordermag getpayload + nextup nextdown totalorder totalordermag getpayload \ + canonicalize libnldbl-routines = $(libnldbl-calls:%=nldbl-%) libnldbl-inhibit-o = $(object-suffixes) libnldbl-static-only-routines = $(libnldbl-routines) @@ -58,6 +59,7 @@ CFLAGS-nldbl-atanh.c = -fno-builtin-atanhl CFLAGS-nldbl-cabs.c = -fno-builtin-cabsl CFLAGS-nldbl-cacos.c = -fno-builtin-cacosl CFLAGS-nldbl-cacosh.c = -fno-builtin-cacoshl +CFLAGS-nldbl-canonicalize.c = -fno-builtin-canonicalizel CFLAGS-nldbl-carg.c = -fno-builtin-cargl CFLAGS-nldbl-casin.c = -fno-builtin-casinl CFLAGS-nldbl-casinh.c = -fno-builtin-casinhl diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-canonicalize.c b/sysdeps/ieee754/ldbl-opt/nldbl-canonicalize.c new file mode 100644 index 0000000000..3b33d5c57e --- /dev/null +++ b/sysdeps/ieee754/ldbl-opt/nldbl-canonicalize.c @@ -0,0 +1,26 @@ +/* Compatibility routine for IEEE double as long double for canonicalize. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "nldbl-compat.h" + +int +attribute_hidden +canonicalizel (double *cx, double *x) +{ + return canonicalize (cx, x); +} diff --git a/sysdeps/ieee754/ldbl-opt/s_canonicalizel.c b/sysdeps/ieee754/ldbl-opt/s_canonicalizel.c new file mode 100644 index 0000000000..d5d67dfe0c --- /dev/null +++ b/sysdeps/ieee754/ldbl-opt/s_canonicalizel.c @@ -0,0 +1,5 @@ +/* canonicalizel is not subject to complex aliasing rules. It was + added in glibc 2.25. */ +#define declare_mgen_alias(from, to) weak_alias (M_SUF (from), M_SUF (to)) +#include +#include diff --git a/sysdeps/mips/math-tests.h b/sysdeps/mips/math-tests.h index f41c1616b0..fb08bca418 100644 --- a/sysdeps/mips/math-tests.h +++ b/sysdeps/mips/math-tests.h @@ -35,4 +35,10 @@ # define EXCEPTION_TESTS_long_double 0 #endif +/* NaN payload preservation when converting a signaling NaN to quiet + is only required in NAN2008 mode. */ +#if defined __mips_hard_float && !defined __mips_nan2008 +# define SNAN_TESTS_PRESERVE_PAYLOAD 0 +#endif + #include_next diff --git a/sysdeps/nacl/libm.abilist b/sysdeps/nacl/libm.abilist index b721bfb379..b0fc19f9f7 100644 --- a/sysdeps/nacl/libm.abilist +++ b/sysdeps/nacl/libm.abilist @@ -382,6 +382,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist index dbd620e474..9d5936c5c6 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist +++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist @@ -414,6 +414,9 @@ GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist index 3af146a00d..ce5be3c567 100644 --- a/sysdeps/unix/sysv/linux/alpha/libm.abilist +++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist @@ -424,6 +424,9 @@ GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/arm/libm.abilist b/sysdeps/unix/sysv/linux/arm/libm.abilist index 502b5128c8..675dfa5b86 100644 --- a/sysdeps/unix/sysv/linux/arm/libm.abilist +++ b/sysdeps/unix/sysv/linux/arm/libm.abilist @@ -71,6 +71,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist index 232ef8ea3e..75b71ad8f7 100644 --- a/sysdeps/unix/sysv/linux/hppa/libm.abilist +++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist @@ -383,6 +383,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist index b6151a9680..5db3def6fd 100644 --- a/sysdeps/unix/sysv/linux/i386/libm.abilist +++ b/sysdeps/unix/sysv/linux/i386/libm.abilist @@ -427,6 +427,9 @@ GLIBC_2.25 __iscanonicall F GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/ia64/libm.abilist b/sysdeps/unix/sysv/linux/ia64/libm.abilist index 941c4bf49a..a80c93a00f 100644 --- a/sysdeps/unix/sysv/linux/ia64/libm.abilist +++ b/sysdeps/unix/sysv/linux/ia64/libm.abilist @@ -356,6 +356,9 @@ GLIBC_2.25 __iscanonicall F GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist index 502b5128c8..675dfa5b86 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist @@ -71,6 +71,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist index 1080dc6cda..c795dbdc88 100644 --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist @@ -425,6 +425,9 @@ GLIBC_2.25 __iscanonicall F GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/microblaze/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/libm.abilist index f86e20c775..cdc8f19971 100644 --- a/sysdeps/unix/sysv/linux/microblaze/libm.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/libm.abilist @@ -382,6 +382,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist index 7965bf20dc..a610b03eba 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist @@ -384,6 +384,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist index 0711e03a8b..dfd888cf70 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist @@ -416,6 +416,9 @@ GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/nios2/libm.abilist b/sysdeps/unix/sysv/linux/nios2/libm.abilist index b4b81647ac..a6c505d19a 100644 --- a/sysdeps/unix/sysv/linux/nios2/libm.abilist +++ b/sysdeps/unix/sysv/linux/nios2/libm.abilist @@ -382,6 +382,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist index d5253c1244..9a5f983c3c 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist @@ -427,6 +427,9 @@ GLIBC_2.25 __iscanonicall F GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist index 274eede940..24f0127055 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist @@ -426,6 +426,9 @@ GLIBC_2.25 __iscanonicall F GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist index 1af5a2fa74..00c7d22dfc 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist @@ -421,6 +421,9 @@ GLIBC_2.25 __iscanonicall F GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist index 767905c801..bfbaa36634 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist @@ -102,6 +102,9 @@ GLIBC_2.25 __iscanonicall F GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist index 342a27b7c8..6e52936a88 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist @@ -414,6 +414,9 @@ GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist index 58b6e50d85..a01c58857b 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist @@ -412,6 +412,9 @@ GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/sh/libm.abilist b/sysdeps/unix/sysv/linux/sh/libm.abilist index ab550995a5..96497844bb 100644 --- a/sysdeps/unix/sysv/linux/sh/libm.abilist +++ b/sysdeps/unix/sysv/linux/sh/libm.abilist @@ -383,6 +383,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist index 76c6e8e818..ba10933919 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist @@ -417,6 +417,9 @@ GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist index 4e54a03eff..82245edfba 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist @@ -415,6 +415,9 @@ GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist index e9a7426ac6..1d4d6f98c6 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist @@ -383,6 +383,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist index e9a7426ac6..1d4d6f98c6 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist @@ -383,6 +383,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist index e9a7426ac6..1d4d6f98c6 100644 --- a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist @@ -383,6 +383,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist index ab57b5867d..b0bbadac09 100644 --- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist @@ -416,6 +416,9 @@ GLIBC_2.25 __iscanonicall F GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist index 8aaa2a4ab8..87f085202f 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist @@ -415,6 +415,9 @@ GLIBC_2.25 __iscanonicall F GLIBC_2.25 __iseqsig F GLIBC_2.25 __iseqsigf F GLIBC_2.25 __iseqsigl F +GLIBC_2.25 canonicalize F +GLIBC_2.25 canonicalizef F +GLIBC_2.25 canonicalizel F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F -- cgit v1.2.1