1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

Support bits/floatn.h inclusion from .S files.

Further _FloatN / _FloatNx type alias support will involve making
architecture-specific .S files use the common macros for libm function
aliases.  Making them use those macros will also serve to simplify
existing code for aliases / symbol versions in various cases, similar
to such simplifications for ldbl-opt code.

The libm-alias-*.h files sometimes need to include <bits/floatn.h> to
determine which aliases they should define.  At present, this does not
work for inclusion from .S files because <bits/floatn.h> can define
typedefs for old compilers.  This patch changes all the
<bits/floatn.h> and <bits/floatn-common.h> headers to include
__ASSEMBLER__ conditionals.  Those conditionals disable everything
related to C syntax in the __ASSEMBLER__ case, not just the problem
typedefs, as that seemed cleanest.  The __HAVE_* definitions remain in
the __ASSEMBLER__ case, as those provide information that is required
to define the correct set of aliases.

Tested with build-many-glibcs.py for a representative set of
configurations (x86_64-linux-gnu i686-linux-gnu ia64-linux-gnu
powerpc64le-linux-gnu mips64-linux-gnu-n64 sparc64-linux-gnu) with GCC
6.  Also tested with GCC 6 for i686-linux-gnu in conjunction with
changes to use alias macros in .S files.

	* bits/floatn-common.h [!__ASSEMBLER]: Disable everything related
	to C syntax instead of availability and properties of types.
	* bits/floatn.h [!__ASSEMBLER]: Likewise.
	* sysdeps/ia64/bits/floatn.h [!__ASSEMBLER]: Likewise.
	* sysdeps/ieee754/ldbl-128/bits/floatn.h [!__ASSEMBLER]: Likewise.
	* sysdeps/mips/ieee754/bits/floatn.h [!__ASSEMBLER]: Likewise.
	* sysdeps/powerpc/bits/floatn.h [!__ASSEMBLER]: Likewise.
	* sysdeps/x86/bits/floatn.h [!__ASSEMBLER]: Likewise.
This commit is contained in:
Joseph Myers
2017-11-17 22:01:43 +00:00
parent ce003e5d4c
commit 015c6dc288
8 changed files with 334 additions and 295 deletions

View File

@ -1,3 +1,14 @@
2017-11-17 Joseph Myers <joseph@codesourcery.com>
* bits/floatn-common.h [!__ASSEMBLER]: Disable everything related
to C syntax instead of availability and properties of types.
* bits/floatn.h [!__ASSEMBLER]: Likewise.
* sysdeps/ia64/bits/floatn.h [!__ASSEMBLER]: Likewise.
* sysdeps/ieee754/ldbl-128/bits/floatn.h [!__ASSEMBLER]: Likewise.
* sysdeps/mips/ieee754/bits/floatn.h [!__ASSEMBLER]: Likewise.
* sysdeps/powerpc/bits/floatn.h [!__ASSEMBLER]: Likewise.
* sysdeps/x86/bits/floatn.h [!__ASSEMBLER]: Likewise.
2017-11-17 Florian Weimer <fweimer@redhat.com> 2017-11-17 Florian Weimer <fweimer@redhat.com>
support_become_root: Enable file creation in namespaces. support_become_root: Enable file creation in namespaces.

View File

@ -71,222 +71,226 @@
# define __HAVE_FLOATN_NOT_TYPEDEF 0 # define __HAVE_FLOATN_NOT_TYPEDEF 0
#endif #endif
#ifndef __ASSEMBLER__
/* Defined to concatenate the literal suffix to be used with _FloatN /* Defined to concatenate the literal suffix to be used with _FloatN
or _FloatNx types, if __HAVE_<type> is 1. The corresponding or _FloatNx types, if __HAVE_<type> is 1. The corresponding
literal suffixes exist since GCC 7, for C only. */ literal suffixes exist since GCC 7, for C only. */
#if __HAVE_FLOAT16 # if __HAVE_FLOAT16
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
/* No corresponding suffix available for this type. */ /* No corresponding suffix available for this type. */
# define __f16(x) ((_Float16) x##f) # 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 # else
# define __f64x(x) __f128 (x) # define __f16(x) x##f16
# endif # endif
# else
# define __f64x(x) x##f64x
# endif # endif
#endif
#if __HAVE_FLOAT128X # if __HAVE_FLOAT32
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
# error "_Float128X supported but no constant suffix" # define __f32(x) x##f
# else # else
# define __f128x(x) x##f128x # 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 # endif
#endif
/* Defined to a complex type if __HAVE_<type> is 1. */ /* Defined to a complex type if __HAVE_<type> is 1. */
#if __HAVE_FLOAT16 # if __HAVE_FLOAT16
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef _Complex float __cfloat16 __attribute__ ((__mode__ (__HC__))); typedef _Complex float __cfloat16 __attribute__ ((__mode__ (__HC__)));
# define __CFLOAT16 __cfloat16 # 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 # else
# define __CFLOAT64X __CFLOAT128 # define __CFLOAT16 _Complex _Float16
# endif # endif
# else
# define __CFLOAT64X _Complex _Float64x
# endif # endif
#endif
#if __HAVE_FLOAT128X # if __HAVE_FLOAT32
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
# error "_Float128X supported but no complex type" # define __CFLOAT32 _Complex float
# else # else
# define __CFLOAT128X _Complex _Float128x # 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 # endif
#endif
/* The remaining of this file provides support for older compilers. */ /* The remaining of this file provides support for older compilers. */
#if __HAVE_FLOAT16 # if __HAVE_FLOAT16
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef float _Float16 __attribute__ ((__mode__ (__HF__))); 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 # endif
# if !__GNUC_PREREQ (7, 0) # if __HAVE_FLOAT32
# 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 !__GNUC_PREREQ (7, 0) || defined __cplusplus
#if __HAVE_FLOAT32
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef float _Float32; 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 # endif
# if !__GNUC_PREREQ (7, 0) # if __HAVE_FLOAT64
# 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 !__GNUC_PREREQ (7, 0) || defined __cplusplus
#if __HAVE_FLOAT64
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef double _Float64; 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 # endif
# if !__GNUC_PREREQ (7, 0) # if __HAVE_FLOAT32X
# 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 !__GNUC_PREREQ (7, 0) || defined __cplusplus
#if __HAVE_FLOAT32X
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef double _Float32x; 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 # endif
# if !__GNUC_PREREQ (7, 0) # if __HAVE_FLOAT64X
# 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_LONG_DOUBLE
#if __HAVE_FLOAT64X # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
# if __HAVE_FLOAT64X_LONG_DOUBLE
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef long double _Float64x; 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 !__GNUC_PREREQ (7, 0) # endif
# 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 __HAVE_FLOAT128X
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef _Float128 _Float64x; # error "_Float128x supported but no type"
# endif # endif
# if !__GNUC_PREREQ (7, 0) # if !__GNUC_PREREQ (7, 0)
# define __builtin_huge_valf64x() (__builtin_huge_valf128 ()) # define __builtin_huge_valf128x() ((_Float128x) __builtin_huge_val ())
# define __builtin_inff64x() (__builtin_inff128 ()) # define __builtin_inff128x() ((_Float128x) __builtin_inf ())
# define __builtin_nanf64x(x) (__builtin_nanf128 (x)) # define __builtin_nanf128x(x) ((_Float128x) __builtin_nan (x))
# define __builtin_nansf64x(x) (__builtin_nansf128 (x)) # define __builtin_nansf128x(x) ((_Float128x) __builtin_nans (x))
# endif # endif
# endif # endif
#endif #endif /* !__ASSEMBLER__. */
#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 /* _BITS_FLOATN_COMMON_H */ #endif /* _BITS_FLOATN_COMMON_H */

View File

@ -25,13 +25,17 @@
from the default float, double and long double types in this glibc. */ from the default float, double and long double types in this glibc. */
#define __HAVE_DISTINCT_FLOAT128 0 #define __HAVE_DISTINCT_FLOAT128 0
#ifndef __ASSEMBLER__
/* Defined to concatenate the literal suffix to be used with _Float128 /* Defined to concatenate the literal suffix to be used with _Float128
types, if __HAVE_FLOAT128 is 1. types, if __HAVE_FLOAT128 is 1.
E.g.: #define __f128(x) x##f128. */ E.g.: #define __f128(x) x##f128. */
#undef __f128 # undef __f128
/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1.
E.g.: #define __CFLOAT128 _Complex _Float128. */ E.g.: #define __CFLOAT128 _Complex _Float128. */
#undef __CFLOAT128 # undef __CFLOAT128
#endif /* !__ASSEMBLER__. */
#include <bits/floatn-common.h> #include <bits/floatn-common.h>

View File

@ -40,64 +40,68 @@
# define __HAVE_DISTINCT_FLOAT128 0 # define __HAVE_DISTINCT_FLOAT128 0
#endif #endif
#ifndef __ASSEMBLER__
/* Defined to concatenate the literal suffix to be used with _Float128 /* Defined to concatenate the literal suffix to be used with _Float128
types, if __HAVE_FLOAT128 is 1. */ types, if __HAVE_FLOAT128 is 1. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
/* The literal suffix f128 exists only since GCC 7.0. */ /* The literal suffix f128 exists only since GCC 7.0. */
# define __f128(x) x##q # define __f128(x) x##q
# else # else
# define __f128(x) x##f128 # define __f128(x) x##f128
# endif
# endif # endif
#endif
/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
/* Add a typedef for older GCC compilers which don't natively support /* Add a typedef for older GCC compilers which don't natively support
_Complex _Float128. */ _Complex _Float128. */
typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__)));
# define __CFLOAT128 __cfloat128 # define __CFLOAT128 __cfloat128
# else # else
# define __CFLOAT128 _Complex _Float128 # define __CFLOAT128 _Complex _Float128
# endif
# endif # endif
#endif
/* The remaining of this file provides support for older compilers. */ /* The remaining of this file provides support for older compilers. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
/* The type _Float128 exists only since GCC 7.0. */ /* The type _Float128 exists only since GCC 7.0. */
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef __float128 _Float128; typedef __float128 _Float128;
# endif # endif
/* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */
# if !__GNUC_PREREQ (7, 0) # if !__GNUC_PREREQ (7, 0)
# define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ())
# endif # endif
/* Older GCC has only a subset of built-in functions for _Float128 on /* Older GCC has only a subset of built-in functions for _Float128 on
ia64, and __builtin_infq is not usable in static initializers. ia64, and __builtin_infq is not usable in static initializers.
Converting a narrower sNaN to _Float128 produces a quiet NaN, so Converting a narrower sNaN to _Float128 produces a quiet NaN, so
attempts to use _Float128 sNaNs will not work properly with older attempts to use _Float128 sNaNs will not work properly with older
compilers. */ compilers. */
# if !__GNUC_PREREQ (7, 0) # if !__GNUC_PREREQ (7, 0)
# define __builtin_copysignf128 __builtin_copysignq # define __builtin_copysignf128 __builtin_copysignq
# define __builtin_fabsf128 __builtin_fabsq # define __builtin_fabsf128 __builtin_fabsq
# define __builtin_inff128() ((_Float128) __builtin_inf ()) # define __builtin_inff128() ((_Float128) __builtin_inf ())
# define __builtin_nanf128(x) ((_Float128) __builtin_nan (x)) # define __builtin_nanf128(x) ((_Float128) __builtin_nan (x))
# define __builtin_nansf128(x) ((_Float128) __builtin_nans (x)) # define __builtin_nansf128(x) ((_Float128) __builtin_nans (x))
# endif # endif
/* In math/math.h, __MATH_TG will expand signbit to __builtin_signbit*, /* In math/math.h, __MATH_TG will expand signbit to __builtin_signbit*,
e.g.: __builtin_signbitf128, before GCC 6. However, there has never e.g.: __builtin_signbitf128, before GCC 6. However, there has never
been a __builtin_signbitf128 in GCC and the type-generic builtin is been a __builtin_signbitf128 in GCC and the type-generic builtin is
only available since GCC 6. */ only available since GCC 6. */
# if !__GNUC_PREREQ (6, 0) # if !__GNUC_PREREQ (6, 0)
# define __builtin_signbitf128 __signbitf128 # define __builtin_signbitf128 __signbitf128
# endif
# endif # endif
#endif #endif /* !__ASSEMBLER__. */
#include <bits/floatn-common.h> #include <bits/floatn-common.h>

View File

@ -39,43 +39,47 @@
from the default float, double and long double types in this glibc. */ from the default float, double and long double types in this glibc. */
#define __HAVE_DISTINCT_FLOAT128 0 #define __HAVE_DISTINCT_FLOAT128 0
#ifndef __ASSEMBLER__
/* Defined to concatenate the literal suffix to be used with _Float128 /* Defined to concatenate the literal suffix to be used with _Float128
types, if __HAVE_FLOAT128 is 1. */ types, if __HAVE_FLOAT128 is 1. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
/* The literal suffix f128 exists only since GCC 7.0. */ /* The literal suffix f128 exists only since GCC 7.0. */
# define __f128(x) x##l # define __f128(x) x##l
# else # else
# define __f128(x) x##f128 # define __f128(x) x##f128
# endif
# endif # endif
#endif
/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
# define __CFLOAT128 _Complex long double # define __CFLOAT128 _Complex long double
# else # else
# define __CFLOAT128 _Complex _Float128 # define __CFLOAT128 _Complex _Float128
# endif
# endif # endif
#endif
/* The remaining of this file provides support for older compilers. */ /* The remaining of this file provides support for older compilers. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
/* The type _Float128 exists only since GCC 7.0. */ /* The type _Float128 exists only since GCC 7.0. */
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef long double _Float128; typedef long double _Float128;
# endif # endif
/* Various built-in functions do not exist before GCC 7.0. */ /* Various built-in functions do not exist before GCC 7.0. */
# if !__GNUC_PREREQ (7, 0) # if !__GNUC_PREREQ (7, 0)
# define __builtin_huge_valf128() (__builtin_huge_vall ()) # define __builtin_huge_valf128() (__builtin_huge_vall ())
# define __builtin_inff128() (__builtin_infl ()) # define __builtin_inff128() (__builtin_infl ())
# define __builtin_nanf128(x) (__builtin_nanl (x)) # define __builtin_nanf128(x) (__builtin_nanl (x))
# define __builtin_nansf128(x) (__builtin_nansl (x)) # define __builtin_nansf128(x) (__builtin_nansl (x))
# endif
# endif # endif
#endif #endif /* !__ASSEMBLER__. */
#include <bits/floatn-common.h> #include <bits/floatn-common.h>

View File

@ -39,43 +39,47 @@
from the default float, double and long double types in this glibc. */ from the default float, double and long double types in this glibc. */
#define __HAVE_DISTINCT_FLOAT128 0 #define __HAVE_DISTINCT_FLOAT128 0
#ifndef __ASSEMBLER__
/* Defined to concatenate the literal suffix to be used with _Float128 /* Defined to concatenate the literal suffix to be used with _Float128
types, if __HAVE_FLOAT128 is 1. */ types, if __HAVE_FLOAT128 is 1. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
/* The literal suffix f128 exists only since GCC 7.0. */ /* The literal suffix f128 exists only since GCC 7.0. */
# define __f128(x) x##l # define __f128(x) x##l
# else # else
# define __f128(x) x##f128 # define __f128(x) x##f128
# endif
# endif # endif
#endif
/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
# define __CFLOAT128 _Complex long double # define __CFLOAT128 _Complex long double
# else # else
# define __CFLOAT128 _Complex _Float128 # define __CFLOAT128 _Complex _Float128
# endif
# endif # endif
#endif
/* The remaining of this file provides support for older compilers. */ /* The remaining of this file provides support for older compilers. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
/* The type _Float128 exists only since GCC 7.0. */ /* The type _Float128 exists only since GCC 7.0. */
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef long double _Float128; typedef long double _Float128;
# endif # endif
/* Various built-in functions do not exist before GCC 7.0. */ /* Various built-in functions do not exist before GCC 7.0. */
# if !__GNUC_PREREQ (7, 0) # if !__GNUC_PREREQ (7, 0)
# define __builtin_huge_valf128() (__builtin_huge_vall ()) # define __builtin_huge_valf128() (__builtin_huge_vall ())
# define __builtin_inff128() (__builtin_infl ()) # define __builtin_inff128() (__builtin_infl ())
# define __builtin_nanf128(x) (__builtin_nanl (x)) # define __builtin_nanf128(x) (__builtin_nanl (x))
# define __builtin_nansf128(x) (__builtin_nansl (x)) # define __builtin_nansf128(x) (__builtin_nansl (x))
# endif
# endif # endif
#endif #endif /* !__ASSEMBLER__. */
#include <bits/floatn-common.h> #include <bits/floatn-common.h>

View File

@ -40,63 +40,67 @@
# define __HAVE_DISTINCT_FLOAT128 0 # define __HAVE_DISTINCT_FLOAT128 0
#endif #endif
#ifndef __ASSEMBLER__
/* Defined to concatenate the literal suffix to be used with _Float128 /* Defined to concatenate the literal suffix to be used with _Float128
types, if __HAVE_FLOAT128 is 1. */ types, if __HAVE_FLOAT128 is 1. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
/* The literal suffix (f128) exist for powerpc only since GCC 7.0. */ /* The literal suffix (f128) exist for powerpc only since GCC 7.0. */
# define __f128(x) x##q # define __f128(x) x##q
# else # else
# define __f128(x) x##f128 # define __f128(x) x##f128
# endif
# endif # endif
#endif
/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
/* Add a typedef for older GCC compilers which don't natively support /* Add a typedef for older GCC compilers which don't natively support
_Complex _Float128. */ _Complex _Float128. */
typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__KC__))); typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__KC__)));
# define __CFLOAT128 __cfloat128 # define __CFLOAT128 __cfloat128
# else # else
# define __CFLOAT128 _Complex _Float128 # define __CFLOAT128 _Complex _Float128
# endif
# endif # endif
#endif
/* The remaining of this file provides support for older compilers. */ /* The remaining of this file provides support for older compilers. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
/* The type _Float128 exist for powerpc only since GCC 7.0. */ /* The type _Float128 exist for powerpc only since GCC 7.0. */
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef __float128 _Float128; typedef __float128 _Float128;
# endif # endif
/* Builtin __builtin_huge_valf128 doesn't exist before GCC 7.0. */ /* Builtin __builtin_huge_valf128 doesn't exist before GCC 7.0. */
# if !__GNUC_PREREQ (7, 0) # if !__GNUC_PREREQ (7, 0)
# define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ())
# endif # endif
/* The following builtins (suffixed with 'q') are available in GCC >= 6.2, /* The following builtins (suffixed with 'q') are available in GCC >= 6.2,
which is the minimum version required for float128 support on powerpc64le. which is the minimum version required for float128 support on powerpc64le.
Since GCC 7.0 the builtins suffixed with f128 are also available, then Since GCC 7.0 the builtins suffixed with f128 are also available, then
there is no need to redefined them. */ there is no need to redefined them. */
# if !__GNUC_PREREQ (7, 0) # if !__GNUC_PREREQ (7, 0)
# define __builtin_copysignf128 __builtin_copysignq # define __builtin_copysignf128 __builtin_copysignq
# define __builtin_fabsf128 __builtin_fabsq # define __builtin_fabsf128 __builtin_fabsq
# define __builtin_inff128 __builtin_infq # define __builtin_inff128 __builtin_infq
# define __builtin_nanf128 __builtin_nanq # define __builtin_nanf128 __builtin_nanq
# define __builtin_nansf128 __builtin_nansq # define __builtin_nansf128 __builtin_nansq
# endif # endif
/* In math/math.h, __MATH_TG will expand signbit to __builtin_signbit*, /* In math/math.h, __MATH_TG will expand signbit to __builtin_signbit*,
e.g.: __builtin_signbitf128, before GCC 6. However, there has never e.g.: __builtin_signbitf128, before GCC 6. However, there has never
been a __builtin_signbitf128 in GCC and the type-generic builtin is been a __builtin_signbitf128 in GCC and the type-generic builtin is
only available since GCC 6. */ only available since GCC 6. */
# if !__GNUC_PREREQ (6, 0) # if !__GNUC_PREREQ (6, 0)
# define __builtin_signbitf128 __signbitf128 # define __builtin_signbitf128 __signbitf128
# endif
# endif # endif
#endif #endif /* !__ASSEMBLER__. */
#include <bits/floatn-common.h> #include <bits/floatn-common.h>

View File

@ -42,64 +42,68 @@
# define __HAVE_DISTINCT_FLOAT128 0 # define __HAVE_DISTINCT_FLOAT128 0
#endif #endif
#ifndef __ASSEMBLER__
/* Defined to concatenate the literal suffix to be used with _Float128 /* Defined to concatenate the literal suffix to be used with _Float128
types, if __HAVE_FLOAT128 is 1. */ types, if __HAVE_FLOAT128 is 1. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
/* The literal suffix f128 exists only since GCC 7.0. */ /* The literal suffix f128 exists only since GCC 7.0. */
# define __f128(x) x##q # define __f128(x) x##q
# else # else
# define __f128(x) x##f128 # define __f128(x) x##f128
# endif
# endif # endif
#endif
/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
/* Add a typedef for older GCC compilers which don't natively support /* Add a typedef for older GCC compilers which don't natively support
_Complex _Float128. */ _Complex _Float128. */
typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__)));
# define __CFLOAT128 __cfloat128 # define __CFLOAT128 __cfloat128
# else # else
# define __CFLOAT128 _Complex _Float128 # define __CFLOAT128 _Complex _Float128
# endif
# endif # endif
#endif
/* The remaining of this file provides support for older compilers. */ /* The remaining of this file provides support for older compilers. */
#if __HAVE_FLOAT128 # if __HAVE_FLOAT128
/* The type _Float128 exists only since GCC 7.0. */ /* The type _Float128 exists only since GCC 7.0. */
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef __float128 _Float128; typedef __float128 _Float128;
# endif # endif
/* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */
# if !__GNUC_PREREQ (7, 0) # if !__GNUC_PREREQ (7, 0)
# define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ())
# endif # endif
/* Older GCC has only a subset of built-in functions for _Float128 on /* Older GCC has only a subset of built-in functions for _Float128 on
x86, and __builtin_infq is not usable in static initializers. x86, and __builtin_infq is not usable in static initializers.
Converting a narrower sNaN to _Float128 produces a quiet NaN, so Converting a narrower sNaN to _Float128 produces a quiet NaN, so
attempts to use _Float128 sNaNs will not work properly with older attempts to use _Float128 sNaNs will not work properly with older
compilers. */ compilers. */
# if !__GNUC_PREREQ (7, 0) # if !__GNUC_PREREQ (7, 0)
# define __builtin_copysignf128 __builtin_copysignq # define __builtin_copysignf128 __builtin_copysignq
# define __builtin_fabsf128 __builtin_fabsq # define __builtin_fabsf128 __builtin_fabsq
# define __builtin_inff128() ((_Float128) __builtin_inf ()) # define __builtin_inff128() ((_Float128) __builtin_inf ())
# define __builtin_nanf128(x) ((_Float128) __builtin_nan (x)) # define __builtin_nanf128(x) ((_Float128) __builtin_nan (x))
# define __builtin_nansf128(x) ((_Float128) __builtin_nans (x)) # define __builtin_nansf128(x) ((_Float128) __builtin_nans (x))
# endif # endif
/* In math/math.h, __MATH_TG will expand signbit to __builtin_signbit*, /* In math/math.h, __MATH_TG will expand signbit to __builtin_signbit*,
e.g.: __builtin_signbitf128, before GCC 6. However, there has never e.g.: __builtin_signbitf128, before GCC 6. However, there has never
been a __builtin_signbitf128 in GCC and the type-generic builtin is been a __builtin_signbitf128 in GCC and the type-generic builtin is
only available since GCC 6. */ only available since GCC 6. */
# if !__GNUC_PREREQ (6, 0) # if !__GNUC_PREREQ (6, 0)
# define __builtin_signbitf128 __signbitf128 # define __builtin_signbitf128 __signbitf128
# endif
# endif # endif
#endif #endif /* !__ASSEMBLER__. */
#include <bits/floatn-common.h> #include <bits/floatn-common.h>