From: "Maciej W. Rozycki" <macro@linux-mips.org>
To: Alexis BRENON <abrenon@wyplay.com>
Cc: linux-mips@linux-mips.org
Subject: Re: Immediate branch offset
Date: Sun, 9 Jun 2013 15:43:29 +0100 (BST) [thread overview]
Message-ID: <alpine.LFD.2.03.1306082206540.18329@linux-mips.org> (raw)
In-Reply-To: <51B1B739.7080104@wyplay.com>
On Fri, 7 Jun 2013, Alexis BRENON wrote:
> To create the JIT, I have to load some MIPS instruction directly in memory
> without passing through a .asm file or else. So, I cannot set some labels. So
> to make some branches, I try to load the equivalent instruction of :
> bne $t0, $t1, -8
> to go back, just before the bne instruction, if $t0 and $t1 are equals. But
> when it run, I've got an illegal instruction error.
Please note that BNE means Branch-if-Not-Equal, your quoted instruction
will jump backwards if $t0 and $t1 are *not* equal.
> To debug, I write a small program in the MARS MIPS simulator with this
> instruction. But when compiling, assembler says me that -8 is an operand of
> incorrect type.
The instruction you quoted assembles for me successfully, what version of
binutils do you use and what exact error message do you get?
Please note however that this instruction is not what I understand you
need -- it is treated as a branch to the absolute address -8 (0xfffffff8
in the o32 ABI), rather than 8 bytes back (there's an off-by-four bug in
GAS here too making it jump to -4 instead, and some other issues; I'll see
if I can get them fixed sometime -- see the discussion around
http://sourceware.org/ml/binutils/2012-09/msg00288.html if interested in
the gory details).
If you want to jump to the instruction immediately preceding the branch
and avoid a label (assuming the standard MIPS ISA), use:
bne $t0, $t1, . - 4
-- "." is a special "the address of this instruction" designator (see the
GAS manual for further information), so this produces the machine
instruction you require (the jump is calculated as relative to the next
instruction -- that is (. + 4) -- so the ultimate effective (i.e. shifted
rather than as encoded in the instruction's 16-bit immediate operand
field) offset is -8).
$ cat foo.s
bne $t0, $t1, . - 4
$ mips-linux-as -o foo.o foo.s
$ mips-linux-objdump -dr foo.o
foo.o: file format elf32-tradbigmips
Disassembly of section .text:
00000000 <.text>:
0: 1509fffe bne t0,t1,0xfffffffc
4: 00000000 nop
...
$ mips-linux-as --version
GNU assembler (GNU Binutils) 2.23.2
[...]
Likewise with the current binutils trunk.
I hope this helps.
Maciej
next prev parent reply other threads:[~2013-06-09 14:43 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-07 10:34 Immediate branch offset Alexis BRENON
2013-06-07 16:25 ` David Daney
2013-06-09 14:43 ` Maciej W. Rozycki [this message]
2013-06-10 7:18 ` Alexis BRENON
2013-06-10 18:26 ` Maciej W. Rozycki
2013-06-19 9:11 ` Ralf Baechle
2013-06-19 10:56 ` Ralf Baechle
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.03.1306082206540.18329@linux-mips.org \
--to=macro@linux-mips.org \
--cc=abrenon@wyplay.com \
--cc=linux-mips@linux-mips.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.