[PATCH 3/8] x86: Do not use __builtin_isinf_sign for _Float64x/long double

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Thu Dec 18 12:39:41 GMT 2025



On 17/12/25 20:53, H.J. Lu wrote:
> On Thu, Dec 18, 2025 at 1:56 AM Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>>
>> Neither gcc [1] nor clang [2] handles pseudo-normal numbers correctly
>> with the __builtin_isinf_sign, so disable its usage for _Float64x and
>> long double types.
>>
>> This only affects x86, so add a new define __FP_BUILTIN_ISINF_SIGN_DENORMAL
>> to gate long double and related types to the libc function instead.
>>
>> It fixes the regression on test-ldouble-isinf when built with clang:
> 
> Why don't they fail with GCC?

Similar to fpclassify, glibc builds the isinf tests with -fsignaling-nans. 
With gcc this defines __SUPPORT_SNAN__, which will always calls the glibc 
symbol.  The clang does not support the options, nor define __SUPPORT_SNAN__;
and then will always use the builtin.

> 
>> Failure: isinf (pseudo_zero): Exception "Invalid operation" set
>> Failure: isinf (pseudo_inf): Exception "Invalid operation" set
>> Failure: isinf (pseudo_qnan): Exception "Invalid operation" set
>> Failure: isinf (pseudo_snan): Exception "Invalid operation" set
>> Failure: isinf (pseudo_unnormal): Exception "Invalid operation" set
>> Failure: isinf_downward (pseudo_zero): Exception "Invalid operation" set
>> Failure: isinf_downward (pseudo_inf): Exception "Invalid operation" set
>> Failure: isinf_downward (pseudo_qnan): Exception "Invalid operation" set
>> Failure: isinf_downward (pseudo_snan): Exception "Invalid operation" set
>> Failure: isinf_downward (pseudo_unnormal): Exception "Invalid operation" set
>> Failure: isinf_towardzero (pseudo_zero): Exception "Invalid operation" set
>> Failure: isinf_towardzero (pseudo_inf): Exception "Invalid operation" set
>> Failure: isinf_towardzero (pseudo_qnan): Exception "Invalid operation" set
>> Failure: isinf_towardzero (pseudo_snan): Exception "Invalid operation" set
>> Failure: isinf_towardzero (pseudo_unnormal): Exception "Invalid operation" set
>> Failure: isinf_upward (pseudo_zero): Exception "Invalid operation" set
>> Failure: isinf_upward (pseudo_inf): Exception "Invalid operation" set
>> Failure: isinf_upward (pseudo_qnan): Exception "Invalid operation" set
>> Failure: isinf_upward (pseudo_snan): Exception "Invalid operation" set
>> Failure: isinf_upward (pseudo_unnormal): Exception "Invalid operation" set
>>
>> Checked on x86_64-linux-gnu with gcc-15 and clang-18.
>>
>> [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123173
>> [2] https://github.com/llvm/llvm-project/issues/172651
>> ---
>>  bits/fp-builtin-denormal.h             | 4 ++++
>>  math/math.h                            | 5 ++++-
>>  sysdeps/x86/bits/fp-builtin-denormal.h | 4 ++++
>>  3 files changed, 12 insertions(+), 1 deletion(-)
>>
>> diff --git a/bits/fp-builtin-denormal.h b/bits/fp-builtin-denormal.h
>> index 77b7184975..5748eb86f0 100644
>> --- a/bits/fp-builtin-denormal.h
>> +++ b/bits/fp-builtin-denormal.h
>> @@ -26,3 +26,7 @@
>>      Intel double extended-precision (long double).  By default assume 1 to
>>      enable the usage of compiler builtin on math.h.  */
>>  #define __FP_BUILTIN_FPCLASSIFY_DENORMAL 1
>> +
>> +/* __FP_BUILTIN_ISINF_SIGN_DENORMAL is defined to 1 if compiler supports
>> +   handling pseudo-dernormal numbers with isinf_sign builtin.  */
>> +#define __FP_BUILTIN_ISINF_SIGN_DENORMAL 1
>> diff --git a/math/math.h b/math/math.h
>> index cbec2f406a..96b64379f7 100644
>> --- a/math/math.h
>> +++ b/math/math.h
>> @@ -1249,7 +1249,10 @@ enum
>>       ? __isinff128 (x) : __builtin_isinf_sign (x))
>>  # elif (__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__) \
>>         || __glibc_clang_prereq (3,7)
>> -#  define isinf(x) __builtin_isinf_sign (x)
>> +#  define isinf(x) __MATH_TG_BUILTIN_CLASSIFY ((x),                          \
>> +                                              __builtin_isinf_sign, (x),     \
>> +                                              isinf, (x),                    \
>> +                                              __FP_BUILTIN_ISINF_SIGN_DENORMAL)
>>  # else
>>  #  define isinf(x) __MATH_TG ((x), __isinf, (x))
>>  # endif
>> diff --git a/sysdeps/x86/bits/fp-builtin-denormal.h b/sysdeps/x86/bits/fp-builtin-denormal.h
>> index bfb8f54237..2f9a5c7b66 100644
>> --- a/sysdeps/x86/bits/fp-builtin-denormal.h
>> +++ b/sysdeps/x86/bits/fp-builtin-denormal.h
>> @@ -23,3 +23,7 @@
>>  /* Neither GCC (bug 123161) nor clang (issue 172533) handles pseudo-normal
>>     numbers correctly with fpclassify builtin.  */
>>  #define __FP_BUILTIN_FPCLASSIFY_DENORMAL 0
>> +
>> +/* Neither GCC (bug 123173) nor clang (issue 172651) handles pseudo-normal
>> +   numbers correctly with isinf_sign builtin.  */
>> +#define __FP_BUILTIN_ISINF_SIGN_DENORMAL 0
>> --
>> 2.43.0
>>
> 
> 



More information about the Libc-alpha mailing list