diff options
author | Fangrui Song <i@maskray.me> | 2021-10-10 14:38:00 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2024-12-22 16:07:11 +0800 |
commit | d773aff467840f5ed305e40c180466e90bd88183 (patch) | |
tree | bb93860f36c173c6401c615bb428b2eb3446a4ba | |
parent | b2556550a0f952b2a841a0b4bddc999c2df1b233 (diff) | |
download | glibc-d773aff467840f5ed305e40c180466e90bd88183.zip glibc-d773aff467840f5ed305e40c180466e90bd88183.tar.gz glibc-d773aff467840f5ed305e40c180466e90bd88183.tar.bz2 |
x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path
Clang supports __builtin_fabsf128 (despite not supporting _Float128) but
it does not support __builtin_fabsq. Fallback to back to
`typedef __float128 _Float128;` it clang is used.
Originally developed by Fangrui Song <maskray@google.com>.
Co-Authored-By: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Sam James <sam@gentoo.org>
-rw-r--r-- | sysdeps/x86/bits/floatn.h | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index e661aba..ba030d2 100644 --- a/sysdeps/x86/bits/floatn.h +++ b/sysdeps/x86/bits/floatn.h @@ -28,7 +28,8 @@ support, for x86_64 and x86. */ #if (defined __x86_64__ \ ? __GNUC_PREREQ (4, 3) \ - : (defined __GNU__ ? __GNUC_PREREQ (4, 5) : __GNUC_PREREQ (4, 4))) + : (defined __GNU__ ? __GNUC_PREREQ (4, 5) : __GNUC_PREREQ (4, 4))) \ + || __glibc_clang_prereq (3, 4) # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,9 @@ /* 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 && !__GNUC_PREREQ (13, 0)) +# if !__GNUC_PREREQ (7, 0) \ + || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) \ + || defined __clang__ /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +71,9 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) +# if !__GNUC_PREREQ (7, 0) \ + || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) \ + || defined __clang__ /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +87,14 @@ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); # if __HAVE_FLOAT128 /* The type _Float128 exists only since GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) +# if !__GNUC_PREREQ (7, 0) \ + || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) \ + || __glibc_clang_prereq (3, 4) typedef __float128 _Float128; # endif -/* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +/* __builtin_huge_valf128 doesn't exist before GCC 7.0 nor Clang 7.0. */ +# if !__GNUC_PREREQ (7, 0) && !__glibc_clang_prereq (7, 0) # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +103,7 @@ typedef __float128 _Float128; Converting a narrower sNaN to _Float128 produces a quiet NaN, so attempts to use _Float128 sNaNs will not work properly with older compilers. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_copysignf128 __builtin_copysignq # define __builtin_fabsf128 __builtin_fabsq # define __builtin_inff128() ((_Float128) __builtin_inf ()) @@ -107,7 +114,8 @@ typedef __float128 _Float128; /* In math/math.h, __MATH_TG will expand signbit to __builtin_signbit*, e.g.: __builtin_signbitf128, before GCC 6. However, there has never been a __builtin_signbitf128 in GCC and the type-generic builtin is - only available since GCC 6. */ + only available since GCC 6. signbit is expanded to __builtin_signbit + after Clang 3.3. */ # if !__GNUC_PREREQ (6, 0) # define __builtin_signbitf128 __signbitf128 # endif |