More cases that can be improved / looked at.
void food (double *f, double *g) { int i; for (i = 0; i < 100; i++) { f[i] = g[i] + 1.0; } }
FSF trunk and Linaro 4.5 ends up generating
food: @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. sub r1, r1, #8 sub r0, r0, #8 mov r3, #0 fconstd d6, #112 stmfd sp!, {r4, r5} .L6: add r1, r1, #8 add r3, r3, #1 fldd d7, [r1, #0] cmp r3, #100 faddd d7, d7, d6 fmrrd r4, r5, d7 strd r4, [r0, #8]! bne .L6 ldmfd sp!, {r4, r5} bx lr .size food, .-food
This could well be equivalent to the same kind of code generation as above.
float foo (float *x, int i) { *(x + i) = *(x + i) + 1.0f; return *(x + i); }
We end up generating
add r3, r0, r1, asl #2 fconsts s15, #112 flds s14, [r3, #0] fadds s15, s14, s15 fmrs r3, s15 str r3, [r0, r1, asl #2] @ float fmrs r0, s15 bx lr
FSF trunk looks better with
add r1, r0, r1, asl #2 fconsts s15, #112 flds s14, [r1, #0] fadds s15, s14, s15 fsts s15, [r1, #0] fmrs r0, s15 bx lr
More cases that can be improved / looked at.
void food (double *f, double *g)
{
int i;
for (i = 0; i < 100; i++)
{
f[i] = g[i] + 1.0;
}
}
FSF trunk and Linaro 4.5 ends up generating
food:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
sub r1, r1, #8
sub r0, r0, #8
mov r3, #0
fconstd d6, #112
stmfd sp!, {r4, r5}
.L6:
add r1, r1, #8
add r3, r3, #1
fldd d7, [r1, #0]
cmp r3, #100
faddd d7, d7, d6
fmrrd r4, r5, d7
strd r4, [r0, #8]!
bne .L6
ldmfd sp!, {r4, r5}
bx lr
.size food, .-food
This could well be equivalent to the same kind of code generation as above.
float foo (float *x, int i)
{
*(x + i) = *(x + i) + 1.0f;
return *(x + i);
}
We end up generating
add r3, r0, r1, asl #2
fconsts s15, #112
flds s14, [r3, #0]
fadds s15, s14, s15
fmrs r3, s15
str r3, [r0, r1, asl #2] @ float
fmrs r0, s15
bx lr
FSF trunk looks better with
add r1, r0, r1, asl #2
fconsts s15, #112
flds s14, [r1, #0]
fadds s15, s14, s15
fsts s15, [r1, #0]
fmrs r0, s15
bx lr