aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-12-15 09:51:28 +0100
committerJakub Jelinek <jakub@redhat.com>2020-12-15 09:51:28 +0100
commit59482fa1e7243bd905c7e27c92ae2b89c79fff87 (patch)
tree0e905ede32d70838708111398fd7190b22936920
parentefd08ad579a1dea6409bd280cb5c263ed0849839 (diff)
downloadgcc-59482fa1e7243bd905c7e27c92ae2b89c79fff87.zip
gcc-59482fa1e7243bd905c7e27c92ae2b89c79fff87.tar.gz
gcc-59482fa1e7243bd905c7e27c92ae2b89c79fff87.tar.bz2
i386: Make -march=x86-64-v[234] behave more like other -march= options
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.
-rw-r--r--gcc/config.gcc4
-rw-r--r--gcc/config/i386/i386-options.c11
-rw-r--r--gcc/doc/invoke.texi5
-rw-r--r--gcc/testsuite/gcc.target/i386/x86-64-v2-msabi.c5
-rw-r--r--gcc/testsuite/gcc.target/i386/x86-64-v2-other.c5
-rw-r--r--gcc/testsuite/gcc.target/i386/x86-64-v2.c6
-rw-r--r--gcc/testsuite/gcc.target/i386/x86-64-v3-msabi.c5
-rw-r--r--gcc/testsuite/gcc.target/i386/x86-64-v3-other.c5
-rw-r--r--gcc/testsuite/gcc.target/i386/x86-64-v3.c8
-rw-r--r--gcc/testsuite/gcc.target/i386/x86-64-v4-msabi.c5
-rw-r--r--gcc/testsuite/gcc.target/i386/x86-64-v4-other.c5
-rw-r--r--gcc/testsuite/gcc.target/i386/x86-64-v4.c6
12 files changed, 47 insertions, 23 deletions
diff --git a/gcc/config.gcc b/gcc/config.gcc
index a54f675..81b5523 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -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
;;
diff --git a/gcc/config/i386/i386-options.c b/gcc/config/i386/i386-options.c
index 70b5f09..86bbb24 100644
--- a/gcc/config/i386/i386-options.c
+++ b/gcc/config/i386/i386-options.c
@@ -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;
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 1e025f3..b06ebba 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -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
index 0000000..109589b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/x86-64-v2-msabi.c
@@ -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
index 0000000..1750b7b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/x86-64-v2-other.c
@@ -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"
diff --git a/gcc/testsuite/gcc.target/i386/x86-64-v2.c b/gcc/testsuite/gcc.target/i386/x86-64-v2.c
index f17a15d..e4b7e88 100644
--- a/gcc/testsuite/gcc.target/i386/x86-64-v2.c
+++ b/gcc/testsuite/gcc.target/i386/x86-64-v2.c
@@ -12,8 +12,10 @@
#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
index 0000000..dcf7cb0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/x86-64-v3-msabi.c
@@ -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
index 0000000..d80ac1b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/x86-64-v3-other.c
@@ -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"
diff --git a/gcc/testsuite/gcc.target/i386/x86-64-v3.c b/gcc/testsuite/gcc.target/i386/x86-64-v3.c
index 784202f..5357720 100644
--- a/gcc/testsuite/gcc.target/i386/x86-64-v3.c
+++ b/gcc/testsuite/gcc.target/i386/x86-64-v3.c
@@ -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
@@ -12,8 +12,10 @@
#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
index 0000000..fe8565f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/x86-64-v4-msabi.c
@@ -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
index 0000000..0e1a284
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/x86-64-v4-other.c
@@ -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"
diff --git a/gcc/testsuite/gcc.target/i386/x86-64-v4.c b/gcc/testsuite/gcc.target/i386/x86-64-v4.c
index 7c202a4..718b1a1 100644
--- a/gcc/testsuite/gcc.target/i386/x86-64-v4.c
+++ b/gcc/testsuite/gcc.target/i386/x86-64-v4.c
@@ -12,8 +12,10 @@
#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