diff options
49 files changed, 518 insertions, 26 deletions
@@ -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. @@ -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 |
