Patch for PR4587 + move proc run_list_test into gas-defs.exp
authorNick Clifton <nickc@redhat.com>
Tue, 5 Jun 2007 17:00:33 +0000 (17:00 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 5 Jun 2007 17:00:33 +0000 (17:00 +0000)
29 files changed:
gas/ChangeLog
gas/config/tc-sparc.c
gas/testsuite/ChangeLog
gas/testsuite/gas/alpha/alpha.exp
gas/testsuite/gas/bfin/bfin.exp
gas/testsuite/gas/cfi/cfi.exp
gas/testsuite/gas/crx/allinsn.exp
gas/testsuite/gas/d10v/d10v.exp
gas/testsuite/gas/d30v/d30.exp
gas/testsuite/gas/elf/elf.exp
gas/testsuite/gas/frv/allinsn.exp
gas/testsuite/gas/i386/i386.exp
gas/testsuite/gas/i860/i860.exp
gas/testsuite/gas/ia64/ia64.exp
gas/testsuite/gas/lns/lns.exp
gas/testsuite/gas/macros/macros.exp
gas/testsuite/gas/maxq10/maxq10.exp
gas/testsuite/gas/maxq20/maxq20.exp
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mmix/mmix-list.exp
gas/testsuite/gas/mn10300/basic.exp
gas/testsuite/gas/msp430/msp430.exp
gas/testsuite/gas/pdp11/pdp11.exp
gas/testsuite/gas/ppc/ppc.exp
gas/testsuite/gas/s390/s390.exp
gas/testsuite/gas/sparc/pr4587.l [new file with mode: 0644]
gas/testsuite/gas/sparc/pr4587.s [new file with mode: 0644]
gas/testsuite/gas/sparc/sparc.exp
gas/testsuite/lib/gas-defs.exp

index 24bb920..15c33fa 100644 (file)
@@ -1,3 +1,8 @@
+2007-06-05  Nick Clifton  <nickc@redhat.com>
+
+       PR gas/4587
+       * config/tc-sparc.c (sparc_ip): Terminate tls_ops array.
+
 2007-06-05  Alan Modra  <amodra@bigpond.net.au>
 
        * config/tc-spu.c (spu_cons): Use deferred_expression.  Handle
index 84472b3..d4a409f 100644 (file)
@@ -1860,7 +1860,8 @@ sparc_ip (str, pinsn)
            case '\0':          /* End of args.  */
              if (s[0] == ',' && s[1] == '%')
                {
-                 static const struct tls_ops {
+                 static const struct tls_ops
+                 {
                    /* The name as it appears in assembler.  */
                    char *name;
                    /* strlen (name), precomputed for speed */
@@ -1869,7 +1870,9 @@ sparc_ip (str, pinsn)
                    int reloc;
                    /* 1 if call.  */
                    int call;
-                 } tls_ops[] = {
+                 }
+                 tls_ops[] =
+                 {
                    { "tgd_add", 7, BFD_RELOC_SPARC_TLS_GD_ADD, 0 },
                    { "tgd_call", 8, BFD_RELOC_SPARC_TLS_GD_CALL, 1 },
                    { "tldm_add", 8, BFD_RELOC_SPARC_TLS_LDM_ADD, 0 },
@@ -1877,7 +1880,8 @@ sparc_ip (str, pinsn)
                    { "tldo_add", 8, BFD_RELOC_SPARC_TLS_LDO_ADD, 0 },
                    { "tie_ldx", 7, BFD_RELOC_SPARC_TLS_IE_LDX, 0 },
                    { "tie_ld", 6, BFD_RELOC_SPARC_TLS_IE_LD, 0 },
-                   { "tie_add", 7, BFD_RELOC_SPARC_TLS_IE_ADD, 0 }
+                   { "tie_add", 7, BFD_RELOC_SPARC_TLS_IE_ADD, 0 },
+                   { NULL, 0, 0, 0 }
                  };
                  const struct tls_ops *o;
                  char *s1;
index e3a93e0..4bd0290 100644 (file)
@@ -1,3 +1,36 @@
+2007-06-05  Nick Clifton  <nickc@redhat.com>
+
+       PR gas/4587
+       * gas/sparc/sparc.exp: Run pr4587 list test.
+       * gas/sparc/pr4587.s: New test case.
+       * gas/sparc/pr4587.l: Expected assembler output.
+
+2007-06-05  Nick Clifton  <nickc@redhat.com>
+
+       * lib/gas-defs.exp (run_list_test): New proc.
+       * gas/alpha/alpha.exp: Delete proc run_list_test.
+       * gas/bfin/bfin.exp : Likewise.
+       * gas/cfi/cfi.exp : Likewise.
+       * gas/crx/allinsn.exp : Likewise.
+       * gas/d10v/d10v.exp : Likewise.
+       * gas/d30v/d30v.exp : Likewise.
+       * gas/frv/allinsn.exp : Likewise.
+       * gas/i386/i386.exp : Likewise.
+       * gas/i860.i860.exp : Likewise.
+       * gas/ia64/ia64.exp : Likewise.
+       * gas/lns/lns.exp : Likewise.
+       * gas/macros/macros.exp : Likewise.
+       * gas/maxq10/maxq10.exp : Likewise.
+       * gas/maxq20/maxq20.exp : Likewise.
+       * gas/mips/mips.exp : Likewise.
+       * gas/mmix/mmix-list.exp : Likewise.
+       * gas/mn10300/basic.exp : Likewise.
+       * gas/msp430/msp430.exp : Likewise.
+       * gas/pdp11/pdp11.exp : Likewise.
+       * gas/ppc/ppc.exp : Likewise.
+       * gas/s390/s390.exp : Likewise.
+       * gas/elf/elf.exp (proc run_list_test): Rename to run_elf_list_test.
+
 2007-05-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR gas/4558
index da785ae..04d9932 100644 (file)
@@ -2,19 +2,6 @@
 # Some generic alpha tests
 #
 
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "alpha $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       return
-    }
-    pass $testname
-}
-
 if { [istarget alpha*-*-*] } then {
 
     set elf [expr [istarget *-*-elf*] \
index 51690a1..9f7849b 100644 (file)
@@ -1,17 +1,5 @@
 # Blackfin assembler testsuite
 
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "bfin $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       return
-    }
-    pass $testname
-}
 if [istarget bfin*-*-*] {
        run_dump_test "arithmetic"
        run_dump_test "bit"
index 3a56505..b396f9e 100644 (file)
@@ -1,17 +1,3 @@
-# ??? This probably shouldn't be replicated here...
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "cfi $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-        fail $testname
-        verbose "output is [file_contents "dump.out"]" 2
-        return
-    }
-    pass $testname
-}
-
 if ![is_elf_format] then {
     return
 }
index f3f8ae8..2a52f70 100644 (file)
@@ -2,19 +2,6 @@
 # Driver for CRX assembler testsuite
 #
 
-proc run_list_test { name opts } {
-  global srcdir subdir
-  set testname "CRX $name"
-  set file $srcdir/$subdir/$name
-  gas_run ${name}.s $opts ">&dump.out"
-  if {[regexp_diff "dump.out" "${file}.l"] } {
-    fail $testname
-    verbose "output is [file_contents "dump.out"]" 2
-    return
-  }
-  pass $testname
-}
-
 if ![istarget crx-*-*] {
     return
 }
index 6169ecf..0b152b0 100644 (file)
@@ -1,19 +1,6 @@
 #
 # Driver for D10V assembler testsuite
 #
-proc run_list_test { name opts } {
-  global srcdir subdir
-  set testname "D10V $name"
-  set file $srcdir/$subdir/$name
-  gas_run ${name}.s $opts ">&dump.out"
-  if {[regexp_diff "dump.out" "${file}.l"] } {
-    fail $testname
-    verbose "output is [file_contents "dump.out"]" 2
-    return
-  }
-  pass $testname
-}
-
 if {[istarget d10v-*-*]} {
     run_dump_test "inst"
     run_dump_test "address-001"
index 275b0e0..d06f606 100644 (file)
@@ -2,19 +2,6 @@
 # D30V assembler tests
 #
 
-proc run_list_test { name opts } {
-  global srcdir subdir
-  set testname "D30V $name"
-  set file $srcdir/$subdir/$name
-  gas_run ${name}.s $opts ">&dump.out"
-  if {[regexp_diff "dump.out" "${file}.l"] } {
-    fail $testname
-    verbose "output is [file_contents "dump.out"]" 2
-    return
-  }
-  pass $testname
-}
-
 if {[istarget d30v-*-*]} {
   run_dump_test "inst"
   run_dump_test "align"
index 7f7365d..227b77e 100644 (file)
@@ -2,7 +2,7 @@
 # elf tests
 #
 
-proc run_list_test { name suffix opts readelf_opts readelf_pipe } {
+proc run_elf_list_test { name suffix opts readelf_opts readelf_pipe } {
     global READELF
     global srcdir subdir
     set testname "elf $name list"
@@ -89,11 +89,11 @@ if { ([istarget "*-*-*elf*"]
     }
     run_dump_test "section0" 
     run_dump_test "section1" 
-    run_list_test "section2" "$target_machine" "-al" "-s" ""
+    run_elf_list_test "section2" "$target_machine" "-al" "-s" ""
     run_dump_test "section3" 
     run_dump_test "section4"
-    run_list_test "section5" "" "-al" "-SW" "| grep \" \\\\.test\\\[0-9\\\]\""
+    run_elf_list_test "section5" "" "-al" "-SW" "| grep \" \\\\.test\\\[0-9\\\]\""
     run_dump_test "struct" 
     run_dump_test "symver" 
-    run_list_test "type" "" "" "-s" "| grep \"1 \\\[FONT\\\]\""
+    run_elf_list_test "type" "" "" "-s" "| grep \"1 \\\[FONT\\\]\""
 }
index ed29d20..b6950ae 100644 (file)
@@ -1,31 +1,19 @@
 # FRV assembler testsuite.
 
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "$name error test ($opts)"
-    gas_run $name.s $opts >&dump.out
-    if {[regexp_diff dump.out $srcdir/$subdir/$name.l]} {
-       fail $testname
-       verbose "output is [file_contents dump.out]" 2
-       return
-    }
-    pass $testname
-}
-
 if [istarget frv*-*-*] {
     run_dump_test "allinsn"
 
     run_dump_test "fdpic"
     run_dump_test "reloc1"
     run_dump_test "fr405-insn"
-    run_list_test "fr405-insn" "-mcpu=fr400"
-    run_list_test "fr405-insn" "-mcpu=fr500"
+    run_list_test "fr405-insn" "-mcpu=fr400" "fr405-insn -mcpu=fr400"
+    run_list_test "fr405-insn" "-mcpu=fr500" "fr405-insn -mcpu=fr500"
 
     run_dump_test "fr450-spr"
     run_dump_test "fr450-insn"
-    run_list_test "fr450-insn" "-mcpu=fr405"
-    run_list_test "fr450-insn" "-mcpu=fr400"
-    run_list_test "fr450-insn" "-mcpu=fr500"
+    run_list_test "fr450-insn" "-mcpu=fr405" "fr450-insn -mcpu=fr405"
+    run_list_test "fr450-insn" "-mcpu=fr400" "fr450-insn -mcpu=fr400"
+    run_list_test "fr450-insn" "-mcpu=fr500" "fr450-insn -mcpu=fr500"
     run_list_test "fr450-media-issue" "-mcpu=fr450"
 
     run_dump_test "fr550-pack1"
index e0702f5..0c419d2 100644 (file)
@@ -1,19 +1,6 @@
 #
 # i386 tests
 #
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "i386 $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       return
-    }
-    pass $testname
-}
-
 proc gas_64_check { } {
     global NM
     global NMFLAGS
index 041d859..39e40af 100644 (file)
@@ -1,18 +1,5 @@
 # i860 assembler testsuite.
 
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "i860 $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-        fail $testname
-        verbose "output is [file_contents "dump.out"]" 2
-        return
-    }
-    pass $testname
-}
-
 if [istarget i860-*-*] {
     run_dump_test "bitwise"
     run_dump_test "branch"
index f68c107..3dfd10b 100644 (file)
@@ -1,19 +1,6 @@
 #
 # ia64 tests
 #
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "ia64 $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       return
-    }
-    pass $testname
-}
-
 if [istarget "ia64-*"] then {
 
     run_dump_test "regs"
index 055c140..2373290 100644 (file)
@@ -1,17 +1,3 @@
-# ??? This probably shouldn't be replicated here...
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "lns $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-        fail $testname
-        verbose "output is [file_contents "dump.out"]" 2
-        return
-    }
-    pass $testname
-}
-
 if ![is_elf_format] then {
     return
 }
index e175ad9..62392ec 100644 (file)
@@ -1,18 +1,5 @@
 # Run some tests of gas macros.
 
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "macros $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       return
-    }
-    pass $testname
-}
-
 if { ![istarget hppa*-*-*] || [istarget *-*-linux*] } {
     run_dump_test test1
 }
@@ -69,6 +56,7 @@ run_dump_test app3
 run_dump_test app4
 
 run_list_test badarg ""
+
 case $target_triplet in {
     { *c54x*-*-* } { }
     { *c4x*-*-* } { }
index 482bd4c..8887b53 100644 (file)
@@ -1,19 +1,6 @@
 #
 # MAXQ10 tests
 #
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "maxq10 $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       return
-    }
-    pass $testname
-}
-
 proc gas_64_check { } {
     global NM
     global NMFLAGS
index d2857f6..6d952e9 100644 (file)
@@ -1,19 +1,6 @@
 #
 # MAXQ20 tests
 #
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "maxq20 $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       return
-    }
-    pass $testname
-}
-
 proc gas_64_check { } {
     global NM
     global NMFLAGS
index ae0276d..523a773 100644 (file)
@@ -292,27 +292,6 @@ proc run_dump_test_arches { name arch_list } {
     }
 }
 
-# run_list_test NAME OPTS (optional): TESTNAME
-#
-# Assemble the file "NAME.d" and compare the assembler standard error
-# output against the regular expressions given in the file "NAME.l".
-# The assembler is passed the flags given in OPTS.  If TESTNAME is
-# provided, it will be used as the name of the test.
-proc run_list_test { name opts {testname {}} } {
-    global srcdir subdir
-    if { [string length $testname] == 0 } then {
-           set testname "MIPS $name"
-    }
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       return
-    }
-    pass $testname
-}
-
 # run_list_test_arch NAME OPTS ARCH
 #
 # Invoke "run_list_test" for test NAME with options OPTS, with extra
index 8d2a294..e4a98d0 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2001 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2007 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,24 +18,6 @@ if { ! [istarget "mmix-*"] } {
     return
 }
 
-proc run_list_test { name opts } {
-    global srcdir subdir runtests
-
-    if ![runtest_file_p $runtests $name] then {
-       return
-    }
-
-    set testname "mmix list $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       return
-    }
-    pass $testname
-}
-
 proc run_mmix_list_tests { } {
     global srcdir subdir runtests
     foreach test_name [lsort [find ${srcdir}/${subdir} *.l]] {
index b80e006..37c1972 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 1996, 2000, 2002, 2004 Free Software Foundation, Inc.
+# Copyright (C) 1996, 2000, 2002, 2004, 2007 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -1768,20 +1768,6 @@ proc do_am33_8 {} {
     if [expr $x==67] then { pass $testname } else { fail $testname }
 }
 
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "mn10300 $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       return
-    }
-    pass $testname
-}
-
-
 if [istarget mn10300*-*-*] then {
     # Test the basic instruction parser.
     do_add
index a45ae4b..c5e8052 100644 (file)
@@ -1,19 +1,6 @@
 #
 # msp430 tests
 #
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "msp430 $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       exit
-       return
-    }
-    pass $testname
-}
 
 if [expr [istarget "msp430-*-*"]]  then {
     run_dump_test "opcode"
index 9ee6435..91ccddb 100644 (file)
@@ -1,19 +1,6 @@
 #
 # pdp11/pdp11 tests
 #
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "pdp11 $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       exit
-       return
-    }
-    pass $testname
-}
 
 if [expr [istarget "pdp11-*-*"]]  then {
 
index 0f0e9bf..0e2db22 100644 (file)
@@ -2,19 +2,6 @@
 # Some PowerPC tests
 #
 
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "ppc $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       return
-    }
-    pass $testname
-}
-
 # These tests are currently ELF specific, only because nobody has
 # converted them to look for XCOFF relocations.
 
index db49134..8739bdd 100644 (file)
@@ -1,19 +1,6 @@
 #
 # s390/s390x tests
 #
-proc run_list_test { name opts } {
-    global srcdir subdir
-    set testname "s390 $name"
-    set file $srcdir/$subdir/$name
-    gas_run ${name}.s $opts ">&dump.out"
-    if { [regexp_diff "dump.out" "${file}.l"] } then {
-       fail $testname
-       verbose "output is [file_contents "dump.out"]" 2
-       exit
-       return
-    }
-    pass $testname
-}
 
 if [expr [istarget "s390-*-*"] ||  [istarget "s390x-*-*"]]  then {
 
diff --git a/gas/testsuite/gas/sparc/pr4587.l b/gas/testsuite/gas/sparc/pr4587.l
new file mode 100644 (file)
index 0000000..fd05091
--- /dev/null
@@ -0,0 +1,2 @@
+.*pr4587.s: Assembler messages:
+.*pr4587.s:18: Error: Illegal operands
diff --git a/gas/testsuite/gas/sparc/pr4587.s b/gas/testsuite/gas/sparc/pr4587.s
new file mode 100644 (file)
index 0000000..a058c1d
--- /dev/null
@@ -0,0 +1,22 @@
+       .section .data
+       .align 4
+zero: .single 0.0
+
+       .section .text
+       .align 4
+       .global main
+main:
+    save %sp, -96, %sp
+
+    ! Zero-out the first FP register
+    set zero, %l0
+    ld [%l0], %f0
+
+    ! Compare it to itself
+    ! The third reg (%f0) will cause a segfault in as
+    ! fcmps only takes two regs... this should be illegal operand error
+    fcmps %f0, %f0, %f0
+
+    ! Return 0
+    ret
+    restore %g0, %g0, %o0
index 60ca24f..876f9ac 100644 (file)
@@ -53,6 +53,8 @@ if [istarget sparc*-*-*] {
     run_dump_test "v9branch3"
     run_dump_test "v9branch4"
     run_dump_test "v9branch5"
+
+    run_list_test "pr4587" ""
 }
 
 if [istarget sparc-*-vxworks*] {
index 3b21719..eabd018 100644 (file)
@@ -1,5 +1,5 @@
 # Copyright (C) 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-# 2004, 2005 Free Software Foundation, Inc.
+# 2004, 2005, 2007 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -888,3 +888,25 @@ if ![string length [info proc prune_warnings]] {
        return $text
     }
 }
+
+# run_list_test NAME OPTS (optional): TESTNAME
+#
+# Assemble the file "NAME.d" with command line options OPTS and
+# compare the assembler standard error output against thee regular
+# expressions given in the file "NAME.l".  If TESTNAME is provided,
+# it will be used as the name of the test.
+
+proc run_list_test { name opts {testname {}} } {
+    global srcdir subdir
+    if { [string length $testname] == 0 } then {
+       set testname "[file tail $subdir] $name"
+    }
+    set file $srcdir/$subdir/$name
+    gas_run ${name}.s $opts ">&dump.out"
+    if { [regexp_diff "dump.out" "${file}.l"] } then {
+       fail $testname
+       verbose "output is [file_contents "dump.out"]" 2
+       return
+    }
+    pass $testname
+}