public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Jan Beulich <jbeulich@suse.com>
To: Binutils <binutils@sourceware.org>
Subject: [PATCH 3/7] x86: permit "default" with .arch
Date: Thu, 30 Jun 2022 14:53:57 +0200	[thread overview]
Message-ID: <e552f2e9-edbe-53de-1bf3-003578304da9@suse.com> (raw)
In-Reply-To: <01f502ff-5b51-86d3-ed54-646df7d22037@suse.com>

So far there was no way to reset the architecture to that assembly would
start with in the absence of any overrides (command line or directives).
Note that for Intel MCU "default" is merely an alias of "iamcu".

While there also zap a stray @item from the doc section, as noticed
when inspecting the generated output (which still has some quirks, but
those aren't easy to address without re-flowing almost the entire
section).

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -933,8 +933,8 @@ const relax_typeS md_relax_table[] =
 
 static const arch_entry cpu_arch[] =
 {
-  /* Do not replace the first two entries - i386_target_format()
-     relies on them being there in this order.  */
+  /* Do not replace the first two entries - i386_target_format() and
+     set_cpu_arch() rely on them being there in this order.  */
   { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
     CPU_GENERIC32_FLAGS, 0 },
   { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
@@ -2867,12 +2867,47 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED
 
   if (!is_end_of_line[(unsigned char) *input_line_pointer])
     {
-      char *string;
-      int e = get_symbol_name (&string);
-      unsigned int j;
+      char *s;
+      int e = get_symbol_name (&s);
+      const char *string = s;
+      unsigned int j = 0;
       i386_cpu_flags flags;
 
-      for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
+      if (strcmp (string, "default") == 0)
+	{
+	  if (strcmp (default_arch, "iamcu") == 0)
+	    string = default_arch;
+	  else
+	    {
+	      static const i386_cpu_flags cpu_unknown_flags = CPU_UNKNOWN_FLAGS;
+
+	      cpu_arch_name = NULL;
+	      xfree (cpu_sub_arch_name);
+	      cpu_sub_arch_name = NULL;
+	      cpu_arch_flags = cpu_unknown_flags;
+	      if (flag_code == CODE_64BIT)
+		{
+		  cpu_arch_flags.bitfield.cpu64 = 1;
+		  cpu_arch_flags.bitfield.cpuno64 = 0;
+		}
+	      else
+		{
+		  cpu_arch_flags.bitfield.cpu64 = 0;
+		  cpu_arch_flags.bitfield.cpuno64 = 1;
+		}
+	      cpu_arch_isa = PROCESSOR_UNKNOWN;
+	      cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
+	      if (!cpu_arch_tune_set)
+		{
+		  cpu_arch_tune = cpu_arch_isa;
+		  cpu_arch_tune_flags = cpu_arch_isa_flags;
+		}
+
+	      j = ARRAY_SIZE (cpu_arch) + 1;
+	    }
+	}
+
+      for (; j < ARRAY_SIZE (cpu_arch); j++)
 	{
 	  if (strcmp (string, cpu_arch[j].name) == 0)
 	    {
@@ -2945,7 +2980,7 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED
 	  j = ARRAY_SIZE (cpu_arch);
 	}
 
-      if (j >= ARRAY_SIZE (cpu_arch))
+      if (j == ARRAY_SIZE (cpu_arch))
 	as_bad (_("no such architecture: `%s'"), string);
 
       *input_line_pointer = e;
@@ -13841,6 +13876,13 @@ show_arch (FILE *stream, int ext, int ch
 
   p = start;
   left = size - (start - message);
+
+  if (!ext && check)
+    {
+      p = output_message (stream, p, message, start, &left,
+			  STRING_COMMA_LEN ("default"));
+    }
+
   for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
     {
       /* Should it be skipped?  */
--- a/gas/doc/c-i386.texi
+++ b/gas/doc/c-i386.texi
@@ -1504,6 +1504,7 @@ directive enables a warning when gas det
 supported on the CPU specified.  The choices for @var{cpu_type} are:
 
 @multitable @columnfractions .20 .20 .20 .20
+@item @samp{default}
 @item @samp{i8086} @tab @samp{i186} @tab @samp{i286} @tab @samp{i386}
 @item @samp{i486} @tab @samp{i586} @tab @samp{i686} @tab @samp{pentium}
 @item @samp{pentiumpro} @tab @samp{pentiumii} @tab @samp{pentiumiii} @tab @samp{pentium4}
@@ -1531,7 +1532,7 @@ supported on the CPU specified.  The cho
 @item @samp{.avx512_vpopcntdq} @tab @samp{.avx512_vbmi2} @tab @samp{.avx512_vnni}
 @item @samp{.avx512_bitalg} @tab @samp{.avx512_bf16} @tab @samp{.avx512_vp2intersect}
 @item @samp{.tdx} @tab @samp{.avx_vnni}  @tab @samp{.avx512_fp16}
-@item @samp{.clwb} @tab @samp{.rdpid} @tab @samp{.ptwrite} @tab @item @samp{.ibt}
+@item @samp{.clwb} @tab @samp{.rdpid} @tab @samp{.ptwrite} @tab @samp{.ibt}
 @item @samp{.wbnoinvd} @tab @samp{.pconfig} @tab @samp{.waitpkg} @tab @samp{.cldemote}
 @item @samp{.shstk} @tab @samp{.gfni} @tab @samp{.vaes} @tab @samp{.vpclmulqdq}
 @item @samp{.movdiri} @tab @samp{.movdir64b} @tab @samp{.enqcmd} @tab @samp{.tsxldtrk}
--- /dev/null
+++ b/gas/testsuite/gas/i386/arch-dflt.l
@@ -0,0 +1,19 @@
+.*: Assembler messages:
+.*:3: Error:.*`cmovl'.*
+.*:9: Error:.*`cmovg'.*
+GAS LISTING .*
+
+
+[ 	]*[0-9]*[ 	]+\.text
+[ 	]*[0-9]*[ 	]+start:
+[ 	]*[0-9]*[ 	]+cmovl	%eax, %ecx
+[ 	]*[0-9]*[ 	]*
+[ 	]*[0-9]*[ 	]+\.arch default
+[ 	]*[0-9]*[ 	]+\?\?\?\? 0F4DC8[ 	]+cmovnl	%eax, %ecx
+[ 	]*[0-9]*[ 	]*
+[ 	]*[0-9]*[ 	]+\.arch generic32
+[ 	]*[0-9]*[ 	]+cmovg	%eax, %ecx
+[ 	]*[0-9]*[ 	]*
+[ 	]*[0-9]*[ 	]+\.arch default
+[ 	]*[0-9]*[ 	]+\?\?\?\? 0F4EC8[ 	]+cmovng	%eax, %ecx
+#pass
--- /dev/null
+++ b/gas/testsuite/gas/i386/arch-dflt.s
@@ -0,0 +1,14 @@
+	.text
+start:
+	cmovl	%eax, %ecx
+
+	.arch default
+	cmovnl	%eax, %ecx
+
+	.arch generic32
+	cmovg	%eax, %ecx
+
+	.arch default
+	cmovng	%eax, %ecx
+
+	.end
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -205,6 +205,7 @@ if [gas_32_check] then {
     run_dump_test "arch-12"
     run_dump_test "arch-13"
     run_dump_test "arch-14"
+    run_list_test "arch-dflt" "-march=generic32 -al"
     run_dump_test "8087"
     run_dump_test "287"
     run_dump_test "387"


  parent reply	other threads:[~2022-06-30 12:54 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-30 12:52 [PATCH] gas/x86: .arch / -march= enhancements Jan Beulich
2022-06-30 12:53 ` [PATCH 1/7] x86: don't leak sub-architecture accumulated strings Jan Beulich
2022-06-30 22:54   ` H.J. Lu
2022-07-01 10:18     ` Jan Beulich
2022-07-01 19:44       ` H.J. Lu
2022-06-30 12:53 ` [PATCH 2/7] x86: de-duplicate sub-architecture strings accumulation Jan Beulich
2022-06-30 22:55   ` H.J. Lu
2022-06-30 12:53 ` Jan Beulich [this message]
2022-06-30 22:58   ` [PATCH 3/7] x86: permit "default" with .arch H.J. Lu
2022-06-30 12:54 ` [PATCH 4/7] x86: macro-ize cpu_arch[] entries Jan Beulich
2022-06-30 23:00   ` H.J. Lu
2022-06-30 12:54 ` [PATCH 5/7] x86: introduce fake processor type to mark sub-arch entries in cpu_arch[] Jan Beulich
2022-06-30 23:03   ` H.J. Lu
2022-06-30 12:55 ` [PATCH 6/7] x86: generalize disabling of sub-architectures Jan Beulich
2022-06-30 23:11   ` H.J. Lu
2022-06-30 12:55 ` [PATCH 7/7] x86: introduce a state stack for .arch Jan Beulich
2022-06-30 23:15   ` H.J. Lu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e552f2e9-edbe-53de-1bf3-003578304da9@suse.com \
    --to=jbeulich@suse.com \
    --cc=binutils@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).