aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2009-07-24 15:41:20 +0000
committerJan Beulich <jbeulich@novell.com>2009-07-24 15:41:20 +0000
commit309d33736f82fece9dbeae7a4ba096cdc2d77753 (patch)
treeaf27f997a96225ed278b45e38156d83ae13fb2a6 /gas
parent20203fb9399bed63f555d79dcd8ad95a5bb0aed6 (diff)
downloadgdb-309d33736f82fece9dbeae7a4ba096cdc2d77753.zip
gdb-309d33736f82fece9dbeae7a4ba096cdc2d77753.tar.gz
gdb-309d33736f82fece9dbeae7a4ba096cdc2d77753.tar.bz2
gas/
2009-07-24 Jan Beulich <jbeulich@novell.com> * tc-i386.c (cpu_arch): Add .8087, .287, .387, .no87, .nommx, .nosse, and .noavx. (cpu_flags_and_not): New. (set_cpu_arch): Check whether sub-architecture specified is a feature disable. (md_parse_option): Likewise. (parse_real_register): Don't return floating point register when x87 functionality is disabled. (md_show_usage): Add new sub-options. * doc/c-i386.texi: Update with new command line sub-options. gas/testsuite/ 2009-07-24 Jan Beulich <jbeulich@novell.com> * gas/i386/8087.[ds]: New. * gas/i386/287.[ds]: New. * gas/i386/387.[ds]: New. * gas/i386/no87.[ls]: New. * gas/i386/no87-2.[ls]: New. * gas/i386/i386.exp: Run new tests. * gas/i386/att-regs.s: Also check FPU register access. * gas/i386/intel-regs.s: Likewise. * gas/i386/att-regs.d: Adjust expectations. * gas/i386/intel-regs.d: Likewise. opcodes/ 2009-07-24 Jan Beulich <jbeulich@novell.com> * i386-dis.c (fgrps): Correct annotation for feni/fdisi. Add frstpm. * i386-gen.c (cpu_flag_init): Add FP enabling flags where needed. (cpu_flags): Add Cpu8087, Cpu287, Cpu387, Cpu687, and CpuFISTTP. (set_bitfield): Expand CpuFP to Cpu8087|Cpu287|Cpu387. * i386-opc.h (Cpu8087, Cpu287, Cpu387, Cpu687, CpuFISTTP): Define. (union i386_cpu_flags): Add cpu8087, cpu287, cpu387, cpu687, and cpufisttp. * i386-opc.tbl: Qualify floating point instructions by their respective CpuXXX flag. Fix fucom{,p,pp}, fprem1, fsin, fcos, and fsincos to be avilable only on 387. Fix fstsw ax to be available only on 287+. Add f{,n}eni, f{,n}disi, f{,n}setpm, and frstpm. * i386-init.h, i386-tbl.h: Regenerate.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog13
-rw-r--r--gas/config/tc-i386.c60
-rw-r--r--gas/doc/c-i386.texi9
-rw-r--r--gas/testsuite/ChangeLog13
-rw-r--r--gas/testsuite/gas/i386/287.d12
-rw-r--r--gas/testsuite/gas/i386/287.s10
-rw-r--r--gas/testsuite/gas/i386/387.d17
-rw-r--r--gas/testsuite/gas/i386/387.s11
-rw-r--r--gas/testsuite/gas/i386/8087.d13
-rw-r--r--gas/testsuite/gas/i386/8087.s11
-rw-r--r--gas/testsuite/gas/i386/att-regs.d4
-rw-r--r--gas/testsuite/gas/i386/att-regs.s6
-rw-r--r--gas/testsuite/gas/i386/i386.exp5
-rw-r--r--gas/testsuite/gas/i386/intel-regs.d4
-rw-r--r--gas/testsuite/gas/i386/intel-regs.s6
-rw-r--r--gas/testsuite/gas/i386/no87-2.l19
-rw-r--r--gas/testsuite/gas/i386/no87-2.s14
-rw-r--r--gas/testsuite/gas/i386/no87.l25
-rw-r--r--gas/testsuite/gas/i386/no87.s18
19 files changed, 254 insertions, 16 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 715c731..d798b0a 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,16 @@
+2009-07-24 Jan Beulich <jbeulich@novell.com>
+
+ * tc-i386.c (cpu_arch): Add .8087, .287, .387, .no87, .nommx,
+ .nosse, and .noavx.
+ (cpu_flags_and_not): New.
+ (set_cpu_arch): Check whether sub-architecture specified is a
+ feature disable.
+ (md_parse_option): Likewise.
+ (parse_real_register): Don't return floating point register
+ when x87 functionality is disabled.
+ (md_show_usage): Add new sub-options.
+ * doc/c-i386.texi: Update with new command line sub-options.
+
2009-07-24 Nick Clifton <nickc@redhat.com>
PR 10437
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 42a95ff..62486ec 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -591,8 +591,18 @@ static const arch_entry cpu_arch[] =
CPU_K8_FLAGS },
{ "amdfam10", PROCESSOR_AMDFAM10,
CPU_AMDFAM10_FLAGS },
+ { ".8087", PROCESSOR_UNKNOWN,
+ CPU_8087_FLAGS },
+ { ".287", PROCESSOR_UNKNOWN,
+ CPU_287_FLAGS },
+ { ".387", PROCESSOR_UNKNOWN,
+ CPU_387_FLAGS },
+ { ".no87", PROCESSOR_UNKNOWN,
+ CPU_ANY87_FLAGS },
{ ".mmx", PROCESSOR_UNKNOWN,
CPU_MMX_FLAGS },
+ { ".nommx", PROCESSOR_UNKNOWN,
+ CPU_3DNOWA_FLAGS },
{ ".sse", PROCESSOR_UNKNOWN,
CPU_SSE_FLAGS },
{ ".sse2", PROCESSOR_UNKNOWN,
@@ -607,8 +617,12 @@ static const arch_entry cpu_arch[] =
CPU_SSE4_2_FLAGS },
{ ".sse4", PROCESSOR_UNKNOWN,
CPU_SSE4_2_FLAGS },
+ { ".nosse", PROCESSOR_UNKNOWN,
+ CPU_ANY_SSE_FLAGS },
{ ".avx", PROCESSOR_UNKNOWN,
CPU_AVX_FLAGS },
+ { ".noavx", PROCESSOR_UNKNOWN,
+ CPU_ANY_AVX_FLAGS },
{ ".vmx", PROCESSOR_UNKNOWN,
CPU_VMX_FLAGS },
{ ".smx", PROCESSOR_UNKNOWN,
@@ -1236,6 +1250,24 @@ cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
return x;
}
+static INLINE i386_cpu_flags
+cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
+{
+ switch (ARRAY_SIZE (x.array))
+ {
+ case 3:
+ x.array [2] &= ~y.array [2];
+ case 2:
+ x.array [1] &= ~y.array [1];
+ case 1:
+ x.array [0] &= ~y.array [0];
+ break;
+ default:
+ abort ();
+ }
+ return x;
+}
+
#define CPU_FLAGS_ARCH_MATCH 0x1
#define CPU_FLAGS_64BIT_MATCH 0x2
#define CPU_FLAGS_AES_MATCH 0x4
@@ -1964,8 +1996,12 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
break;
}
- flags = cpu_flags_or (cpu_arch_flags,
- cpu_arch[i].flags);
+ if (strncmp (string + 1, "no", 2))
+ flags = cpu_flags_or (cpu_arch_flags,
+ cpu_arch[i].flags);
+ else
+ flags = cpu_flags_and_not (cpu_arch_flags,
+ cpu_arch[i].flags);
if (!cpu_flags_equal (&flags, &cpu_arch_flags))
{
if (cpu_sub_arch_name)
@@ -7484,6 +7520,12 @@ parse_real_register (char *reg_string, char **end_op)
&& !cpu_arch_flags.bitfield.cpui386)
return (const reg_entry *) NULL;
+ if (r->reg_type.bitfield.floatreg
+ && !cpu_arch_flags.bitfield.cpu8087
+ && !cpu_arch_flags.bitfield.cpu287
+ && !cpu_arch_flags.bitfield.cpu387)
+ return (const reg_entry *) NULL;
+
if (r->reg_type.bitfield.regmmx && !cpu_arch_flags.bitfield.cpummx)
return (const reg_entry *) NULL;
@@ -7759,8 +7801,13 @@ md_parse_option (int c, char *arg)
{
/* ISA entension. */
i386_cpu_flags flags;
- flags = cpu_flags_or (cpu_arch_flags,
- cpu_arch[i].flags);
+
+ if (strncmp (arch, "no", 2))
+ flags = cpu_flags_or (cpu_arch_flags,
+ cpu_arch[i].flags);
+ else
+ flags = cpu_flags_and_not (cpu_arch_flags,
+ cpu_arch[i].flags);
if (!cpu_flags_equal (&flags, &cpu_arch_flags))
{
if (cpu_sub_arch_name)
@@ -7892,8 +7939,9 @@ md_show_usage (stream)
core, core2, corei7, k6, k6_2, athlon, k8, amdfam10,\n\
generic32, generic64\n\
EXTENSION is combination of:\n\
- mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, sse4,\n\
- avx, vmx, smx, xsave, movbe, ept, aes, pclmul, fma,\n\
+ 8087, 287, 387, no87, mmx, nommx, sse, sse2, sse3,\n\
+ ssse3, sse4.1, sse4.2, sse4, nosse, avx, noavx,\n\
+ vmx, smx, xsave, movbe, ept, aes, pclmul, fma,\n\
clflush, syscall, rdtscp, 3dnow, 3dnowa, sse4a,\n\
svme, abm, padlock, fma4\n"));
fprintf (stream, _("\
diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi
index 9c0e52c..dc276b8 100644
--- a/gas/doc/c-i386.texi
+++ b/gas/doc/c-i386.texi
@@ -114,7 +114,12 @@ In addition to the basic instruction set, the assembler can be told to
accept various extension mnemonics. For example,
@code{-march=i686+sse4+vmx} extends @var{i686} with @var{sse4} and
@var{vmx}. The following extensions are currently supported:
+@code{8087},
+@code{287},
+@code{387},
+@code{no87},
@code{mmx},
+@code{nommx},
@code{sse},
@code{sse2},
@code{sse3},
@@ -122,7 +127,9 @@ accept various extension mnemonics. For example,
@code{sse4.1},
@code{sse4.2},
@code{sse4},
+@code{nosse},
@code{avx},
+@code{noavx},
@code{vmx},
@code{smx},
@code{xsave},
@@ -141,6 +148,8 @@ accept various extension mnemonics. For example,
@code{svme},
@code{abm} and
@code{padlock}.
+Note that rather than extending a basic instruction set, the extension
+mnemonics starting with @code{no} revoke the respective functionality.
When the @code{.arch} directive is used with @option{-march}, the
@code{.arch} directive will take precedent.
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index a30164b..636cf48 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,16 @@
+2009-07-24 Jan Beulich <jbeulich@novell.com>
+
+ * gas/i386/8087.[ds]: New.
+ * gas/i386/287.[ds]: New.
+ * gas/i386/387.[ds]: New.
+ * gas/i386/no87.[ls]: New.
+ * gas/i386/no87-2.[ls]: New.
+ * gas/i386/i386.exp: Run new tests.
+ * gas/i386/att-regs.s: Also check FPU register access.
+ * gas/i386/intel-regs.s: Likewise.
+ * gas/i386/att-regs.d: Adjust expectations.
+ * gas/i386/intel-regs.d: Likewise.
+
2009-07-23 Ulrich Drepper <drepper@redhat.com>
* gas/elf/type.s: Add unique global symbol definition.
diff --git a/gas/testsuite/gas/i386/287.d b/gas/testsuite/gas/i386/287.d
new file mode 100644
index 0000000..efee2a7
--- /dev/null
+++ b/gas/testsuite/gas/i386/287.d
@@ -0,0 +1,12 @@
+#objdump: -dw
+#name: i386 287
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <_8087>:
+[ ]*[0-9a-f]+: db e4[ ]+fnsetpm.*
+[ ]*[0-9a-f]+: db e5[ ]+frstpm.*
+[ ]*[0-9a-f]+: 9b db e4[ ]+fsetpm.*
+#pass
diff --git a/gas/testsuite/gas/i386/287.s b/gas/testsuite/gas/i386/287.s
new file mode 100644
index 0000000..74ad160
--- /dev/null
+++ b/gas/testsuite/gas/i386/287.s
@@ -0,0 +1,10 @@
+# Check 287-only instructions.
+
+ .text
+ .arch i286
+ .arch .287
+ .code16
+_8087:
+ fnsetpm
+ frstpm
+ fsetpm
diff --git a/gas/testsuite/gas/i386/387.d b/gas/testsuite/gas/i386/387.d
new file mode 100644
index 0000000..145381d
--- /dev/null
+++ b/gas/testsuite/gas/i386/387.d
@@ -0,0 +1,17 @@
+#objdump: -dw
+#name: i386 387 (cmdline)
+#as: -march=i386+387
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <_387>:
+[ ]*[0-9a-f]+: d9 ff[ ]+fcos[ ]*
+[ ]*[0-9a-f]+: d9 f5[ ]+fprem1[ ]*
+[ ]*[0-9a-f]+: d9 fe[ ]+fsin[ ]*
+[ ]*[0-9a-f]+: d9 fb[ ]+fsincos[ ]*
+[ ]*[0-9a-f]+: dd e1[ ]+fucom[ ]+%st\(1\)
+[ ]*[0-9a-f]+: dd e9[ ]+fucomp[ ]+%st\(1\)
+[ ]*[0-9a-f]+: da e9[ ]+fucompp[ ]*
+#pass
diff --git a/gas/testsuite/gas/i386/387.s b/gas/testsuite/gas/i386/387.s
new file mode 100644
index 0000000..6593d05
--- /dev/null
+++ b/gas/testsuite/gas/i386/387.s
@@ -0,0 +1,11 @@
+# Check 387+ instructions.
+
+ .text
+_387:
+ fcos
+ fprem1
+ fsin
+ fsincos
+ fucom
+ fucomp
+ fucompp
diff --git a/gas/testsuite/gas/i386/8087.d b/gas/testsuite/gas/i386/8087.d
new file mode 100644
index 0000000..dee7f4d
--- /dev/null
+++ b/gas/testsuite/gas/i386/8087.d
@@ -0,0 +1,13 @@
+#objdump: -dw
+#name: i386 8087
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <_8087>:
+[ ]*[0-9a-f]+: 9b db e1[ ]+fdisi.*
+[ ]*[0-9a-f]+: 9b db e0[ ]+feni.*
+[ ]*[0-9a-f]+: db e1[ ]+fndisi.*
+[ ]*[0-9a-f]+: db e0[ ]+fneni.*
+#pass
diff --git a/gas/testsuite/gas/i386/8087.s b/gas/testsuite/gas/i386/8087.s
new file mode 100644
index 0000000..9149eb2
--- /dev/null
+++ b/gas/testsuite/gas/i386/8087.s
@@ -0,0 +1,11 @@
+# Check 8087-only instructions.
+
+ .text
+ .arch i8086
+ .arch .8087
+ .code16
+_8087:
+ fdisi
+ feni
+ fndisi
+ fneni
diff --git a/gas/testsuite/gas/i386/att-regs.d b/gas/testsuite/gas/i386/att-regs.d
index 185507e..47908f8 100644
--- a/gas/testsuite/gas/i386/att-regs.d
+++ b/gas/testsuite/gas/i386/att-regs.d
@@ -13,7 +13,7 @@ Disassembly of section \.text:
.*[ ]+R_386_16[ ]+r8d
.*[ ]+R_386_16[ ]+r8
.*[ ]+R_386_16[ ]+fs
-#.*[ ]+R_386_16[ ]+st
+.*[ ]+R_386_16[ ]+st
.*[ ]+R_386_16[ ]+cr0
.*[ ]+R_386_16[ ]+dr0
.*[ ]+R_386_16[ ]+tr0
@@ -25,7 +25,7 @@ Disassembly of section \.text:
.*[ ]+R_386_32[ ]+r8w
.*[ ]+R_386_32[ ]+r8d
.*[ ]+R_386_32[ ]+r8
-#.*[ ]+R_386_32[ ]+st
+.*[ ]+R_386_32[ ]+st
.*:[ ]+0f 20 c0[ ]+mov[ ]+%cr0,%eax
.*:[ ]+0f 21 c0[ ]+mov[ ]+%db0,%eax
.*:[ ]+0f 24 c0[ ]+mov[ ]+%tr0,%eax
diff --git a/gas/testsuite/gas/i386/att-regs.s b/gas/testsuite/gas/i386/att-regs.s
index 2c15a17..1e49e09 100644
--- a/gas/testsuite/gas/i386/att-regs.s
+++ b/gas/testsuite/gas/i386/att-regs.s
@@ -11,7 +11,7 @@
mov r8d, ax ; add al, (bx,si)
mov r8, ax ; add al, (bx,si)
mov fs, ax ; add al, (bx,si)
-#todo mov st, ax ; add al, (bx,si)
+ mov st, ax ; add al, (bx,si)
mov cr0, ax ; add al, (bx,si)
mov dr0, ax ; add al, (bx,si)
mov tr0, ax ; add al, (bx,si)
@@ -26,7 +26,7 @@
mov r8w, eax
mov r8d, eax
mov r8, eax
-#todo mov st, eax
+ mov st, eax
mov cr0, eax
mov dr0, eax
mov tr0, eax
@@ -34,7 +34,7 @@
mov xmm0, eax
mov ymm0, eax
-#todo .arch i387
+ .arch .387
ffree st
.arch .mmx
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index 5595afd..b0fda93 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -114,6 +114,11 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]]
run_list_test "arch-10-4" "-march=i686+sse4+vmx+smx -I${srcdir}/$subdir -al"
run_dump_test "arch-11"
run_dump_test "arch-12"
+ run_dump_test "8087"
+ run_dump_test "287"
+ run_dump_test "387"
+ run_list_test "no87" "-al"
+ run_list_test "no87-2" "-march=i686+no87 -al"
run_dump_test "xsave"
run_dump_test "xsave-intel"
run_dump_test "aes"
diff --git a/gas/testsuite/gas/i386/intel-regs.d b/gas/testsuite/gas/i386/intel-regs.d
index bfca1c1..6c52dec 100644
--- a/gas/testsuite/gas/i386/intel-regs.d
+++ b/gas/testsuite/gas/i386/intel-regs.d
@@ -13,7 +13,7 @@ Disassembly of section \.text:
.*[ ]+R_386_16[ ]+r8d
.*[ ]+R_386_16[ ]+r8
.*[ ]+R_386_16[ ]+fs
-#.*[ ]+R_386_16[ ]+st
+.*[ ]+R_386_16[ ]+st
.*[ ]+R_386_16[ ]+cr0
.*[ ]+R_386_16[ ]+dr0
.*[ ]+R_386_16[ ]+tr0
@@ -25,7 +25,7 @@ Disassembly of section \.text:
.*[ ]+R_386_32[ ]+r8w
.*[ ]+R_386_32[ ]+r8d
.*[ ]+R_386_32[ ]+r8
-#.*[ ]+R_386_32[ ]+st
+.*[ ]+R_386_32[ ]+st
.*:[ ]+0f 20 c0[ ]+mov[ ]+%cr0,%eax
.*:[ ]+0f 21 c0[ ]+mov[ ]+%db0,%eax
.*:[ ]+0f 24 c0[ ]+mov[ ]+%tr0,%eax
diff --git a/gas/testsuite/gas/i386/intel-regs.s b/gas/testsuite/gas/i386/intel-regs.s
index 6b716b7..7d52711 100644
--- a/gas/testsuite/gas/i386/intel-regs.s
+++ b/gas/testsuite/gas/i386/intel-regs.s
@@ -11,7 +11,7 @@
mov ax, r8d ; add [bx+si], al
mov ax, r8 ; add [bx+si], al
mov ax, fs ; add [bx+si], al
-#todo mov ax, st ; add [bx+si], al
+ mov ax, st ; add [bx+si], al
mov ax, cr0 ; add [bx+si], al
mov ax, dr0 ; add [bx+si], al
mov ax, tr0 ; add [bx+si], al
@@ -26,7 +26,7 @@
mov eax, r8w
mov eax, r8d
mov eax, r8
-#todo mov eax, st
+ mov eax, st
mov eax, cr0
mov eax, dr0
mov eax, tr0
@@ -34,7 +34,7 @@
mov eax, xmm0
mov eax, ymm0
-#todo .arch i387
+ .arch .387
ffree st
.arch .mmx
diff --git a/gas/testsuite/gas/i386/no87-2.l b/gas/testsuite/gas/i386/no87-2.l
new file mode 100644
index 0000000..92cb9f8
--- /dev/null
+++ b/gas/testsuite/gas/i386/no87-2.l
@@ -0,0 +1,19 @@
+.*: Assembler messages:
+.*:3: Error: .*no87.*
+.*:6: Error: .*287.*
+.*:9: Error: .*387.*
+.*:12: Error: .*i686.*
+GAS LISTING .*
+#...
+[ ]*[1-9][0-9]*[ ]+fninit
+[ ]*[1-9][0-9]*[ ]+\.arch \.287
+[ ]*[1-9][0-9]*[ ]+\?+ DBE3[ ]+fninit
+[ ]*[1-9][0-9]*[ ]+fsincos
+[ ]*[1-9][0-9]*[ ]+\.arch \.387
+[ ]*[1-9][0-9]*[ ]+\?+ D9FB[ ]+fsincos
+[ ]*[1-9][0-9]*[ ]+fcomi
+[ ]*[1-9][0-9]*[ ]+\.arch i686
+[ ]*[1-9][0-9]*[ ]+\?+ DBF1[ ]+fcomi
+[ ]*[1-9][0-9]*[ ]+fisttpl[ ].*
+[ ]*[1-9][0-9]*[ ]+\.arch prescott
+[ ]*[1-9][0-9]*[ ]+\?+ DB08[ ]+fisttpl[ ].*
diff --git a/gas/testsuite/gas/i386/no87-2.s b/gas/testsuite/gas/i386/no87-2.s
new file mode 100644
index 0000000..5b8c634
--- /dev/null
+++ b/gas/testsuite/gas/i386/no87-2.s
@@ -0,0 +1,14 @@
+# Test -march=...+no87
+ .text
+ fninit
+ .arch .287
+ fninit
+ fsincos
+ .arch .387
+ fsincos
+ fcomi
+ .arch i686
+ fcomi
+ fisttpl (%eax)
+ .arch prescott
+ fisttpl (%eax)
diff --git a/gas/testsuite/gas/i386/no87.l b/gas/testsuite/gas/i386/no87.l
new file mode 100644
index 0000000..c201718
--- /dev/null
+++ b/gas/testsuite/gas/i386/no87.l
@@ -0,0 +1,25 @@
+.*: Assembler messages:
+.*:4: Error: .*generic.*
+.*:7: Error: .*287.*
+.*:10: Error: .*387.*
+.*:13: Error: .*i686.*
+.*:17: Error: .*no87.*
+.*:18: Error: .*no87.*
+GAS LISTING .*
+#...
+[ ]*[1-9][0-9]*[ ]+\.arch generic32
+[ ]*[1-9][0-9]*[ ]+fninit
+[ ]*[1-9][0-9]*[ ]+\.arch \.287
+[ ]*[1-9][0-9]*[ ]+\?+ DBE3[ ]+fninit
+[ ]*[1-9][0-9]*[ ]+fsincos
+[ ]*[1-9][0-9]*[ ]+\.arch \.387
+[ ]*[1-9][0-9]*[ ]+\?+ D9FB[ ]+fsincos
+[ ]*[1-9][0-9]*[ ]+fcomi
+[ ]*[1-9][0-9]*[ ]+\.arch i686
+[ ]*[1-9][0-9]*[ ]+\?+ DBF1[ ]+fcomi
+[ ]*[1-9][0-9]*[ ]+fisttpl[ ].*
+[ ]*[1-9][0-9]*[ ]+\.arch prescott
+[ ]*[1-9][0-9]*[ ]+\?+ DB08[ ]+fisttpl[ ].*
+[ ]*[1-9][0-9]*[ ]+\.arch \.no87
+[ ]*[1-9][0-9]*[ ]+fcomi
+[ ]*[1-9][0-9]*[ ]+fisttpl[ ].*
diff --git a/gas/testsuite/gas/i386/no87.s b/gas/testsuite/gas/i386/no87.s
new file mode 100644
index 0000000..a992978
--- /dev/null
+++ b/gas/testsuite/gas/i386/no87.s
@@ -0,0 +1,18 @@
+# Test .arch .no87
+ .text
+ .arch generic32
+ fninit
+ .arch .287
+ fninit
+ fsincos
+ .arch .387
+ fsincos
+ fcomi
+ .arch i686
+ fcomi
+ fisttpl (%eax)
+ .arch prescott
+ fisttpl (%eax)
+ .arch .no87
+ fcomi
+ fisttpl (%eax)