aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog71
-rw-r--r--NEWS6
-rw-r--r--manual/arith.texi19
-rw-r--r--math/Makefile4
-rw-r--r--math/Versions9
-rw-r--r--math/auto-libm-test-in95
-rw-r--r--math/auto-libm-test-out-narrow-add23487
-rw-r--r--math/bits/mathcalls-narrow.h3
-rw-r--r--math/gen-auto-libm-tests.c1
-rw-r--r--math/libm-test-narrow-add.inc179
-rw-r--r--math/math-narrow.h58
-rw-r--r--sysdeps/i386/fpu/s_f32xaddf64.c41
-rw-r--r--sysdeps/ieee754/dbl-64/s_f32xaddf64.c30
-rw-r--r--sysdeps/ieee754/dbl-64/s_fadd.c34
-rw-r--r--sysdeps/ieee754/float128/float128_private.h3
-rw-r--r--sysdeps/ieee754/float128/s_f32addf128.c6
-rw-r--r--sysdeps/ieee754/float128/s_f64addf128.c10
-rw-r--r--sysdeps/ieee754/float128/s_f64xaddf128.c2
-rw-r--r--sysdeps/ieee754/ldbl-128/s_daddl.c37
-rw-r--r--sysdeps/ieee754/ldbl-128/s_f64xaddf128.c38
-rw-r--r--sysdeps/ieee754/ldbl-128/s_faddl.c33
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_daddl.c27
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_faddl.c27
-rw-r--r--sysdeps/ieee754/ldbl-96/s_daddl.c33
-rw-r--r--sysdeps/ieee754/ldbl-96/s_faddl.c31
-rw-r--r--sysdeps/ieee754/ldbl-opt/Makefile4
-rw-r--r--sysdeps/ieee754/ldbl-opt/Versions6
-rw-r--r--sysdeps/ieee754/ldbl-opt/nldbl-compat.h3
-rw-r--r--sysdeps/ieee754/ldbl-opt/nldbl-dadd.c28
-rw-r--r--sysdeps/ieee754/ldbl-opt/nldbl-fadd.c28
-rw-r--r--sysdeps/ieee754/soft-fp/s_daddl.c59
-rw-r--r--sysdeps/ieee754/soft-fp/s_fadd.c56
-rw-r--r--sysdeps/ieee754/soft-fp/s_faddl.c55
-rw-r--r--sysdeps/mach/hurd/i386/libm.abilist14
-rw-r--r--sysdeps/powerpc/fpu/libm-test-ulps4
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/libm.abilist14
-rw-r--r--sysdeps/unix/sysv/linux/alpha/libm.abilist15
-rw-r--r--sysdeps/unix/sysv/linux/arm/libm.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/hppa/libm.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/i386/libm.abilist14
-rw-r--r--sysdeps/unix/sysv/linux/ia64/libm.abilist14
-rw-r--r--sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/libm.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/libm.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/libm.abilist14
-rw-r--r--sysdeps/unix/sysv/linux/nios2/libm.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist8
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist8
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist15
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist8
-rw-r--r--sysdeps/unix/sysv/linux/riscv/rv64/libm.abilist14
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist15
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist15
-rw-r--r--sysdeps/unix/sysv/linux/sh/libm.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist15
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist14
-rw-r--r--sysdeps/unix/sysv/linux/tile/tilegx32/libm.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/tile/tilegx64/libm.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/64/libm.abilist14
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist14
61 files changed, 24818 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index a6272b17d1..78bb832c51 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/NEWS b/NEWS
index 06c92519a3..56780313f5 100644
--- a/NEWS
+++ b/NEWS
@@ -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