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]

Reply via email to