https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=515e6c3102f1bc3cf21b19479a9451eae4a9d2ff commit 515e6c3102f1bc3cf21b19479a9451eae4a9d2ff Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=d6d14b290d749151c1537f92e269b39647f412b1 commit d6d14b290d749151c1537f92e269b39647f412b1 Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=cda555c80edc17229b868909b4380a673ef0049d commit cda555c80edc17229b868909b4380a673ef0049d Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=cda555c80edc17229b868909b4380a673ef0049d commit cda555c80edc17229b868909b4380a673ef0049d Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=7ac8db25ac707b2dd95c1ed7ac8bfd89cc90e3bd commit 7ac8db25ac707b2dd95c1ed7ac8bfd89cc90e3bd Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=990fecaf6c0ee1327cd014347f221b3ae3ef49ed commit 990fecaf6c0ee1327cd014347f221b3ae3ef49ed Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=a2f251c48eab1bb2fb53df53d7a1c259f4be2dc5 commit a2f251c48eab1bb2fb53df53d7a1c259f4be2dc5 Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=5453d9065a1e73a290584ddaef62443fa712efaf commit 5453d9065a1e73a290584ddaef62443fa712efaf Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=f7fa7d334ec5dc15379735390f7071e2f2218e4e commit f7fa7d334ec5dc15379735390f7071e2f2218e4e Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=1e1c691365362506beb5fbe3108b2bd83ac2226b commit 1e1c691365362506beb5fbe3108b2bd83ac2226b Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=0e8abd82176a8b2f894e389d0a53360a313921c6 commit 0e8abd82176a8b2f894e389d0a53360a313921c6 Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=f3cbf755679b4f91b1b6bc67fbf2dfe08ab85480 commit f3cbf755679b4f91b1b6bc67fbf2dfe08ab85480 Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=0d61efe1f49a12db89d827f73ad1c94ba5747a93 commit 0d61efe1f49a12db89d827f73ad1c94ba5747a93 Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=0d61efe1f49a12db89d827f73ad1c94ba5747a93 commit 0d61efe1f49a12db89d827f73ad1c94ba5747a93 Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 34a6fdc864..91ac3784b1 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))) \ + || defined __clang__ # define __HAVE_FLOAT128 1 #else # define __HAVE_FLOAT128 0 @@ -58,7 +59,7 @@ /* 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* The literal suffix f128 exists only since GCC 7.0. */ # define __f128(x) x##q # else @@ -68,7 +69,7 @@ /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ # if __HAVE_FLOAT128 -# if !__GNUC_PREREQ (7, 0) || defined __cplusplus +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus /* Add a typedef for older GCC compilers which don't natively support _Complex _Float128. */ typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); @@ -82,12 +83,12 @@ 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 +# if !__GNUC_PREREQ (7, 0) || defined __clang__ || defined __cplusplus typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ()) # endif @@ -96,7 +97,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 ()) @@ -108,7 +109,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=d426aeb39867b8de89c7fe6d0026c4b943f4e733 commit d426aeb39867b8de89c7fe6d0026c4b943f4e733 Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 4ff39457b5..7e24dde129 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))) \ + || defined __clang__ # 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)) \ + || defined __clang__ typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # 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 ()) @@ -108,7 +115,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=4789e5e1e14572ed669e47a740f284be27ce5bdc commit 4789e5e1e14572ed669e47a740f284be27ce5bdc Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index 4ff39457b5..7e24dde129 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))) \ + || defined __clang__ # 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)) \ + || defined __clang__ typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # 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 ()) @@ -108,7 +115,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=b989a899bb39d05a6ee9b2dec87bd5223aa10543 commit b989a899bb39d05a6ee9b2dec87bd5223aa10543 Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index f7f3d05667..b8fa38d9df 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))) \ + || defined __clang__ # 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)) \ + || defined __clang__ typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # 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 ()) @@ -108,7 +115,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=426cafe0ec72d549ff89aef5f7991dea50987d8e commit 426cafe0ec72d549ff89aef5f7991dea50987d8e Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 x86: Define __HAVE_FLOAT128 for Clang and use __builtin_*f128 code path Clang supports __builtin_fabsf128 (despite not supporting _Float128) but _not _builtin_fabsq. By falling back to `typedef __float128 _Float128;`, the float128 code will be buildable with Clang. Diff: --- sysdeps/x86/bits/floatn.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index f7f3d05667..b8fa38d9df 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))) \ + || defined __clang__ # 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)) \ + || defined __clang__ typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # 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 ()) @@ -108,7 +115,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=8fbc46b7bdbe15670a0c5752c99aedcf8f19f51b commit 8fbc46b7bdbe15670a0c5752c99aedcf8f19f51b Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 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. Diff: --- sysdeps/x86/bits/floatn.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index f7f3d05667..b8fa38d9df 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))) \ + || defined __clang__ # 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)) \ + || defined __clang__ typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # 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 ()) @@ -108,7 +115,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=bb99a64823d96abe5bcf292a737d9af73cb4e0fc commit bb99a64823d96abe5bcf292a737d9af73cb4e0fc Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 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. Diff: --- sysdeps/x86/bits/floatn.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index f7f3d05667..b8fa38d9df 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))) \ + || defined __clang__ # 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)) \ + || defined __clang__ typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # 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 ()) @@ -108,7 +115,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=e681991f7abb7f75762b647df71fc7fde54cbdc3 commit e681991f7abb7f75762b647df71fc7fde54cbdc3 Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 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. Diff: --- sysdeps/x86/bits/floatn.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index e661abaea4..8849b811bc 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))) \ + || defined __clang__ # 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)) \ + || defined __clang__ typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # 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 ()) @@ -108,7 +115,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=21069ad0a771ec66a2b7762218d828fc9611d99d commit 21069ad0a771ec66a2b7762218d828fc9611d99d Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 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. Diff: --- sysdeps/x86/bits/floatn.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index e661abaea4..8849b811bc 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))) \ + || defined __clang__ # 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)) \ + || defined __clang__ typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # 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 ()) @@ -108,7 +115,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=b6a5db8bec99f4997ed0fe4c1ccd2c3027135bb9 commit b6a5db8bec99f4997ed0fe4c1ccd2c3027135bb9 Author: Fangrui Song <maskray@google.com> Date: Sun Oct 10 14:38:00 2021 -0700 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. Diff: --- sysdeps/x86/bits/floatn.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/sysdeps/x86/bits/floatn.h b/sysdeps/x86/bits/floatn.h index e661abaea4..8849b811bc 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))) \ + || defined __clang__ # 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)) \ + || defined __clang__ typedef __float128 _Float128; # endif /* __builtin_huge_valf128 doesn't exist before GCC 7.0. */ -# if !__GNUC_PREREQ (7, 0) +# if !__GNUC_PREREQ (7, 0) && !defined __clang__ # 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 ()) @@ -108,7 +115,7 @@ typedef __float128 _Float128; 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. */ -# if !__GNUC_PREREQ (6, 0) +# if !__GNUC_PREREQ (6, 0) && !defined __clang__ # define __builtin_signbitf128 __signbitf128 # endif