mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 21:10:07 +00:00
a23aa5b727
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.
290 lines
8.3 KiB
C
290 lines
8.3 KiB
C
/* Macros to control TS 18661-3 glibc features where the same
|
|
definitions are appropriate for all 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_COMMON_H
|
|
#define _BITS_FLOATN_COMMON_H
|
|
|
|
#include <features.h>
|
|
|
|
/* This header should be included at the bottom of each bits/floatn.h.
|
|
It defines the following macros for each _FloatN and _FloatNx type,
|
|
where the same definitions, or definitions based only on the macros
|
|
in bits/floatn.h, are appropriate for all glibc configurations. */
|
|
|
|
/* Defined to 1 if the current compiler invocation provides a
|
|
floating-point type with the right format for this type, and this
|
|
glibc includes corresponding *fN or *fNx interfaces for it. */
|
|
#define __HAVE_FLOAT16 0
|
|
#define __HAVE_FLOAT32 0
|
|
#define __HAVE_FLOAT64 0
|
|
#define __HAVE_FLOAT32X 0
|
|
#define __HAVE_FLOAT128X 0
|
|
|
|
/* Defined to 1 if the corresponding __HAVE_<type> macro is 1 and the
|
|
type is the first with its format in the sequence of (the default
|
|
choices for) float, double, long double, _Float16, _Float32,
|
|
_Float64, _Float128, _Float32x, _Float64x, _Float128x for this
|
|
glibc; that is, if functions present once per floating-point format
|
|
rather than once per type are present for this type.
|
|
|
|
All configurations supported by glibc have _Float32 the same format
|
|
as float, _Float64 and _Float32x the same format as double, the
|
|
_Float64x the same format as either long double or _Float128. No
|
|
configurations support _Float128x or, as of GCC 7, have compiler
|
|
support for a type meeting the requirements for _Float128x. */
|
|
#define __HAVE_DISTINCT_FLOAT16 __HAVE_FLOAT16
|
|
#define __HAVE_DISTINCT_FLOAT32 0
|
|
#define __HAVE_DISTINCT_FLOAT64 0
|
|
#define __HAVE_DISTINCT_FLOAT32X 0
|
|
#define __HAVE_DISTINCT_FLOAT64X 0
|
|
#define __HAVE_DISTINCT_FLOAT128X __HAVE_FLOAT128X
|
|
|
|
/* 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). */
|
|
#if __GNUC_PREREQ (7, 0) && !defined __cplusplus
|
|
# define __HAVE_FLOATN_NOT_TYPEDEF 1
|
|
#else
|
|
# define __HAVE_FLOATN_NOT_TYPEDEF 0
|
|
#endif
|
|
|
|
#ifndef __ASSEMBLER__
|
|
|
|
/* Defined to concatenate the literal suffix to be used with _FloatN
|
|
or _FloatNx types, if __HAVE_<type> is 1. The corresponding
|
|
literal suffixes exist since GCC 7, for C only. */
|
|
# if __HAVE_FLOAT16
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
/* No corresponding suffix available for this type. */
|
|
# define __f16(x) ((_Float16) x##f)
|
|
# else
|
|
# define __f16(x) x##f16
|
|
# endif
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT32
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
# define __f32(x) x##f
|
|
# else
|
|
# define __f32(x) x##f32
|
|
# endif
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT64
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
# define __f64(x) x
|
|
# else
|
|
# define __f64(x) x##f64
|
|
# endif
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT32X
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
# define __f32x(x) x
|
|
# else
|
|
# define __f32x(x) x##f32x
|
|
# endif
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT64X
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
# if __HAVE_FLOAT64X_LONG_DOUBLE
|
|
# define __f64x(x) x##l
|
|
# else
|
|
# define __f64x(x) __f128 (x)
|
|
# endif
|
|
# else
|
|
# define __f64x(x) x##f64x
|
|
# endif
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT128X
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
# error "_Float128X supported but no constant suffix"
|
|
# else
|
|
# define __f128x(x) x##f128x
|
|
# endif
|
|
# endif
|
|
|
|
/* Defined to a complex type if __HAVE_<type> is 1. */
|
|
# if __HAVE_FLOAT16
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
typedef _Complex float __cfloat16 __attribute__ ((__mode__ (__HC__)));
|
|
# define __CFLOAT16 __cfloat16
|
|
# else
|
|
# define __CFLOAT16 _Complex _Float16
|
|
# endif
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT32
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
# define __CFLOAT32 _Complex float
|
|
# else
|
|
# define __CFLOAT32 _Complex _Float32
|
|
# endif
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT64
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
# define __CFLOAT64 _Complex double
|
|
# else
|
|
# define __CFLOAT64 _Complex _Float64
|
|
# endif
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT32X
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
# define __CFLOAT32X _Complex double
|
|
# else
|
|
# define __CFLOAT32X _Complex _Float32x
|
|
# endif
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT64X
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
# if __HAVE_FLOAT64X_LONG_DOUBLE
|
|
# define __CFLOAT64X _Complex long double
|
|
# else
|
|
# define __CFLOAT64X __CFLOAT128
|
|
# endif
|
|
# else
|
|
# define __CFLOAT64X _Complex _Float64x
|
|
# endif
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT128X
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
# error "_Float128X supported but no complex type"
|
|
# else
|
|
# define __CFLOAT128X _Complex _Float128x
|
|
# endif
|
|
# endif
|
|
|
|
/* The remaining of this file provides support for older compilers. */
|
|
# if __HAVE_FLOAT16
|
|
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
typedef float _Float16 __attribute__ ((__mode__ (__HF__)));
|
|
# endif
|
|
|
|
# if !__GNUC_PREREQ (7, 0)
|
|
# define __builtin_huge_valf16() ((_Float16) __builtin_huge_val ())
|
|
# define __builtin_inff16() ((_Float16) __builtin_inf ())
|
|
# define __builtin_nanf16(x) ((_Float16) __builtin_nan (x))
|
|
# define __builtin_nansf16(x) ((_Float16) __builtin_nans (x))
|
|
# endif
|
|
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT32
|
|
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
typedef float _Float32;
|
|
# endif
|
|
|
|
# if !__GNUC_PREREQ (7, 0)
|
|
# define __builtin_huge_valf32() (__builtin_huge_valf ())
|
|
# define __builtin_inff32() (__builtin_inff ())
|
|
# define __builtin_nanf32(x) (__builtin_nanf (x))
|
|
# define __builtin_nansf32(x) (__builtin_nansf (x))
|
|
# endif
|
|
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT64
|
|
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
typedef double _Float64;
|
|
# endif
|
|
|
|
# if !__GNUC_PREREQ (7, 0)
|
|
# define __builtin_huge_valf64() (__builtin_huge_val ())
|
|
# define __builtin_inff64() (__builtin_inf ())
|
|
# define __builtin_nanf64(x) (__builtin_nan (x))
|
|
# define __builtin_nansf64(x) (__builtin_nans (x))
|
|
# endif
|
|
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT32X
|
|
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
typedef double _Float32x;
|
|
# endif
|
|
|
|
# if !__GNUC_PREREQ (7, 0)
|
|
# define __builtin_huge_valf32x() (__builtin_huge_val ())
|
|
# define __builtin_inff32x() (__builtin_inf ())
|
|
# define __builtin_nanf32x(x) (__builtin_nan (x))
|
|
# define __builtin_nansf32x(x) (__builtin_nans (x))
|
|
# endif
|
|
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT64X
|
|
|
|
# if __HAVE_FLOAT64X_LONG_DOUBLE
|
|
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
typedef long double _Float64x;
|
|
# endif
|
|
|
|
# if !__GNUC_PREREQ (7, 0)
|
|
# define __builtin_huge_valf64x() (__builtin_huge_vall ())
|
|
# define __builtin_inff64x() (__builtin_infl ())
|
|
# define __builtin_nanf64x(x) (__builtin_nanl (x))
|
|
# define __builtin_nansf64x(x) (__builtin_nansl (x))
|
|
# endif
|
|
|
|
# else
|
|
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
typedef _Float128 _Float64x;
|
|
# endif
|
|
|
|
# if !__GNUC_PREREQ (7, 0)
|
|
# define __builtin_huge_valf64x() (__builtin_huge_valf128 ())
|
|
# define __builtin_inff64x() (__builtin_inff128 ())
|
|
# define __builtin_nanf64x(x) (__builtin_nanf128 (x))
|
|
# define __builtin_nansf64x(x) (__builtin_nansf128 (x))
|
|
# endif
|
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
# if __HAVE_FLOAT128X
|
|
|
|
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
|
# error "_Float128x supported but no type"
|
|
# endif
|
|
|
|
# if !__GNUC_PREREQ (7, 0)
|
|
# define __builtin_huge_valf128x() ((_Float128x) __builtin_huge_val ())
|
|
# define __builtin_inff128x() ((_Float128x) __builtin_inf ())
|
|
# define __builtin_nanf128x(x) ((_Float128x) __builtin_nan (x))
|
|
# define __builtin_nansf128x(x) ((_Float128x) __builtin_nans (x))
|
|
# endif
|
|
|
|
# endif
|
|
|
|
#endif /* !__ASSEMBLER__. */
|
|
|
|
#endif /* _BITS_FLOATN_COMMON_H */
|