aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog94
-rw-r--r--NEWS2
-rw-r--r--manual/arith.texi30
-rwxr-xr-xmanual/libm-err-tab.pl8
-rw-r--r--math/Makefile2
-rw-r--r--math/Versions1
-rw-r--r--math/bits/mathcalls.h3
-rw-r--r--math/libm-test.inc155
-rw-r--r--math/s_canonicalize_template.c37
-rw-r--r--sysdeps/generic/math-tests.h8
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/Makefile2
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/include/bits/iscanonical.h5
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_iscanonicall.c1
-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/Makefile2
-rw-r--r--sysdeps/ieee754/ldbl-96/include/bits/iscanonical.h5
-rw-r--r--sysdeps/ieee754/ldbl-96/s_iscanonicall.c1
-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/Makefile4
-rw-r--r--sysdeps/ieee754/ldbl-opt/nldbl-canonicalize.c26
-rw-r--r--sysdeps/ieee754/ldbl-opt/s_canonicalizel.c5
-rw-r--r--sysdeps/mips/math-tests.h6
-rw-r--r--sysdeps/nacl/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/alpha/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/arm/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/hppa/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/i386/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/ia64/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/nios2/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/sh/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/64/libm.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist3
49 files changed, 518 insertions, 26 deletions
diff --git a/ChangeLog b/ChangeLog
index 35813818ca..7dbfbc8d65 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,99 @@
2016-10-26 Joseph Myers <joseph@codesourcery.com>
+ * 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/ieee754/ldbl-opt/nldbl-getpayload.c: New file.
* sysdeps/ieee754/ldbl-opt/Makefile (libnldbl-calls): Add
getpayload.
diff --git a/NEWS b/NEWS
index ea1a0e0371..2da72cdf7a 100644
--- a/NEWS
+++ b/NEWS
@@ -58,6 +58,8 @@ Version 2.25
- Total order functions: totalorder, totalorderf, totalorderl,
totalordermag, totalordermagf, totalordermagl.
+ - Canonicalize functions: canonicalize, canonicalizef, canonicalizel.
+
- NaN functions: getpayload, getpayloadf, getpayloadl.
* The functions strfromd, strfromf, and strfroml, from ISO/IEC TS 18661-1:2014,
diff --git a/manual/arith.texi b/manual/arith.texi
index eaaf2b7127..a5c04e475f 100644
--- a/manual/arith.texi
+++ b/manual/arith.texi
@@ -1857,6 +1857,36 @@ selects one. On other systems it may do nothing.
@comment math.h
@comment ISO
+@deftypefun int canonicalize (double *@var{cx}, const double *@var{x})
+@comment math.h
+@comment ISO
+@deftypefunx int canonicalizef (float *@var{cx}, const float *@var{x})
+@comment math.h
+@comment ISO
+@deftypefunx int canonicalizel (long double *@var{cx}, const long double *@var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
+In some floating-point formats, some values have canonical (preferred)
+and noncanonical encodings (for IEEE interchange binary formats, all
+encodings are canonical). These functions, defined by TS
+18661-1:2014, attempt to produce a canonical version of the
+floating-point value pointed to by @var{x}; if that value is a
+signaling NaN, they raise the invalid exception and produce a quiet
+NaN. If a canonical value is produced, it is stored in the object
+pointed to by @var{cx}, and these functions return zero. Otherwise
+(if a canonical value could not be produced because the object pointed
+to by @var{x} is not a valid representation of any floating-point
+value), the object pointed to by @var{cx} is unchanged and a nonzero
+value is returned.
+
+Note that some formats have multiple encodings of a value which are
+all equally canonical; when such an encoding is used as an input to
+this function, any such encoding of the same value (or of the
+corresponding quiet NaN, if that value is a signaling NaN) may be
+produced as output.
+@end deftypefun
+
+@comment math.h
+@comment ISO
@deftypefun double getpayload (const double *@var{x})
@comment math.h
@comment ISO
diff --git a/manual/libm-err-tab.pl b/manual/libm-err-tab.pl
index 59c53720b3..18b8ca988f 100755
--- a/manual/libm-err-tab.pl
+++ b/manual/libm-err-tab.pl
@@ -77,10 +77,10 @@ use vars qw (%results @all_floats %suffices @all_functions);
"nextup", "pow", "remainder", "remquo", "rint", "round", "scalb",
"scalbn", "sin", "sincos", "sinh", "sqrt", "tan", "tanh", "tgamma",
"trunc", "y0", "y1", "yn" );
-# fpclassify, getpayload, iscanonical, isnormal, isfinite, isinf, isnan,
-# issignaling, issubnormal, iszero, signbit, iseqsig, isgreater,
-# isgreaterequal, isless, islessequal, islessgreater, isunordered,
-# totalorder, totalordermag
+# canonicalize, fpclassify, getpayload, iscanonical, isnormal,
+# isfinite, isinf, isnan, issignaling, issubnormal, iszero, signbit,
+# iseqsig, isgreater, isgreaterequal, isless, islessequal,
+# islessgreater, isunordered, totalorder, totalordermag
# are not tabulated.
if ($#ARGV == 0) {
diff --git a/math/Makefile b/math/Makefile
index 7cecba5357..f400d7b741 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -51,7 +51,7 @@ gen-libm-calls = cargF conjF cimagF crealF cabsF s_cacosF \
k_casinhF s_csinhF k_casinhF s_csinhF s_catanhF s_catanF \
s_ctanF s_ctanhF s_cexpF s_clogF s_cprojF s_csqrtF \
s_cpowF s_clog10F s_fdimF s_nextdownF s_fmaxF s_fminF \
- s_nanF s_iseqsigF
+ s_nanF s_iseqsigF s_canonicalizeF
libm-calls = \
e_acosF e_acoshF e_asinF e_atan2F e_atanhF e_coshF e_expF e_fmodF \
diff --git a/math/Versions b/math/Versions
index a2e0d900ad..0cd594b378 100644
--- a/math/Versions
+++ b/math/Versions
@@ -220,5 +220,6 @@ libm {
totalorder; totalorderf; totalorderl;
totalordermag; totalordermagf; totalordermagl;
getpayload; getpayloadf; getpayloadl;
+ canonicalize; canonicalizef; canonicalizel;
}
}
diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h
index c5853a325f..2fd1d289da 100644
--- a/math/bits/mathcalls.h
+++ b/math/bits/mathcalls.h
@@ -395,6 +395,9 @@ __MATHDECL_1 (int, totalorder,, (_Mdouble_ __x, _Mdouble_ __y))
__MATHDECL_1 (int, totalordermag,, (_Mdouble_ __x, _Mdouble_ __y))
__attribute__ ((__const__));
+/* Canonicalize floating-point representation. */
+__MATHDECL_1 (int, canonicalize,, (_Mdouble_ *__cx, const _Mdouble_ *__x));
+
/* Get NaN payload. */
__MATHCALL (getpayload,, (const _Mdouble_ *__x));
#endif
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 89e0e59638..710633842c 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -43,7 +43,8 @@
/* This testsuite has currently tests for:
acos, acosh, asin, asinh, atan, atan2, atanh,
- cbrt, ceil, copysign, cos, cosh, drem, erf, erfc, exp, exp10, exp2, expm1,
+ canonicalize, cbrt, ceil, copysign, cos, cosh, drem,
+ erf, erfc, exp, exp10, exp2, expm1,
fabs, fdim, finite, floor, fma, fmax, fmin, fmod, fpclassify,
frexp, gamma, getpayload, hypot,
ilogb, iscanonical, isfinite, isinf, isnan, isnormal, issignaling,
@@ -85,8 +86,9 @@
against. These implemented tests should check all cases that are
specified in ISO C99.
- NaN values: The payload of NaNs is not examined, but is set in
- inputs for functions where it is significant.
+ NaN values: The payload of NaNs is set in inputs for functions
+ where it is significant, and is examined in the outputs of some
+ functions.
Inline functions: Inlining functions should give an improvement in
speed - but not in precission. The inlined functions return
@@ -172,17 +174,22 @@
/* Some special test flags, passed together with exceptions. */
#define IGNORE_ZERO_INF_SIGN 0x400
#define TEST_NAN_SIGN 0x800
-#define NO_TEST_INLINE 0x1000
-#define XFAIL_TEST 0x2000
+#define TEST_NAN_PAYLOAD 0x1000
+#define NO_TEST_INLINE 0x2000
+#define XFAIL_TEST 0x4000
/* Indicate errno settings required or disallowed. */
-#define ERRNO_UNCHANGED 0x4000
-#define ERRNO_EDOM 0x8000
-#define ERRNO_ERANGE 0x10000
+#define ERRNO_UNCHANGED 0x8000
+#define ERRNO_EDOM 0x10000
+#define ERRNO_ERANGE 0x20000
/* Flags generated by gen-libm-test.pl, not entered here manually. */
-#define IGNORE_RESULT 0x20000
-#define NON_FINITE 0x40000
-#define TEST_SNAN 0x80000