public inbox for cgen@sourceware.org
 help / color / mirror / Atom feed
* Encoding of immediates different to label addresses
@ 2012-01-02  9:44 Julius Baxter
  2012-01-03 10:57 ` Andrew Burgess
  0 siblings, 1 reply; 2+ messages in thread
From: Julius Baxter @ 2012-01-02  9:44 UTC (permalink / raw)
  To: cgen

Hi,

I'm working on fixing up the OpenRISC 1000 CGEN port and have come
across something I find I can't quite do with CGEN.

For the jump and branch instructions, if we use immediate value number
specified in the assembly, we need that encoded into the instruction
without any shifting occurring to it.

Eg. "l.bf 1" should become 0x10000001, "l.bf 4" should become 0x10000004 etc.

These target addresses are shifted-left by two during decoding, and so
"l.bf 1" is actually a branch of 4 bytes.

If we use a label for an address, though, I'm seeing that we're
getting the offset in bytes during encoding, which then needs to be
shifted right by two before being put in the instruction.

But it seems we can have the shifting on both numerical immediates and
labels, or neither. (Pardon my incorrect use of terminology, I have a
feeling I'm not quite calling everything its right name!)

Upon inspecttion, it looks like the binutils port we have been using
for the past few years (not CGEN-based) has a right-shift of 2 in the
md_apply_fix() function in binutils/gas/config/tc-or32.c (
http://sourceware.org/git/?p=binutils.git;a=blob;f=gas/config/tc-or32.c;h=7234fb837e006f979c255f62206e39a9822046d2;hb=HEAD#l603
) when the instruction had the actual value of the label inserted into
it.

Is there any way to handle this using the CGEN description?

The current instruction field definition being used is:

(df f-disp26     "disp26"              (PCREL-ADDR) 25 26 INT
    ((value pc) (sra WI (sub WI value pc) (const 2)))
    ((value pc) (add WI (sll WI value (const 2)) pc)))

This does the shifting on encode and the target label addresses are
right but the numerical immediates are wrong, but if I remove the sra
on the encode, the numerical immediates are right but the target label
addresses are wrong.

I've had a bit of a poke around and seen the function
gas_cgen_md_apply_fix() is used as a generic md_apply_fix() function,
but can't quite see where I might be able to hook in things for
particular encoding cases.

If anyone could point out how I could handle this case it'd be appreciated.

Thanks,

Julius

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Encoding of immediates different to label addresses
  2012-01-02  9:44 Encoding of immediates different to label addresses Julius Baxter
@ 2012-01-03 10:57 ` Andrew Burgess
  0 siblings, 0 replies; 2+ messages in thread
From: Andrew Burgess @ 2012-01-03 10:57 UTC (permalink / raw)
  To: cgen

On 02/01/2012 09:44, Julius Baxter wrote:
> I'm working on fixing up the OpenRISC 1000 CGEN port and have come
> across something I find I can't quite do with CGEN.
>
> For the jump and branch instructions, if we use immediate value number
> specified in the assembly, we need that encoded into the instruction
> without any shifting occurring to it.
>
> Eg. "l.bf 1" should become 0x10000001, "l.bf 4" should become 0x10000004 etc.
>
> These target addresses are shifted-left by two during decoding, and so
> "l.bf 1" is actually a branch of 4 bytes.
>
> If we use a label for an address, though, I'm seeing that we're
> getting the offset in bytes during encoding, which then needs to be
> shifted right by two before being put in the instruction.
>
> But it seems we can have the shifting on both numerical immediates and
> labels, or neither. (Pardon my incorrect use of terminology, I have a
> feeling I'm not quite calling everything its right name!)
>
> Upon inspecttion, it looks like the binutils port we have been using
> for the past few years (not CGEN-based) has a right-shift of 2 in the
> md_apply_fix() function in binutils/gas/config/tc-or32.c (
> http://sourceware.org/git/?p=binutils.git;a=blob;f=gas/config/tc-or32.c;h=7234fb837e006f979c255f62206e39a9822046d2;hb=HEAD#l603
> ) when the instruction had the actual value of the label inserted into
> it.
>
> Is there any way to handle this using the CGEN description?

I don't know about that.

> The current instruction field definition being used is:
>
> (df f-disp26     "disp26"              (PCREL-ADDR) 25 26 INT
>      ((value pc) (sra WI (sub WI value pc) (const 2)))
>      ((value pc) (add WI (sll WI value (const 2)) pc)))
>
> This does the shifting on encode and the target label addresses are
> right but the numerical immediates are wrong, but if I remove the sra
> on the encode, the numerical immediates are right but the target label
> addresses are wrong.
>
> I've had a bit of a poke around and seen the function
> gas_cgen_md_apply_fix() is used as a generic md_apply_fix() function,
> but can't quite see where I might be able to hook in things for
> particular encoding cases.

What might work is to drop the shifting from the field definition and 
create your own md_apply_fix function something like this,

void
md_apply_fix (fixS *fixP, valueT *valP, segT seg)
{
   if (fixP->fx_done
       && fixP->fx_r_type == BFD_RELOC_UNUSED + OPERAND_ID_OF_BRANCH)
     {
        gas_assert (fixP->fx_addsy == NULL);
        gas_assert (fixP->fx_subsy == NULL);

        *valP >>= 2;
     }

     gas_cgen_md_apply_fix (fixP, valP, seg);
}


Good luck!

Andrew

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2012-01-03 10:57 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-01-02  9:44 Encoding of immediates different to label addresses Julius Baxter
2012-01-03 10:57 ` Andrew Burgess

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).