diff options
author | Joseph Myers <joseph@codesourcery.com> | 2017-10-18 17:37:18 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2017-10-18 17:37:18 +0000 |
commit | 81325b12b14c44887f1633a2c180a413afc2b504 (patch) | |
tree | 090f597a1b4997ad177ce581b39edcacd930f334 /sysdeps/ieee754 | |
parent | a68ba2f3cd3cbe32c1f31e13c20ed13487727b32 (diff) | |
download | glibc-81325b12b14c44887f1633a2c180a413afc2b504.tar glibc-81325b12b14c44887f1633a2c180a413afc2b504.tar.gz glibc-81325b12b14c44887f1633a2c180a413afc2b504.tar.bz2 glibc-81325b12b14c44887f1633a2c180a413afc2b504.zip |
Add _Float128 function aliases.
This patch adds support for *f128 function aliases on platforms where
long double has the binary128 format (and thus GCC 7 provides the
_Float128 type with the same ABI as long double but as a distinct type
in terms of C type compatibility). This is the same API as provided
in glibc 2.26 for powerpc64le / x86_64 / x86 / ia64 where _Float128
has a different format from long double, with the bulk of the API
coming from TS 18661-3. All the functions alias the corresponding
long double functions, and __* function names are not provided since
those are only needed once for each floating-point format, not more
than once for different types with the same format (so for example,
-ffinite-math-only maps foof128 to __fool_finite, while type-generic
macros end up calling e.g. __issignalingl for _Float128 arguments on
such platforms).
The preparation for this feature was done in previous patches, so this
one just needs to add the relevant makefile and header definitions,
and update macro definitions of libm_alias_ldouble_other_r, to turn on
the feature, and update documentation and ABI baselines.
Tested (a) for x86_64, (b) for aarch64, (c) with build-many-glibcs.py
with both GCC 6 and GCC 7.
* sysdeps/ieee754/ldbl-128/Makeconfig: New file.
* sysdeps/ieee754/ldbl-128/bits/floatn.h: Likewise.
* sysdeps/ieee754/ldbl-128/float128-abi.h: Likewise.
* sysdeps/generic/libm-alias-ldouble.h: Include <bits/floatn.h>.
[__HAVE_FLOAT128 && !__HAVE_DISTINCT_FLOAT128]
(libm_alias_ldouble_other_r): Also create _Float128 alias.
* sysdeps/ieee754/ldbl-opt/libm-alias-ldouble.h: Include
<bits/floatn.h>.
[__HAVE_FLOAT128 && !__HAVE_DISTINCT_FLOAT128]
(libm_alias_ldouble_other_r): Also create _Float128 alias.
* manual/math.texi (Mathematics): Document additional architecture
support for _Float128.
* 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/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/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.
Diffstat (limited to 'sysdeps/ieee754')
-rw-r--r-- | sysdeps/ieee754/ldbl-128/Makeconfig | 3 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/bits/floatn.h | 80 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/float128-abi.h | 2 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-opt/libm-alias-ldouble.h | 8 |
4 files changed, 92 insertions, 1 deletions
diff --git a/sysdeps/ieee754/ldbl-128/Makeconfig b/sysdeps/ieee754/ldbl-128/Makeconfig new file mode 100644 index 0000000000..1f8e2562f0 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128/Makeconfig @@ -0,0 +1,3 @@ +# Include this earlier so it can be used earlier in Makefiles, +# and sysdep/ makefiles. +float128-alias-fcts = yes diff --git a/sysdeps/ieee754/ldbl-128/bits/floatn.h b/sysdeps/ieee754/ldbl-128/bits/floatn.h new file mode 100644 index 0000000000..5c87366aef --- /dev/null +++ b/sysdeps/ieee754/ldbl-128/bits/floatn.h @@ -0,0 +1,80 @@ +/* Macros to control TS 18661-3 glibc features on ldbl-128 platforms. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _BITS_FLOATN_H +#define _BITS_FLOATN_H + +#include <features.h> +#include <bits/long-double.h> + +/* Defined to 1 if the current compiler invocation provides a + floating-point type with the IEEE 754 binary128 format, and this + glibc includes corresponding *f128 interfaces for it. */ +#ifndef __NO_LONG_DOUBLE_MATH +# define __HAVE_FLOAT128 1 +#else +/* glibc does not support _Float128 for platforms where long double is + normally binary128 when building with long double as binary64. + GCC's default for supported scalar modes does not support it either + in that case. */ +# define __HAVE_FLOAT128 0 +#endif + +/* Defined to 1 if __HAVE_FLOAT128 is 1 and the type is ABI-distinct + from the default float, double and long double types in this glibc. */ +#define __HAVE_DISTINCT_FLOAT128 0 + +/* Defined to concatenate the literal suffix to be used with _Float128 + types, if __HAVE_FLOAT128 is 1. */ +#if __HAVE_FLOAT128 +# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +/* The literal suffix f128 exists only since GCC 7.0. */ +# define __f128(x) x##l +# else +# define __f128(x) x##f128 +# endif +#endif + +/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ +#if __HAVE_FLOAT128 +# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# define __CFLOAT128 _Complex long double +# else +# define __CFLOAT128 _Complex _Float128 +# endif +#endif + +/* The remaining of this file provides support for older compilers. */ +#if __HAVE_FLOAT128 + +/* The type _Float128 exists only since GCC 7.0. */ +# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +typedef long double _Float128; +# endif + +/* Various built-in functions do not exist before GCC 7.0. */ +# if !__GNUC_PREREQ (7, 0) +# define __builtin_huge_valf128() (__builtin_huge_vall ()) +# define __builtin_inff128() (__builtin_infl ()) +# define __builtin_nanf128(x) (__builtin_nanl (x)) +# define __builtin_nansf128(x) (__builtin_nansl (x)) +# endif + +#endif + +#endif /* _BITS_FLOATN_H */ diff --git a/sysdeps/ieee754/ldbl-128/float128-abi.h b/sysdeps/ieee754/ldbl-128/float128-abi.h new file mode 100644 index 0000000000..3077ffc7fe --- /dev/null +++ b/sysdeps/ieee754/ldbl-128/float128-abi.h @@ -0,0 +1,2 @@ +/* ABI version for _Float128 ABI introduction. */ +#define FLOAT128_VERSION GLIBC_2.27 diff --git a/sysdeps/ieee754/ldbl-opt/libm-alias-ldouble.h b/sysdeps/ieee754/ldbl-opt/libm-alias-ldouble.h index 291a5f56cb..ad31f69f1a 100644 --- a/sysdeps/ieee754/ldbl-opt/libm-alias-ldouble.h +++ b/sysdeps/ieee754/ldbl-opt/libm-alias-ldouble.h @@ -19,6 +19,7 @@ #ifndef _LIBM_ALIAS_LDOUBLE_H #define _LIBM_ALIAS_LDOUBLE_H +#include <bits/floatn.h> #include <math_ldbl_opt.h> #include <ldbl-compat-choose.h> @@ -26,7 +27,12 @@ that has internal name FROM ## l ## R and public names TO ## suffix ## R for each suffix of a supported _FloatN / _FloatNx floating-point type with the same format as long double. */ -#define libm_alias_ldouble_other_r(from, to, r) +#if __HAVE_FLOAT128 && !__HAVE_DISTINCT_FLOAT128 +# define libm_alias_ldouble_other_r(from, to, r) \ + weak_alias (from ## l ## r, to ## f128 ## r) +#else +# define libm_alias_ldouble_other_r(from, to, r) +#endif /* Likewise, but without the R suffix. */ #define libm_alias_ldouble_other(from, to) \ |