The following code snippet produces code that loads a register, r5,
from memory, but never uses the value. The code is correct though, so
not a major issue. In addition, it never uses r3 or r12, which are
"free" registers, in that they don't have to be saved by the callee.
For a one line function that essentially returns a constant, the
generated code spills a lot of registers that it needn't. The
generated code ought to resemble "ldr r0, =constant0; ldr r1,
=constant1; b lr". This code was generated using arm-elf-gcc -mthumb
-O2.
Please cc me in your reply. Cheers,
Shaun
arm-elf-gcc (GCC) 4.0.2
#define USER_STACK 0x2100000
static long long rdp_getenv(void)
{
// Return the command line in r0 and the stack in r1.
return ((long long unsigned)USER_STACK << 32) | (int)"";
}
02001644 <rdp_getenv>:
2001644: b570 push {r4, r5, r6, lr}
2001646: 4a04 ldr r2, [pc, #16] (2001658 <.text+0x1658>)
2001648: 4d04 ldr r5, [pc, #16] (200165c <.text+0x165c>)
200164a: 4e05 ldr r6, [pc, #20] (2001660 <.text+0x1660>)
200164c: 17d4 asrs r4, r2, #31
200164e: 1c21 adds r1, r4, #0
2001650: 4331 orrs r1, r6
2001652: 1c10 adds r0, r2, #0
2001654: bd70 pop {r4, r5, r6, pc}
[the literal pool follows here]