diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/tc-i386.c | 82 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/i386.exp | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/nops-9.d | 28 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/nops-9.s | 19 |
4 files changed, 83 insertions, 47 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index fa813aa..9f5522b 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -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; diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index d16eb88..aa9f9a4 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -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" diff --git a/gas/testsuite/gas/i386/nops-9.d b/gas/testsuite/gas/i386/nops-9.d new file mode 100644 index 0000000..a073a58 --- /dev/null +++ b/gas/testsuite/gas/i386/nops-9.d @@ -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 diff --git a/gas/testsuite/gas/i386/nops-9.s b/gas/testsuite/gas/i386/nops-9.s new file mode 100644 index 0000000..db2eebb --- /dev/null +++ b/gas/testsuite/gas/i386/nops-9.s @@ -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 |