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