Multiplying by a constant
David Brown
david at westcontrol.com
Tue Nov 14 09:32:07 UTC 2006
This is just an idea for an improvement in the ColdFire backend.
When multiplying by a constant, the compiler generates a series of
shifts and adds (or subs) instead of using the appropriate "mul"
instruction. While this is optimal when the shift and add combination
is small, it is sub-optimal if more than 3 instructions are needed
(multiplies take 4 clocks on a v2 Coldfire). This is a hang-over from
the pre-Coldfire m68k cores which had very slow multiplies.
Test code:
extern unsigned int x, y;
void foo(void) {
x = y * 11;
}
Generated code (-O2 -Wa,-ahlsd -m528x):
92 foo:
93 008e 4E56 0000 link.w %fp,#0
94 0092 2079 0000 move.l y,%a0 | y, y.6
94 0000
95 0098 2008 move.l %a0,%d0 | y.6, y.6
96 009a 2200 move.l %d0,%d1 | y.6, tmp33
97 009c E589 lsl.l #2,%d1 |, tmp33
98 009e 2001 move.l %d1,%d0 | tmp33, tmp34
99 00a0 E588 lsl.l #2,%d0 |, tmp34
100 00a2 9081 sub.l %d1,%d0 | tmp33, tmp34
101 00a4 9088 sub.l %a0,%d0 | y.6, D.1159
102 00a6 23C0 0000 move.l %d0,x | D.1159, x
102 0000
103 00ac 4E5E unlk %fp
104 00ae 4E75 rts
mvh.,
David
More information about the coldfire-gnu-discuss
mailing list