1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-10-31 22:10:34 +03:00
Files
glibc/sysdeps/x86/configure.ac
H.J. Lu 1fa5773eb1 x86: Don't use asm statement for trunc/truncf
Compiler inlines trunc and truncf with SSE4.1.  But older versions of GCC
doesn't inline them with -Os:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121861

Don't use asm statement for trunc and truncf if compiler can inline them
with -Os.  It removes one register move with GCC 16:

__modff_sse41:                        __modff_sse41:
.LFB23:                               .LFB23:
   .cfi_startproc                        .cfi_startproc
   endbr64                               endbr64
   subq  $24, %rsp                       subq  $24, %rsp
   .cfi_def_cfa_offset 32                .cfi_def_cfa_offset 32
   movq  %fs:40, %rax                    movq  %fs:40, %rax
   movq  %rax, 8(%rsp)                   movq  %rax, 8(%rsp)
   xorl  %eax, %eax                      xorl  %eax, %eax
   movd  %xmm0, %eax                     movd  %xmm0, %eax
   addl  %eax, %eax                      addl  %eax, %eax
   cmpl  $-16777216, %eax                cmpl  $-16777216, %eax
   je .L7                                je .L7
                                   >     movaps   %xmm0, %xmm3
   movaps   %xmm0, %xmm4                 movaps   %xmm0, %xmm4
   movss .LC0(%rip), %xmm2         |     movss .LC0(%rip), %xmm1
   movaps   %xmm2, %xmm3           |     movaps   %xmm1, %xmm2
   andps %xmm0, %xmm2              |     roundss  $11, %xmm3, %xmm3
   roundss $11, %xmm0, %xmm1       |     subss %xmm3, %xmm4
   subss %xmm1, %xmm4              |     andps %xmm0, %xmm1
   andnps   %xmm4, %xmm3           |     andnps   %xmm4, %xmm2
   orps  %xmm3, %xmm2              |     orps  %xmm2, %xmm1
.L3:                                  .L3:
   movss %xmm1, (%rdi)             |     movss %xmm3, (%rdi)
   movq  8(%rsp), %rax                   movq  8(%rsp), %rax
   subq  %fs:40, %rax                    subq  %fs:40, %rax
   jne   .L8                             jne   .L8
   movaps   %xmm2, %xmm0           |     movaps   %xmm1, %xmm0
   addq  $24, %rsp                       addq  $24, %rsp
   .cfi_remember_state                   .cfi_remember_state
   .cfi_def_cfa_offset 8                 .cfi_def_cfa_offset 8
   ret                                   ret

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Uros Bizjak <ubizjak@gmail.com>
2025-09-17 04:30:11 -07:00

238 lines
7.0 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" -eq 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],
[-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)
conftest_code="
extern int foo;
int *
foo_p (void)
{
return &foo;
}
"
dnl Check if CC enables no direct extern access by default.
LIBC_TRY_CC_COMMAND([if no direct extern access is enabled by default],
[$conftest_code],
[-S -O2 -fno-pic],
libc_cv_cc_no_direct_extern_access,
[
libc_cv_cc_cflags_no_direct_extern_access=no
if test "$base_machine" = x86_64; then
if grep -E -q "mov[lq][ ]+foo@GOTPCREL\(%rip\)," conftest; then
libc_cv_cc_no_direct_extern_access=yes
fi
elif test "$base_machine" = i386; then
if grep -E -q "movl[ ]+foo@GOT," conftest; then
libc_cv_cc_no_direct_extern_access=yes
fi
else
echo unsupported machine: $base_machine
rm -f conftest*
exit 1
fi
],
[
echo failed to check no direct external data access
rm -f conftest*
exit 1
])
dnl Check if TEST_CC supports -mno-direct-extern-access.
LIBC_TRY_TEST_CC_OPTION([if -mno-direct-extern-access works],
[-Werror -mno-direct-extern-access],
libc_cv_test_cc_cflags_mno_direct_extern_access,
[libc_cv_test_cc_cflags_mno_direct_extern_access=yes],
[libc_cv_test_cc_cflags_mno_direct_extern_access=no]
)
dnl Check if TEST_CC supports -fno-direct-access-external-data.
LIBC_TRY_TEST_CC_OPTION([if -fno-direct-access-external-data works],
[-Werror -fno-direct-access-external-data],
libc_cv_test_cc_cflags_fno_direct_access_external_data,
[libc_cv_test_cc_cflags_fno_direct_access_external_data=yes],
[libc_cv_test_cc_cflags_fno_direct_access_external_data=no]
)
if test $libc_cv_test_cc_cflags_mno_direct_extern_access = yes; then
libc_cv_test_cc_cflags_no_direct_extern_access="-mno-direct-extern-access"
elif test $libc_cv_test_cc_cflags_fno_direct_access_external_data = yes; then
libc_cv_test_cc_cflags_no_direct_extern_access="-fno-direct-access-external-data"
fi
LIBC_CONFIG_VAR(test-cc-cflags-no-direct-extern-access,
$libc_cv_test_cc_cflags_no_direct_extern_access)
conftest_code="
extern float truncf (float __x) __attribute__ ((__nothrow__,__const__));
float
tf (float x)
{
return truncf (x);
}
"
dnl Check if CC inlines trunc with -Os.
LIBC_TRY_CC_COMMAND([if -Os inlines trunc],
[$conftest_code],
[-S -Os -msse4.1],
libc_cv_cc_x86_inline_trunc,
[
libc_cv_cc_x86_inline_trunc=no
if grep -E -q "roundss" conftest; then
libc_cv_cc_x86_inline_trunc=yes
fi
],
[
echo "failed to check if -Os inlines trunc."
rm -f conftest*
exit 1
])
if test "$libc_cv_cc_x86_inline_trunc" = yes; then
AC_DEFINE(HAVE_X86_INLINE_TRUNC, 1)
else
AC_DEFINE(HAVE_X86_INLINE_TRUNC, 0)
fi
dnl If the building compiler enables no direct external data access by
dnl default, access to protected data in shared libraries from executables
dnl must be compiled with no direct external data access. If the testing
dnl compiler doesn't support it, set have-protected-data to no to disable
dnl the tests which requires no direct external data access.
dnl
if test "${libc_cv_cc_no_direct_extern_access}${libc_cv_test_cc_cflags_no_direct_extern_access}" = yes; then
libc_cv_protected_data=no
fi
dnl Static PIE is supported.
AC_DEFINE(SUPPORT_STATIC_PIE)