aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXi Ruoyao <xry111@xry111.site>2023-06-03 02:25:44 +0800
committerXi Ruoyao <xry111@xry111.site>2023-06-10 21:43:56 +0800
commitdb80262475d28ae074a2cda7a1a6c2ea525791b9 (patch)
treee1f157f75cd54cbd84aa6a013ab7c96d8e96a269
parent39adc5eebd61fd276f3f1ef9d7228756a35bd0cb (diff)
downloadgcc-db80262475d28ae074a2cda7a1a6c2ea525791b9.zip
gcc-db80262475d28ae074a2cda7a1a6c2ea525791b9.tar.gz
gcc-db80262475d28ae074a2cda7a1a6c2ea525791b9.tar.bz2
libatomic: x86_64: Always try ifunc
We used to skip ifunc check when CX16 is available. But now we use CX16+AVX+Intel/AMD for the "perfect" 16b load implementation, so CX16 alone is not a sufficient reason not to use ifunc (see PR104688). This causes a subtle and annoying issue: when GCC is built with a higher -march= setting in CFLAGS_FOR_TARGET, ifunc is disabled and the worst (locked) implementation of __atomic_load_16 is always used. There seems no good way to check if the CPU is Intel or AMD from the built-in macros (maybe we can check every known model like __skylake, __bdver2, ..., but it will be very error-prune and require an update whenever we add the support for a new x86 model). The best thing we can do seems "always try ifunc" here. libatomic/ChangeLog: * configure.tgt: For x86_64, always set try_ifunc=yes.
-rw-r--r--libatomic/configure.tgt4
1 files changed, 1 insertions, 3 deletions
diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt
index a92ae9e..39dd568 100644
--- a/libatomic/configure.tgt
+++ b/libatomic/configure.tgt
@@ -100,9 +100,7 @@ EOF
fi
cat > conftestx.c <<EOF
#ifdef __x86_64__
-#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
-#error need -mcx16
-#endif
+#error ifunc is always wanted for 16B atomic load
#else
#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
#error need -march=i686