diff options
Diffstat (limited to 'sysdeps/ieee754')
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/Makefile | 2 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/include/bits/iscanonical.h | 5 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/s_iscanonicall.c | 1 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/test-canonical-ldbl-128ibm.c (renamed from sysdeps/ieee754/ldbl-128ibm/test-iscanonical-ldbl-128ibm.c) | 33 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/Makefile | 2 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/include/bits/iscanonical.h | 5 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/s_iscanonicall.c | 1 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/test-canonical-ldbl-96.c (renamed from sysdeps/ieee754/ldbl-96/test-iscanonical-ldbl-96.c) | 33 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-opt/Makefile | 4 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-opt/nldbl-canonicalize.c | 26 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-opt/s_canonicalizel.c | 5 |
11 files changed, 108 insertions, 9 deletions
diff --git a/sysdeps/ieee754/ldbl-128ibm/Makefile b/sysdeps/ieee754/ldbl-128ibm/Makefile index eb625a7..bdba6cc 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 0000000..bee080b --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm/include/bits/iscanonical.h @@ -0,0 +1,5 @@ +#include_next <bits/iscanonical.h> + +#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 100b401..63ddb82 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-iscanonical-ldbl-128ibm.c b/sysdeps/ieee754/ldbl-128ibm/test-canonical-ldbl-128ibm.c index fc16250..1fe1bc4 100644 --- a/sysdeps/ieee754/ldbl-128ibm/test-iscanonical-ldbl-128ibm.c +++ b/sysdeps/ieee754/ldbl-128ibm/test-canonical-ldbl-128ibm.c @@ -1,4 +1,4 @@ -/* Test iscanonical for ldbl-128ibm. +/* Test iscanonical and canonicalizel for ldbl-128ibm. Copyright (C) 2016 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -188,10 +188,37 @@ do_test (void) 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); + { + 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: test %zu\n", i); + printf ("FAIL: iscanonical test %zu\n", i); result = 1; } } diff --git a/sysdeps/ieee754/ldbl-96/Makefile b/sysdeps/ieee754/ldbl-96/Makefile index 931976d..dcbfbba 100644 --- a/sysdeps/ieee754/ldbl-96/Makefile +++ b/sysdeps/ieee754/ldbl-96/Makefile @@ -17,5 +17,5 @@ # <http://www.gnu.org/licenses/>. 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 0000000..bee080b --- /dev/null +++ b/sysdeps/ieee754/ldbl-96/include/bits/iscanonical.h @@ -0,0 +1,5 @@ +#include_next <bits/iscanonical.h> + +#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 f820030..91ce80d 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-iscanonical-ldbl-96.c b/sysdeps/ieee754/ldbl-96/test-canonical-ldbl-96.c index 6827aa8..ce6dc5b 100644 --- a/sysdeps/ieee754/ldbl-96/test-iscanonical-ldbl-96.c +++ b/sysdeps/ieee754/ldbl-96/test-canonical-ldbl-96.c @@ -1,4 +1,4 @@ -/* Test iscanonical for ldbl-96. +/* Test iscanonical and canonicalizel for ldbl-96. Copyright (C) 2016 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -99,10 +99,37 @@ do_test (void) tests[i].mantissa & 0xffffffffULL); bool canonical = iscanonical (ld); if (canonical == tests[i].canonical) - printf ("PASS: test %zu\n", i); + { + 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: test %zu\n", i); + printf ("FAIL: iscanonical test %zu\n", i); result = 1; } } diff --git a/sysdeps/ieee754/ldbl-opt/Makefile b/sysdeps/ieee754/ldbl-opt/Makefile index e97abdc..745fa4c 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 0000000..3b33d5c --- /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 + <http://www.gnu.org/licenses/>. */ + +#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 0000000..d5d67df --- /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 <math-type-macros-ldouble.h> +#include <s_canonicalize_template.c> |