diff options
author | Joseph Myers <joseph@codesourcery.com> | 2018-02-10 02:08:43 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2018-02-10 02:08:43 +0000 |
commit | d8742dd82f6a00601155c69bad3012e905591e1f (patch) | |
tree | d37836d2d6af8b428dc3092466bea93c2624469f /math/auto-libm-test-in | |
parent | a85b70dbd2efb84123dcfb7a2131b2de81b59b6a (diff) | |
download | glibc-d8742dd82f6a00601155c69bad3012e905591e1f.zip glibc-d8742dd82f6a00601155c69bad3012e905591e1f.tar.gz glibc-d8742dd82f6a00601155c69bad3012e905591e1f.tar.bz2 |
Add narrowing add functions.
This patch adds the narrowing add functions from TS 18661-1 to glibc's
libm: fadd, faddl, daddl, f32addf64, f32addf32x, f32xaddf64 for all
configurations; f32addf64x, f32addf128, f64addf64x, f64addf128,
f32xaddf64x, f32xaddf128, f64xaddf128 for configurations with
_Float64x and _Float128; __nldbl_daddl for ldbl-opt. As discussed for
the build infrastructure patch, tgmath.h support is deliberately
deferred, and FP_FAST_* macros are not applicable without optimized
function implementations.
Function implementations are added for all relevant pairs of formats
(including certain cases of a format and itself where more than one
type has that format). The main implementations use round-to-odd, or
a trivial computation in the case where both formats are the same or
where the wider format is IBM long double (in which case we don't
attempt to be correctly rounding). The sysdeps/ieee754/soft-fp
implementations use soft-fp, and are used automatically for
configurations without exceptions and rounding modes by virtue of
existing Implies files. As previously discussed, optimized versions
for particular architectures are possible, but not included.
i386 gets a special version of f32xaddf64 to avoid problems with
double rounding (similar to the existing fdim version), since this
function must round just once without an intermediate rounding to long
double. (No such special version is needed for any other function,
because the nontrivial functions use round-to-odd, which does the
intermediate computation with the rounding mode set to round-to-zero,
and double rounding is OK except in round-to-nearest mode, so is OK
for that intermediate round-to-zero computation.) mul and div will
need slightly different special versions for i386 (using round-to-odd
on long double instead of precision control) because of the
possibility of inexact intermediate results in the subnormal range for
double.
To reduce duplication among the different function implementations,
math-narrow.h gets macros CHECK_NARROW_ADD, NARROW_ADD_ROUND_TO_ODD
and NARROW_ADD_TRIVIAL.
In the trivial cases and for any architecture-specific optimized
implementations, the overhead of the errno setting might be
significant, but I think that's best handled through compiler built-in
functions rather than providing separate no-errno versions in glibc
(and likewise there are no __*_finite entry points for these function
provided, __*_finite effectively being no-errno versions at present in
most cases).
Tested for x86_64 and x86, with both GCC 6 and GCC 7. Tested for
mips64 (all three ABIs, both hard and soft float) and powerpc with GCC
7. Tested with build-many-glibcs.py with both GCC 6 and GCC 7.
* math/Makefile (libm-narrow-fns): Add add.
(libm-test-funcs-narrow): Likewise.
* math/Versions (GLIBC_2.28): Add narrowing add functions.
* math/bits/mathcalls-narrow.h (add): Use __MATHCALL_NARROW .
* math/gen-auto-libm-tests.c (test_functions): Add add.
* math/math-narrow.h (CHECK_NARROW_ADD): New macro.
(NARROW_ADD_ROUND_TO_ODD): Likewise.
(NARROW_ADD_TRIVIAL): Likewise.
* sysdeps/ieee754/float128/float128_private.h (__faddl): New
macro.
(__daddl): Likewise.
* sysdeps/ieee754/ldbl-opt/Makefile (libnldbl-calls): Add fadd and
dadd.
(CFLAGS-nldbl-dadd.c): New variable.
(CFLAGS-nldbl-fadd.c): Likewise.
* sysdeps/ieee754/ldbl-opt/Versions (GLIBC_2.28): Add
__nldbl_daddl.
* sysdeps/ieee754/ldbl-opt/nldbl-compat.h (__nldbl_daddl): New
prototype.
* manual/arith.texi (Misc FP Arithmetic): Document fadd, faddl,
daddl, fMaddfN, fMaddfNx, fMxaddfN and fMxaddfNx.
* math/auto-libm-test-in: Add tests of add.
* math/auto-libm-test-out-narrow-add: New generated file.
* math/libm-test-narrow-add.inc: New file.
* sysdeps/i386/fpu/s_f32xaddf64.c: Likewise.
* sysdeps/ieee754/dbl-64/s_f32xaddf64.c: Likewise.
* sysdeps/ieee754/dbl-64/s_fadd.c: Likewise.
* sysdeps/ieee754/float128/s_f32addf128.c: Likewise.
* sysdeps/ieee754/float128/s_f64addf128.c: Likewise.
* sysdeps/ieee754/float128/s_f64xaddf128.c: Likewise.
* sysdeps/ieee754/ldbl-128/s_daddl.c: Likewise.
* sysdeps/ieee754/ldbl-128/s_f64xaddf128.c: Likewise.
* sysdeps/ieee754/ldbl-128/s_faddl.c: Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_daddl.c: Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_faddl.c: Likewise.
* sysdeps/ieee754/ldbl-96/s_daddl.c: Likewise.
* sysdeps/ieee754/ldbl-96/s_faddl.c: Likewise.
* sysdeps/ieee754/ldbl-opt/nldbl-dadd.c: Likewise.
* sysdeps/ieee754/ldbl-opt/nldbl-fadd.c: Likewise.
* sysdeps/ieee754/soft-fp/s_daddl.c: Likewise.
* sysdeps/ieee754/soft-fp/s_fadd.c: Likewise.
* sysdeps/ieee754/soft-fp/s_faddl.c: Likewise.
* sysdeps/powerpc/fpu/libm-test-ulps: Update.
* sysdeps/mach/hurd/i386/libm.abilist: Likewise.
* 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/riscv/rv64/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/tilegx32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/tile/tilegx64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
Diffstat (limited to 'math/auto-libm-test-in')
-rw-r--r-- | math/auto-libm-test-in | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in index 614fe25..fc407e9 100644 --- a/math/auto-libm-test-in +++ b/math/auto-libm-test-in @@ -142,6 +142,101 @@ acosh 0x1.1808eep+0 acosh 0x1.1052c4p+0 acosh max no-test-inline +add 0 0 +add 0 -0 +add -0 0 +add -0 -0 +add max max +add max -max +add -max max +add -max -max +add min min missing-underflow:arg-ibm128 +add min -min missing-underflow:arg-ibm128 +add -min min missing-underflow:arg-ibm128 +add -min -min missing-underflow:arg-ibm128 +add min_subnorm min_subnorm missing-underflow:arg-ibm128 +add min_subnorm -min_subnorm missing-underflow:arg-ibm128 +add -min_subnorm min_subnorm missing-underflow:arg-ibm128 +add -min_subnorm -min_subnorm missing-underflow:arg-ibm128 +add 1 2 +add 1 -2 +add -1 2 +add -1 -2 +add 100.5 0.75 +add 100.5 -0.75 +add -100.5 0.75 +add -100.5 -0.75 +add 1 0x1p-23 +add 1 0x1.7fp-23 +add 1 0x1.8p-23 +add 1 0x1.81p-23 +add 1 0x1p-24 +add 1 0x1.1p-24 +add 1 0x0.fp-24 +add 1 min +add 1 -min +add 1 min_subnorm +add 1 -min_subnorm +add -1 min +add -1 -min +add -1 min_subnorm +add -1 -min_subnorm +# Cases where larger argument is half way between two values of a +# floating-point format, so that double rounding would sometimes yield +# the wrong result. +add 0x1.000001p0 min +add 0x1.000001p0 -min +add 0x1.000001p0 min_subnorm +add 0x1.000001p0 -min_subnorm +add -0x1.000001p0 min +add -0x1.000001p0 -min +add -0x1.000001p0 min_subnorm +add -0x1.000001p0 -min_subnorm +add 0x1.00000000000008p0 min +add 0x1.00000000000008p0 -min +add 0x1.00000000000008p0 min_subnorm +add 0x1.00000000000008p0 -min_subnorm +add -0x1.00000000000008p0 min +add -0x1.00000000000008p0 -min +add -0x1.00000000000008p0 min_subnorm +add -0x1.00000000000008p0 -min_subnorm +add 0x1.0000000000000001p0 min +add 0x1.0000000000000001p0 -min +add 0x1.0000000000000001p0 min_subnorm +add 0x1.0000000000000001p0 -min_subnorm +add -0x1.0000000000000001p0 min +add -0x1.0000000000000001p0 -min +add -0x1.0000000000000001p0 min_subnorm +add -0x1.0000000000000001p0 -min_subnorm +# Two values representable in the same format with sum very close to +# half way between two representable values. In particular, verify +# that there is no intermediate rounding to 64 bits when adding two +# double values. +add 1 0x1.000002p-24 +add 1 -0x1.000002p-24 +add 1 0x0.ffffffp-24 +add 1 -0x0.ffffffp-24 +add 0x1.000002p0 0x1.000002p-24 +add 0x1.000002p0 -0x1.000002p-24 +add 0x1.000002p0 0x0.ffffffp-24 +add 0x1.000002p0 -0x0.ffffffp-24 +add 1 0x1.0000000000001p-53 +add 1 -0x1.0000000000001p-53 +add 1 0x0.fffffffffffff8p-53 +add 1 -0x0.fffffffffffff8p-53 +add 0x1.0000000000001p0 0x1.0000000000001p-53 +add 0x1.0000000000001p0 -0x1.0000000000001p-53 +add 0x1.0000000000001p0 0x0.fffffffffffff8p-53 +add 0x1.0000000000001p0 -0x0.fffffffffffff8p-53 +add 1 0x1.0000000000000002p-64 +add 1 -0x1.0000000000000002p-64 +add 1 0x0.ffffffffffffffffp-64 +add 1 -0x0.ffffffffffffffffp-64 +add 0x1.0000000000000002p0 0x1.0000000000000002p-64 +add 0x1.0000000000000002p0 -0x1.0000000000000002p-64 +add 0x1.0000000000000002p0 0x0.ffffffffffffffffp-64 +add 0x1.0000000000000002p0 -0x0.ffffffffffffffffp-64 + asin 0 asin -0 asin 0.5 |