This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
How to support 40bit GP register
- From: Mohamed Shafi <shafitvm at gmail dot com>
- To: GCC <gcc at gcc dot gnu dot org>
- Date: Wed, 21 Oct 2009 19:55:37 +0530
- Subject: How to support 40bit GP register
HI all,
I am porting GCC 4.4.0 for a 32bit target. The target has 40bit data
registers and 32bit address registers that can be used as general
purpose registers. When 40bit registers are used for arithmetic
operations or comparison operations GCC generates code assuming that
its a 32bit register. Whenever there is a move from address register
to data register sign extension is automatically performed by the
target. Since the data register is 40bit after some operations
sign/zero extension has to be performed for the result to be proper.
Take the following test case for example :
typedef struct
{
char b0;
char b1;
char b2;
char b3;
char b4;
char b5;
} __attribute__ ((packed)) b_struct;
typedef struct
{
short a;
long b;
short c;
short d;
b_struct e;
} __attribute__ ((packed)) a_struct;
int
main(void)
{
volatile a_struct *a;
volatile a_struct b;
a = &b;
*a = (a_struct){1,2,3,4};
a->e.b4 = 'c';
if (a->b != 2)
abort ();
exit (0);
}
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 ?
Regards,
Shafi