mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-25 20:21:07 +00:00
f43cb35c9b
If assembler doesn't support AVX512DQ, _dl_runtime_resolve_avx is used to save the first 8 vector registers, which only saves the lower 256 bits of vector register, for lazy binding. When it is called on AVX512 platform, the upper 256 bits of ZMM registers are clobbered. Parameters passed in ZMM registers will be wrong when the function is called the first time. This patch requires binutils 2.24, whose assembler can store and load ZMM registers, to build x86-64 glibc. Since mathvec library needs assembler support for AVX512DQ, we disable mathvec if assembler doesn't support AVX512DQ. [BZ #20139] * config.h.in (HAVE_AVX512_ASM_SUPPORT): Renamed to ... (HAVE_AVX512DQ_ASM_SUPPORT): This. * sysdeps/x86_64/configure.ac: Require assembler from binutils 2.24 or above. (HAVE_AVX512_ASM_SUPPORT): Removed. (HAVE_AVX512DQ_ASM_SUPPORT): New. * sysdeps/x86_64/configure: Regenerated. * sysdeps/x86_64/dl-trampoline.S: Make HAVE_AVX512_ASM_SUPPORT check unconditional. * sysdeps/x86_64/multiarch/ifunc-impl-list.c: Likewise. * sysdeps/x86_64/multiarch/memcpy.S: Likewise. * sysdeps/x86_64/multiarch/memcpy_chk.S: Likewise. * sysdeps/x86_64/multiarch/memmove-avx512-no-vzeroupper.S: Likewise. * sysdeps/x86_64/multiarch/memmove-avx512-unaligned-erms.S: Likewise. * sysdeps/x86_64/multiarch/memmove.S: Likewise. * sysdeps/x86_64/multiarch/memmove_chk.S: Likewise. * sysdeps/x86_64/multiarch/mempcpy.S: Likewise. * sysdeps/x86_64/multiarch/mempcpy_chk.S: Likewise. * sysdeps/x86_64/multiarch/memset-avx512-no-vzeroupper.S: Likewise. * sysdeps/x86_64/multiarch/memset-avx512-unaligned-erms.S: Likewise. * sysdeps/x86_64/multiarch/memset.S: Likewise. * sysdeps/x86_64/multiarch/memset_chk.S: Likewise. * sysdeps/x86_64/fpu/multiarch/svml_d_cos8_core_avx512.S: Check HAVE_AVX512DQ_ASM_SUPPORT instead of HAVE_AVX512_ASM_SUPPORT. * sysdeps/x86_64/fpu/multiarch/svml_d_exp8_core_avx512.S: Likewise. * sysdeps/x86_64/fpu/multiarch/svml_d_log8_core_avx512.S: Likewise. * sysdeps/x86_64/fpu/multiarch/svml_d_pow8_core_avx512.S: Likewise. * sysdeps/x86_64/fpu/multiarch/svml_d_sin8_core_avx512.S: Likewise. * sysdeps/x86_64/fpu/multiarch/svml_d_sincos8_core_avx512.: Likewise. * sysdeps/x86_64/fpu/multiarch/svml_s_cosf16_core_avx512.S: Likewise. * sysdeps/x86_64/fpu/multiarch/svml_s_expf16_core_avx512.S: Likewise. * sysdeps/x86_64/fpu/multiarch/svml_s_logf16_core_avx512.S: Likewise. * sysdeps/x86_64/fpu/multiarch/svml_s_powf16_core_avx512.S: Likewise. * sysdeps/x86_64/fpu/multiarch/svml_s_sincosf16_core_avx51: Likewise. * sysdeps/x86_64/fpu/multiarch/svml_s_sinf16_core_avx512.S: Likewise.
59 lines
1.8 KiB
Plaintext
59 lines
1.8 KiB
Plaintext
GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
|
|
# Local configure fragment for sysdeps/x86_64.
|
|
|
|
dnl Accept as 2.24 or newer for AVX512 load and store.
|
|
AC_CHECK_PROG_VER(AS, $AS, --version,
|
|
[GNU assembler.* \([0-9]*\.[0-9.]*\)],
|
|
[2.2[4-9]*|2.[3-9][0-9]*|[3-9].*|[1-9][0-9]*],
|
|
critic_missing="$critic_missing The program AS is required in version >= 2.24 for target x86_64.")
|
|
|
|
dnl Check if asm supports AVX512DQ.
|
|
AC_CACHE_CHECK(for AVX512DQ support in assembler, libc_cv_asm_avx512dq, [dnl
|
|
cat > conftest.s <<\EOF
|
|
vandpd (%rax), %zmm6, %zmm1
|
|
EOF
|
|
if AC_TRY_COMMAND(${CC-cc} -c $ASFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
|
|
libc_cv_asm_avx512dq=yes
|
|
else
|
|
libc_cv_asm_avx512dq=no
|
|
fi
|
|
rm -f conftest*])
|
|
if test $libc_cv_asm_avx512dq = yes; then
|
|
AC_DEFINE(HAVE_AVX512DQ_ASM_SUPPORT)
|
|
fi
|
|
|
|
dnl Check if -mavx512f works.
|
|
AC_CACHE_CHECK(for AVX512 support, libc_cv_cc_avx512, [dnl
|
|
LIBC_TRY_CC_OPTION([-mavx512f], [libc_cv_cc_avx512=$libc_cv_asm_avx512dq], [libc_cv_cc_avx512=no])
|
|
])
|
|
if test $libc_cv_cc_avx512 = yes; then
|
|
AC_DEFINE(HAVE_AVX512_SUPPORT)
|
|
fi
|
|
LIBC_CONFIG_VAR([config-cflags-avx512], [$libc_cv_cc_avx512])
|
|
|
|
dnl Check whether asm supports Intel MPX
|
|
AC_CACHE_CHECK(for Intel MPX support, libc_cv_asm_mpx, [dnl
|
|
cat > conftest.s <<\EOF
|
|
bndmov %bnd0,(%rsp)
|
|
EOF
|
|
if AC_TRY_COMMAND(${CC-cc} -c $ASFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
|
|
libc_cv_asm_mpx=yes
|
|
else
|
|
libc_cv_asm_mpx=no
|
|
fi
|
|
rm -f conftest*])
|
|
if test $libc_cv_asm_mpx = yes; then
|
|
AC_DEFINE(HAVE_MPX_SUPPORT)
|
|
fi
|
|
|
|
if test x"$build_mathvec" = xnotset; then
|
|
build_mathvec=yes
|
|
fi
|
|
|
|
dnl It is always possible to access static and hidden symbols in an
|
|
dnl position independent way.
|
|
AC_DEFINE(PI_STATIC_AND_HIDDEN)
|
|
|
|
test -n "$critic_missing" && AC_MSG_ERROR([
|
|
*** $critic_missing])
|