[v3] x86_64: Exclude SSE, AVX and FMA4 variants in libm multiarch

Message ID 20240225020308.329306-1-skpgkp2@gmail.com
State Committed
Commit 9f78a7c1d0963282608da836b840f0d5ae1c478e
Headers
Series [v3] x86_64: Exclude SSE, AVX and FMA4 variants in libm multiarch |

Checks

Context Check Description
redhat-pt-bot/TryBot-apply_patch success Patch applied to master at the time it was sent
redhat-pt-bot/TryBot-32bit success Build for i686
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 warning Patch is already merged
linaro-tcwg-bot/tcwg_glibc_build--master-arm warning Patch is already merged

Commit Message

Sunil Pandey Feb. 25, 2024, 2:03 a.m. UTC
  When glibc is built with ISA level 3 or higher by default, the resulting
glibc binaries won't run on SSE or FMA4 processors.  Exclude SSE, AVX and
FMA4 variants in libm multiarch when ISA level 3 or higher is enabled by
default.

When glibc is built with ISA level 2 enabled by default, only keep SSE4.1
variant.

Fixes BZ 31335.

NB: elf/tst-valgrind-smoke test fails with ISA level 4, because valgrind
doesn't support AVX512 instructions:

https://bugs.kde.org/show_bug.cgi?id=383010

Changes from v2:

Replace ISA level 3 check with AVX2_X86_ISA_LEVEL.
Replace ISA level 2 check with SSE4_1_X86_ISA_LEVEL.
Replace makefile ISA level "3 4" check with $(x86-isa-level-3-or-above).

Changes from v1:

Replace AVX2 and FMA feature check with ISA level.
Replace SSE4_1 feature check with ISA level.
---
 sysdeps/x86/configure                         |  33 ++++
 sysdeps/x86/configure.ac                      |  24 +++
 sysdeps/x86_64/fpu/multiarch/Makefile         | 148 +++++++++---------
 sysdeps/x86_64/fpu/multiarch/e_asin.c         |  19 ++-
 sysdeps/x86_64/fpu/multiarch/e_atan2.c        |  11 +-
 sysdeps/x86_64/fpu/multiarch/e_exp.c          |  13 +-
 sysdeps/x86_64/fpu/multiarch/e_exp2f.c        |  19 ++-
 sysdeps/x86_64/fpu/multiarch/e_expf.c         |  19 ++-
 sysdeps/x86_64/fpu/multiarch/e_log.c          |  13 +-
 sysdeps/x86_64/fpu/multiarch/e_log2.c         |  19 ++-
 sysdeps/x86_64/fpu/multiarch/e_log2f.c        |  19 ++-
 sysdeps/x86_64/fpu/multiarch/e_logf.c         |  19 ++-
 sysdeps/x86_64/fpu/multiarch/e_pow.c          |  13 +-
 sysdeps/x86_64/fpu/multiarch/e_powf.c         |  27 ++--
 sysdeps/x86_64/fpu/multiarch/s_atan.c         |  11 +-
 sysdeps/x86_64/fpu/multiarch/s_ceil-avx.S     |  28 ++++
 sysdeps/x86_64/fpu/multiarch/s_ceil-sse4_1.S  |  12 ++
 sysdeps/x86_64/fpu/multiarch/s_ceil.c         |  21 +--
 sysdeps/x86_64/fpu/multiarch/s_ceilf-avx.S    |  28 ++++
 sysdeps/x86_64/fpu/multiarch/s_ceilf-sse4_1.S |  12 ++
 sysdeps/x86_64/fpu/multiarch/s_ceilf.c        |  21 +--
 sysdeps/x86_64/fpu/multiarch/s_cosf.c         |  11 +-
 sysdeps/x86_64/fpu/multiarch/s_expm1.c        |  11 +-
 sysdeps/x86_64/fpu/multiarch/s_floor-avx.S    |  28 ++++
 sysdeps/x86_64/fpu/multiarch/s_floor-sse4_1.S |  12 ++
 sysdeps/x86_64/fpu/multiarch/s_floor.c        |  21 +--
 sysdeps/x86_64/fpu/multiarch/s_floorf-avx.S   |  28 ++++
 .../x86_64/fpu/multiarch/s_floorf-sse4_1.S    |  12 ++
 sysdeps/x86_64/fpu/multiarch/s_floorf.c       |  21 +--
 sysdeps/x86_64/fpu/multiarch/s_log1p.c        |  11 +-
 .../x86_64/fpu/multiarch/s_nearbyint-avx.S    |  28 ++++
 .../x86_64/fpu/multiarch/s_nearbyint-sse4_1.S |  12 ++
 sysdeps/x86_64/fpu/multiarch/s_nearbyint.c    |  19 ++-
 .../x86_64/fpu/multiarch/s_nearbyintf-avx.S   |  28 ++++
 .../fpu/multiarch/s_nearbyintf-sse4_1.S       |  12 ++
 sysdeps/x86_64/fpu/multiarch/s_nearbyintf.c   |  19 ++-
 sysdeps/x86_64/fpu/multiarch/s_rint-avx.S     |  28 ++++
 sysdeps/x86_64/fpu/multiarch/s_rint-sse4_1.S  |  12 ++
 sysdeps/x86_64/fpu/multiarch/s_rint.c         |  21 +--
 sysdeps/x86_64/fpu/multiarch/s_rintf-avx.S    |  28 ++++
 sysdeps/x86_64/fpu/multiarch/s_rintf-sse4_1.S |  12 ++
 sysdeps/x86_64/fpu/multiarch/s_rintf.c        |  21 +--
 .../x86_64/fpu/multiarch/s_roundeven-avx.S    |  28 ++++
 .../x86_64/fpu/multiarch/s_roundeven-sse4_1.S |  12 ++
 sysdeps/x86_64/fpu/multiarch/s_roundeven.c    |  19 ++-
 .../x86_64/fpu/multiarch/s_roundevenf-avx.S   |  28 ++++
 .../fpu/multiarch/s_roundevenf-sse4_1.S       |  12 ++
 sysdeps/x86_64/fpu/multiarch/s_roundevenf.c   |  19 ++-
 sysdeps/x86_64/fpu/multiarch/s_sin.c          |  19 ++-
 sysdeps/x86_64/fpu/multiarch/s_sincos.c       |  11 +-
 sysdeps/x86_64/fpu/multiarch/s_sincosf.c      |  11 +-
 sysdeps/x86_64/fpu/multiarch/s_sinf.c         |  11 +-
 sysdeps/x86_64/fpu/multiarch/s_tan.c          |  11 +-
 sysdeps/x86_64/fpu/multiarch/s_trunc-avx.S    |  28 ++++
 sysdeps/x86_64/fpu/multiarch/s_trunc-sse4_1.S |  12 ++
 sysdeps/x86_64/fpu/multiarch/s_trunc.c        |  21 +--
 sysdeps/x86_64/fpu/multiarch/s_truncf-avx.S   |  28 ++++
 .../x86_64/fpu/multiarch/s_truncf-sse4_1.S    |  12 ++
 sysdeps/x86_64/fpu/multiarch/s_truncf.c       |  21 +--
 sysdeps/x86_64/fpu/multiarch/w_exp.c          |   7 +-
 sysdeps/x86_64/fpu/multiarch/w_log.c          |   7 +-
 sysdeps/x86_64/fpu/multiarch/w_pow.c          |   7 +-
 62 files changed, 953 insertions(+), 295 deletions(-)
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_ceil-avx.S
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_ceilf-avx.S
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_floor-avx.S
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_floorf-avx.S
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_nearbyint-avx.S
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_nearbyintf-avx.S
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_rint-avx.S
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_rintf-avx.S
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_roundeven-avx.S
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_roundevenf-avx.S
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_trunc-avx.S
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_truncf-avx.S
  

Comments

H.J. Lu Feb. 25, 2024, 7:26 p.m. UTC | #1
On Sat, Feb 24, 2024 at 6:04 PM Sunil K Pandey <skpgkp2@gmail.com> wrote:
>
> When glibc is built with ISA level 3 or higher by default, the resulting
> glibc binaries won't run on SSE or FMA4 processors.  Exclude SSE, AVX and
> FMA4 variants in libm multiarch when ISA level 3 or higher is enabled by
> default.
>
> When glibc is built with ISA level 2 enabled by default, only keep SSE4.1
> variant.
>
> Fixes BZ 31335.
>
> NB: elf/tst-valgrind-smoke test fails with ISA level 4, because valgrind
> doesn't support AVX512 instructions:
>
> https://bugs.kde.org/show_bug.cgi?id=383010
>
> Changes from v2:
>
> Replace ISA level 3 check with AVX2_X86_ISA_LEVEL.
> Replace ISA level 2 check with SSE4_1_X86_ISA_LEVEL.
> Replace makefile ISA level "3 4" check with $(x86-isa-level-3-or-above).
>
> Changes from v1:
>
> Replace AVX2 and FMA feature check with ISA level.
> Replace SSE4_1 feature check with ISA level.
> ---
>  sysdeps/x86/configure                         |  33 ++++
>  sysdeps/x86/configure.ac                      |  24 +++
>  sysdeps/x86_64/fpu/multiarch/Makefile         | 148 +++++++++---------
>  sysdeps/x86_64/fpu/multiarch/e_asin.c         |  19 ++-
>  sysdeps/x86_64/fpu/multiarch/e_atan2.c        |  11 +-
>  sysdeps/x86_64/fpu/multiarch/e_exp.c          |  13 +-
>  sysdeps/x86_64/fpu/multiarch/e_exp2f.c        |  19 ++-
>  sysdeps/x86_64/fpu/multiarch/e_expf.c         |  19 ++-
>  sysdeps/x86_64/fpu/multiarch/e_log.c          |  13 +-
>  sysdeps/x86_64/fpu/multiarch/e_log2.c         |  19 ++-
>  sysdeps/x86_64/fpu/multiarch/e_log2f.c        |  19 ++-
>  sysdeps/x86_64/fpu/multiarch/e_logf.c         |  19 ++-
>  sysdeps/x86_64/fpu/multiarch/e_pow.c          |  13 +-
>  sysdeps/x86_64/fpu/multiarch/e_powf.c         |  27 ++--
>  sysdeps/x86_64/fpu/multiarch/s_atan.c         |  11 +-
>  sysdeps/x86_64/fpu/multiarch/s_ceil-avx.S     |  28 ++++
>  sysdeps/x86_64/fpu/multiarch/s_ceil-sse4_1.S  |  12 ++
>  sysdeps/x86_64/fpu/multiarch/s_ceil.c         |  21 +--
>  sysdeps/x86_64/fpu/multiarch/s_ceilf-avx.S    |  28 ++++
>  sysdeps/x86_64/fpu/multiarch/s_ceilf-sse4_1.S |  12 ++
>  sysdeps/x86_64/fpu/multiarch/s_ceilf.c        |  21 +--
>  sysdeps/x86_64/fpu/multiarch/s_cosf.c         |  11 +-
>  sysdeps/x86_64/fpu/multiarch/s_expm1.c        |  11 +-
>  sysdeps/x86_64/fpu/multiarch/s_floor-avx.S    |  28 ++++
>  sysdeps/x86_64/fpu/multiarch/s_floor-sse4_1.S |  12 ++
>  sysdeps/x86_64/fpu/multiarch/s_floor.c        |  21 +--
>  sysdeps/x86_64/fpu/multiarch/s_floorf-avx.S   |  28 ++++
>  .../x86_64/fpu/multiarch/s_floorf-sse4_1.S    |  12 ++
>  sysdeps/x86_64/fpu/multiarch/s_floorf.c       |  21 +--
>  sysdeps/x86_64/fpu/multiarch/s_log1p.c        |  11 +-
>  .../x86_64/fpu/multiarch/s_nearbyint-avx.S    |  28 ++++
>  .../x86_64/fpu/multiarch/s_nearbyint-sse4_1.S |  12 ++
>  sysdeps/x86_64/fpu/multiarch/s_nearbyint.c    |  19 ++-
>  .../x86_64/fpu/multiarch/s_nearbyintf-avx.S   |  28 ++++
>  .../fpu/multiarch/s_nearbyintf-sse4_1.S       |  12 ++
>  sysdeps/x86_64/fpu/multiarch/s_nearbyintf.c   |  19 ++-
>  sysdeps/x86_64/fpu/multiarch/s_rint-avx.S     |  28 ++++
>  sysdeps/x86_64/fpu/multiarch/s_rint-sse4_1.S  |  12 ++
>  sysdeps/x86_64/fpu/multiarch/s_rint.c         |  21 +--
>  sysdeps/x86_64/fpu/multiarch/s_rintf-avx.S    |  28 ++++
>  sysdeps/x86_64/fpu/multiarch/s_rintf-sse4_1.S |  12 ++
>  sysdeps/x86_64/fpu/multiarch/s_rintf.c        |  21 +--
>  .../x86_64/fpu/multiarch/s_roundeven-avx.S    |  28 ++++
>  .../x86_64/fpu/multiarch/s_roundeven-sse4_1.S |  12 ++
>  sysdeps/x86_64/fpu/multiarch/s_roundeven.c    |  19 ++-
>  .../x86_64/fpu/multiarch/s_roundevenf-avx.S   |  28 ++++
>  .../fpu/multiarch/s_roundevenf-sse4_1.S       |  12 ++
>  sysdeps/x86_64/fpu/multiarch/s_roundevenf.c   |  19 ++-
>  sysdeps/x86_64/fpu/multiarch/s_sin.c          |  19 ++-
>  sysdeps/x86_64/fpu/multiarch/s_sincos.c       |  11 +-
>  sysdeps/x86_64/fpu/multiarch/s_sincosf.c      |  11 +-
>  sysdeps/x86_64/fpu/multiarch/s_sinf.c         |  11 +-
>  sysdeps/x86_64/fpu/multiarch/s_tan.c          |  11 +-
>  sysdeps/x86_64/fpu/multiarch/s_trunc-avx.S    |  28 ++++
>  sysdeps/x86_64/fpu/multiarch/s_trunc-sse4_1.S |  12 ++
>  sysdeps/x86_64/fpu/multiarch/s_trunc.c        |  21 +--
>  sysdeps/x86_64/fpu/multiarch/s_truncf-avx.S   |  28 ++++
>  .../x86_64/fpu/multiarch/s_truncf-sse4_1.S    |  12 ++
>  sysdeps/x86_64/fpu/multiarch/s_truncf.c       |  21 +--
>  sysdeps/x86_64/fpu/multiarch/w_exp.c          |   7 +-
>  sysdeps/x86_64/fpu/multiarch/w_log.c          |   7 +-
>  sysdeps/x86_64/fpu/multiarch/w_pow.c          |   7 +-
>  62 files changed, 953 insertions(+), 295 deletions(-)
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_ceil-avx.S
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_ceilf-avx.S
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_floor-avx.S
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_floorf-avx.S
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_nearbyint-avx.S
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_nearbyintf-avx.S
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_rint-avx.S
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_rintf-avx.S
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_roundeven-avx.S
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_roundevenf-avx.S
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_trunc-avx.S
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_truncf-avx.S
>
> diff --git a/sysdeps/x86/configure b/sysdeps/x86/configure
> index 1f4c2d67fd..2a5421bb31 100644
> --- a/sysdeps/x86/configure
> +++ b/sysdeps/x86/configure
> @@ -98,6 +98,7 @@ printf "%s\n" "$libc_cv_have_x86_lahf_sahf" >&6; }
>    if test $libc_cv_have_x86_lahf_sahf = yes; then
>      printf "%s\n" "#define HAVE_X86_LAHF_SAHF 1" >>confdefs.h
>
> +    ISAFLAG="-DHAVE_X86_LAHF_SAHF"
>    fi
>    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MOVBE instruction support" >&5
>  printf %s "checking for MOVBE instruction support... " >&6; }
> @@ -120,9 +121,41 @@ printf "%s\n" "$libc_cv_have_x86_movbe" >&6; }
>    if test $libc_cv_have_x86_movbe = yes; then
>      printf "%s\n" "#define HAVE_X86_MOVBE 1" >>confdefs.h
>
> +    ISAFLAG="$ISAFLAG -DHAVE_X86_MOVBE"
>    fi
> +
> +  # Check for ISA level support.
> +  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ISA level support" >&5
> +printf %s "checking for ISA level support... " >&6; }
> +if test ${libc_cv_have_x86_isa_level+y}
> +then :
> +  printf %s "(cached) " >&6
> +else $as_nop
> +  cat > conftest.c <<EOF
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL >= 4
> +libc_cv_have_x86_isa_level=4
> +#elif MINIMUM_X86_ISA_LEVEL == 3
> +libc_cv_have_x86_isa_level=3
> +#elif MINIMUM_X86_ISA_LEVEL == 2
> +libc_cv_have_x86_isa_level=2
> +#else
> +libc_cv_have_x86_isa_level=baseline
> +#endif
> +EOF
> +                eval `${CC-cc} $CFLAGS $CPPFLAGS $ISAFLAG -I$srcdir -E conftest.c | grep libc_cv_have_x86_isa_level`
> +                rm -rf conftest*
> +fi
> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_x86_isa_level" >&5
> +printf "%s\n" "$libc_cv_have_x86_isa_level" >&6; }
> +else
> +  libc_cv_have_x86_isa_level=baseline
>  fi
>  config_vars="$config_vars
> +have-x86-isa-level = $libc_cv_have_x86_isa_level"
> +config_vars="$config_vars
> +x86-isa-level-3-or-above = 3 4"
> +config_vars="$config_vars
>  enable-x86-isa-level = $libc_cv_include_x86_isa_level"
>
>  printf "%s\n" "#define SUPPORT_STATIC_PIE 1" >>confdefs.h
> diff --git a/sysdeps/x86/configure.ac b/sysdeps/x86/configure.ac
> index 437a50623b..78ff7c8f41 100644
> --- a/sysdeps/x86/configure.ac
> +++ b/sysdeps/x86/configure.ac
> @@ -72,6 +72,7 @@ if test $libc_cv_include_x86_isa_level = yes; then
>      fi])
>    if test $libc_cv_have_x86_lahf_sahf = yes; then
>      AC_DEFINE(HAVE_X86_LAHF_SAHF)
> +    ISAFLAG="-DHAVE_X86_LAHF_SAHF"
>    fi
>    AC_CACHE_CHECK([for MOVBE instruction support],
>                  libc_cv_have_x86_movbe, [dnl
> @@ -81,8 +82,31 @@ if test $libc_cv_include_x86_isa_level = yes; then
>      fi])
>    if test $libc_cv_have_x86_movbe = yes; then
>      AC_DEFINE(HAVE_X86_MOVBE)
> +    ISAFLAG="$ISAFLAG -DHAVE_X86_MOVBE"
>    fi
> +
> +  # Check for ISA level support.
> +  AC_CACHE_CHECK([for ISA level support],
> +                libc_cv_have_x86_isa_level, [dnl
> +cat > conftest.c <<EOF
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL >= 4
> +libc_cv_have_x86_isa_level=4
> +#elif MINIMUM_X86_ISA_LEVEL == 3
> +libc_cv_have_x86_isa_level=3
> +#elif MINIMUM_X86_ISA_LEVEL == 2
> +libc_cv_have_x86_isa_level=2
> +#else
> +libc_cv_have_x86_isa_level=baseline
> +#endif
> +EOF
> +                eval `${CC-cc} $CFLAGS $CPPFLAGS $ISAFLAG -I$srcdir -E conftest.c | grep libc_cv_have_x86_isa_level`
> +                rm -rf conftest*])
> +else
> +  libc_cv_have_x86_isa_level=baseline
>  fi
> +LIBC_CONFIG_VAR([have-x86-isa-level], [$libc_cv_have_x86_isa_level])
> +LIBC_CONFIG_VAR([x86-isa-level-3-or-above], [3 4])
>  LIBC_CONFIG_VAR([enable-x86-isa-level], [$libc_cv_include_x86_isa_level])
>
>  dnl Static PIE is supported.
> diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile
> index e1a490dd98..6ddd50240c 100644
> --- a/sysdeps/x86_64/fpu/multiarch/Makefile
> +++ b/sysdeps/x86_64/fpu/multiarch/Makefile
> @@ -1,49 +1,4 @@
>  ifeq ($(subdir),math)
> -libm-sysdep_routines += \
> -  s_ceil-c \
> -  s_ceilf-c \
> -  s_floor-c \
> -  s_floorf-c \
> -  s_nearbyint-c \
> -  s_nearbyintf-c \
> -  s_rint-c \
> -  s_rintf-c \
> -  s_roundeven-c \
> -  s_roundevenf-c \
> -  s_trunc-c \
> -  s_truncf-c \
> -# libm-sysdep_routines
> -
> -libm-sysdep_routines += \
> -  s_ceil-sse4_1 \
> -  s_ceilf-sse4_1 \
> -  s_floor-sse4_1 \
> -  s_floorf-sse4_1 \
> -  s_nearbyint-sse4_1 \
> -  s_nearbyintf-sse4_1 \
> -  s_rint-sse4_1 \
> -  s_rintf-sse4_1 \
> -  s_roundeven-sse4_1 \
> -  s_roundevenf-sse4_1 \
> -  s_trunc-sse4_1 \
> -  s_truncf-sse4_1 \
> -# libm-sysdep_routines
> -
> -libm-sysdep_routines += \
> -  e_asin-fma \
> -  e_atan2-fma \
> -  e_exp-fma \
> -  e_log-fma \
> -  e_log2-fma \
> -  e_pow-fma \
> -  s_atan-fma \
> -  s_expm1-fma \
> -  s_log1p-fma \
> -  s_sin-fma \
> -  s_sincos-fma \
> -  s_tan-fma \
> -# libm-sysdep_routines
> -
>  CFLAGS-e_asin-fma.c = -mfma -mavx2
>  CFLAGS-e_atan2-fma.c = -mfma -mavx2
>  CFLAGS-e_exp-fma.c = -mfma -mavx2
> @@ -57,23 +12,6 @@ CFLAGS-s_sin-fma.c = -mfma -mavx2
>  CFLAGS-s_tan-fma.c = -mfma -mavx2
>  CFLAGS-s_sincos-fma.c = -mfma -mavx2
>
> -libm-sysdep_routines += \
> -  s_cosf-sse2 \
> -  s_sincosf-sse2 \
> -  s_sinf-sse2 \
> -# libm-sysdep_routines
> -
> -libm-sysdep_routines += \
> -  e_exp2f-fma \
> -  e_expf-fma \
> -  e_log2f-fma \
> -  e_logf-fma \
> -  e_powf-fma \
> -  s_cosf-fma \
> -  s_sincosf-fma \
> -  s_sinf-fma \
> -# libm-sysdep_routines
> -
>  CFLAGS-e_exp2f-fma.c = -mfma -mavx2
>  CFLAGS-e_expf-fma.c = -mfma -mavx2
>  CFLAGS-e_log2f-fma.c = -mfma -mavx2
> @@ -83,17 +21,93 @@ CFLAGS-s_sinf-fma.c = -mfma -mavx2
>  CFLAGS-s_cosf-fma.c = -mfma -mavx2
>  CFLAGS-s_sincosf-fma.c = -mfma -mavx2
>
> +# Check if ISA level is 3 or above.
> +ifneq (,$(filter $(have-x86-isa-level),$(x86-isa-level-3-or-above)))
>  libm-sysdep_routines += \
> +  s_ceil-avx \
> +  s_ceilf-avx \
> +  s_floor-avx \
> +  s_floorf-avx \
> +  s_nearbyint-avx \
> +  s_nearbyintf-avx \
> +  s_rint-avx \
> +  s_rintf-avx \
> +  s_roundeven-avx \
> +  s_roundevenf-avx \
> +  s_trunc-avx \
> +  s_truncf-avx \
> +# libm-sysdep_routines
> +else
> +libm-sysdep_routines += \
> +  e_asin-fma \
>    e_asin-fma4 \
> +  e_atan2-avx \
> +  e_atan2-fma \
>    e_atan2-fma4 \
> +  e_exp-avx \
> +  e_exp-fma \
>    e_exp-fma4 \
> +  e_exp2f-fma \
> +  e_expf-fma \
> +  e_log-avx \
> +  e_log-fma \
>    e_log-fma4 \
> +  e_log2-fma \
> +  e_log2f-fma \
> +  e_logf-fma \
> +  e_pow-fma \
>    e_pow-fma4 \
> +  e_powf-fma \
> +  s_atan-avx \
> +  s_atan-fma \
>    s_atan-fma4 \
> +  s_ceil-sse4_1 \
> +  s_ceilf-sse4_1 \
> +  s_cosf-fma \
> +  s_cosf-sse2 \
> +  s_expm1-fma \
> +  s_floor-sse4_1 \
> +  s_floorf-sse4_1 \
> +  s_log1p-fma \
> +  s_nearbyint-sse4_1 \
> +  s_nearbyintf-sse4_1 \
> +  s_rint-sse4_1 \
> +  s_rintf-sse4_1 \
> +  s_roundeven-sse4_1 \
> +  s_roundevenf-sse4_1 \
> +  s_sin-avx \
> +  s_sin-fma \
>    s_sin-fma4 \
> +  s_sincos-avx \
> +  s_sincos-fma \
>    s_sincos-fma4 \
> +  s_sincosf-fma \
> +  s_sincosf-sse2 \
> +  s_sinf-fma \
> +  s_sinf-sse2 \
> +  s_tan-avx \
> +  s_tan-fma \
>    s_tan-fma4 \
> +  s_trunc-sse4_1 \
> +  s_truncf-sse4_1 \
>  # libm-sysdep_routines
> +ifeq ($(have-x86-isa-level),baseline)
> +libm-sysdep_routines += \
> +  s_ceil-c \
> +  s_ceilf-c \
> +  s_floor-c \
> +  s_floorf-c \
> +  s_nearbyint-c \
> +  s_nearbyintf-c \
> +  s_rint-c \
> +  s_rintf-c \
> +  s_roundeven-c \
> +  s_roundevenf-c \
> +  s_trunc-c \
> +  s_truncf-c \
> +# libm-sysdep_routines
> +endif
> +endif
>
>  CFLAGS-e_asin-fma4.c = -mfma4
>  CFLAGS-e_atan2-fma4.c = -mfma4
> @@ -105,16 +119,6 @@ CFLAGS-s_sin-fma4.c = -mfma4
>  CFLAGS-s_tan-fma4.c = -mfma4
>  CFLAGS-s_sincos-fma4.c = -mfma4
>
> -libm-sysdep_routines += \
> -  e_atan2-avx \
> -  e_exp-avx \
> -  e_log-avx \
> -  s_atan-avx \
> -  s_sin-avx \
> -  s_sincos-avx \
> -  s_tan-avx \
> -# libm-sysdep_routines
> -
>  CFLAGS-e_atan2-avx.c = -msse2avx -DSSE2AVX
>  CFLAGS-e_exp-avx.c = -msse2avx -DSSE2AVX
>  CFLAGS-e_log-avx.c = -msse2avx -DSSE2AVX
> diff --git a/sysdeps/x86_64/fpu/multiarch/e_asin.c b/sysdeps/x86_64/fpu/multiarch/e_asin.c
> index 2eaa6c2c04..d64fca2586 100644
> --- a/sysdeps/x86_64/fpu/multiarch/e_asin.c
> +++ b/sysdeps/x86_64/fpu/multiarch/e_asin.c
> @@ -16,26 +16,29 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-finite.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-finite.h>
>
>  extern double __redirect_ieee754_asin (double);
>  extern double __redirect_ieee754_acos (double);
>
> -#define SYMBOL_NAME ieee754_asin
> -#include "ifunc-fma4.h"
> +# define SYMBOL_NAME ieee754_asin
> +# include "ifunc-fma4.h"
>
>  libc_ifunc_redirected (__redirect_ieee754_asin, __ieee754_asin,
>                        IFUNC_SELECTOR ());
>  libm_alias_finite (__ieee754_asin, __asin)
>
> -#undef SYMBOL_NAME
> -#define SYMBOL_NAME ieee754_acos
> -#include "ifunc-fma4.h"
> +# undef SYMBOL_NAME
> +# define SYMBOL_NAME ieee754_acos
> +# include "ifunc-fma4.h"
>
>  libc_ifunc_redirected (__redirect_ieee754_acos, __ieee754_acos,
>                        IFUNC_SELECTOR ());
>  libm_alias_finite (__ieee754_acos, __acos)
>
> -#define __ieee754_acos __ieee754_acos_sse2
> -#define __ieee754_asin __ieee754_asin_sse2
> +# define __ieee754_acos __ieee754_acos_sse2
> +# define __ieee754_asin __ieee754_asin_sse2
> +#endif
>  #include <sysdeps/ieee754/dbl-64/e_asin.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/e_atan2.c b/sysdeps/x86_64/fpu/multiarch/e_atan2.c
> index 17ee4f3c36..8a86c14ded 100644
> --- a/sysdeps/x86_64/fpu/multiarch/e_atan2.c
> +++ b/sysdeps/x86_64/fpu/multiarch/e_atan2.c
> @@ -16,16 +16,19 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-finite.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-finite.h>
>
>  extern double __redirect_ieee754_atan2 (double, double);
>
> -#define SYMBOL_NAME ieee754_atan2
> -#include "ifunc-avx-fma4.h"
> +# define SYMBOL_NAME ieee754_atan2
> +# include "ifunc-avx-fma4.h"
>
>  libc_ifunc_redirected (__redirect_ieee754_atan2,
>                        __ieee754_atan2, IFUNC_SELECTOR ());
>  libm_alias_finite (__ieee754_atan2, __atan2)
>
> -#define __ieee754_atan2 __ieee754_atan2_sse2
> +# define __ieee754_atan2 __ieee754_atan2_sse2
> +#endif
>  #include <sysdeps/ieee754/dbl-64/e_atan2.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/e_exp.c b/sysdeps/x86_64/fpu/multiarch/e_exp.c
> index 406b7ebd44..d56329291a 100644
> --- a/sysdeps/x86_64/fpu/multiarch/e_exp.c
> +++ b/sysdeps/x86_64/fpu/multiarch/e_exp.c
> @@ -16,17 +16,20 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <math.h>
> -#include <libm-alias-finite.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <math.h>
> +# include <libm-alias-finite.h>
>
>  extern double __redirect_ieee754_exp (double);
>
> -#define SYMBOL_NAME ieee754_exp
> -#include "ifunc-avx-fma4.h"
> +# define SYMBOL_NAME ieee754_exp
> +# include "ifunc-avx-fma4.h"
>
>  libc_ifunc_redirected (__redirect_ieee754_exp, __ieee754_exp,
>                        IFUNC_SELECTOR ());
>  libm_alias_finite (__ieee754_exp, __exp)
>
> -#define __exp __ieee754_exp_sse2
> +# define __exp __ieee754_exp_sse2
> +#endif
>  #include <sysdeps/ieee754/dbl-64/e_exp.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/e_exp2f.c b/sysdeps/x86_64/fpu/multiarch/e_exp2f.c
> index 804fd6be85..06fe5028d6 100644
> --- a/sysdeps/x86_64/fpu/multiarch/e_exp2f.c
> +++ b/sysdeps/x86_64/fpu/multiarch/e_exp2f.c
> @@ -16,25 +16,28 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-float.h>
> -#include <libm-alias-finite.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +# include <libm-alias-finite.h>
>
>  extern float __redirect_exp2f (float);
>
> -#define SYMBOL_NAME exp2f
> -#include "ifunc-fma.h"
> +# define SYMBOL_NAME exp2f
> +# include "ifunc-fma.h"
>
>  libc_ifunc_redirected (__redirect_exp2f, __exp2f, IFUNC_SELECTOR ());
>
> -#ifdef SHARED
> +# ifdef SHARED
>  versioned_symbol (libm, __ieee754_exp2f, exp2f, GLIBC_2_27);
>  libm_alias_float_other (__exp2, exp2)
> -#else
> +# else
>  libm_alias_float (__exp2, exp2)
> -#endif
> +# endif
>
>  strong_alias (__exp2f, __ieee754_exp2f)
>  libm_alias_finite (__exp2f, __exp2f)
>
> -#define __exp2f __exp2f_sse2
> +# define __exp2f __exp2f_sse2
> +#endif
>  #include <sysdeps/ieee754/flt-32/e_exp2f.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/e_expf.c b/sysdeps/x86_64/fpu/multiarch/e_expf.c
> index 4a7e2a5bce..19d767f636 100644
> --- a/sysdeps/x86_64/fpu/multiarch/e_expf.c
> +++ b/sysdeps/x86_64/fpu/multiarch/e_expf.c
> @@ -16,28 +16,31 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-float.h>
> -#include <libm-alias-finite.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +# include <libm-alias-finite.h>
>
>  extern float __redirect_expf (float);
>
> -#define SYMBOL_NAME expf
> -#include "ifunc-fma.h"
> +# define SYMBOL_NAME expf
> +# include "ifunc-fma.h"
>
>  libc_ifunc_redirected (__redirect_expf, __expf, IFUNC_SELECTOR ());
>
> -#ifdef SHARED
> +# ifdef SHARED
>  __hidden_ver1 (__expf, __GI___expf, __redirect_expf)
>    __attribute__ ((visibility ("hidden")));
>
>  versioned_symbol (libm, __ieee754_expf, expf, GLIBC_2_27);
>  libm_alias_float_other (__exp, exp)
> -#else
> +# else
>  libm_alias_float (__exp, exp)
> -#endif
> +# endif
>
>  strong_alias (__expf, __ieee754_expf)
>  libm_alias_finite (__expf, __expf)
>
> -#define __expf __expf_sse2
> +# define __expf __expf_sse2
> +#endif
>  #include <sysdeps/ieee754/flt-32/e_expf.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/e_log.c b/sysdeps/x86_64/fpu/multiarch/e_log.c
> index 067fbf58c3..d80c1b1463 100644
> --- a/sysdeps/x86_64/fpu/multiarch/e_log.c
> +++ b/sysdeps/x86_64/fpu/multiarch/e_log.c
> @@ -16,17 +16,20 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <math.h>
> -#include <libm-alias-finite.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <math.h>
> +# include <libm-alias-finite.h>
>
>  extern double __redirect_ieee754_log (double);
>
> -#define SYMBOL_NAME ieee754_log
> -#include "ifunc-avx-fma4.h"
> +# define SYMBOL_NAME ieee754_log
> +# include "ifunc-avx-fma4.h"
>
>  libc_ifunc_redirected (__redirect_ieee754_log, __ieee754_log,
>                        IFUNC_SELECTOR ());
>  libm_alias_finite (__ieee754_log, __log)
>
> -#define __log __ieee754_log_sse2
> +# define __log __ieee754_log_sse2
> +#endif
>  #include <sysdeps/ieee754/dbl-64/e_log.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/e_log2.c b/sysdeps/x86_64/fpu/multiarch/e_log2.c
> index 9c57a2f6cc..9686782c09 100644
> --- a/sysdeps/x86_64/fpu/multiarch/e_log2.c
> +++ b/sysdeps/x86_64/fpu/multiarch/e_log2.c
> @@ -16,28 +16,31 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-double.h>
> -#include <libm-alias-finite.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
> +# include <libm-alias-finite.h>
>
>  extern double __redirect_log2 (double);
>
> -#define SYMBOL_NAME log2
> -#include "ifunc-fma.h"
> +# define SYMBOL_NAME log2
> +# include "ifunc-fma.h"
>
>  libc_ifunc_redirected (__redirect_log2, __log2, IFUNC_SELECTOR ());
>
> -#ifdef SHARED
> +# ifdef SHARED
>  __hidden_ver1 (__log2, __GI___log2, __redirect_log2)
>    __attribute__ ((visibility ("hidden")));
>
>  versioned_symbol (libm, __ieee754_log2, log2, GLIBC_2_29);
>  libm_alias_double_other (__log2, log2)
> -#else
> +# else
>  libm_alias_double (__log2, log2)
> -#endif
> +# endif
>
>  strong_alias (__log2, __ieee754_log2)
>  libm_alias_finite (__log2, __log2)
>
> -#define __log2 __log2_sse2
> +# define __log2 __log2_sse2
> +#endif
>  #include <sysdeps/ieee754/dbl-64/e_log2.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/e_log2f.c b/sysdeps/x86_64/fpu/multiarch/e_log2f.c
> index 2b45c87f38..8ada46e11e 100644
> --- a/sysdeps/x86_64/fpu/multiarch/e_log2f.c
> +++ b/sysdeps/x86_64/fpu/multiarch/e_log2f.c
> @@ -16,28 +16,31 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-float.h>
> -#include <libm-alias-finite.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +# include <libm-alias-finite.h>
>
>  extern float __redirect_log2f (float);
>
> -#define SYMBOL_NAME log2f
> -#include "ifunc-fma.h"
> +# define SYMBOL_NAME log2f
> +# include "ifunc-fma.h"
>
>  libc_ifunc_redirected (__redirect_log2f, __log2f, IFUNC_SELECTOR ());
>
> -#ifdef SHARED
> +# ifdef SHARED
>  __hidden_ver1 (__log2f, __GI___log2f, __redirect_log2f)
>    __attribute__ ((visibility ("hidden")));
>
>  versioned_symbol (libm, __ieee754_log2f, log2f, GLIBC_2_27);
>  libm_alias_float_other (__log2, log2)
> -#else
> +# else
>  libm_alias_float (__log2, log2)
> -#endif
> +# endif
>
>  strong_alias (__log2f, __ieee754_log2f)
>  libm_alias_finite (__log2f, __log2f)
>
> -#define __log2f __log2f_sse2
> +# define __log2f __log2f_sse2
> +#endif
>  #include <sysdeps/ieee754/flt-32/e_log2f.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/e_logf.c b/sysdeps/x86_64/fpu/multiarch/e_logf.c
> index 97e23c8fea..a3978d9a8e 100644
> --- a/sysdeps/x86_64/fpu/multiarch/e_logf.c
> +++ b/sysdeps/x86_64/fpu/multiarch/e_logf.c
> @@ -16,28 +16,31 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-float.h>
> -#include <libm-alias-finite.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +# include <libm-alias-finite.h>
>
>  extern float __redirect_logf (float);
>
> -#define SYMBOL_NAME logf
> -#include "ifunc-fma.h"
> +# define SYMBOL_NAME logf
> +# include "ifunc-fma.h"
>
>  libc_ifunc_redirected (__redirect_logf, __logf, IFUNC_SELECTOR ());
>
> -#ifdef SHARED
> +# ifdef SHARED
>  __hidden_ver1 (__logf, __GI___logf, __redirect_logf)
>    __attribute__ ((visibility ("hidden")));
>
>  versioned_symbol (libm, __ieee754_logf, logf, GLIBC_2_27);
>  libm_alias_float_other (__log, log)
> -#else
> +# else
>  libm_alias_float (__log, log)
> -#endif
> +# endif
>
>  strong_alias (__logf, __ieee754_logf)
>  libm_alias_finite (__logf, __logf)
>
> -#define __logf __logf_sse2
> +# define __logf __logf_sse2
> +#endif
>  #include <sysdeps/ieee754/flt-32/e_logf.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/e_pow.c b/sysdeps/x86_64/fpu/multiarch/e_pow.c
> index 42618e7112..f8f17aff9f 100644
> --- a/sysdeps/x86_64/fpu/multiarch/e_pow.c
> +++ b/sysdeps/x86_64/fpu/multiarch/e_pow.c
> @@ -16,17 +16,20 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <math.h>
> -#include <libm-alias-finite.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <math.h>
> +# include <libm-alias-finite.h>
>
>  extern double __redirect_ieee754_pow (double, double);
>
> -#define SYMBOL_NAME ieee754_pow
> -#include "ifunc-fma4.h"
> +# define SYMBOL_NAME ieee754_pow
> +# include "ifunc-fma4.h"
>
>  libc_ifunc_redirected (__redirect_ieee754_pow,
>                        __ieee754_pow, IFUNC_SELECTOR ());
>  libm_alias_finite (__ieee754_pow, __pow)
>
> -#define __pow __ieee754_pow_sse2
> +# define __pow __ieee754_pow_sse2
> +#endif
>  #include <sysdeps/ieee754/dbl-64/e_pow.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/e_powf.c b/sysdeps/x86_64/fpu/multiarch/e_powf.c
> index 8e6ce13cc1..8b1a4c7d04 100644
> --- a/sysdeps/x86_64/fpu/multiarch/e_powf.c
> +++ b/sysdeps/x86_64/fpu/multiarch/e_powf.c
> @@ -16,31 +16,34 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-float.h>
> -#include <libm-alias-finite.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +# include <libm-alias-finite.h>
>
> -#define powf __redirect_powf
> -#define __DECL_SIMD___redirect_powf
> -#include <math.h>
> -#undef powf
> +# define powf __redirect_powf
> +# define __DECL_SIMD___redirect_powf
> +# include <math.h>
> +# undef powf
>
> -#define SYMBOL_NAME powf
> -#include "ifunc-fma.h"
> +# define SYMBOL_NAME powf
> +# include "ifunc-fma.h"
>
>  libc_ifunc_redirected (__redirect_powf, __powf, IFUNC_SELECTOR ());
>
> -#ifdef SHARED
> +# ifdef SHARED
>  __hidden_ver1 (__powf, __GI___powf, __redirect_powf)
>    __attribute__ ((visibility ("hidden")));
>
>  versioned_symbol (libm, __ieee754_powf, powf, GLIBC_2_27);
>  libm_alias_float_other (__pow, pow)
> -#else
> +# else
>  libm_alias_float (__pow, pow)
> -#endif
> +# endif
>
>  strong_alias (__powf, __ieee754_powf)
>  libm_alias_finite (__powf, __powf)
>
> -#define __powf __powf_sse2
> +# define __powf __powf_sse2
> +#endif
>  #include <sysdeps/ieee754/flt-32/e_powf.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_atan.c b/sysdeps/x86_64/fpu/multiarch/s_atan.c
> index 71bad096a9..4d2c6ce006 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_atan.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_atan.c
> @@ -16,15 +16,18 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-double.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
>
>  extern double __redirect_atan (double);
>
> -#define SYMBOL_NAME atan
> -#include "ifunc-avx-fma4.h"
> +# define SYMBOL_NAME atan
> +# include "ifunc-avx-fma4.h"
>
>  libc_ifunc_redirected (__redirect_atan, __atan, IFUNC_SELECTOR ());
>  libm_alias_double (__atan, atan)
>
> -#define __atan __atan_sse2
> +# define __atan __atan_sse2
> +#endif
>  #include <sysdeps/ieee754/dbl-64/s_atan.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceil-avx.S b/sysdeps/x86_64/fpu/multiarch/s_ceil-avx.S
> new file mode 100644
> index 0000000000..e6c1106753
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_ceil-avx.S
> @@ -0,0 +1,28 @@
> +/* AVX implementation of ceil function.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <libm-alias-double.h>
> +
> +       .text
> +ENTRY(__ceil)
> +       vroundsd $10, %xmm0, %xmm0, %xmm0
> +       ret
> +END(__ceil)
> +
> +libm_alias_double (__ceil, ceil)
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceil-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_ceil-sse4_1.S
> index 64119011ad..dba756c38f 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_ceil-sse4_1.S
> +++ b/sysdeps/x86_64/fpu/multiarch/s_ceil-sse4_1.S
> @@ -17,8 +17,20 @@
>
>  #include <sysdep.h>
>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
> +# define __ceil_sse41 __ceil
> +       .text
> +#else
>         .section .text.sse4.1,"ax",@progbits
> +#endif
> +
>  ENTRY(__ceil_sse41)
>         roundsd $10, %xmm0, %xmm0
>         ret
>  END(__ceil_sse41)
> +
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +libm_alias_double (__ceil, ceil)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceil.c b/sysdeps/x86_64/fpu/multiarch/s_ceil.c
> index cc028addee..46c8e91e19 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_ceil.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_ceil.c
> @@ -16,17 +16,20 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#define NO_MATH_REDIRECT
> -#include <libm-alias-double.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
> +# define NO_MATH_REDIRECT
> +# include <libm-alias-double.h>
>
> -#define ceil __redirect_ceil
> -#define __ceil __redirect___ceil
> -#include <math.h>
> -#undef ceil
> -#undef __ceil
> +# define ceil __redirect_ceil
> +# define __ceil __redirect___ceil
> +# include <math.h>
> +# undef ceil
> +# undef __ceil
>
> -#define SYMBOL_NAME ceil
> -#include "ifunc-sse4_1.h"
> +# define SYMBOL_NAME ceil
> +# include "ifunc-sse4_1.h"
>
>  libc_ifunc_redirected (__redirect_ceil, __ceil, IFUNC_SELECTOR ());
>  libm_alias_double (__ceil, ceil)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceilf-avx.S b/sysdeps/x86_64/fpu/multiarch/s_ceilf-avx.S
> new file mode 100644
> index 0000000000..b4d8ac0455
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_ceilf-avx.S
> @@ -0,0 +1,28 @@
> +/* AVX implementation of ceilf function.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <libm-alias-float.h>
> +
> +       .text
> +ENTRY(__ceilf)
> +       vroundss $10, %xmm0, %xmm0, %xmm0
> +       ret
> +END(__ceilf)
> +
> +libm_alias_float (__ceil, ceil)
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceilf-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_ceilf-sse4_1.S
> index dd9a9f6b71..9abc87b91a 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_ceilf-sse4_1.S
> +++ b/sysdeps/x86_64/fpu/multiarch/s_ceilf-sse4_1.S
> @@ -17,8 +17,20 @@
>
>  #include <sysdep.h>
>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +# define __ceilf_sse41 __ceilf
> +       .text
> +#else
>         .section .text.sse4.1,"ax",@progbits
> +#endif
> +
>  ENTRY(__ceilf_sse41)
>         roundss $10, %xmm0, %xmm0
>         ret
>  END(__ceilf_sse41)
> +
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +libm_alias_float (__ceil, ceil)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceilf.c b/sysdeps/x86_64/fpu/multiarch/s_ceilf.c
> index 97a0ca7d19..bb53108f73 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_ceilf.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_ceilf.c
> @@ -16,17 +16,20 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#define NO_MATH_REDIRECT
> -#include <libm-alias-float.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
> +# define NO_MATH_REDIRECT
> +# include <libm-alias-float.h>
>
> -#define ceilf __redirect_ceilf
> -#define __ceilf __redirect___ceilf
> -#include <math.h>
> -#undef ceilf
> -#undef __ceilf
> +# define ceilf __redirect_ceilf
> +# define __ceilf __redirect___ceilf
> +# include <math.h>
> +# undef ceilf
> +# undef __ceilf
>
> -#define SYMBOL_NAME ceilf
> -#include "ifunc-sse4_1.h"
> +# define SYMBOL_NAME ceilf
> +# include "ifunc-sse4_1.h"
>
>  libc_ifunc_redirected (__redirect_ceilf, __ceilf, IFUNC_SELECTOR ());
>  libm_alias_float (__ceil, ceil)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_cosf.c b/sysdeps/x86_64/fpu/multiarch/s_cosf.c
> index 2703c576df..8a02e04538 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_cosf.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_cosf.c
> @@ -16,13 +16,18 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-float.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
>
>  extern float __redirect_cosf (float);
>
> -#define SYMBOL_NAME cosf
> -#include "ifunc-fma.h"
> +# define SYMBOL_NAME cosf
> +# include "ifunc-fma.h"
>
>  libc_ifunc_redirected (__redirect_cosf, __cosf, IFUNC_SELECTOR ());
>
>  libm_alias_float (__cos, cos)
> +#else
> +# include <sysdeps/ieee754/flt-32/s_cosf.c>
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_expm1.c b/sysdeps/x86_64/fpu/multiarch/s_expm1.c
> index 8a2d69f9b2..d58ef3d8f5 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_expm1.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_expm1.c
> @@ -16,21 +16,24 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-double.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
>
>  extern double __redirect_expm1 (double);
>
> -#define SYMBOL_NAME expm1
> -#include "ifunc-fma.h"
> +# define SYMBOL_NAME expm1
> +# include "ifunc-fma.h"
>
>  libc_ifunc_redirected (__redirect_expm1, __expm1, IFUNC_SELECTOR ());
>  libm_alias_double (__expm1, expm1)
>
> -#define __expm1 __expm1_sse2
> +# define __expm1 __expm1_sse2
>
>  /* NB: __expm1 may be expanded to __expm1_sse2 in the following
>     prototypes.  */
>  extern long double __expm1l (long double);
>  extern long double __expm1f128 (long double);
>
> +#endif
>  #include <sysdeps/ieee754/dbl-64/s_expm1.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_floor-avx.S b/sysdeps/x86_64/fpu/multiarch/s_floor-avx.S
> new file mode 100644
> index 0000000000..ff74b5a8bf
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_floor-avx.S
> @@ -0,0 +1,28 @@
> +/* AVX implementation of floor function.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <libm-alias-double.h>
> +
> +       .text
> +ENTRY(__floor)
> +       vroundsd $9, %xmm0, %xmm0, %xmm0
> +       ret
> +END(__floor)
> +
> +libm_alias_double (__floor, floor)
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_floor-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_floor-sse4_1.S
> index 2f7521f39f..c9b9b0639b 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_floor-sse4_1.S
> +++ b/sysdeps/x86_64/fpu/multiarch/s_floor-sse4_1.S
> @@ -17,8 +17,20 @@
>
>  #include <sysdep.h>
>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
> +# define __floor_sse41 __floor
> +       .text
> +#else
>         .section .text.sse4.1,"ax",@progbits
> +#endif
> +
>  ENTRY(__floor_sse41)
>         roundsd $9, %xmm0, %xmm0
>         ret
>  END(__floor_sse41)
> +
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +libm_alias_double (__floor, floor)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_floor.c b/sysdeps/x86_64/fpu/multiarch/s_floor.c
> index 8cebd48e10..2c87dd0056 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_floor.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_floor.c
> @@ -16,17 +16,20 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#define NO_MATH_REDIRECT
> -#include <libm-alias-double.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
> +# define NO_MATH_REDIRECT
> +# include <libm-alias-double.h>
>
> -#define floor __redirect_floor
> -#define __floor __redirect___floor
> -#include <math.h>
> -#undef floor
> -#undef __floor
> +# define floor __redirect_floor
> +# define __floor __redirect___floor
> +# include <math.h>
> +# undef floor
> +# undef __floor
>
> -#define SYMBOL_NAME floor
> -#include "ifunc-sse4_1.h"
> +# define SYMBOL_NAME floor
> +# include "ifunc-sse4_1.h"
>
>  libc_ifunc_redirected (__redirect_floor, __floor, IFUNC_SELECTOR ());
>  libm_alias_double (__floor, floor)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_floorf-avx.S b/sysdeps/x86_64/fpu/multiarch/s_floorf-avx.S
> new file mode 100644
> index 0000000000..c378baae8e
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_floorf-avx.S
> @@ -0,0 +1,28 @@
> +/* AVX implementation of floorf function.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <libm-alias-float.h>
> +
> +       .text
> +ENTRY(__floorf)
> +       vroundss $9, %xmm0, %xmm0, %xmm0
> +       ret
> +END(__floorf)
> +
> +libm_alias_float (__floor, floor)
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_floorf-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_floorf-sse4_1.S
> index 5f6020d27d..c2216899db 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_floorf-sse4_1.S
> +++ b/sysdeps/x86_64/fpu/multiarch/s_floorf-sse4_1.S
> @@ -17,8 +17,20 @@
>
>  #include <sysdep.h>
>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +# define __floorf_sse41 __floorf
> +       .text
> +#else
>         .section .text.sse4.1,"ax",@progbits
> +#endif
> +
>  ENTRY(__floorf_sse41)
>         roundss $9, %xmm0, %xmm0
>         ret
>  END(__floorf_sse41)
> +
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +libm_alias_float (__floor, floor)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_floorf.c b/sysdeps/x86_64/fpu/multiarch/s_floorf.c
> index a14e18b03c..a277802b6d 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_floorf.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_floorf.c
> @@ -16,17 +16,20 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#define NO_MATH_REDIRECT
> -#include <libm-alias-float.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
> +# define NO_MATH_REDIRECT
> +# include <libm-alias-float.h>
>
> -#define floorf __redirect_floorf
> -#define __floorf __redirect___floorf
> -#include <math.h>
> -#undef floorf
> -#undef __floorf
> +# define floorf __redirect_floorf
> +# define __floorf __redirect___floorf
> +# include <math.h>
> +# undef floorf
> +# undef __floorf
>
> -#define SYMBOL_NAME floorf
> -#include "ifunc-sse4_1.h"
> +# define SYMBOL_NAME floorf
> +# include "ifunc-sse4_1.h"
>
>  libc_ifunc_redirected (__redirect_floorf, __floorf, IFUNC_SELECTOR ());
>  libm_alias_float (__floor, floor)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_log1p.c b/sysdeps/x86_64/fpu/multiarch/s_log1p.c
> index a8e1a3f21b..3fa1185d81 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_log1p.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_log1p.c
> @@ -16,14 +16,17 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-double.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
>
>  extern double __redirect_log1p (double);
>
> -#define SYMBOL_NAME log1p
> -#include "ifunc-fma.h"
> +# define SYMBOL_NAME log1p
> +# include "ifunc-fma.h"
>
>  libc_ifunc_redirected (__redirect_log1p, __log1p, IFUNC_SELECTOR ());
>
> -#define __log1p __log1p_sse2
> +# define __log1p __log1p_sse2
> +#endif
>  #include <sysdeps/ieee754/dbl-64/s_log1p.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_nearbyint-avx.S b/sysdeps/x86_64/fpu/multiarch/s_nearbyint-avx.S
> new file mode 100644
> index 0000000000..5bfdf73c28
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_nearbyint-avx.S
> @@ -0,0 +1,28 @@
> +/* AVX implementation of nearbyint function.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <libm-alias-double.h>
> +
> +       .text
> +ENTRY(__nearbyint)
> +       vroundsd $0xc, %xmm0, %xmm0, %xmm0
> +       ret
> +END(__nearbyint)
> +
> +libm_alias_double (__nearbyint, nearbyint)
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_nearbyint-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_nearbyint-sse4_1.S
> index 674f7eb40a..9d84410a1f 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_nearbyint-sse4_1.S
> +++ b/sysdeps/x86_64/fpu/multiarch/s_nearbyint-sse4_1.S
> @@ -17,8 +17,20 @@
>
>  #include <sysdep.h>
>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
> +# define __nearbyint_sse41 __nearbyint
> +       .text
> +#else
>         .section .text.sse4.1,"ax",@progbits
> +#endif
> +
>  ENTRY(__nearbyint_sse41)
>         roundsd $0xc, %xmm0, %xmm0
>         ret
>  END(__nearbyint_sse41)
> +
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +libm_alias_double (__nearbyint, nearbyint)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_nearbyint.c b/sysdeps/x86_64/fpu/multiarch/s_nearbyint.c
> index 693e42dd4e..057a7ca60f 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_nearbyint.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_nearbyint.c
> @@ -16,17 +16,20 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-double.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
>
> -#define nearbyint __redirect_nearbyint
> -#define __nearbyint __redirect___nearbyint
> -#include <math.h>
> -#undef nearbyint
> -#undef __nearbyint
> +# define nearbyint __redirect_nearbyint
> +# define __nearbyint __redirect___nearbyint
> +# include <math.h>
> +# undef nearbyint
> +# undef __nearbyint
>
> -#define SYMBOL_NAME nearbyint
> -#include "ifunc-sse4_1.h"
> +# define SYMBOL_NAME nearbyint
> +# include "ifunc-sse4_1.h"
>
>  libc_ifunc_redirected (__redirect_nearbyint, __nearbyint,
>                        IFUNC_SELECTOR ());
>  libm_alias_double (__nearbyint, nearbyint)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-avx.S b/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-avx.S
> new file mode 100644
> index 0000000000..1dbaed0324
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-avx.S
> @@ -0,0 +1,28 @@
> +/* AVX implmentation of nearbyintf function.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <libm-alias-float.h>
> +
> +       .text
> +ENTRY(__nearbyintf)
> +       vroundss $0xc, %xmm0, %xmm0, %xmm0
> +       ret
> +END(__nearbyintf)
> +
> +libm_alias_float (__nearbyint, nearbyint)
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-sse4_1.S
> index 5892bd7563..3cf35f92d6 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-sse4_1.S
> +++ b/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-sse4_1.S
> @@ -17,8 +17,20 @@
>
>  #include <sysdep.h>
>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +# define __nearbyintf_sse41 __nearbyintf
> +       .text
> +#else
>         .section .text.sse4.1,"ax",@progbits
> +#endif
> +
>  ENTRY(__nearbyintf_sse41)
>         roundss $0xc, %xmm0, %xmm0
>         ret
>  END(__nearbyintf_sse41)
> +
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +libm_alias_float (__nearbyint, nearbyint)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_nearbyintf.c b/sysdeps/x86_64/fpu/multiarch/s_nearbyintf.c
> index a0ac009f4b..41f374ba72 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_nearbyintf.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_nearbyintf.c
> @@ -16,17 +16,20 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-float.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
>
> -#define nearbyintf __redirect_nearbyintf
> -#define __nearbyintf __redirect___nearbyintf
> -#include <math.h>
> -#undef nearbyintf
> -#undef __nearbyintf
> +# define nearbyintf __redirect_nearbyintf
> +# define __nearbyintf __redirect___nearbyintf
> +# include <math.h>
> +# undef nearbyintf
> +# undef __nearbyintf
>
> -#define SYMBOL_NAME nearbyintf
> -#include "ifunc-sse4_1.h"
> +# define SYMBOL_NAME nearbyintf
> +# include "ifunc-sse4_1.h"
>
>  libc_ifunc_redirected (__redirect_nearbyintf, __nearbyintf,
>                        IFUNC_SELECTOR ());
>  libm_alias_float (__nearbyint, nearbyint)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_rint-avx.S b/sysdeps/x86_64/fpu/multiarch/s_rint-avx.S
> new file mode 100644
> index 0000000000..2b403b331f
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_rint-avx.S
> @@ -0,0 +1,28 @@
> +/* AVX implementation of rint function.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <libm-alias-double.h>
> +
> +       .text
> +ENTRY(__rint)
> +       vroundsd $4, %xmm0, %xmm0, %xmm0
> +       ret
> +END(__rint)
> +
> +libm_alias_double (__rint, rint)
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_rint-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_rint-sse4_1.S
> index 405372991b..8cd9cf759f 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_rint-sse4_1.S
> +++ b/sysdeps/x86_64/fpu/multiarch/s_rint-sse4_1.S
> @@ -17,8 +17,20 @@
>
>  #include <sysdep.h>
>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
> +# define __rint_sse41 __rint
> +       .text
> +#else
>         .section .text.sse4.1,"ax",@progbits
> +#endif
> +
>  ENTRY(__rint_sse41)
>         roundsd $4, %xmm0, %xmm0
>         ret
>  END(__rint_sse41)
> +
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +libm_alias_double (__rint, rint)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_rint.c b/sysdeps/x86_64/fpu/multiarch/s_rint.c
> index 754c87e004..18623b7d99 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_rint.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_rint.c
> @@ -16,17 +16,20 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#define NO_MATH_REDIRECT
> -#include <libm-alias-double.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
> +# define NO_MATH_REDIRECT
> +# include <libm-alias-double.h>
>
> -#define rint __redirect_rint
> -#define __rint __redirect___rint
> -#include <math.h>
> -#undef rint
> -#undef __rint
> +# define rint __redirect_rint
> +# define __rint __redirect___rint
> +# include <math.h>
> +# undef rint
> +# undef __rint
>
> -#define SYMBOL_NAME rint
> -#include "ifunc-sse4_1.h"
> +# define SYMBOL_NAME rint
> +# include "ifunc-sse4_1.h"
>
>  libc_ifunc_redirected (__redirect_rint, __rint, IFUNC_SELECTOR ());
>  libm_alias_double (__rint, rint)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_rintf-avx.S b/sysdeps/x86_64/fpu/multiarch/s_rintf-avx.S
> new file mode 100644
> index 0000000000..171c2867f4
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_rintf-avx.S
> @@ -0,0 +1,28 @@
> +/* AVX implementation of rintf function.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <libm-alias-float.h>
> +
> +       .text
> +ENTRY(__rintf)
> +       vroundss $4, %xmm0, %xmm0, %xmm0
> +       ret
> +END(__rintf)
> +
> +libm_alias_float (__rint, rint)
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_rintf-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_rintf-sse4_1.S
> index 8ac67ce767..fc1e70f0c9 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_rintf-sse4_1.S
> +++ b/sysdeps/x86_64/fpu/multiarch/s_rintf-sse4_1.S
> @@ -17,8 +17,20 @@
>
>  #include <sysdep.h>
>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +# define __rintf_sse41 __rintf
> +       .text
> +#else
>         .section .text.sse4.1,"ax",@progbits
> +#endif
> +
>  ENTRY(__rintf_sse41)
>         roundss $4, %xmm0, %xmm0
>         ret
>  END(__rintf_sse41)
> +
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +libm_alias_float (__rint, rint)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_rintf.c b/sysdeps/x86_64/fpu/multiarch/s_rintf.c
> index e9d6b7a5f2..e275368dec 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_rintf.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_rintf.c
> @@ -16,17 +16,20 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#define NO_MATH_REDIRECT
> -#include <libm-alias-float.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
> +# define NO_MATH_REDIRECT
> +# include <libm-alias-float.h>
>
> -#define rintf __redirect_rintf
> -#define __rintf __redirect___rintf
> -#include <math.h>
> -#undef rintf
> -#undef __rintf
> +# define rintf __redirect_rintf
> +# define __rintf __redirect___rintf
> +# include <math.h>
> +# undef rintf
> +# undef __rintf
>
> -#define SYMBOL_NAME rintf
> -#include "ifunc-sse4_1.h"
> +# define SYMBOL_NAME rintf
> +# include "ifunc-sse4_1.h"
>
>  libc_ifunc_redirected (__redirect_rintf, __rintf, IFUNC_SELECTOR ());
>  libm_alias_float (__rint, rint)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundeven-avx.S b/sysdeps/x86_64/fpu/multiarch/s_roundeven-avx.S
> new file mode 100644
> index 0000000000..576790355c
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_roundeven-avx.S
> @@ -0,0 +1,28 @@
> +/* AVX implementation of roundeven function.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <libm-alias-double.h>
> +
> +       .text
> +ENTRY(__roundeven)
> +       vroundsd $8, %xmm0, %xmm0, %xmm0
> +       ret
> +END(__roundeven)
> +
> +libm_alias_double (__roundeven, roundeven)
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundeven-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_roundeven-sse4_1.S
> index 5ef102336b..f00be56c59 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_roundeven-sse4_1.S
> +++ b/sysdeps/x86_64/fpu/multiarch/s_roundeven-sse4_1.S
> @@ -17,8 +17,20 @@
>
>  #include <sysdep.h>
>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
> +# define __roundeven_sse41 __roundeven
> +       .text
> +#else
>         .section .text.sse4.1,"ax",@progbits
> +#endif
> +
>  ENTRY(__roundeven_sse41)
>         roundsd $8, %xmm0, %xmm0
>         ret
>  END(__roundeven_sse41)
> +
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +libm_alias_double (__roundeven, roundeven)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundeven.c b/sysdeps/x86_64/fpu/multiarch/s_roundeven.c
> index 8737b32e26..139aad088f 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_roundeven.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_roundeven.c
> @@ -16,16 +16,19 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-double.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
>
> -#define roundeven __redirect_roundeven
> -#define __roundeven __redirect___roundeven
> -#include <math.h>
> -#undef roundeven
> -#undef __roundeven
> +# define roundeven __redirect_roundeven
> +# define __roundeven __redirect___roundeven
> +# include <math.h>
> +# undef roundeven
> +# undef __roundeven
>
> -#define SYMBOL_NAME roundeven
> -#include "ifunc-sse4_1.h"
> +# define SYMBOL_NAME roundeven
> +# include "ifunc-sse4_1.h"
>
>  libc_ifunc_redirected (__redirect_roundeven, __roundeven, IFUNC_SELECTOR ());
>  libm_alias_double (__roundeven, roundeven)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundevenf-avx.S b/sysdeps/x86_64/fpu/multiarch/s_roundevenf-avx.S
> new file mode 100644
> index 0000000000..42c359f4cd
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_roundevenf-avx.S
> @@ -0,0 +1,28 @@
> +/* AVX implementation of roundevenf function.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <libm-alias-float.h>
> +
> +       .text
> +ENTRY(__roundevenf)
> +       vroundss $8, %xmm0, %xmm0, %xmm0
> +       ret
> +END(__roundevenf)
> +
> +libm_alias_float (__roundeven, roundeven)
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundevenf-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_roundevenf-sse4_1.S
> index 792c90ba07..6b148e4353 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_roundevenf-sse4_1.S
> +++ b/sysdeps/x86_64/fpu/multiarch/s_roundevenf-sse4_1.S
> @@ -17,8 +17,20 @@
>
>  #include <sysdep.h>
>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +# define __roundevenf_sse41 __roundevenf
> +       .text
> +#else
>         .section .text.sse4.1,"ax",@progbits
> +#endif
> +
>  ENTRY(__roundevenf_sse41)
>         roundss $8, %xmm0, %xmm0
>         ret
>  END(__roundevenf_sse41)
> +
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +libm_alias_float (__roundeven, roundeven)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundevenf.c b/sysdeps/x86_64/fpu/multiarch/s_roundevenf.c
> index e96016a4d5..2fb090075d 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_roundevenf.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_roundevenf.c
> @@ -16,16 +16,19 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-float.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
>
> -#define roundevenf __redirect_roundevenf
> -#define __roundevenf __redirect___roundevenf
> -#include <math.h>
> -#undef roundevenf
> -#undef __roundevenf
> +# define roundevenf __redirect_roundevenf
> +# define __roundevenf __redirect___roundevenf
> +# include <math.h>
> +# undef roundevenf
> +# undef __roundevenf
>
> -#define SYMBOL_NAME roundevenf
> -#include "ifunc-sse4_1.h"
> +# define SYMBOL_NAME roundevenf
> +# include "ifunc-sse4_1.h"
>
>  libc_ifunc_redirected (__redirect_roundevenf, __roundevenf, IFUNC_SELECTOR ());
>  libm_alias_float (__roundeven, roundeven)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_sin.c b/sysdeps/x86_64/fpu/multiarch/s_sin.c
> index 355cc0092e..21e77943a3 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_sin.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_sin.c
> @@ -16,24 +16,27 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-double.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
>
>  extern double __redirect_sin (double);
>  extern double __redirect_cos (double);
>
> -#define SYMBOL_NAME sin
> -#include "ifunc-avx-fma4.h"
> +# define SYMBOL_NAME sin
> +# include "ifunc-avx-fma4.h"
>
>  libc_ifunc_redirected (__redirect_sin, __sin, IFUNC_SELECTOR ());
>  libm_alias_double (__sin, sin)
>
> -#undef SYMBOL_NAME
> -#define SYMBOL_NAME cos
> -#include "ifunc-avx-fma4.h"
> +# undef SYMBOL_NAME
> +# define SYMBOL_NAME cos
> +# include "ifunc-avx-fma4.h"
>
>  libc_ifunc_redirected (__redirect_cos, __cos, IFUNC_SELECTOR ());
>  libm_alias_double (__cos, cos)
>
> -#define __cos __cos_sse2
> -#define __sin __sin_sse2
> +# define __cos __cos_sse2
> +# define __sin __sin_sse2
> +#endif
>  #include <sysdeps/ieee754/dbl-64/s_sin.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_sincos.c b/sysdeps/x86_64/fpu/multiarch/s_sincos.c
> index 70107e999c..b35757f8de 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_sincos.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_sincos.c
> @@ -16,15 +16,18 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-double.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
>
>  extern void __redirect_sincos (double, double *, double *);
>
> -#define SYMBOL_NAME sincos
> -#include "ifunc-fma4.h"
> +# define SYMBOL_NAME sincos
> +# include "ifunc-fma4.h"
>
>  libc_ifunc_redirected (__redirect_sincos, __sincos, IFUNC_SELECTOR ());
>  libm_alias_double (__sincos, sincos)
>
> -#define __sincos __sincos_sse2
> +# define __sincos __sincos_sse2
> +#endif
>  #include <sysdeps/ieee754/dbl-64/s_sincos.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_sincosf.c b/sysdeps/x86_64/fpu/multiarch/s_sincosf.c
> index 80bc028451..0ea9b40e84 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_sincosf.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_sincosf.c
> @@ -16,13 +16,18 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-float.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
>
>  extern void __redirect_sincosf (float, float *, float *);
>
> -#define SYMBOL_NAME sincosf
> -#include "ifunc-fma.h"
> +# define SYMBOL_NAME sincosf
> +# include "ifunc-fma.h"
>
>  libc_ifunc_redirected (__redirect_sincosf, __sincosf, IFUNC_SELECTOR ());
>
>  libm_alias_float (__sincos, sincos)
> +#else
> +# include <sysdeps/ieee754/flt-32/s_sincosf.c>
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_sinf.c b/sysdeps/x86_64/fpu/multiarch/s_sinf.c
> index a32b9e9550..c61624e3ee 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_sinf.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_sinf.c
> @@ -16,13 +16,18 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-float.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
>
>  extern float __redirect_sinf (float);
>
> -#define SYMBOL_NAME sinf
> -#include "ifunc-fma.h"
> +# define SYMBOL_NAME sinf
> +# include "ifunc-fma.h"
>
>  libc_ifunc_redirected (__redirect_sinf, __sinf, IFUNC_SELECTOR ());
>
>  libm_alias_float (__sin, sin)
> +#else
> +# include <sysdeps/ieee754/flt-32/s_sinf.c>
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_tan.c b/sysdeps/x86_64/fpu/multiarch/s_tan.c
> index f9a2474a13..125d992ba1 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_tan.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_tan.c
> @@ -16,15 +16,18 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#include <libm-alias-double.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
>
>  extern double __redirect_tan (double);
>
> -#define SYMBOL_NAME tan
> -#include "ifunc-avx-fma4.h"
> +# define SYMBOL_NAME tan
> +# include "ifunc-avx-fma4.h"
>
>  libc_ifunc_redirected (__redirect_tan, __tan, IFUNC_SELECTOR ());
>  libm_alias_double (__tan, tan)
>
> -#define __tan __tan_sse2
> +# define __tan __tan_sse2
> +#endif
>  #include <sysdeps/ieee754/dbl-64/s_tan.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_trunc-avx.S b/sysdeps/x86_64/fpu/multiarch/s_trunc-avx.S
> new file mode 100644
> index 0000000000..b3e87e9606
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_trunc-avx.S
> @@ -0,0 +1,28 @@
> +/* AVX implementation of trunc function.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <libm-alias-double.h>
> +
> +       .text
> +ENTRY(__trunc)
> +       vroundsd $11, %xmm0, %xmm0, %xmm0
> +       ret
> +END(__trunc)
> +
> +libm_alias_double (__trunc, trunc)
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_trunc-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_trunc-sse4_1.S
> index b496a6ef49..2b79174eed 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_trunc-sse4_1.S
> +++ b/sysdeps/x86_64/fpu/multiarch/s_trunc-sse4_1.S
> @@ -18,8 +18,20 @@
>
>  #include <sysdep.h>
>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-double.h>
> +# define __trunc_sse41 __trunc
> +       .text
> +#else
>         .section .text.sse4.1,"ax",@progbits
> +#endif
> +
>  ENTRY(__trunc_sse41)
>         roundsd $11, %xmm0, %xmm0
>         ret
>  END(__trunc_sse41)
> +
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +libm_alias_double (__trunc, trunc)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_trunc.c b/sysdeps/x86_64/fpu/multiarch/s_trunc.c
> index 9bc9df8744..ea89c4f85d 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_trunc.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_trunc.c
> @@ -16,17 +16,20 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#define NO_MATH_REDIRECT
> -#include <libm-alias-double.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
> +# define NO_MATH_REDIRECT
> +# include <libm-alias-double.h>
>
> -#define trunc __redirect_trunc
> -#define __trunc __redirect___trunc
> -#include <math.h>
> -#undef trunc
> -#undef __trunc
> +# define trunc __redirect_trunc
> +# define __trunc __redirect___trunc
> +# include <math.h>
> +# undef trunc
> +# undef __trunc
>
> -#define SYMBOL_NAME trunc
> -#include "ifunc-sse4_1.h"
> +# define SYMBOL_NAME trunc
> +# include "ifunc-sse4_1.h"
>
>  libc_ifunc_redirected (__redirect_trunc, __trunc, IFUNC_SELECTOR ());
>  libm_alias_double (__trunc, trunc)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_truncf-avx.S b/sysdeps/x86_64/fpu/multiarch/s_truncf-avx.S
> new file mode 100644
> index 0000000000..f31ac7d7f7
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_truncf-avx.S
> @@ -0,0 +1,28 @@
> +/* AVX implementation of truncf function.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <libm-alias-float.h>
> +
> +       .text
> +ENTRY(__truncf)
> +       vroundss $11, %xmm0, %xmm0, %xmm0
> +       ret
> +END(__truncf)
> +
> +libm_alias_float (__trunc, trunc)
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_truncf-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_truncf-sse4_1.S
> index 22e9a83307..60498b2cb2 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_truncf-sse4_1.S
> +++ b/sysdeps/x86_64/fpu/multiarch/s_truncf-sse4_1.S
> @@ -18,8 +18,20 @@
>
>  #include <sysdep.h>
>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +# define __truncf_sse41 __truncf
> +       .text
> +#else
>         .section .text.sse4.1,"ax",@progbits
> +#endif
> +
>  ENTRY(__truncf_sse41)
>         roundss $11, %xmm0, %xmm0
>         ret
>  END(__truncf_sse41)
> +
> +#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
> +libm_alias_float (__trunc, trunc)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_truncf.c b/sysdeps/x86_64/fpu/multiarch/s_truncf.c
> index dae01d166a..92435ce39d 100644
> --- a/sysdeps/x86_64/fpu/multiarch/s_truncf.c
> +++ b/sysdeps/x86_64/fpu/multiarch/s_truncf.c
> @@ -16,17 +16,20 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#define NO_MATH_REDIRECT
> -#include <libm-alias-float.h>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
> +# define NO_MATH_REDIRECT
> +# include <libm-alias-float.h>
>
> -#define truncf __redirect_truncf
> -#define __truncf __redirect___truncf
> -#include <math.h>
> -#undef truncf
> -#undef __truncf
> +# define truncf __redirect_truncf
> +# define __truncf __redirect___truncf
> +# include <math.h>
> +# undef truncf
> +# undef __truncf
>
> -#define SYMBOL_NAME truncf
> -#include "ifunc-sse4_1.h"
> +# define SYMBOL_NAME truncf
> +# include "ifunc-sse4_1.h"
>
>  libc_ifunc_redirected (__redirect_truncf, __truncf, IFUNC_SELECTOR ());
>  libm_alias_float (__trunc, trunc)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/w_exp.c b/sysdeps/x86_64/fpu/multiarch/w_exp.c
> index 27eee98a0a..3584187e0e 100644
> --- a/sysdeps/x86_64/fpu/multiarch/w_exp.c
> +++ b/sysdeps/x86_64/fpu/multiarch/w_exp.c
> @@ -1 +1,6 @@
> -#include <sysdeps/../math/w_exp.c>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL >= AVX2_X86_ISA_LEVEL
> +# include <sysdeps/ieee754/dbl-64/w_exp.c>
> +#else
> +# include <sysdeps/../math/w_exp.c>
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/w_log.c b/sysdeps/x86_64/fpu/multiarch/w_log.c
> index 9b2b018711..414ca3ca3d 100644
> --- a/sysdeps/x86_64/fpu/multiarch/w_log.c
> +++ b/sysdeps/x86_64/fpu/multiarch/w_log.c
> @@ -1 +1,6 @@
> -#include <sysdeps/../math/w_log.c>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL >= AVX2_X86_ISA_LEVEL
> +# include <sysdeps/ieee754/dbl-64/w_log.c>
> +#else
> +# include <sysdeps/../math/w_log.c>
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/w_pow.c b/sysdeps/x86_64/fpu/multiarch/w_pow.c
> index b50c1988de..d5fcc4f871 100644
> --- a/sysdeps/x86_64/fpu/multiarch/w_pow.c
> +++ b/sysdeps/x86_64/fpu/multiarch/w_pow.c
> @@ -1 +1,6 @@
> -#include <sysdeps/../math/w_pow.c>
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL >= AVX2_X86_ISA_LEVEL
> +# include <sysdeps/ieee754/dbl-64/w_pow.c>
> +#else
> +# include <sysdeps/../math/w_pow.c>
> +#endif
> --
> 2.43.0
>

LGTM.

Reviewed-by: H.J. Lu <hjl.tools@gmail.com>

Thanks.
  

Patch

diff --git a/sysdeps/x86/configure b/sysdeps/x86/configure
index 1f4c2d67fd..2a5421bb31 100644
--- a/sysdeps/x86/configure
+++ b/sysdeps/x86/configure
@@ -98,6 +98,7 @@  printf "%s\n" "$libc_cv_have_x86_lahf_sahf" >&6; }
   if test $libc_cv_have_x86_lahf_sahf = yes; then
     printf "%s\n" "#define HAVE_X86_LAHF_SAHF 1" >>confdefs.h
 
+    ISAFLAG="-DHAVE_X86_LAHF_SAHF"
   fi
   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MOVBE instruction support" >&5
 printf %s "checking for MOVBE instruction support... " >&6; }
@@ -120,9 +121,41 @@  printf "%s\n" "$libc_cv_have_x86_movbe" >&6; }
   if test $libc_cv_have_x86_movbe = yes; then
     printf "%s\n" "#define HAVE_X86_MOVBE 1" >>confdefs.h
 
+    ISAFLAG="$ISAFLAG -DHAVE_X86_MOVBE"
   fi
+
+  # Check for ISA level support.
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ISA level support" >&5
+printf %s "checking for ISA level support... " >&6; }
+if test ${libc_cv_have_x86_isa_level+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat > conftest.c <<EOF
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL >= 4
+libc_cv_have_x86_isa_level=4
+#elif MINIMUM_X86_ISA_LEVEL == 3
+libc_cv_have_x86_isa_level=3
+#elif MINIMUM_X86_ISA_LEVEL == 2
+libc_cv_have_x86_isa_level=2
+#else
+libc_cv_have_x86_isa_level=baseline
+#endif
+EOF
+		 eval `${CC-cc} $CFLAGS $CPPFLAGS $ISAFLAG -I$srcdir -E conftest.c | grep libc_cv_have_x86_isa_level`
+		 rm -rf conftest*
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_x86_isa_level" >&5
+printf "%s\n" "$libc_cv_have_x86_isa_level" >&6; }
+else
+  libc_cv_have_x86_isa_level=baseline
 fi
 config_vars="$config_vars
+have-x86-isa-level = $libc_cv_have_x86_isa_level"
+config_vars="$config_vars
+x86-isa-level-3-or-above = 3 4"
+config_vars="$config_vars
 enable-x86-isa-level = $libc_cv_include_x86_isa_level"
 
 printf "%s\n" "#define SUPPORT_STATIC_PIE 1" >>confdefs.h
diff --git a/sysdeps/x86/configure.ac b/sysdeps/x86/configure.ac
index 437a50623b..78ff7c8f41 100644
--- a/sysdeps/x86/configure.ac
+++ b/sysdeps/x86/configure.ac
@@ -72,6 +72,7 @@  if test $libc_cv_include_x86_isa_level = yes; then
     fi])
   if test $libc_cv_have_x86_lahf_sahf = yes; then
     AC_DEFINE(HAVE_X86_LAHF_SAHF)
+    ISAFLAG="-DHAVE_X86_LAHF_SAHF"
   fi
   AC_CACHE_CHECK([for MOVBE instruction support],
 		 libc_cv_have_x86_movbe, [dnl
@@ -81,8 +82,31 @@  if test $libc_cv_include_x86_isa_level = yes; then
     fi])
   if test $libc_cv_have_x86_movbe = yes; then
     AC_DEFINE(HAVE_X86_MOVBE)
+    ISAFLAG="$ISAFLAG -DHAVE_X86_MOVBE"
   fi
+
+  # Check for ISA level support.
+  AC_CACHE_CHECK([for ISA level support],
+		 libc_cv_have_x86_isa_level, [dnl
+cat > conftest.c <<EOF
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL >= 4
+libc_cv_have_x86_isa_level=4
+#elif MINIMUM_X86_ISA_LEVEL == 3
+libc_cv_have_x86_isa_level=3
+#elif MINIMUM_X86_ISA_LEVEL == 2
+libc_cv_have_x86_isa_level=2
+#else
+libc_cv_have_x86_isa_level=baseline
+#endif
+EOF
+		 eval `${CC-cc} $CFLAGS $CPPFLAGS $ISAFLAG -I$srcdir -E conftest.c | grep libc_cv_have_x86_isa_level`
+		 rm -rf conftest*])
+else
+  libc_cv_have_x86_isa_level=baseline
 fi
+LIBC_CONFIG_VAR([have-x86-isa-level], [$libc_cv_have_x86_isa_level])
+LIBC_CONFIG_VAR([x86-isa-level-3-or-above], [3 4])
 LIBC_CONFIG_VAR([enable-x86-isa-level], [$libc_cv_include_x86_isa_level])
 
 dnl Static PIE is supported.
diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile
index e1a490dd98..6ddd50240c 100644
--- a/sysdeps/x86_64/fpu/multiarch/Makefile
+++ b/sysdeps/x86_64/fpu/multiarch/Makefile
@@ -1,49 +1,4 @@ 
 ifeq ($(subdir),math)
-libm-sysdep_routines += \
-  s_ceil-c \
-  s_ceilf-c \
-  s_floor-c \
-  s_floorf-c \
-  s_nearbyint-c \
-  s_nearbyintf-c \
-  s_rint-c \
-  s_rintf-c \
-  s_roundeven-c \
-  s_roundevenf-c \
-  s_trunc-c \
-  s_truncf-c \
-# libm-sysdep_routines
-
-libm-sysdep_routines += \
-  s_ceil-sse4_1 \
-  s_ceilf-sse4_1 \
-  s_floor-sse4_1 \
-  s_floorf-sse4_1 \
-  s_nearbyint-sse4_1 \
-  s_nearbyintf-sse4_1 \
-  s_rint-sse4_1 \
-  s_rintf-sse4_1 \
-  s_roundeven-sse4_1 \
-  s_roundevenf-sse4_1 \
-  s_trunc-sse4_1 \
-  s_truncf-sse4_1 \
-# libm-sysdep_routines
-
-libm-sysdep_routines += \
-  e_asin-fma \
-  e_atan2-fma \
-  e_exp-fma \
-  e_log-fma \
-  e_log2-fma \
-  e_pow-fma \
-  s_atan-fma \
-  s_expm1-fma \
-  s_log1p-fma \
-  s_sin-fma \
-  s_sincos-fma \
-  s_tan-fma \
-# libm-sysdep_routines
-
 CFLAGS-e_asin-fma.c = -mfma -mavx2
 CFLAGS-e_atan2-fma.c = -mfma -mavx2
 CFLAGS-e_exp-fma.c = -mfma -mavx2
@@ -57,23 +12,6 @@  CFLAGS-s_sin-fma.c = -mfma -mavx2
 CFLAGS-s_tan-fma.c = -mfma -mavx2
 CFLAGS-s_sincos-fma.c = -mfma -mavx2
 
-libm-sysdep_routines += \
-  s_cosf-sse2 \
-  s_sincosf-sse2 \
-  s_sinf-sse2 \
-# libm-sysdep_routines
-
-libm-sysdep_routines += \
-  e_exp2f-fma \
-  e_expf-fma \
-  e_log2f-fma \
-  e_logf-fma \
-  e_powf-fma \
-  s_cosf-fma \
-  s_sincosf-fma \
-  s_sinf-fma \
-# libm-sysdep_routines
-
 CFLAGS-e_exp2f-fma.c = -mfma -mavx2
 CFLAGS-e_expf-fma.c = -mfma -mavx2
 CFLAGS-e_log2f-fma.c = -mfma -mavx2
@@ -83,17 +21,93 @@  CFLAGS-s_sinf-fma.c = -mfma -mavx2
 CFLAGS-s_cosf-fma.c = -mfma -mavx2
 CFLAGS-s_sincosf-fma.c = -mfma -mavx2
 
+# Check if ISA level is 3 or above.
+ifneq (,$(filter $(have-x86-isa-level),$(x86-isa-level-3-or-above)))
 libm-sysdep_routines += \
+  s_ceil-avx \
+  s_ceilf-avx \
+  s_floor-avx \
+  s_floorf-avx \
+  s_nearbyint-avx \
+  s_nearbyintf-avx \
+  s_rint-avx \
+  s_rintf-avx \
+  s_roundeven-avx \
+  s_roundevenf-avx \
+  s_trunc-avx \
+  s_truncf-avx \
+# libm-sysdep_routines
+else
+libm-sysdep_routines += \
+  e_asin-fma \
   e_asin-fma4 \
+  e_atan2-avx \
+  e_atan2-fma \
   e_atan2-fma4 \
+  e_exp-avx \
+  e_exp-fma \
   e_exp-fma4 \
+  e_exp2f-fma \
+  e_expf-fma \
+  e_log-avx \
+  e_log-fma \
   e_log-fma4 \
+  e_log2-fma \
+  e_log2f-fma \
+  e_logf-fma \
+  e_pow-fma \
   e_pow-fma4 \
+  e_powf-fma \
+  s_atan-avx \
+  s_atan-fma \
   s_atan-fma4 \
+  s_ceil-sse4_1 \
+  s_ceilf-sse4_1 \
+  s_cosf-fma \
+  s_cosf-sse2 \
+  s_expm1-fma \
+  s_floor-sse4_1 \
+  s_floorf-sse4_1 \
+  s_log1p-fma \
+  s_nearbyint-sse4_1 \
+  s_nearbyintf-sse4_1 \
+  s_rint-sse4_1 \
+  s_rintf-sse4_1 \
+  s_roundeven-sse4_1 \
+  s_roundevenf-sse4_1 \
+  s_sin-avx \
+  s_sin-fma \
   s_sin-fma4 \
+  s_sincos-avx \
+  s_sincos-fma \
   s_sincos-fma4 \
+  s_sincosf-fma \
+  s_sincosf-sse2 \
+  s_sinf-fma \
+  s_sinf-sse2 \
+  s_tan-avx \
+  s_tan-fma \
   s_tan-fma4 \
+  s_trunc-sse4_1 \
+  s_truncf-sse4_1 \
 # libm-sysdep_routines
+ifeq ($(have-x86-isa-level),baseline)
+libm-sysdep_routines += \
+  s_ceil-c \
+  s_ceilf-c \
+  s_floor-c \
+  s_floorf-c \
+  s_nearbyint-c \
+  s_nearbyintf-c \
+  s_rint-c \
+  s_rintf-c \
+  s_roundeven-c \
+  s_roundevenf-c \
+  s_trunc-c \
+  s_truncf-c \
+# libm-sysdep_routines
+endif
+endif
 
 CFLAGS-e_asin-fma4.c = -mfma4
 CFLAGS-e_atan2-fma4.c = -mfma4
@@ -105,16 +119,6 @@  CFLAGS-s_sin-fma4.c = -mfma4
 CFLAGS-s_tan-fma4.c = -mfma4
 CFLAGS-s_sincos-fma4.c = -mfma4
 
-libm-sysdep_routines += \
-  e_atan2-avx \
-  e_exp-avx \
-  e_log-avx \
-  s_atan-avx \
-  s_sin-avx \
-  s_sincos-avx \
-  s_tan-avx \
-# libm-sysdep_routines
-
 CFLAGS-e_atan2-avx.c = -msse2avx -DSSE2AVX
 CFLAGS-e_exp-avx.c = -msse2avx -DSSE2AVX
 CFLAGS-e_log-avx.c = -msse2avx -DSSE2AVX
diff --git a/sysdeps/x86_64/fpu/multiarch/e_asin.c b/sysdeps/x86_64/fpu/multiarch/e_asin.c
index 2eaa6c2c04..d64fca2586 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_asin.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_asin.c
@@ -16,26 +16,29 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-finite.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-finite.h>
 
 extern double __redirect_ieee754_asin (double);
 extern double __redirect_ieee754_acos (double);
 
-#define SYMBOL_NAME ieee754_asin
-#include "ifunc-fma4.h"
+# define SYMBOL_NAME ieee754_asin
+# include "ifunc-fma4.h"
 
 libc_ifunc_redirected (__redirect_ieee754_asin, __ieee754_asin,
 		       IFUNC_SELECTOR ());
 libm_alias_finite (__ieee754_asin, __asin)
 
-#undef SYMBOL_NAME
-#define SYMBOL_NAME ieee754_acos
-#include "ifunc-fma4.h"
+# undef SYMBOL_NAME
+# define SYMBOL_NAME ieee754_acos
+# include "ifunc-fma4.h"
 
 libc_ifunc_redirected (__redirect_ieee754_acos, __ieee754_acos,
 		       IFUNC_SELECTOR ());
 libm_alias_finite (__ieee754_acos, __acos)
 
-#define __ieee754_acos __ieee754_acos_sse2
-#define __ieee754_asin __ieee754_asin_sse2
+# define __ieee754_acos __ieee754_acos_sse2
+# define __ieee754_asin __ieee754_asin_sse2
+#endif
 #include <sysdeps/ieee754/dbl-64/e_asin.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/e_atan2.c b/sysdeps/x86_64/fpu/multiarch/e_atan2.c
index 17ee4f3c36..8a86c14ded 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_atan2.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_atan2.c
@@ -16,16 +16,19 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-finite.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-finite.h>
 
 extern double __redirect_ieee754_atan2 (double, double);
 
-#define SYMBOL_NAME ieee754_atan2
-#include "ifunc-avx-fma4.h"
+# define SYMBOL_NAME ieee754_atan2
+# include "ifunc-avx-fma4.h"
 
 libc_ifunc_redirected (__redirect_ieee754_atan2,
 		       __ieee754_atan2, IFUNC_SELECTOR ());
 libm_alias_finite (__ieee754_atan2, __atan2)
 
-#define __ieee754_atan2 __ieee754_atan2_sse2
+# define __ieee754_atan2 __ieee754_atan2_sse2
+#endif
 #include <sysdeps/ieee754/dbl-64/e_atan2.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/e_exp.c b/sysdeps/x86_64/fpu/multiarch/e_exp.c
index 406b7ebd44..d56329291a 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_exp.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_exp.c
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <math.h>
-#include <libm-alias-finite.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <math.h>
+# include <libm-alias-finite.h>
 
 extern double __redirect_ieee754_exp (double);
 
-#define SYMBOL_NAME ieee754_exp
-#include "ifunc-avx-fma4.h"
+# define SYMBOL_NAME ieee754_exp
+# include "ifunc-avx-fma4.h"
 
 libc_ifunc_redirected (__redirect_ieee754_exp, __ieee754_exp,
 		       IFUNC_SELECTOR ());
 libm_alias_finite (__ieee754_exp, __exp)
 
-#define __exp __ieee754_exp_sse2
+# define __exp __ieee754_exp_sse2
+#endif
 #include <sysdeps/ieee754/dbl-64/e_exp.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/e_exp2f.c b/sysdeps/x86_64/fpu/multiarch/e_exp2f.c
index 804fd6be85..06fe5028d6 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_exp2f.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_exp2f.c
@@ -16,25 +16,28 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-float.h>
-#include <libm-alias-finite.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-float.h>
+# include <libm-alias-finite.h>
 
 extern float __redirect_exp2f (float);
 
-#define SYMBOL_NAME exp2f
-#include "ifunc-fma.h"
+# define SYMBOL_NAME exp2f
+# include "ifunc-fma.h"
 
 libc_ifunc_redirected (__redirect_exp2f, __exp2f, IFUNC_SELECTOR ());
 
-#ifdef SHARED
+# ifdef SHARED
 versioned_symbol (libm, __ieee754_exp2f, exp2f, GLIBC_2_27);
 libm_alias_float_other (__exp2, exp2)
-#else
+# else
 libm_alias_float (__exp2, exp2)
-#endif
+# endif
 
 strong_alias (__exp2f, __ieee754_exp2f)
 libm_alias_finite (__exp2f, __exp2f)
 
-#define __exp2f __exp2f_sse2
+# define __exp2f __exp2f_sse2
+#endif
 #include <sysdeps/ieee754/flt-32/e_exp2f.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/e_expf.c b/sysdeps/x86_64/fpu/multiarch/e_expf.c
index 4a7e2a5bce..19d767f636 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_expf.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_expf.c
@@ -16,28 +16,31 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-float.h>
-#include <libm-alias-finite.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-float.h>
+# include <libm-alias-finite.h>
 
 extern float __redirect_expf (float);
 
-#define SYMBOL_NAME expf
-#include "ifunc-fma.h"
+# define SYMBOL_NAME expf
+# include "ifunc-fma.h"
 
 libc_ifunc_redirected (__redirect_expf, __expf, IFUNC_SELECTOR ());
 
-#ifdef SHARED
+# ifdef SHARED
 __hidden_ver1 (__expf, __GI___expf, __redirect_expf)
   __attribute__ ((visibility ("hidden")));
 
 versioned_symbol (libm, __ieee754_expf, expf, GLIBC_2_27);
 libm_alias_float_other (__exp, exp)
-#else
+# else
 libm_alias_float (__exp, exp)
-#endif
+# endif
 
 strong_alias (__expf, __ieee754_expf)
 libm_alias_finite (__expf, __expf)
 
-#define __expf __expf_sse2
+# define __expf __expf_sse2
+#endif
 #include <sysdeps/ieee754/flt-32/e_expf.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/e_log.c b/sysdeps/x86_64/fpu/multiarch/e_log.c
index 067fbf58c3..d80c1b1463 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_log.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_log.c
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <math.h>
-#include <libm-alias-finite.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <math.h>
+# include <libm-alias-finite.h>
 
 extern double __redirect_ieee754_log (double);
 
-#define SYMBOL_NAME ieee754_log
-#include "ifunc-avx-fma4.h"
+# define SYMBOL_NAME ieee754_log
+# include "ifunc-avx-fma4.h"
 
 libc_ifunc_redirected (__redirect_ieee754_log, __ieee754_log,
 		       IFUNC_SELECTOR ());
 libm_alias_finite (__ieee754_log, __log)
 
-#define __log __ieee754_log_sse2
+# define __log __ieee754_log_sse2
+#endif
 #include <sysdeps/ieee754/dbl-64/e_log.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/e_log2.c b/sysdeps/x86_64/fpu/multiarch/e_log2.c
index 9c57a2f6cc..9686782c09 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_log2.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_log2.c
@@ -16,28 +16,31 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-double.h>
-#include <libm-alias-finite.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-double.h>
+# include <libm-alias-finite.h>
 
 extern double __redirect_log2 (double);
 
-#define SYMBOL_NAME log2
-#include "ifunc-fma.h"
+# define SYMBOL_NAME log2
+# include "ifunc-fma.h"
 
 libc_ifunc_redirected (__redirect_log2, __log2, IFUNC_SELECTOR ());
 
-#ifdef SHARED
+# ifdef SHARED
 __hidden_ver1 (__log2, __GI___log2, __redirect_log2)
   __attribute__ ((visibility ("hidden")));
 
 versioned_symbol (libm, __ieee754_log2, log2, GLIBC_2_29);
 libm_alias_double_other (__log2, log2)
-#else
+# else
 libm_alias_double (__log2, log2)
-#endif
+# endif
 
 strong_alias (__log2, __ieee754_log2)
 libm_alias_finite (__log2, __log2)
 
-#define __log2 __log2_sse2
+# define __log2 __log2_sse2
+#endif
 #include <sysdeps/ieee754/dbl-64/e_log2.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/e_log2f.c b/sysdeps/x86_64/fpu/multiarch/e_log2f.c
index 2b45c87f38..8ada46e11e 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_log2f.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_log2f.c
@@ -16,28 +16,31 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-float.h>
-#include <libm-alias-finite.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-float.h>
+# include <libm-alias-finite.h>
 
 extern float __redirect_log2f (float);
 
-#define SYMBOL_NAME log2f
-#include "ifunc-fma.h"
+# define SYMBOL_NAME log2f
+# include "ifunc-fma.h"
 
 libc_ifunc_redirected (__redirect_log2f, __log2f, IFUNC_SELECTOR ());
 
-#ifdef SHARED
+# ifdef SHARED
 __hidden_ver1 (__log2f, __GI___log2f, __redirect_log2f)
   __attribute__ ((visibility ("hidden")));
 
 versioned_symbol (libm, __ieee754_log2f, log2f, GLIBC_2_27);
 libm_alias_float_other (__log2, log2)
-#else
+# else
 libm_alias_float (__log2, log2)
-#endif
+# endif
 
 strong_alias (__log2f, __ieee754_log2f)
 libm_alias_finite (__log2f, __log2f)
 
-#define __log2f __log2f_sse2
+# define __log2f __log2f_sse2
+#endif
 #include <sysdeps/ieee754/flt-32/e_log2f.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/e_logf.c b/sysdeps/x86_64/fpu/multiarch/e_logf.c
index 97e23c8fea..a3978d9a8e 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_logf.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_logf.c
@@ -16,28 +16,31 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-float.h>
-#include <libm-alias-finite.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-float.h>
+# include <libm-alias-finite.h>
 
 extern float __redirect_logf (float);
 
-#define SYMBOL_NAME logf
-#include "ifunc-fma.h"
+# define SYMBOL_NAME logf
+# include "ifunc-fma.h"
 
 libc_ifunc_redirected (__redirect_logf, __logf, IFUNC_SELECTOR ());
 
-#ifdef SHARED
+# ifdef SHARED
 __hidden_ver1 (__logf, __GI___logf, __redirect_logf)
   __attribute__ ((visibility ("hidden")));
 
 versioned_symbol (libm, __ieee754_logf, logf, GLIBC_2_27);
 libm_alias_float_other (__log, log)
-#else
+# else
 libm_alias_float (__log, log)
-#endif
+# endif
 
 strong_alias (__logf, __ieee754_logf)
 libm_alias_finite (__logf, __logf)
 
-#define __logf __logf_sse2
+# define __logf __logf_sse2
+#endif
 #include <sysdeps/ieee754/flt-32/e_logf.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/e_pow.c b/sysdeps/x86_64/fpu/multiarch/e_pow.c
index 42618e7112..f8f17aff9f 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_pow.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_pow.c
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <math.h>
-#include <libm-alias-finite.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <math.h>
+# include <libm-alias-finite.h>
 
 extern double __redirect_ieee754_pow (double, double);
 
-#define SYMBOL_NAME ieee754_pow
-#include "ifunc-fma4.h"
+# define SYMBOL_NAME ieee754_pow
+# include "ifunc-fma4.h"
 
 libc_ifunc_redirected (__redirect_ieee754_pow,
 		       __ieee754_pow, IFUNC_SELECTOR ());
 libm_alias_finite (__ieee754_pow, __pow)
 
-#define __pow __ieee754_pow_sse2
+# define __pow __ieee754_pow_sse2
+#endif
 #include <sysdeps/ieee754/dbl-64/e_pow.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/e_powf.c b/sysdeps/x86_64/fpu/multiarch/e_powf.c
index 8e6ce13cc1..8b1a4c7d04 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_powf.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_powf.c
@@ -16,31 +16,34 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-float.h>
-#include <libm-alias-finite.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-float.h>
+# include <libm-alias-finite.h>
 
-#define powf __redirect_powf
-#define __DECL_SIMD___redirect_powf
-#include <math.h>
-#undef powf
+# define powf __redirect_powf
+# define __DECL_SIMD___redirect_powf
+# include <math.h>
+# undef powf
 
-#define SYMBOL_NAME powf
-#include "ifunc-fma.h"
+# define SYMBOL_NAME powf
+# include "ifunc-fma.h"
 
 libc_ifunc_redirected (__redirect_powf, __powf, IFUNC_SELECTOR ());
 
-#ifdef SHARED
+# ifdef SHARED
 __hidden_ver1 (__powf, __GI___powf, __redirect_powf)
   __attribute__ ((visibility ("hidden")));
 
 versioned_symbol (libm, __ieee754_powf, powf, GLIBC_2_27);
 libm_alias_float_other (__pow, pow)
-#else
+# else
 libm_alias_float (__pow, pow)
-#endif
+# endif
 
 strong_alias (__powf, __ieee754_powf)
 libm_alias_finite (__powf, __powf)
 
-#define __powf __powf_sse2
+# define __powf __powf_sse2
+#endif
 #include <sysdeps/ieee754/flt-32/e_powf.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/s_atan.c b/sysdeps/x86_64/fpu/multiarch/s_atan.c
index 71bad096a9..4d2c6ce006 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_atan.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_atan.c
@@ -16,15 +16,18 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-double.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-double.h>
 
 extern double __redirect_atan (double);
 
-#define SYMBOL_NAME atan
-#include "ifunc-avx-fma4.h"
+# define SYMBOL_NAME atan
+# include "ifunc-avx-fma4.h"
 
 libc_ifunc_redirected (__redirect_atan, __atan, IFUNC_SELECTOR ());
 libm_alias_double (__atan, atan)
 
-#define __atan __atan_sse2
+# define __atan __atan_sse2
+#endif
 #include <sysdeps/ieee754/dbl-64/s_atan.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceil-avx.S b/sysdeps/x86_64/fpu/multiarch/s_ceil-avx.S
new file mode 100644
index 0000000000..e6c1106753
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_ceil-avx.S
@@ -0,0 +1,28 @@ 
+/* AVX implementation of ceil function.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <libm-alias-double.h>
+
+	.text
+ENTRY(__ceil)
+	vroundsd $10, %xmm0, %xmm0, %xmm0
+	ret
+END(__ceil)
+
+libm_alias_double (__ceil, ceil)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceil-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_ceil-sse4_1.S
index 64119011ad..dba756c38f 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_ceil-sse4_1.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_ceil-sse4_1.S
@@ -17,8 +17,20 @@ 
 
 #include <sysdep.h>
 
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-double.h>
+# define __ceil_sse41 __ceil
+	.text
+#else
 	.section .text.sse4.1,"ax",@progbits
+#endif
+
 ENTRY(__ceil_sse41)
 	roundsd	$10, %xmm0, %xmm0
 	ret
 END(__ceil_sse41)
+
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+libm_alias_double (__ceil, ceil)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceil.c b/sysdeps/x86_64/fpu/multiarch/s_ceil.c
index cc028addee..46c8e91e19 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_ceil.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_ceil.c
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#define NO_MATH_REDIRECT
-#include <libm-alias-double.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
+# define NO_MATH_REDIRECT
+# include <libm-alias-double.h>
 
-#define ceil __redirect_ceil
-#define __ceil __redirect___ceil
-#include <math.h>
-#undef ceil
-#undef __ceil
+# define ceil __redirect_ceil
+# define __ceil __redirect___ceil
+# include <math.h>
+# undef ceil
+# undef __ceil
 
-#define SYMBOL_NAME ceil
-#include "ifunc-sse4_1.h"
+# define SYMBOL_NAME ceil
+# include "ifunc-sse4_1.h"
 
 libc_ifunc_redirected (__redirect_ceil, __ceil, IFUNC_SELECTOR ());
 libm_alias_double (__ceil, ceil)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceilf-avx.S b/sysdeps/x86_64/fpu/multiarch/s_ceilf-avx.S
new file mode 100644
index 0000000000..b4d8ac0455
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_ceilf-avx.S
@@ -0,0 +1,28 @@ 
+/* AVX implementation of ceilf function.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <libm-alias-float.h>
+
+	.text
+ENTRY(__ceilf)
+	vroundss $10, %xmm0, %xmm0, %xmm0
+	ret
+END(__ceilf)
+
+libm_alias_float (__ceil, ceil)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceilf-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_ceilf-sse4_1.S
index dd9a9f6b71..9abc87b91a 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_ceilf-sse4_1.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_ceilf-sse4_1.S
@@ -17,8 +17,20 @@ 
 
 #include <sysdep.h>
 
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-float.h>
+# define __ceilf_sse41 __ceilf
+	.text
+#else
 	.section .text.sse4.1,"ax",@progbits
+#endif
+
 ENTRY(__ceilf_sse41)
 	roundss	$10, %xmm0, %xmm0
 	ret
 END(__ceilf_sse41)
+
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+libm_alias_float (__ceil, ceil)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceilf.c b/sysdeps/x86_64/fpu/multiarch/s_ceilf.c
index 97a0ca7d19..bb53108f73 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_ceilf.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_ceilf.c
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#define NO_MATH_REDIRECT
-#include <libm-alias-float.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
+# define NO_MATH_REDIRECT
+# include <libm-alias-float.h>
 
-#define ceilf __redirect_ceilf
-#define __ceilf __redirect___ceilf
-#include <math.h>
-#undef ceilf
-#undef __ceilf
+# define ceilf __redirect_ceilf
+# define __ceilf __redirect___ceilf
+# include <math.h>
+# undef ceilf
+# undef __ceilf
 
-#define SYMBOL_NAME ceilf
-#include "ifunc-sse4_1.h"
+# define SYMBOL_NAME ceilf
+# include "ifunc-sse4_1.h"
 
 libc_ifunc_redirected (__redirect_ceilf, __ceilf, IFUNC_SELECTOR ());
 libm_alias_float (__ceil, ceil)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_cosf.c b/sysdeps/x86_64/fpu/multiarch/s_cosf.c
index 2703c576df..8a02e04538 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_cosf.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_cosf.c
@@ -16,13 +16,18 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-float.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-float.h>
 
 extern float __redirect_cosf (float);
 
-#define SYMBOL_NAME cosf
-#include "ifunc-fma.h"
+# define SYMBOL_NAME cosf
+# include "ifunc-fma.h"
 
 libc_ifunc_redirected (__redirect_cosf, __cosf, IFUNC_SELECTOR ());
 
 libm_alias_float (__cos, cos)
+#else
+# include <sysdeps/ieee754/flt-32/s_cosf.c>
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_expm1.c b/sysdeps/x86_64/fpu/multiarch/s_expm1.c
index 8a2d69f9b2..d58ef3d8f5 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_expm1.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_expm1.c
@@ -16,21 +16,24 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-double.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-double.h>
 
 extern double __redirect_expm1 (double);
 
-#define SYMBOL_NAME expm1
-#include "ifunc-fma.h"
+# define SYMBOL_NAME expm1
+# include "ifunc-fma.h"
 
 libc_ifunc_redirected (__redirect_expm1, __expm1, IFUNC_SELECTOR ());
 libm_alias_double (__expm1, expm1)
 
-#define __expm1 __expm1_sse2
+# define __expm1 __expm1_sse2
 
 /* NB: __expm1 may be expanded to __expm1_sse2 in the following
    prototypes.  */
 extern long double __expm1l (long double);
 extern long double __expm1f128 (long double);
 
+#endif
 #include <sysdeps/ieee754/dbl-64/s_expm1.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/s_floor-avx.S b/sysdeps/x86_64/fpu/multiarch/s_floor-avx.S
new file mode 100644
index 0000000000..ff74b5a8bf
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_floor-avx.S
@@ -0,0 +1,28 @@ 
+/* AVX implementation of floor function.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <libm-alias-double.h>
+
+	.text
+ENTRY(__floor)
+	vroundsd $9, %xmm0, %xmm0, %xmm0
+	ret
+END(__floor)
+
+libm_alias_double (__floor, floor)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_floor-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_floor-sse4_1.S
index 2f7521f39f..c9b9b0639b 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_floor-sse4_1.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_floor-sse4_1.S
@@ -17,8 +17,20 @@ 
 
 #include <sysdep.h>
 
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-double.h>
+# define __floor_sse41 __floor
+	.text
+#else
 	.section .text.sse4.1,"ax",@progbits
+#endif
+
 ENTRY(__floor_sse41)
 	roundsd	$9, %xmm0, %xmm0
 	ret
 END(__floor_sse41)
+
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+libm_alias_double (__floor, floor)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_floor.c b/sysdeps/x86_64/fpu/multiarch/s_floor.c
index 8cebd48e10..2c87dd0056 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_floor.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_floor.c
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#define NO_MATH_REDIRECT
-#include <libm-alias-double.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
+# define NO_MATH_REDIRECT
+# include <libm-alias-double.h>
 
-#define floor __redirect_floor
-#define __floor __redirect___floor
-#include <math.h>
-#undef floor
-#undef __floor
+# define floor __redirect_floor
+# define __floor __redirect___floor
+# include <math.h>
+# undef floor
+# undef __floor
 
-#define SYMBOL_NAME floor
-#include "ifunc-sse4_1.h"
+# define SYMBOL_NAME floor
+# include "ifunc-sse4_1.h"
 
 libc_ifunc_redirected (__redirect_floor, __floor, IFUNC_SELECTOR ());
 libm_alias_double (__floor, floor)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_floorf-avx.S b/sysdeps/x86_64/fpu/multiarch/s_floorf-avx.S
new file mode 100644
index 0000000000..c378baae8e
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_floorf-avx.S
@@ -0,0 +1,28 @@ 
+/* AVX implementation of floorf function.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <libm-alias-float.h>
+
+	.text
+ENTRY(__floorf)
+	vroundss $9, %xmm0, %xmm0, %xmm0
+	ret
+END(__floorf)
+
+libm_alias_float (__floor, floor)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_floorf-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_floorf-sse4_1.S
index 5f6020d27d..c2216899db 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_floorf-sse4_1.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_floorf-sse4_1.S
@@ -17,8 +17,20 @@ 
 
 #include <sysdep.h>
 
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-float.h>
+# define __floorf_sse41 __floorf
+	.text
+#else
 	.section .text.sse4.1,"ax",@progbits
+#endif
+
 ENTRY(__floorf_sse41)
 	roundss	$9, %xmm0, %xmm0
 	ret
 END(__floorf_sse41)
+
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+libm_alias_float (__floor, floor)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_floorf.c b/sysdeps/x86_64/fpu/multiarch/s_floorf.c
index a14e18b03c..a277802b6d 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_floorf.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_floorf.c
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#define NO_MATH_REDIRECT
-#include <libm-alias-float.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
+# define NO_MATH_REDIRECT
+# include <libm-alias-float.h>
 
-#define floorf __redirect_floorf
-#define __floorf __redirect___floorf
-#include <math.h>
-#undef floorf
-#undef __floorf
+# define floorf __redirect_floorf
+# define __floorf __redirect___floorf
+# include <math.h>
+# undef floorf
+# undef __floorf
 
-#define SYMBOL_NAME floorf
-#include "ifunc-sse4_1.h"
+# define SYMBOL_NAME floorf
+# include "ifunc-sse4_1.h"
 
 libc_ifunc_redirected (__redirect_floorf, __floorf, IFUNC_SELECTOR ());
 libm_alias_float (__floor, floor)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_log1p.c b/sysdeps/x86_64/fpu/multiarch/s_log1p.c
index a8e1a3f21b..3fa1185d81 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_log1p.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_log1p.c
@@ -16,14 +16,17 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-double.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-double.h>
 
 extern double __redirect_log1p (double);
 
-#define SYMBOL_NAME log1p
-#include "ifunc-fma.h"
+# define SYMBOL_NAME log1p
+# include "ifunc-fma.h"
 
 libc_ifunc_redirected (__redirect_log1p, __log1p, IFUNC_SELECTOR ());
 
-#define __log1p __log1p_sse2
+# define __log1p __log1p_sse2
+#endif
 #include <sysdeps/ieee754/dbl-64/s_log1p.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/s_nearbyint-avx.S b/sysdeps/x86_64/fpu/multiarch/s_nearbyint-avx.S
new file mode 100644
index 0000000000..5bfdf73c28
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_nearbyint-avx.S
@@ -0,0 +1,28 @@ 
+/* AVX implementation of nearbyint function.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <libm-alias-double.h>
+
+	.text
+ENTRY(__nearbyint)
+	vroundsd $0xc, %xmm0, %xmm0, %xmm0
+	ret
+END(__nearbyint)
+
+libm_alias_double (__nearbyint, nearbyint)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_nearbyint-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_nearbyint-sse4_1.S
index 674f7eb40a..9d84410a1f 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_nearbyint-sse4_1.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_nearbyint-sse4_1.S
@@ -17,8 +17,20 @@ 
 
 #include <sysdep.h>
 
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-double.h>
+# define __nearbyint_sse41 __nearbyint
+	.text
+#else
 	.section .text.sse4.1,"ax",@progbits
+#endif
+
 ENTRY(__nearbyint_sse41)
 	roundsd	$0xc, %xmm0, %xmm0
 	ret
 END(__nearbyint_sse41)
+
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+libm_alias_double (__nearbyint, nearbyint)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_nearbyint.c b/sysdeps/x86_64/fpu/multiarch/s_nearbyint.c
index 693e42dd4e..057a7ca60f 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_nearbyint.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_nearbyint.c
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-double.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-double.h>
 
-#define nearbyint __redirect_nearbyint
-#define __nearbyint __redirect___nearbyint
-#include <math.h>
-#undef nearbyint
-#undef __nearbyint
+# define nearbyint __redirect_nearbyint
+# define __nearbyint __redirect___nearbyint
+# include <math.h>
+# undef nearbyint
+# undef __nearbyint
 
-#define SYMBOL_NAME nearbyint
-#include "ifunc-sse4_1.h"
+# define SYMBOL_NAME nearbyint
+# include "ifunc-sse4_1.h"
 
 libc_ifunc_redirected (__redirect_nearbyint, __nearbyint,
 		       IFUNC_SELECTOR ());
 libm_alias_double (__nearbyint, nearbyint)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-avx.S b/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-avx.S
new file mode 100644
index 0000000000..1dbaed0324
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-avx.S
@@ -0,0 +1,28 @@ 
+/* AVX implmentation of nearbyintf function.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <libm-alias-float.h>
+
+	.text
+ENTRY(__nearbyintf)
+	vroundss $0xc, %xmm0, %xmm0, %xmm0
+	ret
+END(__nearbyintf)
+
+libm_alias_float (__nearbyint, nearbyint)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-sse4_1.S
index 5892bd7563..3cf35f92d6 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-sse4_1.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_nearbyintf-sse4_1.S
@@ -17,8 +17,20 @@ 
 
 #include <sysdep.h>
 
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-float.h>
+# define __nearbyintf_sse41 __nearbyintf
+	.text
+#else
 	.section .text.sse4.1,"ax",@progbits
+#endif
+
 ENTRY(__nearbyintf_sse41)
 	roundss	$0xc, %xmm0, %xmm0
 	ret
 END(__nearbyintf_sse41)
+
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+libm_alias_float (__nearbyint, nearbyint)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_nearbyintf.c b/sysdeps/x86_64/fpu/multiarch/s_nearbyintf.c
index a0ac009f4b..41f374ba72 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_nearbyintf.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_nearbyintf.c
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-float.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-float.h>
 
-#define nearbyintf __redirect_nearbyintf
-#define __nearbyintf __redirect___nearbyintf
-#include <math.h>
-#undef nearbyintf
-#undef __nearbyintf
+# define nearbyintf __redirect_nearbyintf
+# define __nearbyintf __redirect___nearbyintf
+# include <math.h>
+# undef nearbyintf
+# undef __nearbyintf
 
-#define SYMBOL_NAME nearbyintf
-#include "ifunc-sse4_1.h"
+# define SYMBOL_NAME nearbyintf
+# include "ifunc-sse4_1.h"
 
 libc_ifunc_redirected (__redirect_nearbyintf, __nearbyintf,
 		       IFUNC_SELECTOR ());
 libm_alias_float (__nearbyint, nearbyint)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_rint-avx.S b/sysdeps/x86_64/fpu/multiarch/s_rint-avx.S
new file mode 100644
index 0000000000..2b403b331f
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_rint-avx.S
@@ -0,0 +1,28 @@ 
+/* AVX implementation of rint function.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <libm-alias-double.h>
+
+	.text
+ENTRY(__rint)
+	vroundsd $4, %xmm0, %xmm0, %xmm0
+	ret
+END(__rint)
+
+libm_alias_double (__rint, rint)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_rint-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_rint-sse4_1.S
index 405372991b..8cd9cf759f 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_rint-sse4_1.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_rint-sse4_1.S
@@ -17,8 +17,20 @@ 
 
 #include <sysdep.h>
 
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-double.h>
+# define __rint_sse41 __rint
+	.text
+#else
 	.section .text.sse4.1,"ax",@progbits
+#endif
+
 ENTRY(__rint_sse41)
 	roundsd	$4, %xmm0, %xmm0
 	ret
 END(__rint_sse41)
+
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+libm_alias_double (__rint, rint)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_rint.c b/sysdeps/x86_64/fpu/multiarch/s_rint.c
index 754c87e004..18623b7d99 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_rint.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_rint.c
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#define NO_MATH_REDIRECT
-#include <libm-alias-double.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
+# define NO_MATH_REDIRECT
+# include <libm-alias-double.h>
 
-#define rint __redirect_rint
-#define __rint __redirect___rint
-#include <math.h>
-#undef rint
-#undef __rint
+# define rint __redirect_rint
+# define __rint __redirect___rint
+# include <math.h>
+# undef rint
+# undef __rint
 
-#define SYMBOL_NAME rint
-#include "ifunc-sse4_1.h"
+# define SYMBOL_NAME rint
+# include "ifunc-sse4_1.h"
 
 libc_ifunc_redirected (__redirect_rint, __rint, IFUNC_SELECTOR ());
 libm_alias_double (__rint, rint)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_rintf-avx.S b/sysdeps/x86_64/fpu/multiarch/s_rintf-avx.S
new file mode 100644
index 0000000000..171c2867f4
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_rintf-avx.S
@@ -0,0 +1,28 @@ 
+/* AVX implementation of rintf function.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <libm-alias-float.h>
+
+	.text
+ENTRY(__rintf)
+	vroundss $4, %xmm0, %xmm0, %xmm0
+	ret
+END(__rintf)
+
+libm_alias_float (__rint, rint)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_rintf-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_rintf-sse4_1.S
index 8ac67ce767..fc1e70f0c9 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_rintf-sse4_1.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_rintf-sse4_1.S
@@ -17,8 +17,20 @@ 
 
 #include <sysdep.h>
 
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-float.h>
+# define __rintf_sse41 __rintf
+	.text
+#else
 	.section .text.sse4.1,"ax",@progbits
+#endif
+
 ENTRY(__rintf_sse41)
 	roundss	$4, %xmm0, %xmm0
 	ret
 END(__rintf_sse41)
+
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+libm_alias_float (__rint, rint)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_rintf.c b/sysdeps/x86_64/fpu/multiarch/s_rintf.c
index e9d6b7a5f2..e275368dec 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_rintf.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_rintf.c
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#define NO_MATH_REDIRECT
-#include <libm-alias-float.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
+# define NO_MATH_REDIRECT
+# include <libm-alias-float.h>
 
-#define rintf __redirect_rintf
-#define __rintf __redirect___rintf
-#include <math.h>
-#undef rintf
-#undef __rintf
+# define rintf __redirect_rintf
+# define __rintf __redirect___rintf
+# include <math.h>
+# undef rintf
+# undef __rintf
 
-#define SYMBOL_NAME rintf
-#include "ifunc-sse4_1.h"
+# define SYMBOL_NAME rintf
+# include "ifunc-sse4_1.h"
 
 libc_ifunc_redirected (__redirect_rintf, __rintf, IFUNC_SELECTOR ());
 libm_alias_float (__rint, rint)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundeven-avx.S b/sysdeps/x86_64/fpu/multiarch/s_roundeven-avx.S
new file mode 100644
index 0000000000..576790355c
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_roundeven-avx.S
@@ -0,0 +1,28 @@ 
+/* AVX implementation of roundeven function.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <libm-alias-double.h>
+
+	.text
+ENTRY(__roundeven)
+	vroundsd $8, %xmm0, %xmm0, %xmm0
+	ret
+END(__roundeven)
+
+libm_alias_double (__roundeven, roundeven)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundeven-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_roundeven-sse4_1.S
index 5ef102336b..f00be56c59 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_roundeven-sse4_1.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_roundeven-sse4_1.S
@@ -17,8 +17,20 @@ 
 
 #include <sysdep.h>
 
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-double.h>
+# define __roundeven_sse41 __roundeven
+	.text
+#else
 	.section .text.sse4.1,"ax",@progbits
+#endif
+
 ENTRY(__roundeven_sse41)
 	roundsd	$8, %xmm0, %xmm0
 	ret
 END(__roundeven_sse41)
+
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+libm_alias_double (__roundeven, roundeven)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundeven.c b/sysdeps/x86_64/fpu/multiarch/s_roundeven.c
index 8737b32e26..139aad088f 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_roundeven.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_roundeven.c
@@ -16,16 +16,19 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-double.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-double.h>
 
-#define roundeven __redirect_roundeven
-#define __roundeven __redirect___roundeven
-#include <math.h>
-#undef roundeven
-#undef __roundeven
+# define roundeven __redirect_roundeven
+# define __roundeven __redirect___roundeven
+# include <math.h>
+# undef roundeven
+# undef __roundeven
 
-#define SYMBOL_NAME roundeven
-#include "ifunc-sse4_1.h"
+# define SYMBOL_NAME roundeven
+# include "ifunc-sse4_1.h"
 
 libc_ifunc_redirected (__redirect_roundeven, __roundeven, IFUNC_SELECTOR ());
 libm_alias_double (__roundeven, roundeven)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundevenf-avx.S b/sysdeps/x86_64/fpu/multiarch/s_roundevenf-avx.S
new file mode 100644
index 0000000000..42c359f4cd
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_roundevenf-avx.S
@@ -0,0 +1,28 @@ 
+/* AVX implementation of roundevenf function.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <libm-alias-float.h>
+
+	.text
+ENTRY(__roundevenf)
+	vroundss $8, %xmm0, %xmm0, %xmm0
+	ret
+END(__roundevenf)
+
+libm_alias_float (__roundeven, roundeven)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundevenf-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_roundevenf-sse4_1.S
index 792c90ba07..6b148e4353 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_roundevenf-sse4_1.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_roundevenf-sse4_1.S
@@ -17,8 +17,20 @@ 
 
 #include <sysdep.h>
 
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-float.h>
+# define __roundevenf_sse41 __roundevenf
+	.text
+#else
 	.section .text.sse4.1,"ax",@progbits
+#endif
+
 ENTRY(__roundevenf_sse41)
 	roundss	$8, %xmm0, %xmm0
 	ret
 END(__roundevenf_sse41)
+
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+libm_alias_float (__roundeven, roundeven)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundevenf.c b/sysdeps/x86_64/fpu/multiarch/s_roundevenf.c
index e96016a4d5..2fb090075d 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_roundevenf.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_roundevenf.c
@@ -16,16 +16,19 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-float.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-float.h>
 
-#define roundevenf __redirect_roundevenf
-#define __roundevenf __redirect___roundevenf
-#include <math.h>
-#undef roundevenf
-#undef __roundevenf
+# define roundevenf __redirect_roundevenf
+# define __roundevenf __redirect___roundevenf
+# include <math.h>
+# undef roundevenf
+# undef __roundevenf
 
-#define SYMBOL_NAME roundevenf
-#include "ifunc-sse4_1.h"
+# define SYMBOL_NAME roundevenf
+# include "ifunc-sse4_1.h"
 
 libc_ifunc_redirected (__redirect_roundevenf, __roundevenf, IFUNC_SELECTOR ());
 libm_alias_float (__roundeven, roundeven)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_sin.c b/sysdeps/x86_64/fpu/multiarch/s_sin.c
index 355cc0092e..21e77943a3 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_sin.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_sin.c
@@ -16,24 +16,27 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-double.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-double.h>
 
 extern double __redirect_sin (double);
 extern double __redirect_cos (double);
 
-#define SYMBOL_NAME sin
-#include "ifunc-avx-fma4.h"
+# define SYMBOL_NAME sin
+# include "ifunc-avx-fma4.h"
 
 libc_ifunc_redirected (__redirect_sin, __sin, IFUNC_SELECTOR ());
 libm_alias_double (__sin, sin)
 
-#undef SYMBOL_NAME
-#define SYMBOL_NAME cos
-#include "ifunc-avx-fma4.h"
+# undef SYMBOL_NAME
+# define SYMBOL_NAME cos
+# include "ifunc-avx-fma4.h"
 
 libc_ifunc_redirected (__redirect_cos, __cos, IFUNC_SELECTOR ());
 libm_alias_double (__cos, cos)
 
-#define __cos __cos_sse2
-#define __sin __sin_sse2
+# define __cos __cos_sse2
+# define __sin __sin_sse2
+#endif
 #include <sysdeps/ieee754/dbl-64/s_sin.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/s_sincos.c b/sysdeps/x86_64/fpu/multiarch/s_sincos.c
index 70107e999c..b35757f8de 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_sincos.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_sincos.c
@@ -16,15 +16,18 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-double.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-double.h>
 
 extern void __redirect_sincos (double, double *, double *);
 
-#define SYMBOL_NAME sincos
-#include "ifunc-fma4.h"
+# define SYMBOL_NAME sincos
+# include "ifunc-fma4.h"
 
 libc_ifunc_redirected (__redirect_sincos, __sincos, IFUNC_SELECTOR ());
 libm_alias_double (__sincos, sincos)
 
-#define __sincos __sincos_sse2
+# define __sincos __sincos_sse2
+#endif
 #include <sysdeps/ieee754/dbl-64/s_sincos.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/s_sincosf.c b/sysdeps/x86_64/fpu/multiarch/s_sincosf.c
index 80bc028451..0ea9b40e84 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_sincosf.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_sincosf.c
@@ -16,13 +16,18 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-float.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-float.h>
 
 extern void __redirect_sincosf (float, float *, float *);
 
-#define SYMBOL_NAME sincosf
-#include "ifunc-fma.h"
+# define SYMBOL_NAME sincosf
+# include "ifunc-fma.h"
 
 libc_ifunc_redirected (__redirect_sincosf, __sincosf, IFUNC_SELECTOR ());
 
 libm_alias_float (__sincos, sincos)
+#else
+# include <sysdeps/ieee754/flt-32/s_sincosf.c>
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_sinf.c b/sysdeps/x86_64/fpu/multiarch/s_sinf.c
index a32b9e9550..c61624e3ee 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_sinf.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_sinf.c
@@ -16,13 +16,18 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-float.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-float.h>
 
 extern float __redirect_sinf (float);
 
-#define SYMBOL_NAME sinf
-#include "ifunc-fma.h"
+# define SYMBOL_NAME sinf
+# include "ifunc-fma.h"
 
 libc_ifunc_redirected (__redirect_sinf, __sinf, IFUNC_SELECTOR ());
 
 libm_alias_float (__sin, sin)
+#else
+# include <sysdeps/ieee754/flt-32/s_sinf.c>
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_tan.c b/sysdeps/x86_64/fpu/multiarch/s_tan.c
index f9a2474a13..125d992ba1 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_tan.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_tan.c
@@ -16,15 +16,18 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <libm-alias-double.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-double.h>
 
 extern double __redirect_tan (double);
 
-#define SYMBOL_NAME tan
-#include "ifunc-avx-fma4.h"
+# define SYMBOL_NAME tan
+# include "ifunc-avx-fma4.h"
 
 libc_ifunc_redirected (__redirect_tan, __tan, IFUNC_SELECTOR ());
 libm_alias_double (__tan, tan)
 
-#define __tan __tan_sse2
+# define __tan __tan_sse2
+#endif
 #include <sysdeps/ieee754/dbl-64/s_tan.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/s_trunc-avx.S b/sysdeps/x86_64/fpu/multiarch/s_trunc-avx.S
new file mode 100644
index 0000000000..b3e87e9606
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_trunc-avx.S
@@ -0,0 +1,28 @@ 
+/* AVX implementation of trunc function.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <libm-alias-double.h>
+
+	.text
+ENTRY(__trunc)
+	vroundsd $11, %xmm0, %xmm0, %xmm0
+	ret
+END(__trunc)
+
+libm_alias_double (__trunc, trunc)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_trunc-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_trunc-sse4_1.S
index b496a6ef49..2b79174eed 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_trunc-sse4_1.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_trunc-sse4_1.S
@@ -18,8 +18,20 @@ 
 
 #include <sysdep.h>
 
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-double.h>
+# define __trunc_sse41 __trunc
+	.text
+#else
 	.section .text.sse4.1,"ax",@progbits
+#endif
+
 ENTRY(__trunc_sse41)
 	roundsd	$11, %xmm0, %xmm0
 	ret
 END(__trunc_sse41)
+
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+libm_alias_double (__trunc, trunc)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_trunc.c b/sysdeps/x86_64/fpu/multiarch/s_trunc.c
index 9bc9df8744..ea89c4f85d 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_trunc.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_trunc.c
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#define NO_MATH_REDIRECT
-#include <libm-alias-double.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
+# define NO_MATH_REDIRECT
+# include <libm-alias-double.h>
 
-#define trunc __redirect_trunc
-#define __trunc __redirect___trunc
-#include <math.h>
-#undef trunc
-#undef __trunc
+# define trunc __redirect_trunc
+# define __trunc __redirect___trunc
+# include <math.h>
+# undef trunc
+# undef __trunc
 
-#define SYMBOL_NAME trunc
-#include "ifunc-sse4_1.h"
+# define SYMBOL_NAME trunc
+# include "ifunc-sse4_1.h"
 
 libc_ifunc_redirected (__redirect_trunc, __trunc, IFUNC_SELECTOR ());
 libm_alias_double (__trunc, trunc)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_truncf-avx.S b/sysdeps/x86_64/fpu/multiarch/s_truncf-avx.S
new file mode 100644
index 0000000000..f31ac7d7f7
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_truncf-avx.S
@@ -0,0 +1,28 @@ 
+/* AVX implementation of truncf function.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <libm-alias-float.h>
+
+	.text
+ENTRY(__truncf)
+	vroundss $11, %xmm0, %xmm0, %xmm0
+	ret
+END(__truncf)
+
+libm_alias_float (__trunc, trunc)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_truncf-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_truncf-sse4_1.S
index 22e9a83307..60498b2cb2 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_truncf-sse4_1.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_truncf-sse4_1.S
@@ -18,8 +18,20 @@ 
 
 #include <sysdep.h>
 
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+# include <libm-alias-float.h>
+# define __truncf_sse41 __truncf
+	.text
+#else
 	.section .text.sse4.1,"ax",@progbits
+#endif
+
 ENTRY(__truncf_sse41)
 	roundss	$11, %xmm0, %xmm0
 	ret
 END(__truncf_sse41)
+
+#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
+libm_alias_float (__trunc, trunc)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/s_truncf.c b/sysdeps/x86_64/fpu/multiarch/s_truncf.c
index dae01d166a..92435ce39d 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_truncf.c
+++ b/sysdeps/x86_64/fpu/multiarch/s_truncf.c
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#define NO_MATH_REDIRECT
-#include <libm-alias-float.h>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
+# define NO_MATH_REDIRECT
+# include <libm-alias-float.h>
 
-#define truncf __redirect_truncf
-#define __truncf __redirect___truncf
-#include <math.h>
-#undef truncf
-#undef __truncf
+# define truncf __redirect_truncf
+# define __truncf __redirect___truncf
+# include <math.h>
+# undef truncf
+# undef __truncf
 
-#define SYMBOL_NAME truncf
-#include "ifunc-sse4_1.h"
+# define SYMBOL_NAME truncf
+# include "ifunc-sse4_1.h"
 
 libc_ifunc_redirected (__redirect_truncf, __truncf, IFUNC_SELECTOR ());
 libm_alias_float (__trunc, trunc)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/w_exp.c b/sysdeps/x86_64/fpu/multiarch/w_exp.c
index 27eee98a0a..3584187e0e 100644
--- a/sysdeps/x86_64/fpu/multiarch/w_exp.c
+++ b/sysdeps/x86_64/fpu/multiarch/w_exp.c
@@ -1 +1,6 @@ 
-#include <sysdeps/../math/w_exp.c>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL >= AVX2_X86_ISA_LEVEL
+# include <sysdeps/ieee754/dbl-64/w_exp.c>
+#else
+# include <sysdeps/../math/w_exp.c>
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/w_log.c b/sysdeps/x86_64/fpu/multiarch/w_log.c
index 9b2b018711..414ca3ca3d 100644
--- a/sysdeps/x86_64/fpu/multiarch/w_log.c
+++ b/sysdeps/x86_64/fpu/multiarch/w_log.c
@@ -1 +1,6 @@ 
-#include <sysdeps/../math/w_log.c>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL >= AVX2_X86_ISA_LEVEL
+# include <sysdeps/ieee754/dbl-64/w_log.c>
+#else
+# include <sysdeps/../math/w_log.c>
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/w_pow.c b/sysdeps/x86_64/fpu/multiarch/w_pow.c
index b50c1988de..d5fcc4f871 100644
--- a/sysdeps/x86_64/fpu/multiarch/w_pow.c
+++ b/sysdeps/x86_64/fpu/multiarch/w_pow.c
@@ -1 +1,6 @@ 
-#include <sysdeps/../math/w_pow.c>
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL >= AVX2_X86_ISA_LEVEL
+# include <sysdeps/ieee754/dbl-64/w_pow.c>
+#else
+# include <sysdeps/../math/w_pow.c>
+#endif