x86: correct cpu_arch_isa_flags maintenance
These may not be set from a value derived from cpu_arch_flags: That starts with (almost) all functionality enabled, while cpu_arch_isa_flags is supposed to track features that were explicitly enabled (and perhaps later disabled) by the user. To avoid needing to do any such adjustment in two places (each), introduce helper functions used by both command line handling and directive processing.
This commit is contained in:
parent
aeb889f580
commit
bd483d213a
@ -2808,13 +2808,41 @@ check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
|
||||
}
|
||||
|
||||
static void
|
||||
extend_cpu_sub_arch_name (const char *name)
|
||||
extend_cpu_sub_arch_name (const char *pfx, const char *name)
|
||||
{
|
||||
if (cpu_sub_arch_name)
|
||||
cpu_sub_arch_name = reconcat (cpu_sub_arch_name, cpu_sub_arch_name,
|
||||
".", name, (const char *) NULL);
|
||||
pfx, name, (const char *) NULL);
|
||||
else
|
||||
cpu_sub_arch_name = concat (".", name, (const char *) NULL);
|
||||
cpu_sub_arch_name = concat (pfx, name, (const char *) NULL);
|
||||
}
|
||||
|
||||
static void isa_enable (unsigned int idx)
|
||||
{
|
||||
i386_cpu_flags flags = cpu_flags_or (cpu_arch_flags, cpu_arch[idx].enable);
|
||||
|
||||
if (!cpu_flags_equal (&flags, &cpu_arch_flags))
|
||||
{
|
||||
extend_cpu_sub_arch_name (".", cpu_arch[idx].name);
|
||||
cpu_arch_flags = flags;
|
||||
}
|
||||
|
||||
cpu_arch_isa_flags = cpu_flags_or (cpu_arch_isa_flags, cpu_arch[idx].enable);
|
||||
}
|
||||
|
||||
static void isa_disable (unsigned int idx)
|
||||
{
|
||||
i386_cpu_flags flags
|
||||
= cpu_flags_and_not (cpu_arch_flags, cpu_arch[idx].disable);
|
||||
|
||||
if (!cpu_flags_equal (&flags, &cpu_arch_flags))
|
||||
{
|
||||
extend_cpu_sub_arch_name (".no", cpu_arch[idx].name);
|
||||
cpu_arch_flags = flags;
|
||||
}
|
||||
|
||||
cpu_arch_isa_flags
|
||||
= cpu_flags_and_not (cpu_arch_isa_flags, cpu_arch[idx].disable);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2838,7 +2866,6 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
|
||||
int e;
|
||||
const char *string;
|
||||
unsigned int j = 0;
|
||||
i386_cpu_flags flags;
|
||||
|
||||
SKIP_WHITESPACE ();
|
||||
|
||||
@ -2991,17 +3018,7 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
|
||||
if (cpu_flags_all_zero (&cpu_arch[j].enable))
|
||||
continue;
|
||||
|
||||
flags = cpu_flags_or (cpu_arch_flags, cpu_arch[j].enable);
|
||||
|
||||
if (!cpu_flags_equal (&flags, &cpu_arch_flags))
|
||||
{
|
||||
extend_cpu_sub_arch_name (string + 1);
|
||||
cpu_arch_flags = flags;
|
||||
cpu_arch_isa_flags = flags;
|
||||
}
|
||||
else
|
||||
cpu_arch_isa_flags
|
||||
= cpu_flags_or (cpu_arch_isa_flags, cpu_arch[j].enable);
|
||||
isa_enable (j);
|
||||
|
||||
(void) restore_line_pointer (e);
|
||||
|
||||
@ -3048,13 +3065,7 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
|
||||
if (cpu_arch[j].type == PROCESSOR_NONE
|
||||
&& strcmp (string + 3, cpu_arch[j].name) == 0)
|
||||
{
|
||||
flags = cpu_flags_and_not (cpu_arch_flags, cpu_arch[j].disable);
|
||||
if (!cpu_flags_equal (&flags, &cpu_arch_flags))
|
||||
{
|
||||
extend_cpu_sub_arch_name (string + 1);
|
||||
cpu_arch_flags = flags;
|
||||
cpu_arch_isa_flags = flags;
|
||||
}
|
||||
isa_disable (j);
|
||||
|
||||
if (cpu_arch[j].vsz == vsz_set)
|
||||
vector_size = VSZ_DEFAULT;
|
||||
@ -14611,21 +14622,7 @@ md_parse_option (int c, const char *arg)
|
||||
&& !cpu_flags_all_zero (&cpu_arch[j].enable))
|
||||
{
|
||||
/* ISA extension. */
|
||||
i386_cpu_flags flags;
|
||||
|
||||
flags = cpu_flags_or (cpu_arch_flags,
|
||||
cpu_arch[j].enable);
|
||||
|
||||
if (!cpu_flags_equal (&flags, &cpu_arch_flags))
|
||||
{
|
||||
extend_cpu_sub_arch_name (arch);
|
||||
cpu_arch_flags = flags;
|
||||
cpu_arch_isa_flags = flags;
|
||||
}
|
||||
else
|
||||
cpu_arch_isa_flags
|
||||
= cpu_flags_or (cpu_arch_isa_flags,
|
||||
cpu_arch[j].enable);
|
||||
isa_enable (j);
|
||||
|
||||
switch (cpu_arch[j].vsz)
|
||||
{
|
||||
@ -14668,16 +14665,7 @@ md_parse_option (int c, const char *arg)
|
||||
if (cpu_arch[j].type == PROCESSOR_NONE
|
||||
&& strcmp (arch + 2, cpu_arch[j].name) == 0)
|
||||
{
|
||||
i386_cpu_flags flags;
|
||||
|
||||
flags = cpu_flags_and_not (cpu_arch_flags,
|
||||
cpu_arch[j].disable);
|
||||
if (!cpu_flags_equal (&flags, &cpu_arch_flags))
|
||||
{
|
||||
extend_cpu_sub_arch_name (arch);
|
||||
cpu_arch_flags = flags;
|
||||
cpu_arch_isa_flags = flags;
|
||||
}
|
||||
isa_disable (j);
|
||||
if (cpu_arch[j].vsz == vsz_set)
|
||||
vector_size = VSZ_DEFAULT;
|
||||
break;
|
||||
|
@ -147,6 +147,7 @@ if [gas_32_check] then {
|
||||
run_dump_test "nops-6"
|
||||
run_dump_test "nops-7"
|
||||
run_dump_test "nops-8"
|
||||
run_dump_test "nops-9"
|
||||
run_dump_test "noreg16"
|
||||
run_list_test "noreg16"
|
||||
run_dump_test "noreg16-data32"
|
||||
|
28
gas/testsuite/gas/i386/nops-9.d
Normal file
28
gas/testsuite/gas/i386/nops-9.d
Normal file
@ -0,0 +1,28 @@
|
||||
#objdump: -drw
|
||||
#name: i386 nops 9
|
||||
|
||||
.*: +file format .*
|
||||
|
||||
Disassembly of section .text:
|
||||
|
||||
0+ <default>:
|
||||
[ ]*[a-f0-9]+: 0f be f0 movsbl %al,%esi
|
||||
[ ]*[a-f0-9]+: 8d b4 26 00 00 00 00 lea 0x0\(%esi,%eiz,1\),%esi
|
||||
[ ]*[a-f0-9]+: 8d b6 00 00 00 00 lea 0x0\(%esi\),%esi
|
||||
|
||||
0+10 <nopopcnt>:
|
||||
[ ]*[a-f0-9]+: 0f be f0 movsbl %al,%esi
|
||||
[ ]*[a-f0-9]+: 8d b4 26 00 00 00 00 lea 0x0\(%esi,%eiz,1\),%esi
|
||||
[ ]*[a-f0-9]+: 8d b6 00 00 00 00 lea 0x0\(%esi\),%esi
|
||||
|
||||
0+20 <popcnt>:
|
||||
[ ]*[a-f0-9]+: f3 0f b8 f0 popcnt %eax,%esi
|
||||
[ ]*[a-f0-9]+: 8d b4 26 00 00 00 00 lea 0x0\(%esi,%eiz,1\),%esi
|
||||
[ ]*[a-f0-9]+: 8d 74 26 00 lea 0x0\(%esi,%eiz,1\),%esi
|
||||
[ ]*[a-f0-9]+: 90 nop
|
||||
|
||||
0+30 <nop>:
|
||||
[ ]*[a-f0-9]+: 0f be f0 movsbl %al,%esi
|
||||
[ ]*[a-f0-9]+: 66 66 2e 0f 1f 84 00 00 00 00 00 data16 nopw %cs:0x0\(%eax,%eax,1\)
|
||||
[ ]*[a-f0-9]+: 66 90 xchg %ax,%ax
|
||||
#pass
|
19
gas/testsuite/gas/i386/nops-9.s
Normal file
19
gas/testsuite/gas/i386/nops-9.s
Normal file
@ -0,0 +1,19 @@
|
||||
.text
|
||||
default:
|
||||
movsbl %al,%esi
|
||||
.p2align 4
|
||||
|
||||
.arch .nopopcnt
|
||||
nopopcnt:
|
||||
movsbl %al,%esi
|
||||
.p2align 4
|
||||
|
||||
.arch .popcnt
|
||||
popcnt:
|
||||
popcnt %eax,%esi
|
||||
.p2align 4
|
||||
|
||||
.arch .nop
|
||||
nop:
|
||||
movsbl %al,%esi
|
||||
.p2align 4
|
Loading…
x
Reference in New Issue
Block a user