On Mon, Aug 16, 2010 at 2:10 PM, Mohamed Shafi <shafi...@gmail.com> wrote:
> Hello all,
>
> I am trying to port GCC 4.5.1 for a processor that has the following
> addressing capability:
>
> The data memory address space of 64K bytes is represented by a total
> of 15 bits, with each address selecting a 16-bit element. When using
> the address register, the LSB of address reg (AD) points to a 16-bit
> field in data memory. If a data memory line is 128 bits there are 8,
> 16-bit elements per data memory line. We use little endian addressing,
> so
> if AD=0, bits [15:0] of data memory line address 0 would be selected.
> If AD=1, bits [31:16] of data memory line address 0 would be selected.
> If AD=9, bits [31:16] of data memory line address 1 would be selected.
>
> So if i have the following program
>
> short arr[5] = {11,12,13,14,15};
>
> int foo ()
> {
>     short a = arr[0] + arr[3];
>     return a;
> }
>
> Assume that short is 16bits and short address is 2byte aligned.Then I
> expect the following code to get generated:
>
> mov a0,#arr       // Load the address
>
> mov a1, a0        // Copy the address
> add a1, 1          // Increment the location by 1 so that the address
> points to arr[1]
> ld.16 g0, (a1)    // Load the value 12 into g0
>
> mov a1, a0        // Copy the address
> add a1, 3          // Increment the location by 3 so that the address
> points to arr[3]
> ld.16 g1, (a1)    // Load the value 14 into g0
>
> add g1, g1, g0  // Add 12 and 14
>
> For the following code:
>
> short arr[5] = {11,12,13,14,15};
>
> int foo ()
> {
> short a,b;
>
> a = (short) (&arr[3] - &arr[1]); // a is 2 after this operation
> b = (short) ((char*)&arr[3] - (char*)&arr[1]);  // b is 4 after this operation
>
> return a;
> }
>
> My question is should i set the macro BITS_PER_UNIT = 16 to get a code
> generated like this? From IRC chat i realize that  BITS_PER_UNIT != 8
> is seriously rotten. If that is the case how can i proceed to port
> this target?
You should set BITS_PER_UNIT to 16 if a byte has 16 bits when
looking at the definition of byte in the C99 standard (3.6).  That is,
when

int foo()
{
  unsigned char c = 0x8000;
  return c >> 15;
}

should return 1 (instead of 0 when a char only has 8 bits).

Richard.

> Regards,
> Shafi
>

Reply via email to