Comment 2 for bug 640518

Revision history for this message
Ramana Radhakrishnan (ramana) wrote :

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