[PATCH/MIPS] Fix Branches with a constant offset

Andrew Pinski andrew.pinski@caviumnetworks.com
Thu Jun 7 00:44:00 GMT 2012


On Wed, Jun 6, 2012 at 5:35 PM, Maciej W. Rozycki
<macro@codesourcery.com> wrote:
> Richard,
>
> [Removed David from the cc list as he's not been with MIPS Technologies
> for many years now and is not available to comment anymore.]
>
> On Wed, 6 Jun 2012, Richard Sandiford wrote:
>
>> >   After:
>> > 2011-04-20  Catherine Moore  <clm@codesourcery.com>
>> >             David Ung <davidu@mips.com>..
>> >         * config/mips.c (mips_cl_insn): Add new field complete_p
>> > ...
>> >         (append_insn): Move O_constant expression handling.
>> >
>> > branches with a constant expression are broken by adding a relocation to them.
>> > The relocation is totally wrong as it is saying it is an absolute
>> > address while what we have really is an offset.
>> >
>> > This patch fixes the issue with how complete_p is handled for
>> > O_constant expression handling just like it was handled before this
>> > patch.
>> >
>> > OK?  Tested on mips64-linux-gnu with no regressions.
>>
>> Oops.  It's certainly unfortunate that we've changed the meaning
>> of this case.  TBH though, the new version makes more sense to me.
>> If you really want a constant offset, ". + X" is (and IMO always was)
>> the right way to write it.  The old behaviour gave oddities where:
>>
>>       .equ    x,0x1000
>>         beq     $4,$5,x
>>
>> would treat "x" as an offset while:
>>
>>         beq     $4,$5,x
>>       .equ    x,0x1000
>>
>> would treat it as an address.  The new behaviour also seems to be
>> consistent with other targets.
>>
>> None of which would be a convincing argument to change the behaviour
>> for its own sake.  But now that we've changed it anyway -- in at least
>> two releases -- I'm not sure we should go back.
>
>  FWIW, I think semantics should be:
>
> 1.
>        beq     $4, $5, 0x1000
>
>   -- branch to the absolute address 0x1000.  That needs a relocation of
>   course and may overflow.
>
> 2.
>
>        beq     $4, $5, . + 0x1000
>
>   -- branch to the relative address 0x1000 bytes away up from the address
>   of the branch instruction.  No relocation needed.
>
> That, of course, however the third operand is evaluated to its final
> expression.  Anything else is going to be pure confusion.  My observation
> is this is what GAS currently does.  This is also how J interprets its
> argument (except of course a relocation is also needed in the second case;
> I have no idea why one isn't produced to catch overflows in the first case
> though -- this is probably a bug).
>
>  I could envisage constructs like:
>
>        beq     $4, $5, -0x1000
>
> and:
>
>        beq     $4, $5, +0x1000
>
> where "-" and "+" are not the usual arithmetic unary operators and that
> would express relative offsets just as with #2 above, but that IMHO would
> only make sense where a new assembly syntax was being defined and in our
> case would also cause more confusion than possible gain.
>
>  Andrew, is the current implementation problematic for you for any reason?

Just the MIPS AVP testsuite for verify the architecture depends on the
older (incorrect also in my mind also) behavior.  I don't know who to
talk to at MIPS have this fixed in that testsuite.

Thanks,
Andrew Pinski



More information about the Binutils mailing list