How to support 40bit GP register
Richard Henderson
rth@redhat.com
Thu Oct 22 06:24:00 GMT 2009
On 10/21/2009 07:25 AM, Mohamed Shafi wrote:
> For accessing a->b GCC generates the following code:
>
> move.l (sp-16), d3
> lsrr.l #<16, d3
> move.l (sp-12),d2
> asll #<16,d2
> or d3,d2
> cmpeq.w #<2,d2
> jf _L2
>
> Because data registers are 40 bit for 'asll' operation the shift count
> should be 16+8 or there should be sign extension from 32bit to 40 bits
> after the 'or' operation. The target has instruction to sign extend
> from 32bit to 40 bit.
>
> Similarly there are other operation that requires sign/zero extension.
> So is there any way to tell GCC that the data registers are 40bit and
> there by expect it to generate sign/zero extension accordingly ?
Define a machine mode for your 40-bit type in cpu-modes.def. Depending
on how your 40-bit type is stored in memory, you'll use either
INT_MODE (RI, 5) // load-store uses exactly 5 bytes
FRACTIONAL_INT_MODE (RI, 40, 8) // load-store uses 8 bytes
Where I've arbitrarily chosen "RImode" as a mnemonic for Register
Integral Mode. Now you define arithmetic operations, as needed, on
RImode. You define the "extendsiri" pattern to be that sign-extend from
32-to-40-bit instruction. You define your comparison patterns on
RImode, and not on SImode, since your comparison instruction works on
the entire 40 bits.
You'll wind up with a selection of patterns in your machine description
that have a sign-extension pattern built in, depending on the exact
behaviour of your ISA. There are plenty of examples on x86_64, mips64,
and Alpha (to name a few) that have similar properties with SI and
DImodes. Examine the -fdump-rtl-combine-details dump for exemplars of
the canonical forms that the combiner creates when it tries to merge
sign-extension instructions into preceeding patterns.
r~
More information about the Gcc
mailing list