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

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

Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
This commit is contained in:
Sunil K Pandey 2024-02-13 12:23:14 -08:00
parent f31d677fd6
commit 9f78a7c1d0
62 changed files with 972 additions and 314 deletions

33
sysdeps/x86/configure vendored
View File

@ -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,40 @@ printf "%s\n" "$libc_cv_have_x86_movbe" >&6; }
if test $libc_cv_have_x86_movbe = yes; then
printf "%s\n" "#define HAVE_X86_MOVBE 1" >>confdefs.h
ISAFLAG="$ISAFLAG -DHAVE_X86_MOVBE"
fi
# Check for ISA level support.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ISA level support" >&5
printf %s "checking for ISA level support... " >&6; }
if test ${libc_cv_have_x86_isa_level+y}
then :
printf %s "(cached) " >&6
else $as_nop
cat > conftest.c <<EOF
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL >= 4
libc_cv_have_x86_isa_level=4
#elif MINIMUM_X86_ISA_LEVEL == 3
libc_cv_have_x86_isa_level=3
#elif MINIMUM_X86_ISA_LEVEL == 2
libc_cv_have_x86_isa_level=2
#else
libc_cv_have_x86_isa_level=baseline
#endif
EOF
eval `${CC-cc} $CFLAGS $CPPFLAGS $ISAFLAG -I$srcdir -E conftest.c | grep libc_cv_have_x86_isa_level`
rm -rf conftest*
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_x86_isa_level" >&5
printf "%s\n" "$libc_cv_have_x86_isa_level" >&6; }
else
libc_cv_have_x86_isa_level=baseline
fi
config_vars="$config_vars
have-x86-isa-level = $libc_cv_have_x86_isa_level"
config_vars="$config_vars
x86-isa-level-3-or-above = 3 4"
config_vars="$config_vars
enable-x86-isa-level = $libc_cv_include_x86_isa_level"

View File

@ -72,6 +72,7 @@ if test $libc_cv_include_x86_isa_level = yes; then
fi])
if test $libc_cv_have_x86_lahf_sahf = yes; then
AC_DEFINE(HAVE_X86_LAHF_SAHF)
ISAFLAG="-DHAVE_X86_LAHF_SAHF"
fi
AC_CACHE_CHECK([for MOVBE instruction support],
libc_cv_have_x86_movbe, [dnl
@ -81,8 +82,31 @@ if test $libc_cv_include_x86_isa_level = yes; then
fi])
if test $libc_cv_have_x86_movbe = yes; then
AC_DEFINE(HAVE_X86_MOVBE)
ISAFLAG="$ISAFLAG -DHAVE_X86_MOVBE"
fi
# Check for ISA level support.
AC_CACHE_CHECK([for ISA level support],
libc_cv_have_x86_isa_level, [dnl
cat > conftest.c <<EOF
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL >= 4
libc_cv_have_x86_isa_level=4
#elif MINIMUM_X86_ISA_LEVEL == 3
libc_cv_have_x86_isa_level=3
#elif MINIMUM_X86_ISA_LEVEL == 2
libc_cv_have_x86_isa_level=2
#else
libc_cv_have_x86_isa_level=baseline
#endif
EOF
eval `${CC-cc} $CFLAGS $CPPFLAGS $ISAFLAG -I$srcdir -E conftest.c | grep libc_cv_have_x86_isa_level`
rm -rf conftest*])
else
libc_cv_have_x86_isa_level=baseline
fi
LIBC_CONFIG_VAR([have-x86-isa-level], [$libc_cv_have_x86_isa_level])
LIBC_CONFIG_VAR([x86-isa-level-3-or-above], [3 4])
LIBC_CONFIG_VAR([enable-x86-isa-level], [$libc_cv_include_x86_isa_level])
dnl Static PIE is supported.

View File

@ -1,4 +1,97 @@
ifeq ($(subdir),math)
CFLAGS-e_asin-fma.c = -mfma -mavx2
CFLAGS-e_atan2-fma.c = -mfma -mavx2
CFLAGS-e_exp-fma.c = -mfma -mavx2
CFLAGS-e_log-fma.c = -mfma -mavx2
CFLAGS-e_log2-fma.c = -mfma -mavx2
CFLAGS-e_pow-fma.c = -mfma -mavx2
CFLAGS-s_atan-fma.c = -mfma -mavx2
CFLAGS-s_expm1-fma.c = -mfma -mavx2
CFLAGS-s_log1p-fma.c = -mfma -mavx2
CFLAGS-s_sin-fma.c = -mfma -mavx2
CFLAGS-s_tan-fma.c = -mfma -mavx2
CFLAGS-s_sincos-fma.c = -mfma -mavx2
CFLAGS-e_exp2f-fma.c = -mfma -mavx2
CFLAGS-e_expf-fma.c = -mfma -mavx2
CFLAGS-e_log2f-fma.c = -mfma -mavx2
CFLAGS-e_logf-fma.c = -mfma -mavx2
CFLAGS-e_powf-fma.c = -mfma -mavx2
CFLAGS-s_sinf-fma.c = -mfma -mavx2
CFLAGS-s_cosf-fma.c = -mfma -mavx2
CFLAGS-s_sincosf-fma.c = -mfma -mavx2
# Check if ISA level is 3 or above.
ifneq (,$(filter $(have-x86-isa-level),$(x86-isa-level-3-or-above)))
libm-sysdep_routines += \
s_ceil-avx \
s_ceilf-avx \
s_floor-avx \
s_floorf-avx \
s_nearbyint-avx \
s_nearbyintf-avx \
s_rint-avx \
s_rintf-avx \
s_roundeven-avx \
s_roundevenf-avx \
s_trunc-avx \
s_truncf-avx \
# libm-sysdep_routines
else
libm-sysdep_routines += \
e_asin-fma \
e_asin-fma4 \
e_atan2-avx \
e_atan2-fma \
e_atan2-fma4 \
e_exp-avx \
e_exp-fma \
e_exp-fma4 \
e_exp2f-fma \
e_expf-fma \
e_log-avx \
e_log-fma \
e_log-fma4 \
e_log2-fma \
e_log2f-fma \
e_logf-fma \
e_pow-fma \
e_pow-fma4 \
e_powf-fma \
s_atan-avx \
s_atan-fma \
s_atan-fma4 \
s_ceil-sse4_1 \
s_ceilf-sse4_1 \
s_cosf-fma \
s_cosf-sse2 \
s_expm1-fma \
s_floor-sse4_1 \
s_floorf-sse4_1 \
s_log1p-fma \
s_nearbyint-sse4_1 \
s_nearbyintf-sse4_1 \
s_rint-sse4_1 \
s_rintf-sse4_1 \
s_roundeven-sse4_1 \
s_roundevenf-sse4_1 \
s_sin-avx \
s_sin-fma \
s_sin-fma4 \
s_sincos-avx \
s_sincos-fma \
s_sincos-fma4 \
s_sincosf-fma \
s_sincosf-sse2 \
s_sinf-fma \
s_sinf-sse2 \
s_tan-avx \
s_tan-fma \
s_tan-fma4 \
s_trunc-sse4_1 \
s_truncf-sse4_1 \
# libm-sysdep_routines
ifeq ($(have-x86-isa-level),baseline)
libm-sysdep_routines += \
s_ceil-c \
s_ceilf-c \
@ -13,87 +106,8 @@ libm-sysdep_routines += \
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
CFLAGS-e_log-fma.c = -mfma -mavx2
CFLAGS-e_log2-fma.c = -mfma -mavx2
CFLAGS-e_pow-fma.c = -mfma -mavx2
CFLAGS-s_atan-fma.c = -mfma -mavx2
CFLAGS-s_expm1-fma.c = -mfma -mavx2
CFLAGS-s_log1p-fma.c = -mfma -mavx2
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
CFLAGS-e_logf-fma.c = -mfma -mavx2
CFLAGS-e_powf-fma.c = -mfma -mavx2
CFLAGS-s_sinf-fma.c = -mfma -mavx2
CFLAGS-s_cosf-fma.c = -mfma -mavx2
CFLAGS-s_sincosf-fma.c = -mfma -mavx2
libm-sysdep_routines += \
e_asin-fma4 \
e_atan2-fma4 \
e_exp-fma4 \
e_log-fma4 \
e_pow-fma4 \
s_atan-fma4 \
s_sin-fma4 \
s_sincos-fma4 \
s_tan-fma4 \
# 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

View File

@ -16,26 +16,29 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-finite.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-finite.h>
extern double __redirect_ieee754_asin (double);
extern double __redirect_ieee754_acos (double);
#define SYMBOL_NAME ieee754_asin
#include "ifunc-fma4.h"
# define SYMBOL_NAME ieee754_asin
# include "ifunc-fma4.h"
libc_ifunc_redirected (__redirect_ieee754_asin, __ieee754_asin,
IFUNC_SELECTOR ());
libm_alias_finite (__ieee754_asin, __asin)
#undef SYMBOL_NAME
#define SYMBOL_NAME ieee754_acos
#include "ifunc-fma4.h"
# undef SYMBOL_NAME
# define SYMBOL_NAME ieee754_acos
# include "ifunc-fma4.h"
libc_ifunc_redirected (__redirect_ieee754_acos, __ieee754_acos,
IFUNC_SELECTOR ());
libm_alias_finite (__ieee754_acos, __acos)
#define __ieee754_acos __ieee754_acos_sse2
#define __ieee754_asin __ieee754_asin_sse2
# define __ieee754_acos __ieee754_acos_sse2
# define __ieee754_asin __ieee754_asin_sse2
#endif
#include <sysdeps/ieee754/dbl-64/e_asin.c>

View File

@ -16,16 +16,19 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-finite.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-finite.h>
extern double __redirect_ieee754_atan2 (double, double);
#define SYMBOL_NAME ieee754_atan2
#include "ifunc-avx-fma4.h"
# define SYMBOL_NAME ieee754_atan2
# include "ifunc-avx-fma4.h"
libc_ifunc_redirected (__redirect_ieee754_atan2,
__ieee754_atan2, IFUNC_SELECTOR ());
libm_alias_finite (__ieee754_atan2, __atan2)
#define __ieee754_atan2 __ieee754_atan2_sse2
# define __ieee754_atan2 __ieee754_atan2_sse2
#endif
#include <sysdeps/ieee754/dbl-64/e_atan2.c>

View File

@ -16,17 +16,20 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <math.h>
#include <libm-alias-finite.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <math.h>
# include <libm-alias-finite.h>
extern double __redirect_ieee754_exp (double);
#define SYMBOL_NAME ieee754_exp
#include "ifunc-avx-fma4.h"
# define SYMBOL_NAME ieee754_exp
# include "ifunc-avx-fma4.h"
libc_ifunc_redirected (__redirect_ieee754_exp, __ieee754_exp,
IFUNC_SELECTOR ());
libm_alias_finite (__ieee754_exp, __exp)
#define __exp __ieee754_exp_sse2
# define __exp __ieee754_exp_sse2
#endif
#include <sysdeps/ieee754/dbl-64/e_exp.c>

View File

@ -16,25 +16,28 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-float.h>
#include <libm-alias-finite.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-float.h>
# include <libm-alias-finite.h>
extern float __redirect_exp2f (float);
#define SYMBOL_NAME exp2f
#include "ifunc-fma.h"
# define SYMBOL_NAME exp2f
# include "ifunc-fma.h"
libc_ifunc_redirected (__redirect_exp2f, __exp2f, IFUNC_SELECTOR ());
#ifdef SHARED
# ifdef SHARED
versioned_symbol (libm, __ieee754_exp2f, exp2f, GLIBC_2_27);
libm_alias_float_other (__exp2, exp2)
#else
# else
libm_alias_float (__exp2, exp2)
#endif
# endif
strong_alias (__exp2f, __ieee754_exp2f)
libm_alias_finite (__exp2f, __exp2f)
#define __exp2f __exp2f_sse2
# define __exp2f __exp2f_sse2
#endif
#include <sysdeps/ieee754/flt-32/e_exp2f.c>

View File

@ -16,28 +16,31 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-float.h>
#include <libm-alias-finite.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-float.h>
# include <libm-alias-finite.h>
extern float __redirect_expf (float);
#define SYMBOL_NAME expf
#include "ifunc-fma.h"
# define SYMBOL_NAME expf
# include "ifunc-fma.h"
libc_ifunc_redirected (__redirect_expf, __expf, IFUNC_SELECTOR ());
#ifdef SHARED
# ifdef SHARED
__hidden_ver1 (__expf, __GI___expf, __redirect_expf)
__attribute__ ((visibility ("hidden")));
versioned_symbol (libm, __ieee754_expf, expf, GLIBC_2_27);
libm_alias_float_other (__exp, exp)
#else
# else
libm_alias_float (__exp, exp)
#endif
# endif
strong_alias (__expf, __ieee754_expf)
libm_alias_finite (__expf, __expf)
#define __expf __expf_sse2
# define __expf __expf_sse2
#endif
#include <sysdeps/ieee754/flt-32/e_expf.c>

View File

@ -16,17 +16,20 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <math.h>
#include <libm-alias-finite.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <math.h>
# include <libm-alias-finite.h>
extern double __redirect_ieee754_log (double);
#define SYMBOL_NAME ieee754_log
#include "ifunc-avx-fma4.h"
# define SYMBOL_NAME ieee754_log
# include "ifunc-avx-fma4.h"
libc_ifunc_redirected (__redirect_ieee754_log, __ieee754_log,
IFUNC_SELECTOR ());
libm_alias_finite (__ieee754_log, __log)
#define __log __ieee754_log_sse2
# define __log __ieee754_log_sse2
#endif
#include <sysdeps/ieee754/dbl-64/e_log.c>

View File

@ -16,28 +16,31 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-double.h>
#include <libm-alias-finite.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-double.h>
# include <libm-alias-finite.h>
extern double __redirect_log2 (double);
#define SYMBOL_NAME log2
#include "ifunc-fma.h"
# define SYMBOL_NAME log2
# include "ifunc-fma.h"
libc_ifunc_redirected (__redirect_log2, __log2, IFUNC_SELECTOR ());
#ifdef SHARED
# ifdef SHARED
__hidden_ver1 (__log2, __GI___log2, __redirect_log2)
__attribute__ ((visibility ("hidden")));
versioned_symbol (libm, __ieee754_log2, log2, GLIBC_2_29);
libm_alias_double_other (__log2, log2)
#else
# else
libm_alias_double (__log2, log2)
#endif
# endif
strong_alias (__log2, __ieee754_log2)
libm_alias_finite (__log2, __log2)
#define __log2 __log2_sse2
# define __log2 __log2_sse2
#endif
#include <sysdeps/ieee754/dbl-64/e_log2.c>

View File

@ -16,28 +16,31 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-float.h>
#include <libm-alias-finite.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-float.h>
# include <libm-alias-finite.h>
extern float __redirect_log2f (float);
#define SYMBOL_NAME log2f
#include "ifunc-fma.h"
# define SYMBOL_NAME log2f
# include "ifunc-fma.h"
libc_ifunc_redirected (__redirect_log2f, __log2f, IFUNC_SELECTOR ());
#ifdef SHARED
# ifdef SHARED
__hidden_ver1 (__log2f, __GI___log2f, __redirect_log2f)
__attribute__ ((visibility ("hidden")));
versioned_symbol (libm, __ieee754_log2f, log2f, GLIBC_2_27);
libm_alias_float_other (__log2, log2)
#else
# else
libm_alias_float (__log2, log2)
#endif
# endif
strong_alias (__log2f, __ieee754_log2f)
libm_alias_finite (__log2f, __log2f)
#define __log2f __log2f_sse2
# define __log2f __log2f_sse2
#endif
#include <sysdeps/ieee754/flt-32/e_log2f.c>

View File

@ -16,28 +16,31 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-float.h>
#include <libm-alias-finite.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-float.h>
# include <libm-alias-finite.h>
extern float __redirect_logf (float);
#define SYMBOL_NAME logf
#include "ifunc-fma.h"
# define SYMBOL_NAME logf
# include "ifunc-fma.h"
libc_ifunc_redirected (__redirect_logf, __logf, IFUNC_SELECTOR ());
#ifdef SHARED
# ifdef SHARED
__hidden_ver1 (__logf, __GI___logf, __redirect_logf)
__attribute__ ((visibility ("hidden")));
versioned_symbol (libm, __ieee754_logf, logf, GLIBC_2_27);
libm_alias_float_other (__log, log)
#else
# else
libm_alias_float (__log, log)
#endif
# endif
strong_alias (__logf, __ieee754_logf)
libm_alias_finite (__logf, __logf)
#define __logf __logf_sse2
# define __logf __logf_sse2
#endif
#include <sysdeps/ieee754/flt-32/e_logf.c>

View File

@ -16,17 +16,20 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <math.h>
#include <libm-alias-finite.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <math.h>
# include <libm-alias-finite.h>
extern double __redirect_ieee754_pow (double, double);
#define SYMBOL_NAME ieee754_pow
#include "ifunc-fma4.h"
# define SYMBOL_NAME ieee754_pow
# include "ifunc-fma4.h"
libc_ifunc_redirected (__redirect_ieee754_pow,
__ieee754_pow, IFUNC_SELECTOR ());
libm_alias_finite (__ieee754_pow, __pow)
#define __pow __ieee754_pow_sse2
# define __pow __ieee754_pow_sse2
#endif
#include <sysdeps/ieee754/dbl-64/e_pow.c>

View File

@ -16,31 +16,34 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-float.h>
#include <libm-alias-finite.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-float.h>
# include <libm-alias-finite.h>
#define powf __redirect_powf
#define __DECL_SIMD___redirect_powf
#include <math.h>
#undef powf
# define powf __redirect_powf
# define __DECL_SIMD___redirect_powf
# include <math.h>
# undef powf
#define SYMBOL_NAME powf
#include "ifunc-fma.h"
# define SYMBOL_NAME powf
# include "ifunc-fma.h"
libc_ifunc_redirected (__redirect_powf, __powf, IFUNC_SELECTOR ());
#ifdef SHARED
# ifdef SHARED
__hidden_ver1 (__powf, __GI___powf, __redirect_powf)
__attribute__ ((visibility ("hidden")));
versioned_symbol (libm, __ieee754_powf, powf, GLIBC_2_27);
libm_alias_float_other (__pow, pow)
#else
# else
libm_alias_float (__pow, pow)
#endif
# endif
strong_alias (__powf, __ieee754_powf)
libm_alias_finite (__powf, __powf)
#define __powf __powf_sse2
# define __powf __powf_sse2
#endif
#include <sysdeps/ieee754/flt-32/e_powf.c>

View File

@ -16,15 +16,18 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-double.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-double.h>
extern double __redirect_atan (double);
#define SYMBOL_NAME atan
#include "ifunc-avx-fma4.h"
# define SYMBOL_NAME atan
# include "ifunc-avx-fma4.h"
libc_ifunc_redirected (__redirect_atan, __atan, IFUNC_SELECTOR ());
libm_alias_double (__atan, atan)
#define __atan __atan_sse2
# define __atan __atan_sse2
#endif
#include <sysdeps/ieee754/dbl-64/s_atan.c>

View File

@ -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)

View File

@ -17,8 +17,20 @@
#include <sysdep.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
# include <libm-alias-double.h>
# define __ceil_sse41 __ceil
.text
#else
.section .text.sse4.1,"ax",@progbits
#endif
ENTRY(__ceil_sse41)
roundsd $10, %xmm0, %xmm0
ret
END(__ceil_sse41)
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
libm_alias_double (__ceil, ceil)
#endif

View File

@ -16,17 +16,20 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#define NO_MATH_REDIRECT
#include <libm-alias-double.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
# define NO_MATH_REDIRECT
# include <libm-alias-double.h>
#define ceil __redirect_ceil
#define __ceil __redirect___ceil
#include <math.h>
#undef ceil
#undef __ceil
# define ceil __redirect_ceil
# define __ceil __redirect___ceil
# include <math.h>
# undef ceil
# undef __ceil
#define SYMBOL_NAME ceil
#include "ifunc-sse4_1.h"
# define SYMBOL_NAME ceil
# include "ifunc-sse4_1.h"
libc_ifunc_redirected (__redirect_ceil, __ceil, IFUNC_SELECTOR ());
libm_alias_double (__ceil, ceil)
#endif

View File

@ -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)

View File

@ -17,8 +17,20 @@
#include <sysdep.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
# include <libm-alias-float.h>
# define __ceilf_sse41 __ceilf
.text
#else
.section .text.sse4.1,"ax",@progbits
#endif
ENTRY(__ceilf_sse41)
roundss $10, %xmm0, %xmm0
ret
END(__ceilf_sse41)
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
libm_alias_float (__ceil, ceil)
#endif

View File

@ -16,17 +16,20 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#define NO_MATH_REDIRECT
#include <libm-alias-float.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
# define NO_MATH_REDIRECT
# include <libm-alias-float.h>
#define ceilf __redirect_ceilf
#define __ceilf __redirect___ceilf
#include <math.h>
#undef ceilf
#undef __ceilf
# define ceilf __redirect_ceilf
# define __ceilf __redirect___ceilf
# include <math.h>
# undef ceilf
# undef __ceilf
#define SYMBOL_NAME ceilf
#include "ifunc-sse4_1.h"
# define SYMBOL_NAME ceilf
# include "ifunc-sse4_1.h"
libc_ifunc_redirected (__redirect_ceilf, __ceilf, IFUNC_SELECTOR ());
libm_alias_float (__ceil, ceil)
#endif

View File

@ -16,13 +16,18 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-float.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-float.h>
extern float __redirect_cosf (float);
#define SYMBOL_NAME cosf
#include "ifunc-fma.h"
# define SYMBOL_NAME cosf
# include "ifunc-fma.h"
libc_ifunc_redirected (__redirect_cosf, __cosf, IFUNC_SELECTOR ());
libm_alias_float (__cos, cos)
#else
# include <sysdeps/ieee754/flt-32/s_cosf.c>
#endif

View File

@ -16,21 +16,24 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-double.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-double.h>
extern double __redirect_expm1 (double);
#define SYMBOL_NAME expm1
#include "ifunc-fma.h"
# define SYMBOL_NAME expm1
# include "ifunc-fma.h"
libc_ifunc_redirected (__redirect_expm1, __expm1, IFUNC_SELECTOR ());
libm_alias_double (__expm1, expm1)
#define __expm1 __expm1_sse2
# define __expm1 __expm1_sse2
/* NB: __expm1 may be expanded to __expm1_sse2 in the following
prototypes. */
extern long double __expm1l (long double);
extern long double __expm1f128 (long double);
#endif
#include <sysdeps/ieee754/dbl-64/s_expm1.c>

View File

@ -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)

View File

@ -17,8 +17,20 @@
#include <sysdep.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
# include <libm-alias-double.h>
# define __floor_sse41 __floor
.text
#else
.section .text.sse4.1,"ax",@progbits
#endif
ENTRY(__floor_sse41)
roundsd $9, %xmm0, %xmm0
ret
END(__floor_sse41)
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
libm_alias_double (__floor, floor)
#endif

View File

@ -16,17 +16,20 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#define NO_MATH_REDIRECT
#include <libm-alias-double.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
# define NO_MATH_REDIRECT
# include <libm-alias-double.h>
#define floor __redirect_floor
#define __floor __redirect___floor
#include <math.h>
#undef floor
#undef __floor
# define floor __redirect_floor
# define __floor __redirect___floor
# include <math.h>
# undef floor
# undef __floor
#define SYMBOL_NAME floor
#include "ifunc-sse4_1.h"
# define SYMBOL_NAME floor
# include "ifunc-sse4_1.h"
libc_ifunc_redirected (__redirect_floor, __floor, IFUNC_SELECTOR ());
libm_alias_double (__floor, floor)
#endif

View File

@ -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)

View File

@ -17,8 +17,20 @@
#include <sysdep.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
# include <libm-alias-float.h>
# define __floorf_sse41 __floorf
.text
#else
.section .text.sse4.1,"ax",@progbits
#endif
ENTRY(__floorf_sse41)
roundss $9, %xmm0, %xmm0
ret
END(__floorf_sse41)
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
libm_alias_float (__floor, floor)
#endif

View File

@ -16,17 +16,20 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#define NO_MATH_REDIRECT
#include <libm-alias-float.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
# define NO_MATH_REDIRECT
# include <libm-alias-float.h>
#define floorf __redirect_floorf
#define __floorf __redirect___floorf
#include <math.h>
#undef floorf
#undef __floorf
# define floorf __redirect_floorf
# define __floorf __redirect___floorf
# include <math.h>
# undef floorf
# undef __floorf
#define SYMBOL_NAME floorf
#include "ifunc-sse4_1.h"
# define SYMBOL_NAME floorf
# include "ifunc-sse4_1.h"
libc_ifunc_redirected (__redirect_floorf, __floorf, IFUNC_SELECTOR ());
libm_alias_float (__floor, floor)
#endif

View File

@ -16,14 +16,17 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-double.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-double.h>
extern double __redirect_log1p (double);
#define SYMBOL_NAME log1p
#include "ifunc-fma.h"
# define SYMBOL_NAME log1p
# include "ifunc-fma.h"
libc_ifunc_redirected (__redirect_log1p, __log1p, IFUNC_SELECTOR ());
#define __log1p __log1p_sse2
# define __log1p __log1p_sse2
#endif
#include <sysdeps/ieee754/dbl-64/s_log1p.c>

View File

@ -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)

View File

@ -17,8 +17,20 @@
#include <sysdep.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
# include <libm-alias-double.h>
# define __nearbyint_sse41 __nearbyint
.text
#else
.section .text.sse4.1,"ax",@progbits
#endif
ENTRY(__nearbyint_sse41)
roundsd $0xc, %xmm0, %xmm0
ret
END(__nearbyint_sse41)
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
libm_alias_double (__nearbyint, nearbyint)
#endif

View File

@ -16,17 +16,20 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-double.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
# include <libm-alias-double.h>
#define nearbyint __redirect_nearbyint
#define __nearbyint __redirect___nearbyint
#include <math.h>
#undef nearbyint
#undef __nearbyint
# define nearbyint __redirect_nearbyint
# define __nearbyint __redirect___nearbyint
# include <math.h>
# undef nearbyint
# undef __nearbyint
#define SYMBOL_NAME nearbyint
#include "ifunc-sse4_1.h"
# define SYMBOL_NAME nearbyint
# include "ifunc-sse4_1.h"
libc_ifunc_redirected (__redirect_nearbyint, __nearbyint,
IFUNC_SELECTOR ());
libm_alias_double (__nearbyint, nearbyint)
#endif

View File

@ -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)

View File

@ -17,8 +17,20 @@
#include <sysdep.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
# include <libm-alias-float.h>
# define __nearbyintf_sse41 __nearbyintf
.text
#else
.section .text.sse4.1,"ax",@progbits
#endif
ENTRY(__nearbyintf_sse41)
roundss $0xc, %xmm0, %xmm0
ret
END(__nearbyintf_sse41)
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
libm_alias_float (__nearbyint, nearbyint)
#endif

View File

@ -16,17 +16,20 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-float.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
# include <libm-alias-float.h>
#define nearbyintf __redirect_nearbyintf
#define __nearbyintf __redirect___nearbyintf
#include <math.h>
#undef nearbyintf
#undef __nearbyintf
# define nearbyintf __redirect_nearbyintf
# define __nearbyintf __redirect___nearbyintf
# include <math.h>
# undef nearbyintf
# undef __nearbyintf
#define SYMBOL_NAME nearbyintf
#include "ifunc-sse4_1.h"
# define SYMBOL_NAME nearbyintf
# include "ifunc-sse4_1.h"
libc_ifunc_redirected (__redirect_nearbyintf, __nearbyintf,
IFUNC_SELECTOR ());
libm_alias_float (__nearbyint, nearbyint)
#endif

View File

@ -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)

View File

@ -17,8 +17,20 @@
#include <sysdep.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
# include <libm-alias-double.h>
# define __rint_sse41 __rint
.text
#else
.section .text.sse4.1,"ax",@progbits
#endif
ENTRY(__rint_sse41)
roundsd $4, %xmm0, %xmm0
ret
END(__rint_sse41)
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
libm_alias_double (__rint, rint)
#endif

View File

@ -16,17 +16,20 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#define NO_MATH_REDIRECT
#include <libm-alias-double.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
# define NO_MATH_REDIRECT
# include <libm-alias-double.h>
#define rint __redirect_rint
#define __rint __redirect___rint
#include <math.h>
#undef rint
#undef __rint
# define rint __redirect_rint
# define __rint __redirect___rint
# include <math.h>
# undef rint
# undef __rint
#define SYMBOL_NAME rint
#include "ifunc-sse4_1.h"
# define SYMBOL_NAME rint
# include "ifunc-sse4_1.h"
libc_ifunc_redirected (__redirect_rint, __rint, IFUNC_SELECTOR ());
libm_alias_double (__rint, rint)
#endif

View File

@ -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)

View File

@ -17,8 +17,20 @@
#include <sysdep.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
# include <libm-alias-float.h>
# define __rintf_sse41 __rintf
.text
#else
.section .text.sse4.1,"ax",@progbits
#endif
ENTRY(__rintf_sse41)
roundss $4, %xmm0, %xmm0
ret
END(__rintf_sse41)
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
libm_alias_float (__rint, rint)
#endif

View File

@ -16,17 +16,20 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#define NO_MATH_REDIRECT
#include <libm-alias-float.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
# define NO_MATH_REDIRECT
# include <libm-alias-float.h>
#define rintf __redirect_rintf
#define __rintf __redirect___rintf
#include <math.h>
#undef rintf
#undef __rintf
# define rintf __redirect_rintf
# define __rintf __redirect___rintf
# include <math.h>
# undef rintf
# undef __rintf
#define SYMBOL_NAME rintf
#include "ifunc-sse4_1.h"
# define SYMBOL_NAME rintf
# include "ifunc-sse4_1.h"
libc_ifunc_redirected (__redirect_rintf, __rintf, IFUNC_SELECTOR ());
libm_alias_float (__rint, rint)
#endif

View File

@ -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)

View File

@ -17,8 +17,20 @@
#include <sysdep.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
# include <libm-alias-double.h>
# define __roundeven_sse41 __roundeven
.text
#else
.section .text.sse4.1,"ax",@progbits
#endif
ENTRY(__roundeven_sse41)
roundsd $8, %xmm0, %xmm0
ret
END(__roundeven_sse41)
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
libm_alias_double (__roundeven, roundeven)
#endif

View File

@ -16,16 +16,19 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-double.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
# include <libm-alias-double.h>
#define roundeven __redirect_roundeven
#define __roundeven __redirect___roundeven
#include <math.h>
#undef roundeven
#undef __roundeven
# define roundeven __redirect_roundeven
# define __roundeven __redirect___roundeven
# include <math.h>
# undef roundeven
# undef __roundeven
#define SYMBOL_NAME roundeven
#include "ifunc-sse4_1.h"
# define SYMBOL_NAME roundeven
# include "ifunc-sse4_1.h"
libc_ifunc_redirected (__redirect_roundeven, __roundeven, IFUNC_SELECTOR ());
libm_alias_double (__roundeven, roundeven)
#endif

View File

@ -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)

View File

@ -17,8 +17,20 @@
#include <sysdep.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
# include <libm-alias-float.h>
# define __roundevenf_sse41 __roundevenf
.text
#else
.section .text.sse4.1,"ax",@progbits
#endif
ENTRY(__roundevenf_sse41)
roundss $8, %xmm0, %xmm0
ret
END(__roundevenf_sse41)
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
libm_alias_float (__roundeven, roundeven)
#endif

View File

@ -16,16 +16,19 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-float.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
# include <libm-alias-float.h>
#define roundevenf __redirect_roundevenf
#define __roundevenf __redirect___roundevenf
#include <math.h>
#undef roundevenf
#undef __roundevenf
# define roundevenf __redirect_roundevenf
# define __roundevenf __redirect___roundevenf
# include <math.h>
# undef roundevenf
# undef __roundevenf
#define SYMBOL_NAME roundevenf
#include "ifunc-sse4_1.h"
# define SYMBOL_NAME roundevenf
# include "ifunc-sse4_1.h"
libc_ifunc_redirected (__redirect_roundevenf, __roundevenf, IFUNC_SELECTOR ());
libm_alias_float (__roundeven, roundeven)
#endif

View File

@ -16,24 +16,27 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-double.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-double.h>
extern double __redirect_sin (double);
extern double __redirect_cos (double);
#define SYMBOL_NAME sin
#include "ifunc-avx-fma4.h"
# define SYMBOL_NAME sin
# include "ifunc-avx-fma4.h"
libc_ifunc_redirected (__redirect_sin, __sin, IFUNC_SELECTOR ());
libm_alias_double (__sin, sin)
#undef SYMBOL_NAME
#define SYMBOL_NAME cos
#include "ifunc-avx-fma4.h"
# undef SYMBOL_NAME
# define SYMBOL_NAME cos
# include "ifunc-avx-fma4.h"
libc_ifunc_redirected (__redirect_cos, __cos, IFUNC_SELECTOR ());
libm_alias_double (__cos, cos)
#define __cos __cos_sse2
#define __sin __sin_sse2
# define __cos __cos_sse2
# define __sin __sin_sse2
#endif
#include <sysdeps/ieee754/dbl-64/s_sin.c>

View File

@ -16,15 +16,18 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-double.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-double.h>
extern void __redirect_sincos (double, double *, double *);
#define SYMBOL_NAME sincos
#include "ifunc-fma4.h"
# define SYMBOL_NAME sincos
# include "ifunc-fma4.h"
libc_ifunc_redirected (__redirect_sincos, __sincos, IFUNC_SELECTOR ());
libm_alias_double (__sincos, sincos)
#define __sincos __sincos_sse2
# define __sincos __sincos_sse2
#endif
#include <sysdeps/ieee754/dbl-64/s_sincos.c>

View File

@ -16,13 +16,18 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-float.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-float.h>
extern void __redirect_sincosf (float, float *, float *);
#define SYMBOL_NAME sincosf
#include "ifunc-fma.h"
# define SYMBOL_NAME sincosf
# include "ifunc-fma.h"
libc_ifunc_redirected (__redirect_sincosf, __sincosf, IFUNC_SELECTOR ());
libm_alias_float (__sincos, sincos)
#else
# include <sysdeps/ieee754/flt-32/s_sincosf.c>
#endif

View File

@ -16,13 +16,18 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-float.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-float.h>
extern float __redirect_sinf (float);
#define SYMBOL_NAME sinf
#include "ifunc-fma.h"
# define SYMBOL_NAME sinf
# include "ifunc-fma.h"
libc_ifunc_redirected (__redirect_sinf, __sinf, IFUNC_SELECTOR ());
libm_alias_float (__sin, sin)
#else
# include <sysdeps/ieee754/flt-32/s_sinf.c>
#endif

View File

@ -16,15 +16,18 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <libm-alias-double.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
# include <libm-alias-double.h>
extern double __redirect_tan (double);
#define SYMBOL_NAME tan
#include "ifunc-avx-fma4.h"
# define SYMBOL_NAME tan
# include "ifunc-avx-fma4.h"
libc_ifunc_redirected (__redirect_tan, __tan, IFUNC_SELECTOR ());
libm_alias_double (__tan, tan)
#define __tan __tan_sse2
# define __tan __tan_sse2
#endif
#include <sysdeps/ieee754/dbl-64/s_tan.c>

View File

@ -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)

View File

@ -18,8 +18,20 @@
#include <sysdep.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
# include <libm-alias-double.h>
# define __trunc_sse41 __trunc
.text
#else
.section .text.sse4.1,"ax",@progbits
#endif
ENTRY(__trunc_sse41)
roundsd $11, %xmm0, %xmm0
ret
END(__trunc_sse41)
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
libm_alias_double (__trunc, trunc)
#endif

View File

@ -16,17 +16,20 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#define NO_MATH_REDIRECT
#include <libm-alias-double.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
# define NO_MATH_REDIRECT
# include <libm-alias-double.h>
#define trunc __redirect_trunc
#define __trunc __redirect___trunc
#include <math.h>
#undef trunc
#undef __trunc
# define trunc __redirect_trunc
# define __trunc __redirect___trunc
# include <math.h>
# undef trunc
# undef __trunc
#define SYMBOL_NAME trunc
#include "ifunc-sse4_1.h"
# define SYMBOL_NAME trunc
# include "ifunc-sse4_1.h"
libc_ifunc_redirected (__redirect_trunc, __trunc, IFUNC_SELECTOR ());
libm_alias_double (__trunc, trunc)
#endif

View File

@ -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)

View File

@ -18,8 +18,20 @@
#include <sysdep.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
# include <libm-alias-float.h>
# define __truncf_sse41 __truncf
.text
#else
.section .text.sse4.1,"ax",@progbits
#endif
ENTRY(__truncf_sse41)
roundss $11, %xmm0, %xmm0
ret
END(__truncf_sse41)
#if MINIMUM_X86_ISA_LEVEL == SSE4_1_X86_ISA_LEVEL
libm_alias_float (__trunc, trunc)
#endif

View File

@ -16,17 +16,20 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#define NO_MATH_REDIRECT
#include <libm-alias-float.h>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL < SSE4_1_X86_ISA_LEVEL
# define NO_MATH_REDIRECT
# include <libm-alias-float.h>
#define truncf __redirect_truncf
#define __truncf __redirect___truncf
#include <math.h>
#undef truncf
#undef __truncf
# define truncf __redirect_truncf
# define __truncf __redirect___truncf
# include <math.h>
# undef truncf
# undef __truncf
#define SYMBOL_NAME truncf
#include "ifunc-sse4_1.h"
# define SYMBOL_NAME truncf
# include "ifunc-sse4_1.h"
libc_ifunc_redirected (__redirect_truncf, __truncf, IFUNC_SELECTOR ());
libm_alias_float (__trunc, trunc)
#endif

View File

@ -1 +1,6 @@
#include <sysdeps/../math/w_exp.c>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL >= AVX2_X86_ISA_LEVEL
# include <sysdeps/ieee754/dbl-64/w_exp.c>
#else
# include <sysdeps/../math/w_exp.c>
#endif

View File

@ -1 +1,6 @@
#include <sysdeps/../math/w_log.c>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL >= AVX2_X86_ISA_LEVEL
# include <sysdeps/ieee754/dbl-64/w_log.c>
#else
# include <sysdeps/../math/w_log.c>
#endif

View File

@ -1 +1,6 @@
#include <sysdeps/../math/w_pow.c>
#include <sysdeps/x86/isa-level.h>
#if MINIMUM_X86_ISA_LEVEL >= AVX2_X86_ISA_LEVEL
# include <sysdeps/ieee754/dbl-64/w_pow.c>
#else
# include <sysdeps/../math/w_pow.c>
#endif