aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
Diffstat (limited to 'gas')
-rw-r--r--gas/config/tc-i386.c82
-rw-r--r--gas/testsuite/gas/i386/i386.exp1
-rw-r--r--gas/testsuite/gas/i386/nops-9.d28
-rw-r--r--gas/testsuite/gas/i386/nops-9.s19
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