public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: "Maciej W. Rozycki" <macro@linux-mips.org>
To: Richard Sandiford <rdsandiford@googlemail.com>
Cc: binutils@sourceware.org
Subject: [PATCH 1/2] MIPS/GAS: Fix o32 LD to the base register
Date: Sun, 17 Oct 2010 16:22:00 -0000	[thread overview]
Message-ID: <alpine.LFD.2.00.1010130023180.15889@eddie.linux-mips.org> (raw)

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)

             reply	other threads:[~2010-10-17 16:22 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-17 16:22 Maciej W. Rozycki [this message]
2010-10-18  7:48 ` Richard Sandiford
2010-10-18 17:05   ` Maciej W. Rozycki
2010-10-31 22:46     ` [PATCH 1/5] " Maciej W. Rozycki
2010-11-01 21:28       ` Richard Sandiford
2010-11-01 21:34         ` Richard Sandiford

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.LFD.2.00.1010130023180.15889@eddie.linux-mips.org \
    --to=macro@linux-mips.org \
    --cc=binutils@sourceware.org \
    --cc=rdsandiford@googlemail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).