This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH 1/2] MIPS/GAS: Fix o32 LD to the base register
- From: "Maciej W. Rozycki" <macro at linux-mips dot org>
- To: Richard Sandiford <rdsandiford at googlemail dot com>
- Cc: binutils at sourceware dot org
- Date: Sun, 17 Oct 2010 17:22:31 +0100 (BST)
- Subject: [PATCH 1/2] MIPS/GAS: Fix o32 LD to the base register
Hi,
Here's another one:
$ cat ld-base.s
ld $4, ($4)
$ mips-linux-as -o ld-base.o ld-base.s
$ mips-linux-objdump -d ld-base.o
ld-base.o: file format elf32-tradbigmips
Disassembly of section .text:
00000000 <.text>:
0: 8c840000 lw a0,0(a0)
4: 00000000 nop
8: 8c850004 lw a1,4(a0)
Ouch!
Fixed thus and regression tested for mips-linux, mips64-linux,
mipstx39-elf, mipsisa64-elf and mips-ecoff targets and their little-endian
counterparts. The new code produced looks like this:
$ mips-linux-objdump -d ld-base.o
ld-base.o: file format elf32-tradbigmips
Disassembly of section .text:
00000000 <.text>:
0: 00800821 move at,a0
4: 8c240000 lw a0,0(at)
8: 8c250004 lw a1,4(at)
2010-10-17 Maciej W. Rozycki <macro@linux-mips.org>
gas/
* config/tc-mips.c (macro)[M_LD_OB]: Use a temporary register
when the first load of the pair would overwrite the base
register needed for the other one.
OK? And thanks for your reviews so far -- I'll try to proceed with
commits ASAP.
Maciej
binutils-2.20.51-20100925-mips-gas-ld-tmp.patch
Index: binutils-2.20.51/gas/config/tc-mips.c
===================================================================
--- binutils-2.20.51.orig/gas/config/tc-mips.c
+++ binutils-2.20.51/gas/config/tc-mips.c
@@ -7346,9 +7346,19 @@ macro (struct mips_cl_insn *ip)
case M_LD_OB:
s = HAVE_64BIT_GPRS ? "ld" : "lw";
+ if (!HAVE_64BIT_GPRS && treg == breg && breg != ZERO)
+ {
+ /* First load would overwrite the base register, use a
+ temporary register. */
+ used_at = 1;
+ macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, ZERO);
+ breg = AT;
+ }
goto sd_ob;
+
case M_SD_OB:
s = HAVE_64BIT_GPRS ? "sd" : "sw";
+
sd_ob:
macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
if (!HAVE_64BIT_GPRS)