public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Help for target with BITS_PER_UNIT = 16
@ 2010-08-16 13:18 Mohamed Shafi
  2010-08-16 14:27 ` Michael Matz
  2010-08-16 15:25 ` Richard Guenther
  0 siblings, 2 replies; 4+ messages in thread
From: Mohamed Shafi @ 2010-08-16 13:18 UTC (permalink / raw)
  To: GCC

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?

Regards,
Shafi

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

* Re: Help for target with BITS_PER_UNIT = 16
  2010-08-16 13:18 Help for target with BITS_PER_UNIT = 16 Mohamed Shafi
@ 2010-08-16 14:27 ` Michael Matz
  2010-08-16 19:40   ` Dave Korn
  2010-08-16 15:25 ` Richard Guenther
  1 sibling, 1 reply; 4+ messages in thread
From: Michael Matz @ 2010-08-16 14:27 UTC (permalink / raw)
  To: Mohamed Shafi; +Cc: GCC

[-- Attachment #1: Type: TEXT/PLAIN, Size: 2532 bytes --]

Hi,

On Mon, 16 Aug 2010, Mohamed Shafi 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.

bits [15:0] are 16 bits, not 15 bits.

> 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]

I assume that your source example above should have read "arr[1] + ..." 
then.

> 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

Nope, with BITS_PER_UNIT=16 also b would be 2.  The reason is that the 
number of bits in 'char' is BITS_PER_UNIT by default (you can define it 
yourself to something else, but that would be even more bit-rotten than 
BITS_PER_UNIT=16 support itself).  Therefore 
sizeof(short)==sizeof(char)==1 and both types would have 16 bits.

And yes, that has implications on memory use for e.g. ASCII strings.

> 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 could do like the alpha port does when BWX instructions aren't 
available (in which case the alpha can only load/store whole words), using 
aligned loads/stores, bit extraction/insertion, and a store back.  I don't 
know if that would be efficiently possible on your hardware.


Ciao,
Michael.

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

* Re: Help for target with BITS_PER_UNIT = 16
  2010-08-16 13:18 Help for target with BITS_PER_UNIT = 16 Mohamed Shafi
  2010-08-16 14:27 ` Michael Matz
@ 2010-08-16 15:25 ` Richard Guenther
  1 sibling, 0 replies; 4+ messages in thread
From: Richard Guenther @ 2010-08-16 15:25 UTC (permalink / raw)
  To: Mohamed Shafi; +Cc: GCC

On Mon, Aug 16, 2010 at 2:10 PM, Mohamed Shafi <shafitvm@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
>

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

* Re: Help for target with BITS_PER_UNIT = 16
  2010-08-16 14:27 ` Michael Matz
@ 2010-08-16 19:40   ` Dave Korn
  0 siblings, 0 replies; 4+ messages in thread
From: Dave Korn @ 2010-08-16 19:40 UTC (permalink / raw)
  To: Michael Matz; +Cc: Mohamed Shafi, GCC

On 16/08/2010 14:16, Michael Matz wrote:
> Hi,
> 
> On Mon, 16 Aug 2010, Mohamed Shafi 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.
> 
> bits [15:0] are 16 bits, not 15 bits.

  The 15 is the number of address lines, not the size of the addressable unit.

    cheers,
      DaveK

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

end of thread, other threads:[~2010-08-16 14:27 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-08-16 13:18 Help for target with BITS_PER_UNIT = 16 Mohamed Shafi
2010-08-16 14:27 ` Michael Matz
2010-08-16 19:40   ` Dave Korn
2010-08-16 15:25 ` Richard Guenther

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