[PATCH v2 16/28] x86: math: Use of __libgcc_cmp_return__ iff compiler supports it

H.J. Lu hjl.tools@gmail.com
Tue Oct 28 19:38:40 GMT 2025


On Wed, Oct 29, 2025 at 1:13 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> clang does not support '__attribute__ ((mode (__libgcc_cmp_return__)))',
> so use a more close related type instead fo the default 'int'.
> ---
>  config.h.in                   |  3 +++
>  sysdeps/x86/configure         | 39 +++++++++++++++++++++++++++++++++++
>  sysdeps/x86/configure.ac      | 18 ++++++++++++++++
>  sysdeps/x86/fpu/sfp-machine.h | 10 ++++++++-
>  4 files changed, 69 insertions(+), 1 deletion(-)
>
> diff --git a/config.h.in b/config.h.in
> index 5378883060..34da4d047e 100644
> --- a/config.h.in
> +++ b/config.h.in
> @@ -317,4 +317,7 @@
>  /* Define if trunc is inlined on x86.  */
>  #undef HAVE_X86_INLINE_TRUNC
>
> +/* Define if compiler suport __attribute__ ((mode (__libgcc_cmp_return__))).  */
> +#undef HAVE_X86_LIBGCC_CMP_RETURN_ATTR
> +
>  #endif
> diff --git a/sysdeps/x86/configure b/sysdeps/x86/configure
> index 2e95277f29..ad205f6975 100644
> --- a/sysdeps/x86/configure
> +++ b/sysdeps/x86/configure
> @@ -392,6 +392,45 @@ else
>
>  fi
>
> +
> +conftest_code="
> +int __gcc_CMPtype_GCC __attribute__ ((mode (__libgcc_cmp_return__)));
> +"
> +
> +cat > conftest.c <<EOF
> +$conftest_code
> +EOF
> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __libgcc_cmp_return__ mode attribute support" >&5
> +printf %s "checking for __libgcc_cmp_return__ mode attribute support... " >&6; }
> +if test ${libc_cv_cc_x86_libgcc_cmp_return_attribute+y}
> +then :
> +  printf %s "(cached) " >&6
> +else case e in #(
> +  e)   if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $CFLAGS conftest.c -o conftest 1>&5'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }
> +  then
> +    libc_cv_cc_x86_libgcc_cmp_return_attribute=yes
> +  else
> +    libc_cv_cc_x86_libgcc_cmp_return_attribute=no
> +  fi ;;
> +esac
> +fi
> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_x86_libgcc_cmp_return_attribute" >&5
> +printf "%s\n" "$libc_cv_cc_x86_libgcc_cmp_return_attribute" >&6; }
> +rm -f conftest*
> +if test "$libc_cv_cc_x86_libgcc_cmp_return_attribute" = yes; then
> +  printf "%s\n" "#define HAVE_X86_LIBGCC_CMP_RETURN_ATTR 1" >>confdefs.h
> +
> +else
> +  printf "%s\n" "#define HAVE_X86_LIBGCC_CMP_RETURN_ATTR 0" >>confdefs.h
> +
> +fi
> +
> +
>  if test "${libc_cv_cc_no_direct_extern_access}${libc_cv_test_cc_cflags_no_direct_extern_access}" = yes; then
>    libc_cv_protected_data=no
>  fi
> diff --git a/sysdeps/x86/configure.ac b/sysdeps/x86/configure.ac
> index f3888e6618..e0500f21b4 100644
> --- a/sysdeps/x86/configure.ac
> +++ b/sysdeps/x86/configure.ac
> @@ -223,6 +223,24 @@ else
>    AC_DEFINE(HAVE_X86_INLINE_TRUNC, 0)
>  fi
>
> +
> +conftest_code="
> +int __gcc_CMPtype_GCC __attribute__ ((mode (__libgcc_cmp_return__)));
> +"
> +dnl Check if CC support the __libgcc_cmp_return__ mode attribute
> +LIBC_TRY_CC_COMMAND([for __libgcc_cmp_return__ mode attribute support],
> +  [$conftest_code],
> +  [$CFLAGS],
> +  libc_cv_cc_x86_libgcc_cmp_return_attribute,
> +  [libc_cv_cc_x86_libgcc_cmp_return_attribute=yes],
> +  [libc_cv_cc_x86_libgcc_cmp_return_attribute=no])
> +if test "$libc_cv_cc_x86_libgcc_cmp_return_attribute" = yes; then
> +  AC_DEFINE(HAVE_X86_LIBGCC_CMP_RETURN_ATTR, 1)
> +else
> +  AC_DEFINE(HAVE_X86_LIBGCC_CMP_RETURN_ATTR, 0)
> +fi
> +
> +
>  dnl If the building compiler enables no direct external data access by
>  dnl default, access to protected data in shared libraries from executables
>  dnl must be compiled with no direct external data access.  If the testing
> diff --git a/sysdeps/x86/fpu/sfp-machine.h b/sysdeps/x86/fpu/sfp-machine.h
> index cbcedb8621..9ef85c4e6c 100644
> --- a/sysdeps/x86/fpu/sfp-machine.h
> +++ b/sysdeps/x86/fpu/sfp-machine.h
> @@ -1,9 +1,17 @@
>  /* Configure soft-fp for building sqrtf128.  Based on sfp-machine.h in
>     libgcc, with soft-float and other irrelevant parts removed.  */
>
> +#if HAVE_X86_LIBGCC_CMP_RETURN_ATTR
>  /* The type of the result of a floating point comparison.  This must
>     match `__libgcc_cmp_return__' in GCC for the target.  */
> -typedef int __gcc_CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
> +typedef int __gcc_CMPtype_GCC __attribute__ ((mode (__libgcc_cmp_return__)));
> +#else
> +# if defined __x86_64__ && defined __ILP32__

Can you drop "&& defined __ILP32__"?

> +typedef long long int __gcc_CMPtype;
> +#else
> +typedef long int __gcc_CMPtype;
> +# endif
> +#endif
>  #define CMPtype __gcc_CMPtype
>
>  #ifdef __x86_64__
> --
> 2.43.0
>


-- 
H.J.


More information about the Libc-alpha mailing list