@ -165,16 +165,80 @@ typedef struct {
# define HAS_80_BIT_LONG_DOUBLE 0
# endif
# if CRT_HAS_FLOATING_POINT
# if HAS_80_BIT_LONG_DOUBLE
typedef long double xf_float ;
typedef union {
uqwords u ;
long double f ;
} long_double_bits ;
xf_float f ;
} xf_bits ;
# endif
# ifdef __powerpc64__
// From https://gcc.gnu.org/wiki/Ieee128PowerPC:
// PowerPC64 uses the following suffixes:
// IFmode: IBM extended double
// KFmode: IEEE 128-bit floating point
// TFmode: Matches the default for long double. With -mabi=ieeelongdouble,
// it is IEEE 128-bit, with -mabi=ibmlongdouble IBM extended double
// Since compiler-rt only implements the tf set of libcalls, we use long double
// for the tf_float typedef.
typedef long double tf_float ;
# define CRT_LDBL_128BIT
# define CRT_HAS_F128
# if __LDBL_MANT_DIG__ == 113 && !defined(__LONG_DOUBLE_IBM128__)
# define CRT_HAS_IEEE_TF
# define CRT_LDBL_IEEE_F128
# endif
# define TF_C(x) x##L
# elif __LDBL_MANT_DIG__ == 113
// Use long double instead of __float128 if it matches the IEEE 128-bit format.
# define CRT_LDBL_128BIT
# define CRT_HAS_F128
# define CRT_HAS_IEEE_TF
# define CRT_LDBL_IEEE_F128
typedef long double tf_float ;
# define TF_C(x) x##L
# elif defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)
# define CRT_HAS___FLOAT128_KEYWORD
# define CRT_HAS_F128
// NB: we assume the __float128 type uses IEEE representation.
# define CRT_HAS_IEEE_TF
typedef __float128 tf_float ;
# define TF_C(x) x##Q
# endif
# ifdef CRT_HAS_F128
typedef union {
uqwords u ;
tf_float f ;
} tf_bits ;
# endif
// __(u)int128_t is currently needed to compile the *tf builtins as we would
// otherwise need to manually expand the bit manipulation on two 64-bit value.
# if defined(CRT_HAS_128BIT) && defined(CRT_HAS_F128)
# define CRT_HAS_TF_MODE
# endif
# if CRT_HAS_FLOATING_POINT
# if __STDC_VERSION__ >= 199901L
typedef float _Complex Fcomplex ;
typedef double _Complex Dcomplex ;
typedef long double _Complex Lcomplex ;
# if defined(CRT_LDBL_128BIT)
typedef Lcomplex Qcomplex ;
# define CRT_HAS_NATIVE_COMPLEX_F128
# elif defined(CRT_HAS___FLOAT128_KEYWORD)
# if defined(__clang_major__) && __clang_major__ > 10
// Clang prior to 11 did not support __float128 _Complex.
typedef __float128 _Complex Qcomplex ;
# define CRT_HAS_NATIVE_COMPLEX_F128
# elif defined(__GNUC__) && __GNUC__ >= 7
// GCC does not allow __float128 _Complex, but accepts _Float128 _Complex.
typedef _Float128 _Complex Qcomplex ;
# define CRT_HAS_NATIVE_COMPLEX_F128
# endif
# endif
# define COMPLEX_REAL(x) __real__(x)
# define COMPLEX_IMAGINARY(x) __imag__(x)
@ -194,5 +258,17 @@ typedef struct {
# define COMPLEX_REAL(x) (x).real
# define COMPLEX_IMAGINARY(x) (x).imaginary
# endif
# ifdef CRT_HAS_NATIVE_COMPLEX_F128
# define COMPLEXTF_REAL(x) __real__(x)
# define COMPLEXTF_IMAGINARY(x) __imag__(x)
# elif defined(CRT_HAS_F128)
typedef struct {
tf_float real , imaginary ;
} Qcomplex ;
# define COMPLEXTF_REAL(x) (x).real
# define COMPLEXTF_IMAGINARY(x) (x).imaginary
# endif
# endif
# endif // INT_TYPES_H