[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 lr
The 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.