i386: Make -march=x86-64-v[234] behave more like other -march= options
authorJakub Jelinek <jakub@redhat.com>
Tue, 15 Dec 2020 08:51:28 +0000 (09:51 +0100)
committerJakub Jelinek <jakub@redhat.com>
Tue, 15 Dec 2020 08:51:28 +0000 (09:51 +0100)
If somebody has -march=x86-64-v2 (or -v3 or -v4) in $CFLAGS, $CXXFLAGS etc.,
then -m32 or -mabi=ms stops working.
What is worse, if one configures gcc --with-arch-64=x86-64-v2 (or -v3 or -v4),
then -mabi=ms stops working.

I think that is a nightmare user experience.  It is ok that x86-64-v[234]
behave slightly different from other -march= options (in that they imply
unless overridden -mtune=generic rather then -mtune= equal to the -march
argument), but the error when one mixes it with -mabi=ms, or -m32 doesn't
improve anything.
It is true that the exact option set is only defined in the x86-64 psABI
(IMHO that is a mistake too, we should copy that into the GCC documentation
like we document it for any other -march= option), but there is no reason
why that exact set of CPU features can't be used for other ABIs, it is just
a set of CPU features.  If we add micro-architecture levels to the 32-bit
ABI (I doubt anyone wants to do that, but just hypothetically), then those
micro-architecture levels wouldn't certainly be called x86-64-v* but perhaps
i386-v*.
In the tests, __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 can't be expected on -m32
not because the CPU feature wouldn't be set, but because the instruction
is 64-bit only and 32-bit code doesn't have __int128 etc. support.

2020-12-15  Jakub Jelinek  <jakub@redhat.com>

* config/i386/i386-options.c (ix86_option_override_internal): Don't
error on -march=x86-64-v[234] with -m32 or -mabi=ms.
* config.gcc: Don't reject --with-arch=x86-64-v[234] or
--with-arch_32=x86-64-v[234].
* doc/invoke.texi (-march=x86-64-v[234]): Document what the option
does for other ABIs.

* gcc.target/i386/x86-64-v2.c: Don't expect
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 to be defined with -m32.
* gcc.target/i386/x86-64-v2-other.c: New test.
* gcc.target/i386/x86-64-v2-msabi.c: New test.
* gcc.target/i386/x86-64-v3.c: Fix a comment pasto.  Don't expect
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 to be defined with -m32.
* gcc.target/i386/x86-64-v3-other.c: New test.
* gcc.target/i386/x86-64-v3-msabi.c: New test.
* gcc.target/i386/x86-64-v4.c:Don't expect
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 to be defined with -m32.
* gcc.target/i386/x86-64-v4-other.c: New test.
* gcc.target/i386/x86-64-v4-msabi.c: New test.

12 files changed:
gcc/config.gcc
gcc/config/i386/i386-options.c
gcc/doc/invoke.texi
gcc/testsuite/gcc.target/i386/x86-64-v2-msabi.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/x86-64-v2-other.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/x86-64-v2.c
gcc/testsuite/gcc.target/i386/x86-64-v3-msabi.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/x86-64-v3-other.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/x86-64-v3.c
gcc/testsuite/gcc.target/i386/x86-64-v4-msabi.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/x86-64-v4-other.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/x86-64-v4.c

index a54f675520cd34d2944f6fb62f5f2c687587e055..81b552383fba523d780afd43b9e9074bdc6adc7c 100644 (file)
@@ -4519,10 +4519,8 @@ case "${target}" in
                                        case " $x86_64_archs " in
                                        *" ${val} "*)
                                                # Disallow x86-64-v* for --with-cpu=/--with-tune=
-                                               # or --with-arch= or --with-arch_32=
-                                               # It can be only specified in --with-arch_64=
                                                case "x$which$val" in
-                                               xcpu*x86-64-v*|xtune*x86-64-v*|xarchx86-64-v*|xarch_32x86-64-v*)
+                                               xcpu*x86-64-v*|xtune*x86-64-v*)
                                                        echo "Unknown CPU given in --with-$which=$val." 1>&2
                                                        exit 1
                                                        ;;
index 70b5f09c62d4b92f64ca5f3f740f44ad571e3ef1..86bbb24606d1e63c39bd6ff1ac8dc57469fa897f 100644 (file)
@@ -2084,17 +2084,6 @@ ix86_option_override_internal (bool main_args_p,
            return false;
          }
 
-       /* The feature-only micro-architecture levels that use
-          PTA_NO_TUNE are only defined for the x86-64 psABI.  */
-       if ((processor_alias_table[i].flags & PTA_NO_TUNE) != 0
-           && (!TARGET_64BIT_P (opts->x_ix86_isa_flags)
-               || opts->x_ix86_abi != SYSV_ABI))
-         {
-           error (G_("%qs architecture level is only defined"
-                     " for the x86-64 psABI"), opts->x_ix86_arch_string);
-           return false;
-         }
-
        ix86_schedule = processor_alias_table[i].schedule;
        ix86_arch = processor_alias_table[i].processor;
 
index 1e025f3285aecb40a415bbd2796ce17f945b849f..b06ebbad847bbabc3cef24aa44137b0462ca5170 100644 (file)
@@ -29778,8 +29778,9 @@ A generic CPU with 64-bit extensions.
 @itemx x86-64-v3
 @itemx x86-64-v4
 These choices for @var{cpu-type} select the corresponding
-micro-architecture level from the x86-64 psABI.  They are only available
-when compiling for an x86-64 target that uses the System V psABI@.
+micro-architecture level from the x86-64 psABI.  On ABIs other than
+the x86-64 psABI they select the same CPU features as the x86-64 psABI
+documents for the particular micro-architecture level.
 
 Since these @var{cpu-type} values do not have a corresponding
 @option{-mtune} setting, using @option{-march} with these values enables
diff --git a/gcc/testsuite/gcc.target/i386/x86-64-v2-msabi.c b/gcc/testsuite/gcc.target/i386/x86-64-v2-msabi.c
new file mode 100644 (file)
index 0000000..109589b
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-mabi=ms -march=x86-64-v2" } */
+
+/* Verify -march=x86-64-v2 works even with -mabi=ms.  */
+#include "x86-64-v2.c"
diff --git a/gcc/testsuite/gcc.target/i386/x86-64-v2-other.c b/gcc/testsuite/gcc.target/i386/x86-64-v2-other.c
new file mode 100644 (file)
index 0000000..1750b7b
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+/* { dg-options "-march=x86-64-v2" } */
+
+/* Verify -march=x86-64-v2 works even with -m32 or -mabi=ms.  */
+#include "x86-64-v2.c"
index f17a15de9b6a2227ac126033cacc239e7423eb74..e4b7e886edd3899f0cc9083c74ec83946089ad67 100644 (file)
 #ifndef __SSE2__
 # error __SSE2__ not defined
 #endif
-#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
-# error __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 not defined
+#ifdef __x86_64__
+# ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
+#  error __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 not defined
+# endif
 #endif
 #ifndef __LAHF_SAHF__
 # error __LAHF_SAHF__ not defined
diff --git a/gcc/testsuite/gcc.target/i386/x86-64-v3-msabi.c b/gcc/testsuite/gcc.target/i386/x86-64-v3-msabi.c
new file mode 100644 (file)
index 0000000..dcf7cb0
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-mabi=ms -march=x86-64-v3" } */
+
+/* Verify -march=x86-64-v3 works even with -mabi=ms.  */
+#include "x86-64-v3.c"
diff --git a/gcc/testsuite/gcc.target/i386/x86-64-v3-other.c b/gcc/testsuite/gcc.target/i386/x86-64-v3-other.c
new file mode 100644 (file)
index 0000000..d80ac1b
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+/* { dg-options "-march=x86-64-v3" } */
+
+/* Verify -march=x86-64-v3 works even with -m32 or -mabi=ms.  */
+#include "x86-64-v3.c"
index 784202fb26f3817ac4941e5f9723267cf7bd21c0..5357720481626feded1879d50d3f09be8e88a9ec 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-do compile { target { ! ia32 } } } */
 /* { dg-options "-mabi=sysv -march=x86-64-v3" } */
 
-/* Verify that the CPU features required by x86-64-v4 are enabled.  */
+/* Verify that the CPU features required by x86-64-v3 are enabled.  */
 
 #ifndef __MMX__
 # error __MMX__ not defined
 #ifndef __SSE2__
 # error __SSE2__ not defined
 #endif
-#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
-# error __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 not defined
+#ifdef __x86_64__
+# ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
+#  error __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 not defined
+# endif
 #endif
 #ifndef __LAHF_SAHF__
 # error __LAHF_SAHF__ not defined
diff --git a/gcc/testsuite/gcc.target/i386/x86-64-v4-msabi.c b/gcc/testsuite/gcc.target/i386/x86-64-v4-msabi.c
new file mode 100644 (file)
index 0000000..fe8565f
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-mabi=ms -march=x86-64-v4" } */
+
+/* Verify -march=x86-64-v4 works even with -mabi=ms.  */
+#include "x86-64-v4.c"
diff --git a/gcc/testsuite/gcc.target/i386/x86-64-v4-other.c b/gcc/testsuite/gcc.target/i386/x86-64-v4-other.c
new file mode 100644 (file)
index 0000000..0e1a284
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+/* { dg-options "-march=x86-64-v4" } */
+
+/* Verify -march=x86-64-v4 works even with -m32 or -mabi=ms.  */
+#include "x86-64-v4.c"
index 7c202a42068b73785fdf1121658f32e6e8f7431b..718b1a18c1df79172d4f76bfa2968ce58a8c1977 100644 (file)
 #ifndef __SSE2__
 # error __SSE2__ not defined
 #endif
-#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
-# error __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 not defined
+#ifdef __x86_64__
+# ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
+#  error __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 not defined
+# endif
 #endif
 #ifndef __LAHF_SAHF__
 # error __LAHF_SAHF__ not defined