x86: permit "default" with .arch
authorJan Beulich <jbeulich@suse.com>
Wed, 6 Jul 2022 07:21:40 +0000 (09:21 +0200)
committerJan Beulich <jbeulich@suse.com>
Wed, 6 Jul 2022 07:21:40 +0000 (09:21 +0200)
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).

gas/config/tc-i386.c
gas/doc/c-i386.texi
gas/testsuite/gas/i386/arch-dflt.l [new file with mode: 0644]
gas/testsuite/gas/i386/arch-dflt.s [new file with mode: 0644]
gas/testsuite/gas/i386/i386.exp

index 4829ff8aaad2d8b9a07a14e9999766c369871747..a52ac8b77cc55208d3292083b476f38bd6d25ee3 100644 (file)
@@ -938,8 +938,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.  */
   ARCH (generic32, GENERIC32, GENERIC32, false),
   ARCH (generic64, GENERIC64, GENERIC64, false),
   ARCH (i8086, UNKNOWN, NONE, false),
@@ -2724,12 +2724,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;
+             free (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)
            {
@@ -2802,7 +2837,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;
@@ -13676,6 +13711,13 @@ show_arch (FILE *stream, int ext, int check)
 
   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?  */
index 5262af2023b9c8a00024bb2b61340036d3be966f..95fd8ec9dc94e0b3cc1310ead0f858fef8831d6a 100644 (file)
@@ -1504,6 +1504,7 @@ directive enables a warning when gas detects an instruction that is not
 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 choices for @var{cpu_type} are:
 @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}
diff --git a/gas/testsuite/gas/i386/arch-dflt.l b/gas/testsuite/gas/i386/arch-dflt.l
new file mode 100644 (file)
index 0000000..d0953b1
--- /dev/null
@@ -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
diff --git a/gas/testsuite/gas/i386/arch-dflt.s b/gas/testsuite/gas/i386/arch-dflt.s
new file mode 100644 (file)
index 0000000..718bf6f
--- /dev/null
@@ -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
index ebb1b49246239c6c9830bc7ca078afc3231a2d17..de4eb1cfba5f651136341061cb634d8eed8263e4 100644 (file)
@@ -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"