ldrb vs ldrh in gcc-3.4.4 (ARM)
Steven Scholz
steven.scholz@imc-berlin.de
Wed Aug 17 13:28:00 GMT 2005
Hi there,
I noticed that gcc-3.4.4 for ARM is using byte wise loading instructions
although word wise would be much better. Does anyone know why? gcc-3.3.3 is
doing it as I would expect.
Please have a look at this trivial program:
unsigned short data[] = {0,1,2,3,4,5,6,7,8,9,10};
int main(void)
{
unsigned short value;
value = data[0];
return (int) value;
}
----------------
gcc-3.3.3 correctly creates
value = data[0];
847c: e59f3010 ldr r3, [pc, #16] ; 8494 <.text+0x128>
8480: e1d330b0 ldrh r3, [r3]
8484: e14b30be strh r3, [fp, #-14]
But gcc-3.4.4 creates
value = data[0];
8470: e59f302c ldr r3, [pc, #44] ; 84a4 <.text+0x138>
8474: e5d32000 ldrb r2, [r3]
8478: e5d33001 ldrb r3, [r3, #1]
847c: e1823403 orr r3, r2, r3, lsl #8
8480: e54b300e strb r3, [fp, #-14]
8484: e1a03443 mov r3, r3, asr #8
8488: e54b300d strb r3, [fp, #-13]
And I don't understand why he is using two ldrb instructions!
Both compilers were called with "-g -O0" Using -O3 creates smaller code but
still uses ldrb.
This is serious for me. It does not only influences speed but breaks direct
accesses to memory mapped 16bit hardware registers!
PS: When value and data are "unsigned long" then both compilers use "ldr" which
is correct.
Thanks for any hints!
--
Steven
------
Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com
More information about the crossgcc
mailing list