From 59482fa1e7243bd905c7e27c92ae2b89c79fff87 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 15 Dec 2020 09:51:28 +0100 Subject: [PATCH] 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 * 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. --- gcc/config.gcc | 4 +--- gcc/config/i386/i386-options.c | 11 ----------- gcc/doc/invoke.texi | 5 +++-- gcc/testsuite/gcc.target/i386/x86-64-v2-msabi.c | 5 +++++ gcc/testsuite/gcc.target/i386/x86-64-v2-other.c | 5 +++++ gcc/testsuite/gcc.target/i386/x86-64-v2.c | 6 ++++-- gcc/testsuite/gcc.target/i386/x86-64-v3-msabi.c | 5 +++++ gcc/testsuite/gcc.target/i386/x86-64-v3-other.c | 5 +++++ gcc/testsuite/gcc.target/i386/x86-64-v3.c | 8 +++++--- gcc/testsuite/gcc.target/i386/x86-64-v4-msabi.c | 5 +++++ gcc/testsuite/gcc.target/i386/x86-64-v4-other.c | 5 +++++ gcc/testsuite/gcc.target/i386/x86-64-v4.c | 6 ++++-- 12 files changed, 47 insertions(+), 23 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/x86-64-v2-msabi.c create mode 100644 gcc/testsuite/gcc.target/i386/x86-64-v2-other.c create mode 100644 gcc/testsuite/gcc.target/i386/x86-64-v3-msabi.c create mode 100644 gcc/testsuite/gcc.target/i386/x86-64-v3-other.c create mode 100644 gcc/testsuite/gcc.target/i386/x86-64-v4-msabi.c create mode 100644 gcc/testsuite/gcc.target/i386/x86-64-v4-other.c diff --git a/gcc/config.gcc b/gcc/config.gcc index a54f675520c..81b552383fb 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 70b5f09c62d..86bbb24606d 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 1e025f3285a..b06ebbad847 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 00000000000..109589b03c3 --- /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 00000000000..1750b7bc23a --- /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 f17a15de9b6..e4b7e886edd 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 00000000000..dcf7cb07294 --- /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 00000000000..d80ac1bcda8 --- /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 784202fb26f..53577204816 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 00000000000..fe8565fda4f --- /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 00000000000..0e1a28404d6 --- /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 7c202a42068..718b1a18c1d 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 -- 2.30.2