[PATCH 1/8] math: Do not use __builtin_isgreater* and __builtin_isless* on clang
H.J. Lu
hjl.tools@gmail.com
Thu Dec 18 23:38:57 GMT 2025
On Thu, Dec 18, 2025 at 1:56 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> clang does not check for unordered numbers with builtins for 128-bit
> float types (both _Float128 on x86_64 or long double on aarch64) [1].
>
> For instance, the code:
>
> #ifdef __x86_64__
> typedef __float128 FLOAT128_TYPE;
> #elif defined (__aarch64__)
> typedef long double FLOAT128_TYPE;
> #endif
>
> int foo (FLOAT128_TYPE x, FLOAT128_TYPE y)
> {
> return __builtin_isgreater (x, y);
> }
>
> Will issue a __gttf2 call instead of a __unordtf2 followed by the
> comparison.
>
> Using the generic implementation fixes multiple issues with math tests,
> such as:
>
> Failure: fmax (0, qNaN): Exception "Invalid operation" set
> Failure: fmax (0, -qNaN): Exception "Invalid operation" set
> Failure: fmax (-0, qNaN): Exception "Invalid operation" set
> Failure: fmax (-0, -qNaN): Exception "Invalid operation" set
> Failure: fmax (9, qNaN): Exception "Invalid operation" set
> Failure: fmax (9, -qNaN): Exception "Invalid operation" set
> Failure: fmax (-9, qNaN): Exception "Invalid operation" set
> Failure: fmax (-9, -qNaN): Exception "Invalid operation" set
>
> It has a small performance overhead due to the extra isunordered (which
> could be omitted for float and double types). Using _Generic (similar to
> how __MATH_TG) on a bivariadic function requires a lot of boilerplate
> macros.
>
> [1] https://github.com/llvm/llvm-project/issues/172499
> ---
> math/math.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/math/math.h b/math/math.h
> index 26cea186fc..74b064d96e 100644
> --- a/math/math.h
> +++ b/math/math.h
> @@ -1433,7 +1433,7 @@ iszero (__T __val)
> #endif
>
> #ifdef __USE_ISOC99
> -# if __GNUC_PREREQ (3, 1)
> +# if __GNUC_PREREQ (3, 1) && !defined __clang__
> /* ISO C99 defines some macros to compare number while taking care for
> unordered numbers. Many FPUs provide special instructions to support
> these operations. Generic support in GCC for these as builtins went
> --
> 2.43.0
>
LGTM.
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
Thanks.
--
H.J.
More information about the Libc-alpha
mailing list