diff options
61 files changed, 24818 insertions, 4 deletions
@@ -1,5 +1,76 @@ 2018-02-10 Joseph Myers <joseph@codesourcery.com> + * 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. + * sysdeps/powerpc/powerpc64le/Makefile [$(subdir) = math] (f128-pairs): New variable. [$(subdir) = math] ($(foreach suf,$(all-object-suffixes),$(foreach @@ -9,7 +9,11 @@ Version 2.28 Major new features: - [Add new features here] +* <math.h> functions that round their results to a narrower type are added + from TS 18661-1:2014 and TS 18661-3:2015: + + - fadd, faddl, daddl and corresponding fMaddfN, fMaddfNx, fMxaddfN and + fMxaddfNx functions. Deprecated and removed features, and other changes affecting compatibility: diff --git a/manual/arith.texi b/manual/arith.texi index 56ae6ddb35..39f2a5da58 100644 --- a/manual/arith.texi +++ b/manual/arith.texi @@ -2191,6 +2191,25 @@ In @theglibc{}, this always means the operation is implemented in hardware. @end deftypefun +@deftypefun float fadd (double @var{x}, double @var{y}) +@deftypefunx float faddl (long double @var{x}, long double @var{y}) +@deftypefunx double daddl (long double @var{x}, long double @var{y}) +@deftypefunx _FloatM fMaddfN (_Float@var{N} @var{x}, _Float@var{N} @var{y}) +@deftypefunx _FloatM fMaddfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y}) +@deftypefunx _FloatMx fMxaddfN (_Float@var{N} @var{x}, _Float@var{N} @var{y}) +@deftypefunx _FloatMx fMxaddfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y}) +@standards{TS 18661-1:2014, math.h} +@standardsx{fMaddfN, TS 18661-3:2015, math.h} +@standardsx{fMaddfNx, TS 18661-3:2015, math.h} +@standardsx{fMxaddfN, TS 18661-3:2015, math.h} +@standardsx{fMxaddfNx, TS 18661-3:2015, math.h} +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +These functions, from TS 18661-1:2014 and TS 18661-3:2015, return +@math{@var{x} + @var{y}}, rounded once to the return type of the +function without any intermediate rounding to the type of the +arguments. +@end deftypefun + @node Complex Numbers @section Complex Numbers @pindex complex.h diff --git a/math/Makefile b/math/Makefile index 42e540cf0e..718b06d246 100644 --- a/math/Makefile +++ b/math/Makefile @@ -89,7 +89,7 @@ libm-compat-calls = \ w_lgammaF_r_compat w_lgammaF_compat2 w_expF_compat \ w_lgamma_compatF k_standardF -libm-narrow-fns = +libm-narrow-fns = add libm-narrow-types-basic = s_fF s_f32xFf64 libm-narrow-types-ldouble-yes = s_fFl s_dFl libm-narrow-types-float128-yes = s_f32Ff128 s_f64Ff128 s_f64xFf128 @@ -284,7 +284,7 @@ libm-test-funcs-noauto = canonicalize ceil cimag conj copysign cproj creal \ scalbln scalbn setpayload setpayloadsig signbit \ significand totalorder totalordermag trunc ufromfp \ ufromfpx -libm-test-funcs-narrow = +libm-test-funcs-narrow = add libm-test-funcs-all = $(libm-test-funcs-auto) $(libm-test-funcs-noauto) libm-test-c-auto = $(foreach f,$(libm-test-funcs-auto),libm-test-$(f).c) libm-test-c-noauto = $(foreach f,$(libm-test-funcs-noauto),libm-test-$(f).c) diff --git a/math/Versions b/math/Versions index 01ed388ae5..9191c0f648 100644 --- a/math/Versions +++ b/math/Versions @@ -551,4 +551,13 @@ libm { y1f32; y1f64; y1f32x; ynf32; ynf64; ynf32x; } + GLIBC_2.28 { + # Functions not involving _Float64x or _Float128, for all configurations. + fadd; faddl; daddl; + f32addf32x; f32addf64; f32xaddf64; + # Functions involving _Float64x or _Float128, for some configurations. + f32addf64x; f32addf128; + f32xaddf64x; f32xaddf128; f64addf64x; f64addf128; + f64xaddf128; + } } diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in index 614fe251b1..fc407e9b90 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.0000000000000 |
