x86: permit "default" with .arch

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).
This commit is contained in:
Jan Beulich
2022-07-06 09:21:40 +02:00
parent d92c7521f9
commit 3ce2ebcf88
5 changed files with 85 additions and 8 deletions

View 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? */

View 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}

View File

@ -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

View File

@ -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

View 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"