If x86 libatomic isn't compiled with -march=i486 or better, append
-march=i486 XCFLAGS for x86 libatomic build.  Set try_ifunc to yes
if -mcx16 isn't used to compile x86-64 libatomic or -march=i686 or
better isn't used to compile x86 libatomic.

        PR target/70454
        * configure.tgt (XCFLAGS): Append -march=i486 to compile x86
        libatomic if needed.
        (try_ifunc): Set to yes only if needed.
---
 libatomic/configure.tgt | 73 ++++++++++++++++++++++++++++-------------
 1 file changed, 50 insertions(+), 23 deletions(-)

diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt
index 2f24817b454..1f3a3ad6c7c 100644
--- a/libatomic/configure.tgt
+++ b/libatomic/configure.tgt
@@ -81,32 +81,59 @@ case "${target_cpu}" in
        ARCH=sparc
        ;;
 
-  i[3456]86)
-       case " ${CC} ${CFLAGS} " in
-         *" -m64 "*|*" -mx32 "*)
-           ;;
-         *)
-           if test -z "$with_arch"; then
-             XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
-             XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
-           fi
-       esac
-       ARCH=x86
-       # ??? Detect when -march=i686 is already enabled.
-       try_ifunc=yes
-       ;;
-  x86_64)
-       case " ${CC} ${CFLAGS} " in
-         *" -m32 "*)
+  i[3456]86 | x86_64)
+       # Need i486 or better.
+       cat > conftestx.c <<EOF
+#if defined __x86_64__ || defined __i486__ || defined __pentium__ \
+      || defined __pentiumpro__ || defined __pentium4__ \
+      || defined __geode__ || defined __SSE__
+# error Need i486 or better
+#endif
+EOF
+       if ${CC} ${CFLAGS} -c -o conftestx.o conftestx.c > /dev/null 2>&1; then
+         if test "${target_cpu}" = x86_64; then
            XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
            XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
-           ;;
-         *)
-           ;;
-       esac
+         else
+           XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
+           XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
+         fi
+       fi
+       # Detect if -march=i686/-mcx16 is already enabled.
+       cat > conftestx.c <<EOF
+#if defined __x86_64__
+__int128_t v = 0;
+__int128_t expected = 0;
+__int128_t max = ~0;
+__int128_t desired = ~0;
+__int128_t zero = 0;
+
+int
+foo (void)
+{
+  return !__atomic_compare_exchange_n (&v, &expected, max, 0,
+                                       __ATOMIC_RELAXED,
+                                       __ATOMIC_RELAXED);
+}
+#else
+# if defined __pentiumpro__ || defined __pentium4__ || defined __SSE__
+asm ("# has i686");
+# endif
+#endif
+EOF
+       if ${CC} ${CFLAGS} -S -o conftestx.s conftestx.c > /dev/null 2>&1; then
+         if ${GREP} cmpxchg16b conftestx.s >/dev/null; then
+           # This is the 64-bit library.
+           try_ifunc=no
+         elif ${GREP} i686 conftestx.s >/dev/null; then
+           # This is the 32-bit library.
+           try_ifunc=no
+         else
+           try_ifunc=yes
+         fi
+       fi
+       rm -f conftestx.c conftestx.o conftestx.s
        ARCH=x86
-       # ??? Detect when -mcx16 is already enabled.
-       try_ifunc=yes
        ;;
 
   *)                   ARCH="${target_cpu}" ;;
-- 
2.29.2

Reply via email to