mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
There are 3 variants of modf and modff: SSE2, SSE4.1 and AVX. s_modf.c and s_modff.c include the generic implementation compiled with the minimum x86 ISA level. The IFUNC selector is used only if the minimum ISA level is less than AVX. SSE4.1 variant is included only if the ISA level is less than SSE4.1. AVX variant is included only the ISA level is less than AVX. AVX variant should be compiled with -mavx, not -msse2avx -DSSE2AVX which are used to encode SSE assembly sources with EVEX encoding. The routines that are shared between libc and libm should use different rules to avoid using the same MODULE_NAME, to avoid potential issues like BZ #33165 where __stack_chk_fail not being routed to the internal symbol. Tested with -march=x86-64, -march=x86-64-v2, -march=x86-64-v3 and -march=x86-64-v4. This fixes BZ #33165 and BZ #33173. Co-authored-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> Signed-off-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
137 lines
4.1 KiB
Plaintext
137 lines
4.1 KiB
Plaintext
GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
|
|
# Local configure fragment for sysdeps/x86.
|
|
|
|
# Check if linker supports x86 ISA level.
|
|
AC_CACHE_CHECK([for linker x86 ISA level support],
|
|
libc_cv_include_x86_isa_level, [dnl
|
|
cat > conftest1.S <<EOF
|
|
#ifdef __LP64__
|
|
# define P2ALIGN 3
|
|
#else
|
|
# define P2ALIGN 2
|
|
#endif
|
|
.section ".note.gnu.property", "a"
|
|
.p2align P2ALIGN
|
|
.long 1f - 0f /* name length. */
|
|
.long 4f - 1f /* data length. */
|
|
/* NT_GNU_PROPERTY_TYPE_0 */
|
|
.long 5 /* note type. */
|
|
0:
|
|
.asciz "GNU" /* vendor name. */
|
|
1:
|
|
.p2align P2ALIGN
|
|
/* GNU_PROPERTY_X86_ISA_1_NEEDED */
|
|
.long 0xc0008002 /* pr_type. */
|
|
.long 3f - 2f /* pr_datasz. */
|
|
2:
|
|
.long 0x1
|
|
3:
|
|
.p2align P2ALIGN
|
|
4:
|
|
EOF
|
|
cat > conftest2.S <<EOF
|
|
#ifdef __LP64__
|
|
# define P2ALIGN 3
|
|
#else
|
|
# define P2ALIGN 2
|
|
#endif
|
|
.section ".note.gnu.property", "a"
|
|
.p2align P2ALIGN
|
|
.long 1f - 0f /* name length. */
|
|
.long 4f - 1f /* data length. */
|
|
/* NT_GNU_PROPERTY_TYPE_0 */
|
|
.long 5 /* note type. */
|
|
0:
|
|
.asciz "GNU" /* vendor name. */
|
|
1:
|
|
.p2align P2ALIGN
|
|
/* GNU_PROPERTY_X86_ISA_1_NEEDED */
|
|
.long 0xc0008002 /* pr_type. */
|
|
.long 3f - 2f /* pr_datasz. */
|
|
2:
|
|
.long 0x2
|
|
3:
|
|
.p2align P2ALIGN
|
|
4:
|
|
EOF
|
|
libc_cv_include_x86_isa_level=no
|
|
if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -nostartfiles -nostdlib -r -o conftest conftest1.S conftest2.S); then
|
|
count=`LC_ALL=C $READELF -n conftest | grep NT_GNU_PROPERTY_TYPE_0 | wc -l`
|
|
if test "$count" = 1; then
|
|
libc_cv_include_x86_isa_level=yes
|
|
fi
|
|
fi
|
|
rm -f conftest*])
|
|
if test $libc_cv_include_x86_isa_level = yes; then
|
|
AC_DEFINE(INCLUDE_X86_ISA_LEVEL)
|
|
AC_CACHE_CHECK([for LAHF/SAHF instruction support],
|
|
libc_cv_have_x86_lahf_sahf, [dnl
|
|
libc_cv_have_x86_lahf_sahf=no
|
|
if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - -x c /dev/null) | grep -qE '(-msahf\b|-march=x86-64-v)'; then
|
|
libc_cv_have_x86_lahf_sahf=yes
|
|
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
|
|
libc_cv_have_x86_movbe=no
|
|
if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - -x c /dev/null) | grep -qE '(-mmovbe\b|-march=x86-64-v(@<:@3-9@:>@|@<:@1-9@:>@@<:@0-9@:>@))'; then
|
|
libc_cv_have_x86_movbe=yes
|
|
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
|
|
#elif defined __x86_64__
|
|
libc_cv_have_x86_isa_level=baseline
|
|
#elif MINIMUM_X86_ISA_LEVEL == 1
|
|
libc_cv_have_x86_isa_level=1
|
|
#else
|
|
libc_cv_have_x86_isa_level=0
|
|
#endif
|
|
EOF
|
|
eval `${CC-cc} $CFLAGS $CPPFLAGS $ISAFLAG -I$srcdir -E conftest.c | grep libc_cv_have_x86_isa_level`
|
|
rm -rf conftest*])
|
|
elif test $base_machine = x86_64; then
|
|
libc_cv_have_x86_isa_level=baseline
|
|
else
|
|
libc_cv_have_x86_isa_level=0
|
|
fi
|
|
if test $libc_cv_have_x86_isa_level = baseline; then
|
|
AC_DEFINE_UNQUOTED(MINIMUM_X86_ISA_LEVEL, 1)
|
|
else
|
|
AC_DEFINE_UNQUOTED(MINIMUM_X86_ISA_LEVEL, $libc_cv_have_x86_isa_level)
|
|
fi
|
|
LIBC_CONFIG_VAR([have-x86-isa-level], [$libc_cv_have_x86_isa_level])
|
|
LIBC_CONFIG_VAR([x86-isa-level-2-or-above], [2 3 4])
|
|
LIBC_CONFIG_VAR([x86-isa-level-3-or-above], [3 4])
|
|
LIBC_CONFIG_VAR([x86-isa-level-4-or-above], [4])
|
|
LIBC_CONFIG_VAR([enable-x86-isa-level], [$libc_cv_include_x86_isa_level])
|
|
|
|
dnl Check if TEST_CC supports -mfpmath=387
|
|
LIBC_TRY_TEST_CC_OPTION([if -mfpmath=387 works],
|
|
[-c -Werror -mfpmath=387],
|
|
libc_cv_have_test_cc_cflags_mfpmath_387,
|
|
[libc_cv_have_test_cc_cflags_mfpmath_387=yes],
|
|
[libc_cv_have_test_cc_cflags_mfpmath_387=no]
|
|
)
|
|
LIBC_CONFIG_VAR(have-test-cc-cflags-mfpmath-387,
|
|
$libc_cv_have_test_cc_cflags_mfpmath_387)
|
|
|
|
dnl Static PIE is supported.
|
|
AC_DEFINE(SUPPORT_STATIC_PIE)
|