ARM: Forcing halfword operation for (short *)?
Toralf Lund
toralf@procaptura.com
Tue Nov 9 15:22:00 GMT 2004
Sigh... Another problem with my ARM setup, after trying to access some
additional hardware... Seems like I still have a lot to learn about the
fine level of control over I/O-operations...
Anyhow, the problem this time is the access size of a specific write
operation. Consider the following function, which is a simplified
version of one actually appearing in my application:
int eraseTest()
{
volatile unsigned short *sector=(unsigned short *)0x10000000;
*sector=(unsigned short )0x0030;
}
The code generated for this is (from 'objdump -d' output):
0801c938 <_eraseTest>:
801c938: e1a0c00d mov ip, sp
801c93c: e92dd800 stmdb sp!, {fp, ip, lr, pc}
801c940: e24cb004 sub fp, ip, #4 ; 0x4
801c944: e24dd004 sub sp, sp, #4 ; 0x4
801c948: e3a03201 mov r3, #268435456 ; 0x10000000
801c94c: e50b3010 str r3, [fp, -#16]
801c950: e51b3010 ldr r3, [fp, -#16]
801c954: e3a02000 mov r2, #0 ; 0x0
801c958: e3a01030 mov r1, #48 ; 0x30
801c95c: e5c32000 strb r2, [r3]
801c960: e5c31001 strb r1, [r3, #1]
801c964: e91ba800 ldmdb fp, {fp, sp, pc}
This simply won't do. The problem? The data is stored via two strb
operations, and it is absolutely essential that there is only one bus
access. More generally, I need to have some more control over the actual
access commands generated throughout my application.
So, why do I get two byte-accesses in this case? Why not one halfword
operation? And is there any way to make sure "strh" is used instead?
- Toralf
------
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