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

Message ID 20240224023553.3804579-1-skpgkp2@gmail.com
State Committed
Headers
Series [v2] 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 success Testing passed
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_glibc_check--master-arm success Testing passed

Commit Message

Sunil Pandey Feb. 24, 2024, 2:35 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 v1:

Replace AVX2 and FMA feature check with ISA level.
Replace SSE4_1 feature check with ISA level.
---
 sysdeps/x86/configure                         |  31 ++++
 sysdeps/x86/configure.ac                      |  23 +++
 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, 950 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. 24, 2024, 2:30 p.m. UTC | #1
On Fri, Feb 23, 2024 at 6:36 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 v1:
>
> Replace AVX2 and FMA feature check with ISA level.
> Replace SSE4_1 feature check with ISA level.
> ---
>  sysdeps/x86/configure                         |  31 ++++
>  sysdeps/x86/configure.ac                      |  23 +++
>  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, 950 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_64/fpu/multiarch/e_asin.c b/sysdeps/x86_64/fpu/multiarch/e_asin.c
> index 2eaa6c2c04..611539344d 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 < 3

Please use AVX_X86_ISA_LEVEL instead of 3.

> +# 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..fcc239b17e 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 < 3
> +# 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..3888452375 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 < 3
> +# 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..b30a49f376 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 < 3
> +# 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..c63d39cf25 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 < 3
> +# 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..4b3d7fd279 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 < 3
> +# 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..19932d42a3 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 < 3
> +# 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..a1c12525bd 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 < 3
> +# 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..0de0201e87 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 < 3
> +# 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..b71ade9c85 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 < 3
> +# 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..7bf518f673 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 < 3
> +# 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..1d2eb04c22 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 < 3
> +# 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..a5fd521c79 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 == 2
> +# 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 == 2
> +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..9e12011123 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 < 2
> +# 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..f50610be06 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 == 2
> +# 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 == 2
> +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..520875c950 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 < 2
> +# 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..3535d681ec 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 < 3
> +# 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..0227583a70 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 < 3
> +# 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..ee91c9ed93 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 == 2
> +# 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 == 2
> +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..fd7e80cb51 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 < 2
> +# 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..4398c0af74 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 == 2
> +# 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 == 2
> +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..b23fd404b6 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 < 2
> +# 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..8664a38b8d 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 < 3
> +# 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..b38cf624c9 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 == 2
> +# 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 == 2
> +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..1e8affe486 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 < 2
> +# 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..e41bb46f1a 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 == 2
> +# 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 == 2
> +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..522387cf30 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 < 2
> +# 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..c025b494e7 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 == 2
> +# 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 == 2
> +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..0ffcd4bb74 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 < 2
> +# 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..ee86e0d571 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 == 2
> +# 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 == 2
> +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..d7e1735fad 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 < 2
> +# 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..ba39049e66 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 == 2
> +# 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 == 2
> +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..c6c2cd0b61 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 < 2
> +# 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..3ab131fc08 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 == 2
> +# 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 == 2
> +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..3a982db07e 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 < 2
> +# 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..9798ba8b4a 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 < 3
> +# 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..b727628dcc 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 < 3
> +# 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..0589458c38 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 < 3
> +# 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..f01d2270ce 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 < 3
> +# 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..95cd2b7364 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 < 3
> +# 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..5a5436fe1f 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 == 2
> +# 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 == 2
> +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..f74cdcf043 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 < 2
> +# 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..bdad416705 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 == 2
> +# 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 == 2
> +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..5ce2368043 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 < 2
> +# 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..52556de7f7 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 >= 3
> +# 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..f69fbd5e8e 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 >= 3
> +# 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..994c5557b1 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 >= 3
> +# include <sysdeps/ieee754/dbl-64/w_pow.c>
> +#else
> +# include <sysdeps/../math/w_pow.c>
> +#endif
> --
> 2.43.0
>
  
H.J. Lu Feb. 24, 2024, 2:55 p.m. UTC | #2
On Sat, Feb 24, 2024 at 6:30 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Fri, Feb 23, 2024 at 6:36 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 v1:
> >
> > Replace AVX2 and FMA feature check with ISA level.
> > Replace SSE4_1 feature check with ISA level.
> > ---
> >  sysdeps/x86/configure                         |  31 ++++
> >  sysdeps/x86/configure.ac                      |  23 +++
> >  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, 950 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_64/fpu/multiarch/e_asin.c b/sysdeps/x86_64/fpu/multiarch/e_asin.c
> > index 2eaa6c2c04..611539344d 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 < 3
>
> Please use AVX_X86_ISA_LEVEL instead of 3.
>
> > +# 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..fcc239b17e 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 < 3
> > +# 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..3888452375 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 < 3
> > +# 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..b30a49f376 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 < 3
> > +# 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..c63d39cf25 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 < 3
> > +# 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..4b3d7fd279 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 < 3
> > +# 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..19932d42a3 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 < 3
> > +# 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..a1c12525bd 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 < 3
> > +# 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..0de0201e87 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 < 3
> > +# 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..b71ade9c85 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 < 3
> > +# 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..7bf518f673 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 < 3
> > +# 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..1d2eb04c22 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 < 3
> > +# 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..a5fd521c79 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 == 2
> > +# 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 == 2
> > +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..9e12011123 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 < 2

Use SSE4_1_X86_ISA_LEVEL instead of 2.

> > +# 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..f50610be06 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 == 2
> > +# 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 == 2
> > +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..520875c950 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 < 2
> > +# 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..3535d681ec 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 < 3
> > +# 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..0227583a70 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 < 3
> > +# 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..ee91c9ed93 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 == 2
> > +# 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 == 2
> > +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..fd7e80cb51 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 < 2
> > +# 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..4398c0af74 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 == 2
> > +# 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 == 2
> > +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..b23fd404b6 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 < 2
> > +# 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..8664a38b8d 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 < 3
> > +# 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..b38cf624c9 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 == 2
> > +# 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 == 2
> > +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..1e8affe486 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 < 2
> > +# 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..e41bb46f1a 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 == 2
> > +# 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 == 2
> > +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..522387cf30 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 < 2
> > +# 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..c025b494e7 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 == 2
> > +# 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 == 2
> > +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..0ffcd4bb74 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 < 2
> > +# 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..ee86e0d571 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 == 2
> > +# 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 == 2
> > +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..d7e1735fad 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 < 2
> > +# 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..ba39049e66 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 == 2
> > +# 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 == 2
> > +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..c6c2cd0b61 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 < 2
> > +# 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..3ab131fc08 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 == 2
> > +# 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 == 2
> > +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..3a982db07e 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 < 2
> > +# 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..9798ba8b4a 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 < 3
> > +# 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..b727628dcc 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 < 3
> > +# 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..0589458c38 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 < 3
> > +# 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..f01d2270ce 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 < 3
> > +# 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..95cd2b7364 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 < 3
> > +# 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..5a5436fe1f 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 == 2
> > +# 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 == 2
> > +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..f74cdcf043 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 < 2
> > +# 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..bdad416705 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 == 2
> > +# 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 == 2
> > +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..5ce2368043 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 < 2
> > +# 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..52556de7f7 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 >= 3
> > +# 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..f69fbd5e8e 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 >= 3
> > +# 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..994c5557b1 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 >= 3
> > +# include <sysdeps/ieee754/dbl-64/w_pow.c>
> > +#else
> > +# include <sysdeps/../math/w_pow.c>
> > +#endif
> > --
> > 2.43.0
> >
>
>
> --
> H.J.
  
H.J. Lu Feb. 24, 2024, 4:23 p.m. UTC | #3
On Fri, Feb 23, 2024 at 6:36 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 v1:
>
> Replace AVX2 and FMA feature check with ISA level.
> Replace SSE4_1 feature check with ISA level.
> ---
>  sysdeps/x86/configure                         |  31 ++++
>  sysdeps/x86/configure.ac                      |  23 +++
>  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, 950 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_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile
> index e1a490dd98..91ac85012b 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 4
> +ifneq (,$(filter $(have-x86-isa-level),3 4))
>  libm-sysdep_routines += \

If we add ISA level 5 and compile glibc with ISA level 5, this won't work.
It is specially bad for release branches.  Glibc release branches should
compile properly without any changes when glibc is built with
-march=x86-64-v5.

H.J.
  
H.J. Lu Feb. 24, 2024, 4:27 p.m. UTC | #4
On Sat, Feb 24, 2024 at 8:23 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Fri, Feb 23, 2024 at 6:36 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 v1:
> >
> > Replace AVX2 and FMA feature check with ISA level.
> > Replace SSE4_1 feature check with ISA level.
> > ---
> >  sysdeps/x86/configure                         |  31 ++++
> >  sysdeps/x86/configure.ac                      |  23 +++
> >  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, 950 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_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile
> > index e1a490dd98..91ac85012b 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 4
> > +ifneq (,$(filter $(have-x86-isa-level),3 4))
> >  libm-sysdep_routines += \
>
> If we add ISA level 5 and compile glibc with ISA level 5, this won't work.
> It is specially bad for release branches.  Glibc release branches should
> compile properly without any changes when glibc is built with
> -march=x86-64-v5.
>

Glibc release branches are OK.  But when level 5 support is added, we
have to change many places in Makefiles where have-x86-isa-level is used.
I think we should avoid it.
  
Sunil Pandey Feb. 24, 2024, 10:23 p.m. UTC | #5
On Sat, Feb 24, 2024 at 8:27 AM H.J. Lu <hjl.tools@gmail.com> wrote:

> On Sat, Feb 24, 2024 at 8:23 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> >
> > On Fri, Feb 23, 2024 at 6:36 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 v1:
> > >
> > > Replace AVX2 and FMA feature check with ISA level.
> > > Replace SSE4_1 feature check with ISA level.
> > > ---
> > >  sysdeps/x86/configure                         |  31 ++++
> > >  sysdeps/x86/configure.ac                      |  23 +++
> > >  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, 950 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_64/fpu/multiarch/Makefile
> b/sysdeps/x86_64/fpu/multiarch/Makefile
> > > index e1a490dd98..91ac85012b 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 4
> > > +ifneq (,$(filter $(have-x86-isa-level),3 4))
> > >  libm-sysdep_routines += \
> >
> > If we add ISA level 5 and compile glibc with ISA level 5, this won't
> work.
> > It is specially bad for release branches.  Glibc release branches should
> > compile properly without any changes when glibc is built with
> > -march=x86-64-v5.
> >
>
> Glibc release branches are OK.  But when level 5 support is added, we
> have to change many places in Makefiles where have-x86-isa-level is used.
> I think we should avoid it.
>
>
have-x86-isa-level used in only one makefile in this patch.

sysdeps/x86_64/fpu/multiarch/Makefile:ifneq (,$(filter
$(have-x86-isa-level),3 4))
sysdeps/x86_64/fpu/multiarch/Makefile:ifeq ($(have-x86-isa-level),baseline)
  

Patch

diff --git a/sysdeps/x86/configure b/sysdeps/x86/configure
index 1f4c2d67fd..d61f673d26 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,8 +121,38 @@  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
 enable-x86-isa-level = $libc_cv_include_x86_isa_level"
 
diff --git a/sysdeps/x86/configure.ac b/sysdeps/x86/configure.ac
index 437a50623b..b462a687e8 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,30 @@  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([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..91ac85012b 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 4
+ifneq (,$(filter $(have-x86-isa-level),3 4))
 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..611539344d 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 < 3
+# 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..fcc239b17e 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 < 3
+# 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..3888452375 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 < 3
+# 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..b30a49f376 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 < 3
+# 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..c63d39cf25 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 < 3
+# 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..4b3d7fd279 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 < 3
+# 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..19932d42a3 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 < 3
+# 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..a1c12525bd 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 < 3
+# 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..0de0201e87 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 < 3
+# 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..b71ade9c85 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 < 3
+# 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..7bf518f673 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 < 3
+# 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..1d2eb04c22 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 < 3
+# 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..a5fd521c79 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 == 2
+# 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 == 2
+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..9e12011123 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 < 2
+# 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..f50610be06 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 == 2
+# 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 == 2
+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..520875c950 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 < 2
+# 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..3535d681ec 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 < 3
+# 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..0227583a70 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 < 3
+# 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..ee91c9ed93 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 == 2
+# 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 == 2
+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..fd7e80cb51 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 < 2
+# 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..4398c0af74 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 == 2
+# 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 == 2
+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..b23fd404b6 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 < 2
+# 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..8664a38b8d 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 < 3
+# 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..b38cf624c9 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 == 2
+# 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 == 2
+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..1e8affe486 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 < 2
+# 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..e41bb46f1a 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 == 2
+# 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 == 2
+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..522387cf30 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 < 2
+# 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..c025b494e7 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 == 2
+# 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 == 2
+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..0ffcd4bb74 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 < 2
+# 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..ee86e0d571 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 == 2
+# 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 == 2
+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..d7e1735fad 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 < 2
+# 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..ba39049e66 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 == 2
+# 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 == 2
+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..c6c2cd0b61 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 < 2
+# 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..3ab131fc08 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 == 2
+# 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 == 2
+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..3a982db07e 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 < 2
+# 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..9798ba8b4a 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 < 3
+# 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..b727628dcc 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 < 3
+# 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..0589458c38 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 < 3
+# 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..f01d2270ce 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 < 3
+# 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..95cd2b7364 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 < 3
+# 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..5a5436fe1f 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 == 2
+# 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 == 2
+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..f74cdcf043 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 < 2
+# 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..bdad416705 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 == 2
+# 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 == 2
+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..5ce2368043 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 < 2
+# 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..52556de7f7 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 >= 3
+# 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..f69fbd5e8e 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 >= 3
+# 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..994c5557b1 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 >= 3
+# include <sysdeps/ieee754/dbl-64/w_pow.c>
+#else
+# include <sysdeps/../math/w_pow.c>
+#endif