This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Calculation of displacement of a variable.
- From: Rama Singh <rama10nov at yahoo dot co dot in>
- To: gcc at gcc dot gnu dot org
- Cc: cjaiprakash at noida dot hcltech dot com
- Date: Thu, 30 Oct 2003 09:56:31 +0000 (GMT)
- Subject: Re: Calculation of displacement of a variable.
--- C Jaiprakash, Noida
<cjaiprakash@noida.hcltech.com> wrote: >
>
> Hi,
> I am working on a gcc port, i have a question
> about how displacements
> are calculated for variables in gcc. Consider for ex
> following code
>
> void fun()
> {
> char a,b,c,d;
> int x,y,z;
> long i,j,k;
>
> }
> Assuming following sizes for
> char = 8 bit
> int = 16 bit
> long = 32 bit
> following will the dislacements for above variables
>
> a = Base Reg + 1
> b = Base Reg + 2
> c = Base Reg + 3
> d = Base Reg + 4
>
> x = Base Reg + 6
> y = Base Reg + 8
> z = Base Reg + 10
>
> i = Base Reg + 12
> j = Base Reg + 16
> k = Base Reg + 20
>
> But the problem is h/w accesses memory as nth byte
> ot nth word so ( Base
> Reg
> + 1 ) if accessed in byte access mode will read 1st
> byte.
> For ex byte at 0001h if BASE REG = 0000h
> and it will access 1st word if memory is accessed in
> word mode. i.e a
> word from memory location 0002h.
>
> Due to this behaviour of h/w the actual
> displacements should have been
> generated as below
>
> a = Base Reg + 1
> b = Base Reg + 2
> c = Base Reg + 3
> d = Base Reg + 4
>
> x = Base Reg + 3
> y = Base Reg + 4
> z = Base Reg + 5
>
> i = Base Reg + 6
> j = Base Reg + 8
> k = Base Reg + 10
>
> Is it possible to generate such displacements in
> gcc? Basically
> definitions of BITS_PER_UNIT and UNITS_PER_WORD here
> are dependent on
> mode, i.e for QImode : BITS_PER_UNIT = 8,
> UNITS_PER_WORD = 2 HImode :
> BITS_PER_UNIT = 16, UNITS_PER_WORD = 1 SImode :
> BITS_PER_UNIT = 16,
> UNITS_PER_WORD = 1
>
> Can this behaviour be implemented in gcc? any
> pointers in this direction
> are appreciated.
>
I am not sure about your hardware but whatever is
clear from your mail is that you can have two memory
addresses both deferring on the basis of _Modes_. Now
if you are switching Memory_Access_mode through some
instruction then you must be emitting that
memory_switch_insn. Following that just have the
BAse_Reg + Displacement/2 otherwise keep the default
setting of Base_Reg + Displacement. This is a little
tricky part but the displacement can be modified in
your target.c file. For this you need not to interfere
with UNITS_PER_WORD or anything!!
Could you provide some more details like are their
instructions that can address memory directly in word
mode or some other mechanism?
Cheers
Rama
________________________________________________________________________
Yahoo! India Matrimony: Find your partner online.
Go to http://yahoo.shaadi.com