aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Demetriou <cgd@google.com>2003-04-02 18:43:16 +0000
committerChris Demetriou <cgd@google.com>2003-04-02 18:43:16 +0000
commitaf22f5b24a0ca6ff93ca536bf12a6b6afb3713a2 (patch)
tree87e20f0c67778f5b3e5f17d601f56b57c5080293
parent8fdeb6e3c534eef6c31a5152448d9e1fa995ddc4 (diff)
downloadgdb-af22f5b24a0ca6ff93ca536bf12a6b6afb3713a2.zip
gdb-af22f5b24a0ca6ff93ca536bf12a6b6afb3713a2.tar.gz
gdb-af22f5b24a0ca6ff93ca536bf12a6b6afb3713a2.tar.bz2
[ gas/ChangeLog ]
2003-04-02 Chris Demetriou <cgd@broadcom.com> * config/tc-mips.c (macro2): Adjust implementation of M_ULH, M_ULHU, M_ULW, and M_ULD so that they work properly in the case where the source and destination registers are the same. [ gas/testsuite/ChangeLog ] 2003-04-02 Chris Demetriou <cgd@broadcom.com> * gas/mips/ulh.d: Adjust for ulh and ulhu macro assembly changes. * gas/mips/mips.exp: Define new "gpr_ilocks" architecture property, and add it to mips2 (and later) chips and r3900. * gas/mips/uld2.s: New test source file. * gas/mips/ulh2.s: Likewise. * gas/mips/ulw2.s: Likewise. * gas/mips/uld2.l: New test stderr listing. * gas/mips/ulh2.l: Likewise. * gas/mips/ulw2.l: Likewise. * gas/mips/uld2-eb.d: New test. * gas/mips/uld2-el.d: Likewise. * gas/mips/ulh2-eb.d: Likewise. * gas/mips/ulh2-el.d: Likewise. * gas/mips/ulw2-eb-ilocks.d: Likewise. * gas/mips/ulw2-eb.d: Likewise. * gas/mips/ulw2-el-ilocks.d: Likewise. * gas/mips/ulw2-el.d: Likewise. * gas/mips/mips.exp: Run new tests for appropriate architectures.
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/config/tc-mips.c25
-rw-r--r--gas/testsuite/ChangeLog22
-rw-r--r--gas/testsuite/gas/mips/mips.exp18
-rw-r--r--gas/testsuite/gas/mips/uld2-eb.d26
-rw-r--r--gas/testsuite/gas/mips/uld2-el.d26
-rw-r--r--gas/testsuite/gas/mips/uld2.l3
-rw-r--r--gas/testsuite/gas/mips/uld2.s15
-rw-r--r--gas/testsuite/gas/mips/ulh.d36
-rw-r--r--gas/testsuite/gas/mips/ulh2-eb.d44
-rw-r--r--gas/testsuite/gas/mips/ulh2-el.d44
-rw-r--r--gas/testsuite/gas/mips/ulh2.l9
-rw-r--r--gas/testsuite/gas/mips/ulh2.s21
-rw-r--r--gas/testsuite/gas/mips/ulw2-eb-ilocks.d26
-rw-r--r--gas/testsuite/gas/mips/ulw2-eb.d28
-rw-r--r--gas/testsuite/gas/mips/ulw2-el-ilocks.d26
-rw-r--r--gas/testsuite/gas/mips/ulw2-el.d28
-rw-r--r--gas/testsuite/gas/mips/ulw2.l3
-rw-r--r--gas/testsuite/gas/mips/ulw2.s15
19 files changed, 395 insertions, 27 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 5462dd5..b8df657 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2003-04-02 Chris Demetriou <cgd@broadcom.com>
+
+ * config/tc-mips.c (macro2): Adjust implementation of
+ M_ULH, M_ULHU, M_ULW, and M_ULD so that they work properly
+ in the case where the source and destination registers
+ are the same.
+
2003-04-01 Bob Wilson <bob.wilson@acm.org>
* Makefile.am (CPU_TYPES): Add xtensa.
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 239ed6d..2e114f4 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -7554,19 +7554,18 @@ macro2 (ip)
ulh:
if (offset_expr.X_add_number >= 0x7fff)
as_bad (_("operand overflow"));
- /* avoid load delay */
if (! target_big_endian)
++offset_expr.X_add_number;
- macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
+ macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", AT,
(int) BFD_RELOC_LO16, breg);
if (! target_big_endian)
--offset_expr.X_add_number;
else
++offset_expr.X_add_number;
- macro_build ((char *) NULL, &icnt, &offset_expr, "lbu", "t,o(b)", AT,
+ macro_build ((char *) NULL, &icnt, &offset_expr, "lbu", "t,o(b)", treg,
(int) BFD_RELOC_LO16, breg);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
- treg, treg, 8);
+ AT, AT, 8);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
treg, treg, AT);
break;
@@ -7583,17 +7582,29 @@ macro2 (ip)
ulw:
if (offset_expr.X_add_number >= 0x8000 - off)
as_bad (_("operand overflow"));
+ if (treg != breg)
+ tempreg = treg;
+ else
+ tempreg = AT;
if (! target_big_endian)
offset_expr.X_add_number += off;
- macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
+ macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", tempreg,
(int) BFD_RELOC_LO16, breg);
if (! target_big_endian)
offset_expr.X_add_number -= off;
else
offset_expr.X_add_number += off;
- macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", treg,
+ macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", tempreg,
(int) BFD_RELOC_LO16, breg);
- return;
+
+ /* If necessary, move the result in tempreg the final destination. */
+ if (treg == tempreg)
+ return;
+ /* Protect second load's delay slot. */
+ if (!gpr_interlocks)
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
+ move_register (&icnt, treg, tempreg);
+ break;
case M_ULD_A:
s = "ldl";
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 5582d16..0a0dba1 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,25 @@
+2003-04-02 Chris Demetriou <cgd@broadcom.com>
+
+ * gas/mips/ulh.d: Adjust for ulh and ulhu macro assembly changes.
+
+ * gas/mips/mips.exp: Define new "gpr_ilocks" architecture
+ property, and add it to mips2 (and later) chips and r3900.
+ * gas/mips/uld2.s: New test source file.
+ * gas/mips/ulh2.s: Likewise.
+ * gas/mips/ulw2.s: Likewise.
+ * gas/mips/uld2.l: New test stderr listing.
+ * gas/mips/ulh2.l: Likewise.
+ * gas/mips/ulw2.l: Likewise.
+ * gas/mips/uld2-eb.d: New test.
+ * gas/mips/uld2-el.d: Likewise.
+ * gas/mips/ulh2-eb.d: Likewise.
+ * gas/mips/ulh2-el.d: Likewise.
+ * gas/mips/ulw2-eb-ilocks.d: Likewise.
+ * gas/mips/ulw2-eb.d: Likewise.
+ * gas/mips/ulw2-el-ilocks.d: Likewise.
+ * gas/mips/ulw2-el.d: Likewise.
+ * gas/mips/mips.exp: Run new tests for appropriate architectures.
+
2003-04-01 Bob Wilson <bob.wilson@acm.org>
* gas/xtensa/all.exp: New file.
diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
index eaf7d37..aa68573 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -55,6 +55,10 @@
# The architecture includes the instructions defined
# by that MIPS ISA.
#
+# gpr_ilocks
+# The architecture interlocks GPRs accesses. (That is,
+# there are no load delay slots.)
+#
# mips3d The architecture includes the MIPS-3D ASE.
#
# ror The architecture includes hardware rotate instructions.
@@ -332,7 +336,7 @@ proc run_list_test_arches { name opts arch_list } {
# to any architecture.
mips_arch_create mips1 32 {} {} \
{ -march=mips1 -mtune=mips1 } { -mmips:3000 }
-mips_arch_create mips2 32 mips1 {} \
+mips_arch_create mips2 32 mips1 { gpr_ilocks } \
{ -march=mips2 -mtune=mips2 } { -mmips:6000 }
mips_arch_create mips3 64 mips2 {} \
{ -march=mips3 -mtune=mips3 } { -mmips:4000 }
@@ -352,7 +356,7 @@ mips_arch_create mips64 64 mips5 { mips32 } \
{ mipsisa64-*-* mipsisa64el-*-* }
mips_arch_create r3000 32 mips1 {} \
{ -march=r3000 -mtune=r3000 } { -mmips:3000 }
-mips_arch_create r3900 32 mips1 {} \
+mips_arch_create r3900 32 mips1 { gpr_ilocks } \
{ -march=r3900 -mtune=r3900 } { -mmips:3900 } \
{ mipstx39-*-* mipstx39el-*-* }
mips_arch_create r4000 64 mips3 {} \
@@ -492,6 +496,8 @@ if { [istarget mips*-*-*] } then {
if !$aout { run_dump_test "sb" }
run_dump_test "trunc"
if !$aout { run_dump_test "ulh" }
+ run_dump_test_arches "ulh2-eb" [mips_arch_list_matching mips1]
+ run_dump_test_arches "ulh2-el" [mips_arch_list_matching mips1]
if $elf { run_dump_test "ulh-svr4pic" }
if $elf { run_dump_test "ulh-xgot" }
if $ecoff { run_dump_test "ulh-empic" }
@@ -502,6 +508,14 @@ if { [istarget mips*-*-*] } then {
run_dump_test "usw"
run_dump_test "usd"
}
+ run_dump_test_arches "ulw2-eb" [mips_arch_list_matching !gpr_ilocks]
+ run_dump_test_arches "ulw2-eb-ilocks" [mips_arch_list_matching gpr_ilocks]
+ run_dump_test_arches "ulw2-el" [mips_arch_list_matching !gpr_ilocks]
+ run_dump_test_arches "ulw2-el-ilocks" [mips_arch_list_matching gpr_ilocks]
+
+ run_dump_test_arches "uld2-eb" [mips_arch_list_matching mips3]
+ run_dump_test_arches "uld2-el" [mips_arch_list_matching mips3]
+
# The mips16 test can only be run on ELF, because only ELF
# supports the necessary mips16 reloc.
if { $elf && !$no_mips16 } {
diff --git a/gas/testsuite/gas/mips/uld2-eb.d b/gas/testsuite/gas/mips/uld2-eb.d
new file mode 100644
index 0000000..90681da6
--- /dev/null
+++ b/gas/testsuite/gas/mips/uld2-eb.d
@@ -0,0 +1,26 @@
+#as: -EB
+#objdump: -dr --prefix-addresses --show-raw-insn -M reg-names=numeric
+#name: uld2 -EB
+#source: uld2.s
+#stderr: uld2.l
+
+# Further checks of uld macro.
+# XXX: note: when 'move' is changed to use 'or' rather than daddu, the
+# XXX: 'move' opcodes shown here (whose raw instruction fields are daddu)
+# XXX: should be changed to be 'or' instructions and this comment should be
+# XXX: removed.
+
+.*: +file format .*mips.*
+
+Disassembly of section .text:
+0+0000 <[^>]*> 68a40000 ldl \$4,0\(\$5\)
+0+0004 <[^>]*> 6ca40007 ldr \$4,7\(\$5\)
+0+0008 <[^>]*> 68a40001 ldl \$4,1\(\$5\)
+0+000c <[^>]*> 6ca40008 ldr \$4,8\(\$5\)
+0+0010 <[^>]*> 68a10000 ldl \$1,0\(\$5\)
+0+0014 <[^>]*> 6ca10007 ldr \$1,7\(\$5\)
+0+0018 <[^>]*> 0020282d move \$5,\$1
+0+001c <[^>]*> 68a10001 ldl \$1,1\(\$5\)
+0+0020 <[^>]*> 6ca10008 ldr \$1,8\(\$5\)
+0+0024 <[^>]*> 0020282d move \$5,\$1
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/uld2-el.d b/gas/testsuite/gas/mips/uld2-el.d
new file mode 100644
index 0000000..08a53a7
--- /dev/null
+++ b/gas/testsuite/gas/mips/uld2-el.d
@@ -0,0 +1,26 @@
+#as: -EL
+#objdump: -dr --prefix-addresses --show-raw-insn -M reg-names=numeric
+#name: uld2 -EL
+#source: uld2.s
+#stderr: uld2.l
+
+# Further checks of uld macro.
+# XXX: note: when 'move' is changed to use 'or' rather than daddu, the
+# XXX: 'move' opcodes shown here (whose raw instruction fields are daddu)
+# XXX: should be changed to be 'or' instructions and this comment should be
+# XXX: removed.
+
+.*: +file format .*mips.*
+
+Disassembly of section .text:
+0+0000 <[^>]*> 68a40007 ldl \$4,7\(\$5\)
+0+0004 <[^>]*> 6ca40000 ldr \$4,0\(\$5\)
+0+0008 <[^>]*> 68a40008 ldl \$4,8\(\$5\)
+0+000c <[^>]*> 6ca40001 ldr \$4,1\(\$5\)
+0+0010 <[^>]*> 68a10007 ldl \$1,7\(\$5\)
+0+0014 <[^>]*> 6ca10000 ldr \$1,0\(\$5\)
+0+0018 <[^>]*> 0020282d move \$5,\$1
+0+001c <[^>]*> 68a10008 ldl \$1,8\(\$5\)
+0+0020 <[^>]*> 6ca10001 ldr \$1,1\(\$5\)
+0+0024 <[^>]*> 0020282d move \$5,\$1
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/uld2.l b/gas/testsuite/gas/mips/uld2.l
new file mode 100644
index 0000000..1ab29b5
--- /dev/null
+++ b/gas/testsuite/gas/mips/uld2.l
@@ -0,0 +1,3 @@
+.*: Assembler messages:
+.*:11: Warning: Macro used \$at after "\.set noat"
+.*:12: Warning: Macro used \$at after "\.set noat"
diff --git a/gas/testsuite/gas/mips/uld2.s b/gas/testsuite/gas/mips/uld2.s
new file mode 100644
index 0000000..5b0d99b
--- /dev/null
+++ b/gas/testsuite/gas/mips/uld2.s
@@ -0,0 +1,15 @@
+# Source file used to test the uld macro (harder).
+
+ .set noat
+
+ .text
+text_label:
+
+ uld $4,0($5)
+ uld $4,1($5)
+
+ uld $5,0($5) # warns
+ uld $5,1($5) # warns
+
+# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
+ .space 8
diff --git a/gas/testsuite/gas/mips/ulh.d b/gas/testsuite/gas/mips/ulh.d
index 264885a..df5a57b 100644
--- a/gas/testsuite/gas/mips/ulh.d
+++ b/gas/testsuite/gas/mips/ulh.d
@@ -7,22 +7,22 @@
.*: +file format .*mips.*
Disassembly of section .text:
-0+0000 <[^>]*> lb a0,[01]\(zero\)
-0+0004 <[^>]*> lbu at,[01]\(zero\)
-0+0008 <[^>]*> sll a0,a0,0x8
+0+0000 <[^>]*> lb at,[01]\(zero\)
+0+0004 <[^>]*> lbu a0,[01]\(zero\)
+0+0008 <[^>]*> sll at,at,0x8
0+000c <[^>]*> or a0,a0,at
-0+0010 <[^>]*> lb a0,[12]\(zero\)
-0+0014 <[^>]*> lbu at,[12]\(zero\)
-0+0018 <[^>]*> sll a0,a0,0x8
+0+0010 <[^>]*> lb at,[12]\(zero\)
+0+0014 <[^>]*> lbu a0,[12]\(zero\)
+0+0018 <[^>]*> sll at,at,0x8
0+001c <[^>]*> or a0,a0,at
0+0020 <[^>]*> li at,0x8000
0+0024 <[^>]*> lb a0,[01]\(at\)
0+0028 <[^>]*> lbu at,[01]\(at\)
0+002c <[^>]*> sll a0,a0,0x8
0+0030 <[^>]*> or a0,a0,at
-0+0034 <[^>]*> lb a0,-3276[78]\(zero\)
-0+0038 <[^>]*> lbu at,-3276[78]\(zero\)
-0+003c <[^>]*> sll a0,a0,0x8
+0+0034 <[^>]*> lb at,-3276[78]\(zero\)
+0+0038 <[^>]*> lbu a0,-3276[78]\(zero\)
+0+003c <[^>]*> sll at,at,0x8
0+0040 <[^>]*> or a0,a0,at
0+0044 <[^>]*> lui at,0x1
0+0048 <[^>]*> lb a0,[01]\(at\)
@@ -35,13 +35,13 @@ Disassembly of section .text:
0+0064 <[^>]*> lbu at,[01]\(at\)
0+0068 <[^>]*> sll a0,a0,0x8
0+006c <[^>]*> or a0,a0,at
-0+0070 <[^>]*> lb a0,[01]\(a1\)
-0+0074 <[^>]*> lbu at,[01]\(a1\)
-0+0078 <[^>]*> sll a0,a0,0x8
+0+0070 <[^>]*> lb at,[01]\(a1\)
+0+0074 <[^>]*> lbu a0,[01]\(a1\)
+0+0078 <[^>]*> sll at,at,0x8
0+007c <[^>]*> or a0,a0,at
-0+0080 <[^>]*> lb a0,[12]\(a1\)
-0+0084 <[^>]*> lbu at,[12]\(a1\)
-0+0088 <[^>]*> sll a0,a0,0x8
+0+0080 <[^>]*> lb at,[12]\(a1\)
+0+0084 <[^>]*> lbu a0,[12]\(a1\)
+0+0088 <[^>]*> sll at,at,0x8
0+008c <[^>]*> or a0,a0,at
0+0090 <[^>]*> lui at,[-0-9x]+
[ ]*90: [A-Z0-9_]*HI[A-Z0-9_]* .data.*
@@ -367,8 +367,8 @@ Disassembly of section .text:
0+045c <[^>]*> lbu at,[01]\(at\)
0+0460 <[^>]*> sll a0,a0,0x8
0+0464 <[^>]*> or a0,a0,at
-0+0468 <[^>]*> lbu a0,[01]\(zero\)
-0+046c <[^>]*> lbu at,[01]\(zero\)
-0+0470 <[^>]*> sll a0,a0,0x8
+0+0468 <[^>]*> lbu at,[01]\(zero\)
+0+046c <[^>]*> lbu a0,[01]\(zero\)
+0+0470 <[^>]*> sll at,at,0x8
0+0474 <[^>]*> or a0,a0,at
...
diff --git a/gas/testsuite/gas/mips/ulh2-eb.d b/gas/testsuite/gas/mips/ulh2-eb.d
new file mode 100644
index 0000000..d822fce
--- /dev/null
+++ b/gas/testsuite/gas/mips/ulh2-eb.d
@@ -0,0 +1,44 @@
+#as: -EB
+#objdump: -dr --prefix-addresses --show-raw-insn -M reg-names=numeric
+#name: ulh2 -EB
+#source: ulh2.s
+#stderr: ulh2.l
+
+# Further checks of ulh/ulhu macros.
+
+.*: +file format .*mips.*
+
+Disassembly of section .text:
+0+0000 <[^>]*> 80a10000 lb \$1,0\(\$5\)
+0+0004 <[^>]*> 90a40001 lbu \$4,1\(\$5\)
+0+0008 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+000c <[^>]*> 00812025 or \$4,\$4,\$1
+0+0010 <[^>]*> 80a10001 lb \$1,1\(\$5\)
+0+0014 <[^>]*> 90a40002 lbu \$4,2\(\$5\)
+0+0018 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+001c <[^>]*> 00812025 or \$4,\$4,\$1
+0+0020 <[^>]*> 80a10000 lb \$1,0\(\$5\)
+0+0024 <[^>]*> 90a50001 lbu \$5,1\(\$5\)
+0+0028 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+002c <[^>]*> 00a12825 or \$5,\$5,\$1
+0+0030 <[^>]*> 80a10001 lb \$1,1\(\$5\)
+0+0034 <[^>]*> 90a50002 lbu \$5,2\(\$5\)
+0+0038 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+003c <[^>]*> 00a12825 or \$5,\$5,\$1
+0+0040 <[^>]*> 90a10000 lbu \$1,0\(\$5\)
+0+0044 <[^>]*> 90a40001 lbu \$4,1\(\$5\)
+0+0048 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+004c <[^>]*> 00812025 or \$4,\$4,\$1
+0+0050 <[^>]*> 90a10001 lbu \$1,1\(\$5\)
+0+0054 <[^>]*> 90a40002 lbu \$4,2\(\$5\)
+0+0058 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+005c <[^>]*> 00812025 or \$4,\$4,\$1
+0+0060 <[^>]*> 90a10000 lbu \$1,0\(\$5\)
+0+0064 <[^>]*> 90a50001 lbu \$5,1\(\$5\)
+0+0068 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+006c <[^>]*> 00a12825 or \$5,\$5,\$1
+0+0070 <[^>]*> 90a10001 lbu \$1,1\(\$5\)
+0+0074 <[^>]*> 90a50002 lbu \$5,2\(\$5\)
+0+0078 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+007c <[^>]*> 00a12825 or \$5,\$5,\$1
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/ulh2-el.d b/gas/testsuite/gas/mips/ulh2-el.d
new file mode 100644
index 0000000..0f5d369
--- /dev/null
+++ b/gas/testsuite/gas/mips/ulh2-el.d
@@ -0,0 +1,44 @@
+#as: -EL
+#objdump: -dr --prefix-addresses --show-raw-insn -M reg-names=numeric
+#name: ulh2 -EL
+#source: ulh2.s
+#stderr: ulh2.l
+
+# Further checks of ulh/ulhu macros.
+
+.*: +file format .*mips.*
+
+Disassembly of section .text:
+0+0000 <[^>]*> 80a10001 lb \$1,1\(\$5\)
+0+0004 <[^>]*> 90a40000 lbu \$4,0\(\$5\)
+0+0008 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+000c <[^>]*> 00812025 or \$4,\$4,\$1
+0+0010 <[^>]*> 80a10002 lb \$1,2\(\$5\)
+0+0014 <[^>]*> 90a40001 lbu \$4,1\(\$5\)
+0+0018 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+001c <[^>]*> 00812025 or \$4,\$4,\$1
+0+0020 <[^>]*> 80a10001 lb \$1,1\(\$5\)
+0+0024 <[^>]*> 90a50000 lbu \$5,0\(\$5\)
+0+0028 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+002c <[^>]*> 00a12825 or \$5,\$5,\$1
+0+0030 <[^>]*> 80a10002 lb \$1,2\(\$5\)
+0+0034 <[^>]*> 90a50001 lbu \$5,1\(\$5\)
+0+0038 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+003c <[^>]*> 00a12825 or \$5,\$5,\$1
+0+0040 <[^>]*> 90a10001 lbu \$1,1\(\$5\)
+0+0044 <[^>]*> 90a40000 lbu \$4,0\(\$5\)
+0+0048 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+004c <[^>]*> 00812025 or \$4,\$4,\$1
+0+0050 <[^>]*> 90a10002 lbu \$1,2\(\$5\)
+0+0054 <[^>]*> 90a40001 lbu \$4,1\(\$5\)
+0+0058 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+005c <[^>]*> 00812025 or \$4,\$4,\$1
+0+0060 <[^>]*> 90a10001 lbu \$1,1\(\$5\)
+0+0064 <[^>]*> 90a50000 lbu \$5,0\(\$5\)
+0+0068 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+006c <[^>]*> 00a12825 or \$5,\$5,\$1
+0+0070 <[^>]*> 90a10002 lbu \$1,2\(\$5\)
+0+0074 <[^>]*> 90a50001 lbu \$5,1\(\$5\)
+0+0078 <[^>]*> 00010a00 sll \$1,\$1,0x8
+0+007c <[^>]*> 00a12825 or \$5,\$5,\$1
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/ulh2.l b/gas/testsuite/gas/mips/ulh2.l
new file mode 100644
index 0000000..4bab367
--- /dev/null
+++ b/gas/testsuite/gas/mips/ulh2.l
@@ -0,0 +1,9 @@
+.*: Assembler messages:
+.*:8: Warning: Macro used \$at after "\.set noat"
+.*:9: Warning: Macro used \$at after "\.set noat"
+.*:11: Warning: Macro used \$at after "\.set noat"
+.*:12: Warning: Macro used \$at after "\.set noat"
+.*:14: Warning: Macro used \$at after "\.set noat"
+.*:15: Warning: Macro used \$at after "\.set noat"
+.*:17: Warning: Macro used \$at after "\.set noat"
+.*:18: Warning: Macro used \$at after "\.set noat"
diff --git a/gas/testsuite/gas/mips/ulh2.s b/gas/testsuite/gas/mips/ulh2.s
new file mode 100644
index 0000000..3aa1cff
--- /dev/null
+++ b/gas/testsuite/gas/mips/ulh2.s
@@ -0,0 +1,21 @@
+# Source file used to test the ulh and ulhu macros (harder).
+
+ .set noat
+
+ .text
+text_label:
+
+ ulh $4,0($5) # warns
+ ulh $4,1($5) # warns
+
+ ulh $5,0($5) # warns
+ ulh $5,1($5) # warns
+
+ ulhu $4,0($5) # warns
+ ulhu $4,1($5) # warns
+
+ ulhu $5,0($5) # warns
+ ulhu $5,1($5) # warns
+
+# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
+ .space 8
diff --git a/gas/testsuite/gas/mips/ulw2-eb-ilocks.d b/gas/testsuite/gas/mips/ulw2-eb-ilocks.d
new file mode 100644
index 0000000..7526909
--- /dev/null
+++ b/gas/testsuite/gas/mips/ulw2-eb-ilocks.d
@@ -0,0 +1,26 @@
+#as: -EB
+#objdump: -dr --prefix-addresses --show-raw-insn -M reg-names=numeric
+#name: ulw2 -EB interlocked
+#source: ulw2.s
+#stderr: ulw2.l
+
+# Further checks of ulw macro.
+# XXX: note: when 'move' is changed to use 'or' rather than addu/daddu, the
+# XXX: 'move' opcodes shown here (whose raw instruction fields are addu/daddu)
+# XXX: should be changed to be 'or' instructions and this comment should be
+# XXX: removed.
+
+.*: +file format .*mips.*
+
+Disassembly of section .text:
+0+0000 <[^>]*> 88a40000 lwl \$4,0\(\$5\)
+0+0004 <[^>]*> 98a40003 lwr \$4,3\(\$5\)
+0+0008 <[^>]*> 88a40001 lwl \$4,1\(\$5\)
+0+000c <[^>]*> 98a40004 lwr \$4,4\(\$5\)
+0+0010 <[^>]*> 88a10000 lwl \$1,0\(\$5\)
+0+0014 <[^>]*> 98a10003 lwr \$1,3\(\$5\)
+0+0018 <[^>]*> 0020282[1d] move \$5,\$1
+0+001c <[^>]*> 88a10001 lwl \$1,1\(\$5\)
+0+0020 <[^>]*> 98a10004 lwr \$1,4\(\$5\)
+0+0024 <[^>]*> 0020282[1d] move \$5,\$1
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/ulw2-eb.d b/gas/testsuite/gas/mips/ulw2-eb.d
new file mode 100644
index 0000000..cb7cae6
--- /dev/null
+++ b/gas/testsuite/gas/mips/ulw2-eb.d
@@ -0,0 +1,28 @@
+#as: -EB
+#objdump: -dr --prefix-addresses --show-raw-insn -M reg-names=numeric
+#name: ulw2 -EB non-interlocked
+#source: ulw2.s
+#stderr: ulw2.l
+
+# Further checks of ulw macro.
+# XXX: note: when 'move' is changed to use 'or' rather than addu/daddu, the
+# XXX: 'move' opcodes shown here (whose raw instruction fields are addu/daddu)
+# XXX: should be changed to be 'or' instructions and this comment should be
+# XXX: removed.
+
+.*: +file format .*mips.*
+
+Disassembly of section .text:
+0+0000 <[^>]*> 88a40000 lwl \$4,0\(\$5\)
+0+0004 <[^>]*> 98a40003 lwr \$4,3\(\$5\)
+0+0008 <[^>]*> 88a40001 lwl \$4,1\(\$5\)
+0+000c <[^>]*> 98a40004 lwr \$4,4\(\$5\)
+0+0010 <[^>]*> 88a10000 lwl \$1,0\(\$5\)
+0+0014 <[^>]*> 98a10003 lwr \$1,3\(\$5\)
+0+0018 <[^>]*> 00000000 nop
+0+001c <[^>]*> 0020282[1d] move \$5,\$1
+0+0020 <[^>]*> 88a10001 lwl \$1,1\(\$5\)
+0+0024 <[^>]*> 98a10004 lwr \$1,4\(\$5\)
+0+0028 <[^>]*> 00000000 nop
+0+002c <[^>]*> 0020282[1d] move \$5,\$1
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/ulw2-el-ilocks.d b/gas/testsuite/gas/mips/ulw2-el-ilocks.d
new file mode 100644
index 0000000..cce9fb7
--- /dev/null
+++ b/gas/testsuite/gas/mips/ulw2-el-ilocks.d
@@ -0,0 +1,26 @@
+#as: -EL
+#objdump: -dr --prefix-addresses --show-raw-insn -M reg-names=numeric
+#name: ulw2 -EL interlocked
+#source: ulw2.s
+#stderr: ulw2.l
+
+# Further checks of ulw macro.
+# XXX: note: when 'move' is changed to use 'or' rather than addu/daddu, the
+# XXX: 'move' opcodes shown here (whose raw instruction fields are addu/daddu)
+# XXX: should be changed to be 'or' instructions and this comment should be
+# XXX: removed.
+
+.*: +file format .*mips.*
+
+Disassembly of section .text:
+0+0000 <[^>]*> 88a40003 lwl \$4,3\(\$5\)
+0+0004 <[^>]*> 98a40000 lwr \$4,0\(\$5\)
+0+0008 <[^>]*> 88a40004 lwl \$4,4\(\$5\)
+0+000c <[^>]*> 98a40001 lwr \$4,1\(\$5\)
+0+0010 <[^>]*> 88a10003 lwl \$1,3\(\$5\)
+0+0014 <[^>]*> 98a10000 lwr \$1,0\(\$5\)
+0+0018 <[^>]*> 0020282[1d] move \$5,\$1
+0+001c <[^>]*> 88a10004 lwl \$1,4\(\$5\)
+0+0020 <[^>]*> 98a10001 lwr \$1,1\(\$5\)
+0+0024 <[^>]*> 0020282[1d] move \$5,\$1
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/ulw2-el.d b/gas/testsuite/gas/mips/ulw2-el.d
new file mode 100644
index 0000000..59039a8
--- /dev/null
+++ b/gas/testsuite/gas/mips/ulw2-el.d
@@ -0,0 +1,28 @@
+#as: -EL
+#objdump: -dr --prefix-addresses --show-raw-insn -M reg-names=numeric
+#name: ulw2 -EL non-interlocked
+#source: ulw2.s
+#stderr: ulw2.l
+
+# Further checks of ulw macro.
+# XXX: note: when 'move' is changed to use 'or' rather than addu/daddu, the
+# XXX: 'move' opcodes shown here (whose raw instruction fields are addu/daddu)
+# XXX: should be changed to be 'or' instructions and this comment should be
+# XXX: removed.
+
+.*: +file format .*mips.*
+
+Disassembly of section .text:
+0+0000 <[^>]*> 88a40003 lwl \$4,3\(\$5\)
+0+0004 <[^>]*> 98a40000 lwr \$4,0\(\$5\)
+0+0008 <[^>]*> 88a40004 lwl \$4,4\(\$5\)
+0+000c <[^>]*> 98a40001 lwr \$4,1\(\$5\)
+0+0010 <[^>]*> 88a10003 lwl \$1,3\(\$5\)
+0+0014 <[^>]*> 98a10000 lwr \$1,0\(\$5\)
+0+0018 <[^>]*> 00000000 nop
+0+001c <[^>]*> 0020282[1d] move \$5,\$1
+0+0020 <[^>]*> 88a10004 lwl \$1,4\(\$5\)
+0+0024 <[^>]*> 98a10001 lwr \$1,1\(\$5\)
+0+0028 <[^>]*> 00000000 nop
+0+002c <[^>]*> 0020282[1d] move \$5,\$1
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/ulw2.l b/gas/testsuite/gas/mips/ulw2.l
new file mode 100644
index 0000000..1ab29b5
--- /dev/null
+++ b/gas/testsuite/gas/mips/ulw2.l
@@ -0,0 +1,3 @@
+.*: Assembler messages:
+.*:11: Warning: Macro used \$at after "\.set noat"
+.*:12: Warning: Macro used \$at after "\.set noat"
diff --git a/gas/testsuite/gas/mips/ulw2.s b/gas/testsuite/gas/mips/ulw2.s
new file mode 100644
index 0000000..f4373dc
--- /dev/null
+++ b/gas/testsuite/gas/mips/ulw2.s
@@ -0,0 +1,15 @@
+# Source file used to test the ulw macro (harder).
+
+ .set noat
+
+ .text
+text_label:
+
+ ulw $4,0($5)
+ ulw $4,1($5)
+
+ ulw $5,0($5) # warns
+ ulw $5,1($5) # warns
+
+# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
+ .space 8