From: Alexis BRENON <abrenon@wyplay.com>
To: "Maciej W. Rozycki" <macro@linux-mips.org>
Cc: linux-mips@linux-mips.org
Subject: Re: Immediate branch offset
Date: Mon, 10 Jun 2013 09:18:00 +0200 [thread overview]
Message-ID: <51B57DA8.1010206@wyplay.com> (raw)
In-Reply-To: <alpine.LFD.2.03.1306082206540.18329@linux-mips.org>
Le 09/06/2013 16:43, Maciej W. Rozycki a écrit :
> 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.
>
Yes, sorry, it's just a typing mistake, since I tried with all branch
instructions.
>> 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?
I didn't try to assemble it, but only to run it in the MARS simulator.
If I assemble it with GNU AS, it assembles successfully.
> 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
I downloaded MIPS32 Architecture For Programmers Volume II: The MIPS32
Instruction Set. If you read the BNE-BEQ-B... description it says :
Purpose:
To compare GPRs then do a PC-relative conditional branch
Description: if rs = rt then branch
An 18-bit signed offset (the 16-bit offset field shifted left 2 bits) is added to the address of the instruction
following the branch (not the branch itself), in the branch delay slot, to form a PC-relative effective target
address.
It says that it's a PC-relative jump, the offset is added to the PC
value, and not a absolute jump as the J instruction. Nevertheless, I try
to type this :
loop:
addiu $v0, $v0, 1
bne $v0, $t1, .-4
or this :
loop:
addiu $v0, $v0, 1
bne $v0, $t1, -8
In both cases, the objdump command says me :
8: 24420001 addiu v0,v0,1
c: 1449fffe bne v0,t1,8 <loop>
10: 00000000 nop
It seems to be equivalent.
Thanks for your answer.
Friendly,
Alexis BRENON
next prev parent reply other threads:[~2013-06-10 7:18 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
2013-06-10 7:18 ` Alexis BRENON [this message]
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=51B57DA8.1010206@wyplay.com \
--to=abrenon@wyplay.com \
--cc=linux-mips@linux-mips.org \
--cc=macro@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox