From 534b6296b804d14fe1a5efbdb2de5c009391d837 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Wed, 21 Feb 2024 10:44:47 -0300 Subject: x86_64: Provide __sfp_handle_exceptions if compiler does not --- config.h.in | 3 +++ sysdeps/x86/fpu/sfp-machine.h | 20 +++++++++++++++++++- sysdeps/x86_64/configure | 31 +++++++++++++++++++++++++++++++ sysdeps/x86_64/configure.ac | 20 ++++++++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) diff --git a/config.h.in b/config.h.in index 69ac450..307ac78 100644 --- a/config.h.in +++ b/config.h.in @@ -294,4 +294,7 @@ /* Define if -mapxf is enabled by default on x86. */ #undef HAVE_X86_APX +/* Define whether compiler runtime library provides __sfp_handle_exceptions. */ +#undef HAVE_X86_64_SFP_HANDLE_EXCEPTIONS + #endif diff --git a/sysdeps/x86/fpu/sfp-machine.h b/sysdeps/x86/fpu/sfp-machine.h index dd23c79..c2aa2b6 100644 --- a/sysdeps/x86/fpu/sfp-machine.h +++ b/sysdeps/x86/fpu/sfp-machine.h @@ -217,8 +217,26 @@ typedef unsigned int UTItype __attribute__ ((mode (TI))); (FP_EX_INVALID | FP_EX_DENORM | FP_EX_DIVZERO | FP_EX_OVERFLOW \ | FP_EX_UNDERFLOW | FP_EX_INEXACT) +#ifdef HAVE_X86_64_SFP_HANDLE_EXCEPTIONS void __sfp_handle_exceptions (int); - +#else +#include +static inline void __sfp_handle_exceptions (int _fex) +{ + if (_fex & FP_EX_INVALID) + feraiseexcept (FE_INVALID); + if (_fex & FP_EX_DENORM) + feraiseexcept (__FE_DENORM); + if (_fex & FP_EX_DIVZERO) + feraiseexcept (FE_DIVBYZERO); + if (_fex & FP_EX_OVERFLOW) + feraiseexcept (FE_OVERFLOW); + if (_fex & FP_EX_UNDERFLOW) + feraiseexcept (FE_UNDERFLOW); + if (_fex & FP_EX_INEXACT) + feraiseexcept (FE_INEXACT); +} +#endif #define FP_HANDLE_EXCEPTIONS \ do { \ if (__builtin_expect (_fex, 0)) \ diff --git a/sysdeps/x86_64/configure b/sysdeps/x86_64/configure index e641e75..65cd4c9 100755 --- a/sysdeps/x86_64/configure +++ b/sysdeps/x86_64/configure @@ -218,6 +218,37 @@ fi config_vars="$config_vars have-x86-apx = $libc_cv_x86_have_apx" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler standard library provides __sfp_handle_exceptions" >&5 +printf %s "checking whether compiler standard library provides __sfp_handle_exceptions... " >&6; } +if test ${libc_cv_sfp_handle_exceptions+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat > conftest.c <&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_sfp_handle_exceptions=yes + else + libc_cv_sfp_handle_exceptions=no + fi + rm -rf conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_sfp_handle_exceptions" >&5 +printf "%s\n" "$libc_cv_sfp_handle_exceptions" >&6; } +if test x"$libc_cv_sfp_handle_exceptions" == xyes; then + printf "%s\n" "#define HAVE_X86_64_SFP_HANDLE_EXCEPTIONS 1" >>confdefs.h + +fi + test -n "$critic_missing" && as_fn_error $? " *** $critic_missing" "$LINENO" 5 diff --git a/sysdeps/x86_64/configure.ac b/sysdeps/x86_64/configure.ac index 57caf63..112d154 100644 --- a/sysdeps/x86_64/configure.ac +++ b/sysdeps/x86_64/configure.ac @@ -103,5 +103,25 @@ if test $libc_cv_x86_have_apx = yes; then fi LIBC_CONFIG_VAR([have-x86-apx], [$libc_cv_x86_have_apx]) +dnl Check if compiler standard library provides __sfp_handle_exceptions, used on +dnl float128 implementation. +AC_CACHE_CHECK(whether compiler standard library provides __sfp_handle_exceptions, + libc_cv_sfp_handle_exceptions, [dnl +cat > conftest.c <&AS_MESSAGE_LOG_FD); then + libc_cv_sfp_handle_exceptions=yes + else + libc_cv_sfp_handle_exceptions=no + fi + rm -rf conftest*]) +if test x"$libc_cv_sfp_handle_exceptions" == xyes; then + AC_DEFINE(HAVE_X86_64_SFP_HANDLE_EXCEPTIONS) +fi + test -n "$critic_missing" && AC_MSG_ERROR([ *** $critic_missing]) -- cgit v1.1