[ARM] This patch addresses following issue.
unsigned long long
foo (unsigned long long a, unsigned char *b, unsigned short *c)
{
return a + *b * *c;
}Should compile to use UMLAL ((unsigned multiple accumulate long) which multiplies two unsigned 32-bit values to produce a 64-bit value, and accumulates this with a 64-bit value.
foo:
ldrb r2, [r2]
ldrh r3, [r3]
mul r2, r3, r2
adds r0, r2, r0
adc r1, r1, #0
bx lrThe above is reduced to following with this patch:
foo:
ldrb r2, [r2]
ldrh r3, [r3]
umlal r0, r1, r3, r2
bx lr
These changes are unrelated and should be left out of this patch.