aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2017-11-27 14:16:47 +0000
committerJoseph Myers <joseph@codesourcery.com>2017-11-27 14:16:47 +0000
commita23aa5b7272ec4a04578d82399ec2bf536281119 (patch)
treeca8063afcf28f64aa6b890acbda0f4bc0b6db902
parentc2c299fd24e87b83c63191ff979d41a86b37d714 (diff)
downloadglibc-a23aa5b7272ec4a04578d82399ec2bf536281119.tar.xz
glibc-a23aa5b7272ec4a04578d82399ec2bf536281119.zip
Add _Float64x function aliases.
This patch continues filling out TS 18661-3 support by adding *f64x function aliases on platforms with _Float64x support. (It so happens the set of such platforms is exactly the same as the set of platforms with _Float128 support, although on x86_64, x86 and ia32 the _Float64x format is Intel extended rather than binary128.) The API provided corresponds exactly to that provided for _Float128, mostly coming from TS 18661-3. As these functions always alias those for another type (long double, _Float128 or both), __* function names are not provided, as in other cases of alias types. Given the preparation done in previous patches, this one just enables the feature via Makeconfig and bits/floatn.h, adds symbol versions, and updates documentation and ABI baselines. The symbol versions are present unconditionally as GLIBC_2.27 in the relevant Versions files, as it's OK for those to specify versions for functions that may not be present in some configurations; no additional complexity is needed unless in future some configuration gains support for this type that didn't have such support in 2.27. The Makeconfig additions for ia64 and x86 aren't strictly needed, as those configurations also get float64x-alias-fcts definitions from sysdeps/ieee754/float128/Makeconfig, but still seem appropriate given that _Float64x is not _Float128 for those configurations. A libm-test-ulps update for x86 is included. This is because bits/mathinline.h does not have _Float64x support added and for two functions the use of out-of-line functions results in increased ulps (ifloat64x shares ulps with ildouble / ifloat128 as appropriate). Given that we'd like generally to eliminate bits/mathinline.h optimizations, preferring to have such optimizations in GCC instead, it seems reasonable not to add such support there for new types. GCC support for _FloatN / _FloatNx built-in functions is limited, but has been improved in GCC 8, and at some point I hope the full set of libm built-in functions in GCC, and other optimizations with per-floating-type aspects, will be enabled for all _FloatN / _FloatNx types. Tested for x86_64 and x86, and with build-many-glibcs.py, with both GCC 6 and GCC 7. * sysdeps/ia64/Makeconfig (float64x-alias-fcts): New variable. * sysdeps/ieee754/float128/Makeconfig (float64x-alias-fcts): Likewise. * sysdeps/ieee754/ldbl-128/Makeconfig (float64x-alias-fcts): Likewise. * sysdeps/x86/Makeconfig: New file. * bits/floatn-common.h (__HAVE_FLOAT64X): Remove macro. (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise. * bits/floatn.h (__HAVE_FLOAT64X): New macro. (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise. * sysdeps/ia64/bits/floatn.h (__HAVE_FLOAT64X): Likewise. (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise. * sysdeps/ieee754/ldbl-128/bits/floatn.h (__HAVE_FLOAT64X): Likewise. (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise. * sysdeps/mips/ieee754/bits/floatn.h (__HAVE_FLOAT64X): Likewise. (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise. * sysdeps/powerpc/bits/floatn.h (__HAVE_FLOAT64X): Likewise. (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise. * sysdeps/x86/bits/floatn.h (__HAVE_FLOAT64X): Likewise. (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise. * manual/math.texi (Mathematics): Document support for _Float64x. * math/Versions (GLIBC_2.27): Add _Float64x functions. * stdlib/Versions (GLIBC_2.27): Likewise. * wcsmbs/Versions (GLIBC_2.27): Likewise. * sysdeps/unix/sysv/linux/aarch64/libc.abilist: Update. * sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/alpha/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/i386/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/ia64/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/x86_64/64/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise. * sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise. * sysdeps/i386/fpu/libm-test-ulps: Likewise. * sysdeps/i386/i686/fpu/multiarch/libm-test-ulps: Likewise.
-rw-r--r--ChangeLog57
-rw-r--r--NEWS6
-rw-r--r--bits/floatn-common.h7
-rw-r--r--bits/floatn.h11
-rw-r--r--manual/math.texi6
-rw-r--r--math/Versions104
-rw-r--r--stdlib/Versions5
-rw-r--r--sysdeps/i386/fpu/libm-test-ulps8
-rw-r--r--sysdeps/i386/i686/fpu/multiarch/libm-test-ulps8
-rw-r--r--sysdeps/ia64/Makeconfig2
-rw-r--r--sysdeps/ia64/bits/floatn.h11
-rw-r--r--sysdeps/ieee754/float128/Makeconfig1
-rw-r--r--sysdeps/ieee754/ldbl-128/Makeconfig1
-rw-r--r--sysdeps/ieee754/ldbl-128/bits/floatn.h11
-rw-r--r--sysdeps/mips/ieee754/bits/floatn.h11
-rw-r--r--sysdeps/powerpc/bits/floatn.h11
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/libc.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/libm.abilist104
-rw-r--r--sysdeps/unix/sysv/linux/alpha/libc.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/alpha/libm.abilist104
-rw-r--r--sysdeps/unix/sysv/linux/i386/libc.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/i386/libm.abilist104
-rw-r--r--sysdeps/unix/sysv/linux/ia64/libc.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/ia64/libm.abilist104
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/libm.abilist104
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist104
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist104
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist104
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist104
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist104
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/64/libc.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/64/libm.abilist104
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist5
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist104
-rw-r--r--sysdeps/x86/Makeconfig1
-rw-r--r--sysdeps/x86/bits/floatn.h11
-rw-r--r--wcsmbs/Versions4
44 files changed, 1571 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 1131526f8b..389e39ea39 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,60 @@
+2017-11-27 Joseph Myers <joseph@codesourcery.com>
+
+ * sysdeps/ia64/Makeconfig (float64x-alias-fcts): New variable.
+ * sysdeps/ieee754/float128/Makeconfig (float64x-alias-fcts):
+ Likewise.
+ * sysdeps/ieee754/ldbl-128/Makeconfig (float64x-alias-fcts):
+ Likewise.
+ * sysdeps/x86/Makeconfig: New file.
+ * bits/floatn-common.h (__HAVE_FLOAT64X): Remove macro.
+ (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise.
+ * bits/floatn.h (__HAVE_FLOAT64X): New macro.
+ (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise.
+ * sysdeps/ia64/bits/floatn.h (__HAVE_FLOAT64X): Likewise.
+ (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise.
+ * sysdeps/ieee754/ldbl-128/bits/floatn.h (__HAVE_FLOAT64X):
+ Likewise.
+ (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise.
+ * sysdeps/mips/ieee754/bits/floatn.h (__HAVE_FLOAT64X): Likewise.
+ (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise.
+ * sysdeps/powerpc/bits/floatn.h (__HAVE_FLOAT64X): Likewise.
+ (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise.
+ * sysdeps/x86/bits/floatn.h (__HAVE_FLOAT64X): Likewise.
+ (__HAVE_FLOAT64X_LONG_DOUBLE): Likewise.
+ * manual/math.texi (Mathematics): Document support for _Float64x.
+ * math/Versions (GLIBC_2.27): Add _Float64x functions.
+ * stdlib/Versions (GLIBC_2.27): Likewise.
+ * wcsmbs/Versions (GLIBC_2.27): Likewise.
+ * sysdeps/unix/sysv/linux/aarch64/libc.abilist: Update.
+ * sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/libc.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/i386/libc.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/ia64/libc.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist:
+ Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
+ Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/64/libc.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
+ * sysdeps/i386/fpu/libm-test-ulps: Likewise.
+ * sysdeps/i386/i686/fpu/multiarch/libm-test-ulps: Likewise.
+
2017-11-27 Andreas Schwab <schwab@suse.de>
* elf/Makefile (dl-routines): Add dl-sort-maps.
diff --git a/NEWS b/NEWS
index ab14d1eb1b..33c62abf2f 100644
--- a/NEWS
+++ b/NEWS
@@ -35,6 +35,12 @@ Major new features:
are the same interfaces added in version 2.26 for some platforms where
this format is supported but is not the format of long double.
+* On platforms with support for _Float64x (aarch64, alpha, i386, ia64,
+ mips64, powerpc64le, s390, sparc and x86_64), the math library now
+ implements interfaces for that type, as defined by ISO/IEC TS
+ 18661-3:2015. These are corresponding interfaces to those supported for
+ _Float128.
+
* glibc now implements the memfd_create function on Linux.
Deprecated and removed features, and other changes affecting compatibility:
diff --git a/bits/floatn-common.h b/bits/floatn-common.h
index 2182c9d56a..4d38a910fc 100644
--- a/bits/floatn-common.h
+++ b/bits/floatn-common.h
@@ -34,7 +34,6 @@
#define __HAVE_FLOAT32 0
#define __HAVE_FLOAT64 0
#define __HAVE_FLOAT32X 0
-#define __HAVE_FLOAT64X 0
#define __HAVE_FLOAT128X 0
/* Defined to 1 if the corresponding __HAVE_<type> macro is 1 and the
@@ -56,12 +55,6 @@
#define __HAVE_DISTINCT_FLOAT64X 0
#define __HAVE_DISTINCT_FLOAT128X __HAVE_FLOAT128X
-/* Defined to 1 if __HAVE_FLOAT64X is 1 and _Float64x has the format
- of long double. Otherwise, if __HAVE_FLOAT64X is 1, _Float64x has
- the format of _Float128, which must be different from that of long
- double. */
-#define __HAVE_FLOAT64X_LONG_DOUBLE 0
-
/* Defined to 1 if any _FloatN or _FloatNx types that are not
ABI-distinct are however distinct types at the C language level (so
for the purposes of __builtin_types_compatible_p and _Generic). */
diff --git a/bits/floatn.h b/bits/floatn.h
index dc0cf93cbf..89114b5a70 100644
--- a/bits/floatn.h
+++ b/bits/floatn.h
@@ -25,6 +25,17 @@
from the default float, double and long double types in this glibc. */
#define __HAVE_DISTINCT_FLOAT128 0
+/* Defined to 1 if the current compiler invocation provides a
+ floating-point type with the right format for _Float64x, and this
+ glibc includes corresponding *f64x interfaces for it. */
+#define __HAVE_FLOAT64X 0
+
+/* Defined to 1 if __HAVE_FLOAT64X is 1 and _Float64x has the format
+ of long double. Otherwise, if __HAVE_FLOAT64X is 1, _Float64x has
+ the format of _Float128, which must be different from that of long
+ double. */
+#define __HAVE_FLOAT64X_LONG_DOUBLE 0
+
#ifndef __ASSEMBLER__
/* Defined to concatenate the literal suffix to be used with _Float128
diff --git a/manual/math.texi b/manual/math.texi
index e6aa342076..08e5dae471 100644
--- a/manual/math.texi
+++ b/manual/math.texi
@@ -66,9 +66,9 @@ these functions are described along with the @code{double},
@w{ISO/IEC TS 18661-3}, unless explicitly stated otherwise.
Currently, support for @code{_Float@var{N}} or @code{_Float@var{N}x}
-types is only provided for @code{_Float128} on powerpc64le (PowerPC
-64-bits little-endian), x86_64, x86, ia64, aarch64, alpha, mips64,
-s390 and sparc.
+types is only provided for @code{_Float128} and @code{_Float64x} on
+powerpc64le (PowerPC 64-bits little-endian), x86_64, x86, ia64,
+aarch64, alpha, mips64, s390 and sparc.
@menu
* Mathematical Constants:: Precise numeric values for often-used
diff --git a/math/Versions b/math/Versions
index c10e32662d..d4018f6964 100644
--- a/math/Versions
+++ b/math/Versions
@@ -340,5 +340,109 @@ libm {
%endif
GLIBC_2.27 {
expf; exp2f; logf; log2f; powf;
+ acosf64x;
+ acoshf64x;
+ asinf64x;
+ asinhf64x;
+ atan2f64x;
+ atanf64x;
+ atanhf64x;
+ cabsf64x;
+ cacosf64x;
+ cacoshf64x;
+ canonicalizef64x;
+ cargf64x;
+ casinf64x;
+ casinhf64x;
+ catanf64x;
+ catanhf64x;
+ cbrtf64x;
+ ccosf64x;
+ ccoshf64x;
+ ceilf64x;
+ cexpf64x;
+ cimagf64x;
+ clog10f64x;
+ clogf64x;
+ conjf64x;
+ copysignf64x;
+ cosf64x;
+ coshf64x;
+ cpowf64x;
+ cprojf64x;
+ crealf64x;
+ csinf64x;
+ csinhf64x;
+ csqrtf64x;
+ ctanf64x;
+ ctanhf64x;
+ erfcf64x;
+ erff64x;
+ exp10f64x;
+ exp2f64x;
+ expf64x;
+ expm1f64x;
+ fabsf64x;
+ fdimf64x;
+ floorf64x;
+ fmaf64x;
+ fmaxf64x;
+ fmaxmagf64x;
+ fminf64x;
+ fminmagf64x;
+ fmodf64x;
+ frexpf64x;
+ fromfpf64x;
+ fromfpxf64x;
+ getpayloadf64x;
+ hypotf64x;
+ ilogbf64x;
+ j0f64x;
+ j1f64x;
+ jnf64x;
+ ldexpf64x;
+ lgammaf64x;
+ lgammaf64x_r;
+ llogbf64x;
+ llrintf64x;
+ llroundf64x;
+ log10f64x;
+ log1pf64x;
+ log2f64x;
+ logbf64x;
+ logf64x;
+ lrintf64x;
+ lroundf64x;
+ modff64x;
+ nanf64x;
+ nearbyintf64x;
+ nextafterf64x;
+ nextdownf64x;
+ nextupf64x;
+ powf64x;
+ remainderf64x;
+ remquof64x;
+ rintf64x;
+ roundevenf64x;
+ roundf64x;
+ scalblnf64x;
+ scalbnf64x;
+ setpayloadf64x;
+ setpayloadsigf64x;
+ sincosf64x;
+ sinf64x;
+ sinhf64x;
+ sqrtf64x;
+ tanf64x;
+ tanhf64x;
+ tgammaf64x;
+ totalorderf64x;
+ totalordermagf64x;
+ truncf64x;
+ ufromfpf64x;
+ ufromfpxf64x;
+ y0f64x;
+ y1f64x;
+ ynf64x;
}
}
diff --git a/stdlib/Versions b/stdlib/Versions
index bf2172f926..66f6b35be9 100644
--- a/stdlib/Versions
+++ b/stdlib/Versions
@@ -129,6 +129,11 @@ libc {
strtof128_l;
}
%endif
+ GLIBC_2.27 {
+ strfromf64x;
+ strtof64x;
+ strtof64x_l;
+ }
GLIBC_PRIVATE {
# functions which have an additional interface since they are
# are cancelable.
diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysd