diff options
author | Xi Ruoyao <xry111@xry111.site> | 2023-06-03 02:25:44 +0800 |
---|---|---|
committer | Xi Ruoyao <xry111@xry111.site> | 2023-06-10 21:43:56 +0800 |
commit | db80262475d28ae074a2cda7a1a6c2ea525791b9 (patch) | |
tree | e1f157f75cd54cbd84aa6a013ab7c96d8e96a269 | |
parent | 39adc5eebd61fd276f3f1ef9d7228756a35bd0cb (diff) | |
download | gcc-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.tgt | 4 |
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 |