diff options
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) \ |