Sources to go through:
- asp68k peephole optimizations: Not all are real.
- Efficient 68000 Progamming: Probably some overlap with the above.
- 68000 Tricks and Traps
- A couple 68k tricks
- Superoptimizer article
- Some forum Amiga posts to go through: 29, 34, 37, 59, 62, 100, 137, 139, 140, 141, 144, 154
- Add in multiplication and division by constants.
| Don't use‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Use instead‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Time savings | Space savings | Notes‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ |
|---|---|---|---|---|
move.b <ea>,dNandi.b #mask,dN |
moveq #mask,dNand.b <ea>,dN |
4(1/0) | 2 bytes | -128 ≤ mask ≤ 127top bits of dN different |
clr.l dN |
moveq #0,dN |
2(0/0) | 0 bytes | |
andi.l #$FFFF,dN |
moveq #0,dMmove.w dN,dM |
8(1/0) | 2 bytes | Wrong flags Result in dM instead of dNNeed free dM |
andi.l #$FFFF,dN |
swap dNclr.w dNswap dN |
4(0/0) | 0 bytes | Wrong flags No spare registers |
andi.l #$FFFF0000,dN |
clr.w dN |
12(2/0) | 4 bytes | Wrong flags |
| Don't use‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Use instead‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Time savings | Space savings | Notes‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ |
|---|---|---|---|---|
movea.l #0,aN |
suba.l aN,aN |
4(2/0) | 4 bytes | |
movea.l #0,aN |
movea.l XM,aN |
8(2/0) | 4 bytes | XM is already zero |
movea.l #val,aN |
movea.w #val,aN |
4(1/0) | 4 bytes | -32768 ≤ val ≤ 32767 |
adda.l #val,aN |
adda.w #val,aN |
4(1/0) | 2 bytes | -32768 ≤ val ≤ 32767 |
adda.w #val,aN |
addq.w #val,aN |
4(1/0) | 2 bytes | 1 ≤ val ≤ 8 |
adda.w #val,aN |
subq.w #-val,aN |
4(1/0) | 2 bytes | -1 ≤ val ≤ -8 |
adda.w #val,aN |
lea val(aN),aN |
4(0/0) | 0 bytes | -32768 ≤ val ≤ -9 or 9 ≤ val ≤ 32767 |
adda.w #val,aNadda.S XN,aN |
lea val(aN,XN.S),aN |
8(1/0) | 2 bytes | -128 ≤ val ≤ 127 |
suba.w #val,aN |
subq.w #val,aN |
4(1/0) | 2 bytes | 1 ≤ val ≤ 8 |
suba.w #val,aN |
addq.w #-val,aN |
4(1/0) | 2 bytes | -1 ≤ val ≤ -8 |
suba.w #val,aN |
lea -val(aN),aN |
4(0/0) | 0 bytes | -32767 ≤ val ≤ -9 or 9 ≤ val ≤ 32767 |
suba.w #val,aNadda.S XN,aN |
lea -val(aN,XN.S),aN |
8(1/0) | 2 bytes | -127 ≤ val ≤ 128 |
| Don't use‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Use instead‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Time savings | Space savings | Notes‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ |
|---|---|---|---|---|
rol.b #4+x,dN |
ror.b #4-x,dN |
4*x(0/0) | 0 bytes | 1 ≤ x ≤ 3Wrong flags, dM different |
moveq #8+x,dMrol.w dM,dN |
ror.w #8-x,dN |
4+4*x(1/0) | 2 bytes | 0 ≤ x ≤ 7Wrong flags, dM different |
moveq #8+x,dMrol.l dM,dN |
swap dNror.l #8-x,dN |
4*x(0/0) | 0 bytes | 1 ≤ x ≤ 7Wrong flags, dM different |
moveq #16,dMrol.l dM,dN |
swap dN |
40(1/0) | 2 bytes | Wrong flags, dM different |
moveq #16+x,dMrol.l dM,dN |
swap dNrol.l #x,dN |
32(0/0) | 0 bytes | 1 ≤ x ≤ 7Wrong flags, dM different |
moveq #16+x,dMrol.l dM,dN |
ror.l #16-x,dN |
4+4*x(1/0) | 2 bytes | 8 ≤ x ≤ 15Wrong flags, dM different |
ror.b #4+x,dN |
rol.b #4-x,dN |
4*x(0/0) | 0 bytes | 1 ≤ x ≤ 3Wrong flags, dM different |
moveq #8+x,dMror.w dM,dN |
rol.w #8-x,dN |
4+4*x(1/0) | 2 bytes | 0 ≤ x ≤ 7Wrong flags, dM different |
moveq #8+x,dMror.l dM,dN |
swap dNrol.l #8-x,dN |
4*x(0/0) | 0 bytes | 1 ≤ x ≤ 7Wrong flags, dM different |
moveq #16,dMror.l dM,dN |
swap dN |
40(1/0) | 2 bytes | Wrong flags, dM different |
moveq #16+x,dMror.l dM,dN |
swap dNror.l #x,dN |
32(0/0) | 0 bytes | 1 ≤ x ≤ 7Wrong flags, dM different |
moveq #16+x,dMror.l dM,dN |
rol.l #16-x,dN |
4+4*x(1/0) | 2 bytes | 8 ≤ x ≤ 15Wrong flags, dM different |
roxl.b #1,dN |
addx.b dN,dN |
4(0/0) | 0 bytes | Wrong flags |
roxl.b #2,dN |
addx.b dN,dNaddx.b dN,dN |
2(-1/0) | -2 bytes | Wrong flags |
roxl.w #1,dN |
addx.w dN,dN |
4(0/0) | 0 bytes | Wrong flags |
roxl.w #2,dN |
addx.w dN,dNaddx.w dN,dN |
2(-1/0) | -2 bytes | Wrong flags |
roxl.l #1,dN |
addx.l dN,dN |
2(0/0) | 0 bytes | Wrong flags |
| Don't use‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Use instead‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Time savings | Space savings | Notes‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ |
|---|---|---|---|---|
lsl.b #1,dN |
add.b dN,dN |
4(0/0) | 0 bytes | |
lsl.b #2,dN |
add.b dN,dNadd.b dN,dN |
2(-1/0) | -2 bytes | |
lsl.b #7,dN |
ror.b #1,dNandi.b #$80,dN |
4(-2/0) | -4 bytes | Wrong flags |
lsl.b #8,dN |
clr.b dN |
18(0/0) | 0 bytes | Wrong flags |
moveq #8+x,dMlsl.b dM,dN |
clr.b dN |
18+2*x(1/0) | 2 bytes | 1 ≤ x ≤ 47Wrong flags, dM different |
lsl.w #1,dN |
add.w dN,dN |
4(0/0) | 0 bytes | |
lsl.w #2,dN |
add.w dN,dNadd.w dN,dN |
2(-1/0) | -2 bytes | |
lsl.w #8,dN |
move.b dN,-(sp)move.w (sp)+,dNclr.b dN |
2(-3/-1) | -4 bytes | Wrong flags |
moveq #9,dMlsl.w dM,dN |
move.b dN,-(sp)move.w (sp)+,dNclr.b dNadd.w dN,dN |
4(-3/-1) | -4 bytes | Wrong flags, dM different |
moveq #8+x,dMlsl.w dM,dN |
ror.w #8-x,dNandi.w #~((1<<(8+x))-1),dN |
4*x-4(-1/0) | -2 bytes | 2 ≤ x ≤ 7Wrong flags, dM different |
moveq #16+x,dMlsl.w dM,dN |
clr.w dN |
38+2*x(1/0) | 2 bytes | 0 ≤ x ≤ 47Wrong flags, dM different |
lsl.l #1,dN |
add.l dN,dN |
2(0/0) | 0 bytes | |
moveq #8+x,dMlsl.l dM,dN |
swap dNror.l #8-x,dNandi.w #~((1<<(8+x))-1),dN |
4*x-8(-2/0) | -4 bytes | 3 ≤ x ≤ 7Wrong flags, dM different |
moveq #16,dMlsl.l dM,dN |
swap dNclr.w dN |
36(0/0) | 0 bytes | Wrong flags, dM different |
moveq #17,dMlsl.l dM,dN |
add.w dN,dNswap dNclr.w dN |
34(-1/0) | -2 bytes | Wrong flags, dM different |
moveq #18,dMlsl.l dM,dN |
add.w dN,dNadd.w dN,dNswap dNclr.w dN |
32(-2/0) | -4 bytes | Wrong flags, dM different |
moveq #16+x,dMlsl.l dM,dN |
lsl.w #x,dNswap dNclr.w dN |
30(-1/0) | -2 bytes | 3 ≤ x ≤ 7dM different |
moveq #24,dMlsl.l dM,dN |
move.b dN,-(sp)move.w (sp)+,dNclr.b dNswap dNclr.w dN |
32(-4/-1) | -6 bytes | dM different |
moveq #25,dMlsl.l dM,dN |
move.b dN,-(sp)move.w (sp)+,dNclr.b dNadd.w dN,dNswap dNclr.w dN |
30(-5/-1) | -8 bytes | dM different |
moveq #24+x,dMlsl.l dM,dN |
ror.w #8-x,dNandi.w #~((1<<(8+x))-1),dNswap dNclr.w dN |
4*x+22(-3/0) | -6 bytes | 2 ≤ x ≤ 7dM different |
moveq #32+x,dMlsl.l dM,dN |
moveq #0,dN |
72+2*x(1/0) | 2 bytes | 0 ≤ x ≤ 31Wrong flags, dM different |
lsr.b #7,dN |
add.b dN,dNsubx.b dN,dNneg.b dN |
8(-2/0) | -4 bytes | Wrong flags |
lsr.b #8,dN |
clr.b dN |
18(0/0) | 0 bytes | Wrong flags |
moveq #8+x,dMlsr.b dM,dN |
clr.b dN |
18+2*x(1/0) | 2 bytes | 1 ≤ x ≤ 47Wrong flags, dM different |
lsr.w #8,dN |
move.w dN,-(sp)clr.w dNmove.b (sp)+,dN |
2(-2/-1) | -4 bytes | Wrong flags |
moveq #8+x,dMlsr.w dM,dN |
andi.w #~((1<<(8+x))-1),dNrol.w #8-x,dN |
4*x-4(-1/0) | -2 bytes | 2 ≤ x ≤ 6Wrong flags, dM different |
moveq #15,dMlsr.w dM,dN |
add.w dN,dNsubx.w dN,dNneg.w dN |
28(-1/0) | -2 bytes | Wrong flags, dM different |
moveq #16+x,dMlsr.w dM,dN |
clr.w dN |
38+2*x(1/0) | 2 bytes | 0 ≤ x ≤ 47Wrong flags, dM different |
moveq #8+x,dMlsr.l dM,dN |
andi.w #~((1<<(8+x))-1),dNswap dNrol.l #8-x,dN |
4*x-8(-2/0) | -4 bytes | 3 ≤ x ≤ 7Wrong flags, dM different |
moveq #16,dMlsr.l dM,dN |
clr.w dNswap dN |
36(0/0) | 0 bytes | Wrong flags, dM different |
moveq #16+x,dMlsr.l dM,dN |
clr.w dNswap dNlsr.w #x,dN |
30(-1/0) | -2 bytes | 1 ≤ x ≤ 7dM different |
moveq #24,dMlsr.l dM,dN |
swap dNmove.w dN,-(sp)moveq #0,dNmove.b (sp)+,dN |
36(-3/-1) | -4 bytes | Wrong flags |
moveq #24+x,dMlsr.l dM,dN |
clr.w dNswap dNandi.w #~((1<<(8+x))-1),dNrol.w #8-x,dN |
4*x+22(-3/-0) | -4 bytes | 1 ≤ x ≤ 6dM different |
moveq #31,dMlsr.l dM,dN |
add.l dN,dNmoveq #0,dNaddx.w dN,dN |
58(-1/0) | -2 bytes | Wrong flags, dM different |
moveq #32+x,dMlsr.l dM,dN |
moveq #0,dN |
72+2*x(1/0) | 2 bytes | 0 ≤ x ≤ 31Wrong flags, dM different |
| Don't use‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Use instead‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Time savings | Space savings | Notes‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ |
|---|---|---|---|---|
asr.b #7+x,dN |
add.b dN,dNsubx.b dN,dN |
12+2*x(-1/0) | -2 bytes | 0 ≤ x ≤ 1Wrong flags |
asr.w #8,dN |
move.w dN,-(sp)move.b (sp)+,dNext.w dN |
2(-3/-1) | -4 bytes | Wrong flags, dM wrong |
moveq #8+x,dMasr.w dM,dN |
ext.l dNswap dNrol.l #8-x,dN |
4*x-6(-1/0) | -2 bytes | 2 ≤ x ≤ 6Wrong flags, dM differentHigh word of dN different |
moveq #15+x,dMasr.w dM,dN |
add.w dN,dNsubx.w dN,dN |
32+2*x(0/0) | -2 bytes | 0 ≤ x ≤ 48Wrong flags, dM wrong |
moveq #16,dMasr.l dM,dN |
swap dNext.l dN |
36(0/0) | 0 bytes | Wrong flags, dM different |
moveq #16+x,dMasr.l dM,dN |
swap dNext.l dNasr.w #x,dN |
30(-1/0) | -2 bytes | 1 ≤ x ≤ 7dM different |
moveq #24,dMasr.l dM,dN |
swap dNext.l dNmove.w dN,-(sp)move.b (sp)+,dNext.w dN |
28(-4/-1) | -6 bytes | Wrong flagsdM different |
moveq #25,dMasr.l dM,dN |
swap dNext.l dNmoveq #9,dMasr.w dM,dN |
26(-2/0) | -4 bytes | dM different |
moveq #24+x,dMasr.l dM,dN |
swap dNext.l dNswap dNrol.l #8-x,dNext.l dN |
20+4*x(-3/0) | -6 bytes | 2 ≤ x ≤ 6dM different |
moveq #31+x,dMasr.l dM,dN |
add.l dN,dNsubx.l dN,dN |
58+2*x(0/0) | -2 bytes | 0 ≤ x ≤ 32Wrong flags, dM wrong |
All lsl peephole optimizations also apply to asl.
| Don't use‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Use instead‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Time savings | Space savings | Notes‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ |
|---|---|---|---|---|
muls.w #0,dN |
moveq #0,dN |
38(1/0) | 2 bytes | Wrong flags |
muls.w #1,dN |
ext.l dN |
42(1/0) | 2 bytes | Wrong flags |
muls.w #2,dN |
ext.l dNadd.l dN,dN |
34(0/0) | 0 bytes | Wrong flags |
muls.w #3,dN |
ext.l dNmove.l dN,dMadd.l dN,dNadd.l dM,dN |
24(-2/0) | -4 bytes | Wrong flagsdM different |
muls.w #4,dN |
ext.l dNasl.l #2,dN |
30(0/0) | 0 bytes | Wrong flags |
muls.w #5,dN |
ext.l dNmove.l dN,dMasl.l #2,dNadd.l dM,dN |
22(-2/0) | -4 bytes | Wrong flagsdM different |
muls.w #6,dN |
ext.l dNadd.l dN,dNmove.l dN,dMadd.l dN,dNadd.l dM,dN |
16(-3/0) | -6 bytes | Wrong flagsdM different |
muls.w #7,dN |
ext.l dNmove.l dN,dMasl.l #3,dNsub.l dM,dN |
20(-2/0) | -4 bytes | Wrong flagsdM different |
muls.w #8,dN |
ext.l dNasl.l #3,dN |
28(0/0) | 0 bytes | Wrong flags |
muls.w #9,dN |
ext.l dNmove.l dN,dMasl.l #3,dNadd.l dM,dN |
20(-2/0) | -4 bytes | Wrong flagsdM different |
muls.w #10,dN |
ext.l dNmove.l dN,dMasl.l #2,dNadd.l dM,dNadd.l dN,dN |
14(-3/0) | -6 bytes | Wrong flagsdM different |
muls.w #11,dN |
ext.l dNmove.l dN,dMadd.l dM,dNadd.l dM,dNasl.l #2,dNsub.l dM,dN |
16(-3/0) | -8 bytes | Wrong flagsdM different |
muls.w #12,dN |
ext.l dNmove.l dN,dMadd.l dM,dNadd.l dM,dNasl.l #2,dN |
4(-4/0) | -6 bytes | Wrong flagsdM different |
muls.w #13,dN |
ext.l dNmove.l dN,dMadd.l dM,dNadd.l dM,dNasl.l #2,dNadd.l dM,dN |
8(-4/0) | -8 bytes | Wrong flagsdM different |
muls.w #14,dN |
ext.l dNmove.l dN,dMasl.l #3,dNsub.l dM,dNadd.l dN,dN |
12(-3/0) | -6 bytes | Wrong flagsdM different |
muls.w #15,dN |
ext.l dNmove.l dN,dMasl.l #4,dNsub.l dM,dN |
20(-2/0) | -4 bytes | Wrong flagsdM different |
muls.w #16,dN |
ext.l dNasl.l #4,dN |
26(0/0) | 0 bytes | Wrong flags |
muls.w #17,dN |
ext.l dNmove.l dN,dMasl.l #4,dNadd.l dM,dN |
18(-2/0) | -4 bytes | Wrong flagsdM different |
muls.w #18,dN |
ext.l dNadd.l dN,dNmove.l dN,dMasl.l #3,dNadd.l dM,dN |
12(-3/0) | -6 bytes | Wrong flagsdM different |
muls.w #19,dN |
ext.l dNmove.l dN,dMasl.l #3,dNadd.l dM,dNadd.l dN,dNadd.l dM,dN |
6(-4/0) | -8 bytes | Wrong flagsdM different |
muls.w #20,dN |
ext.l dNmove.l dN,dMasl.l #2,dNadd.l dM,dNasl.l #2,dN |
10(-3/0) | -6 bytes | Wrong flagsdM different |
muls.w #21,dN |
ext.l dNmove.l dN,dMasl.l #2,dNadd.l dM,dNasl.l #2,dNadd.l dM,dN |
6(-4/0) | -8 bytes | Wrong flagsdM different |
muls.w #22,dN |
ext.l dNadd.l dN,dNmove.l dN,dMadd.l dM,dNadd.l dM,dNasl.l #2,dNsub.l dM,dN |
8(-4/0) | -10 bytes | Wrong flagsdM different |
muls.w #23,dN |
ext.l dNmove.l dN,dMadd.l dM,dNadd.l dM,dNasl.l #3,dNsub.l dM,dN |
6(-5/0) | -8 bytes | Wrong flagsdM different |
muls.w #24,dN |
ext.l dNmove.l dN,dMadd.l dM,dNadd.l dM,dNasl.l #3,dN |
8(-3/0) | -6 bytes | Wrong flagsdM different |
muls.w #25,dN |
ext.l dNmove.l dN,dMadd.l dM,dNadd.l dM,dNasl.l #3,dNadd.l dM,dN |
4(-5/0) | -8 bytes | Wrong flagsdM different |
muls.w #26,dN |
ext.l dNmove.l dN,dMadd.l dM,dMadd.l dM,dNasl.l #3,dNadd.l dM,dN |
4(-5/0) | -8 bytes | Wrong flagsdM different |
muls.w #29,dN |
ext.l dNmove.l dN,dMasl.l #5,dNsub.l dM,dNsub.l dM,dNsub.l dM,dN |
4(-4/0) | -8 bytes | Wrong flagsdM different |
muls.w #30,dN |
ext.l dNmove.l dN,dMasl.l #5,dNsub.l dM,dNsub.l dM,dN |
10(-3/0) | -6 bytes | Wrong flagsdM different |
muls.w #31,dN |
ext.l dNmove.l dN,dMasl.l #5,dNsub.l dM,dN |
20(-2/0) | -4 bytes | Wrong flagsdM different |
muls.w #32,dN |
ext.l dNasl.l #5,dN |
24(0/0) | 0 bytes | Wrong flags |
muls.w #33,dN |
ext.l dNmove.l dN,dMasl.l #5,dNadd.l dM,dN |
16(-2/0) | -4 bytes | Wrong flagsdM different |
muls.w #34,dN |
ext.l dNmove.l dN,dMasl.l #5,dNadd.l dM,dNadd.l dM,dN |
8(-3/0) | -6 bytes | Wrong flagsdM different |
muls.w #35,dN |
ext.l dNmove.l dN,dMasl.l #5,dNadd.l dM,dNadd.l dM,dNadd.l dM,dN |
2(-4/0) | -8 bytes | Wrong flagsdM different |
muls.w #64,dN |
ext.l dNasl.l #6,dN |
22(0/0) | 0 bytes | Wrong flags |
muls.w #128,dN |
ext.l dNasl.l #7,dN |
20(0/0) | 0 bytes | Wrong flags |
muls.w #256,dN |
ext.l dNasl.l #8,dN |
18(0/0) | 0 bytes | Wrong flags |
mulu.w #0,dN |
moveq #0,dM |
38(1/0) | 2 bytes | Wrong flags |
mulu.w #1,dN |
moveq #0,dMmove.w dN,dM |
36(0/0) | 0 bytes | Wrong flags Result in dM instead of dN |
mulu.w #2,dN |
moveq #0,dMmove.w dN,dMadd.l dM,dM |
28(-1/0) | -2 bytes | Wrong flags Result in dM instead of dN |
mulu.w #3,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNadd.l dM,dMadd.l dN,dM |
18(-3/0) | -6 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #4,dN |
moveq #0,dMmove.w dN,dMlsl.l #2,dM |
24(-1/0) | -2 bytes | Wrong flags Result in dM instead of dN |
mulu.w #5,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNlsl.l #2,dMadd.l dN,dM |
14(-3/0) | -6 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #6,dN |
moveq #0,dMmove.w dN,dMadd.l dM,dMmove.l dM,dNadd.l dM,dMadd.l dN,dM |
10(-4/0) | -8 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #7,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNlsl.l #3,dMsub.l dN,dM |
14(-3/0) | -6 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #8,dN |
moveq #0,dMmove.w dN,dMlsl.l #3,dM |
22(-1/0) | -2 bytes | Wrong flags Result in dM instead of dN |
mulu.w #9,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNlsl.l #3,dMadd.l dN,dM |
12(-3/0) | -6 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #10,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNlsl.l #2,dMadd.l dN,dMadd.l dM,dM |
6(-4/0) | -8 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #11,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNadd.l dN,dMadd.l dN,dMlsl.l #2,dMsub.l dN,dM |
8(-4/0) | -8 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #14,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNlsl.l #3,dMsub.l dN,dMadd.l dM,dM |
6(-4/0) | -8 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #15,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNlsl.l #4,dMsub.l dN,dM |
14(-3/0) | -6 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #16,dN |
moveq #0,dMmove.w dN,dMlsl.l #4,dM |
20(-1/0) | -2 bytes | Wrong flags Result in dM instead of dN |
mulu.w #17,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNlsl.l #4,dMadd.l dN,dM |
10(-3/0) | -6 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #18,dN |
moveq #0,dMmove.w dN,dMadd.l dM,dMmove.l dM,dNlsl.l #3,dMadd.l dN,dM |
4(-4/0) | -8 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #20,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNlsl.l #2,dMadd.l dN,dMlsl.l #2,dM |
2(-4/0) | -8 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #24,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNadd.l dM,dMadd.l dN,dMlsl.l #3,dM |
4(-4/0) | -8 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #31,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNlsl.l #5,dMsub.l dN,dM |
14(-3/0) | -6 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #30,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNlsl.l #5,dMsub.l dN,dMsub.l dN,dM |
4(-4/0) | -8 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #32,dN |
moveq #0,dMmove.w dN,dMlsl.l #5,dM |
18(-1/0) | -2 bytes | Wrong flags Result in dM instead of dN |
mulu.w #33,dN |
moveq #0,dMmove.w dN,dMmove.l dM,dNlsl.l #5,dMadd.l dN,dM |
8(-3/0) | -6 bytes | Wrong flagsdM differentResult in dM instead of dN |
mulu.w #64,dN |
moveq #0,dMmove.w dN,dMlsl.l #6,dM |
16(-1/0) | -2 bytes | Wrong flags Result in dM instead of dN |
mulu.w #128,dN |
moveq #0,dMmove.w dN,dMlsl.l #7,dM |
14(-1/0) | -2 bytes | Wrong flags Result in dM instead of dN |
mulu.w #256,dN |
moveq #0,dMmove.w dN,dMlsl.l #8,dM |
12(-1/0) | -2 bytes | Wrong flags Result in dM instead of dN |
Some of the asl and lsl can also be optimized by the respective peephole optimizations.
| Don't use‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Use instead‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Time savings | Space savings | Notes‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ |
|---|---|---|---|---|
muls.w #0,dN |
moveq #0,dN |
38(1/0) | 2 bytes | Wrong flags |
muls.w #1,dN |
(nothing) | 46(2/0) | 4 bytes | Wrong flags High word of dN different |
muls.w #2,dN |
add.w dN,dN |
42(1/0) | 2 bytes | Wrong flags High word of dN different |
muls.w #3,dN |
move.w dN,dMadd.w dN,dNadd.w dM,dN |
36(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
muls.w #4,dN |
add.w dN,dNadd.w dN,dN |
38(0/0) | 0 bytes | Wrong flags High word of dN different |
muls.w #5,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dN |
34(-2/0) | -4 bytes | Wrong flags High word of dN differentdM different |
muls.w #6,dN |
add.w dN,dNmove.w dN,dMadd.w dN,dNadd.w dM,dN |
32(-2/0) | -4 bytes | Wrong flags High word of dN differentdM different |
muls.w #7,dN |
move.w dN,dMasl.w #3,dNsub.w dM,dN |
30(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
muls.w #8,dN |
asl.w #3,dN |
34(1/0) | 2 bytes | Wrong flags High word of dN differentdM different |
muls.w #9,dN |
move.w dN,dMasl.w #3,dNadd.w dM,dN |
30(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
muls.w #10,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dNadd.w dN,dN |
30(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
muls.w #11,dN |
move.w dN,dMadd.w dM,dNadd.w dM,dNadd.w dN,dNadd.w dN,dNsub.w dM,dN |
28(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
muls.w #12,dN |
move.w dN,dMadd.w dM,dNadd.w dM,dNadd.w dN,dNadd.w dN,dN |
28(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
muls.w #13,dN |
move.w dN,dMadd.w dM,dNadd.w dM,dNadd.w dN,dNadd.w dN,dNadd.w dM,dN |
28(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
muls.w #14,dN |
move.w dN,dMasl.w #3,dNsub.w dM,dNadd.w dN,dN |
26(-2/0) | -4 bytes | Wrong flags High word of dN differentdM different |
muls.w #15,dN |
move.w dN,dMasl.w #4,dNsub.w dM,dN |
30(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
muls.w #16,dN |
asl.w #4,dN |
32(1/0) | 2 bytes | Wrong flags High word of dN differentdM different |
muls.w #17,dN |
move.w dN,dMasl.w #4,dNadd.w dM,dN |
28(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
muls.w #18,dN |
add.w dN,dNmove.w dN,dMasl.w #3,dNadd.w dM,dN |
26(-2/0) | -4 bytes | Wrong flags High word of dN differentdM different |
muls.w #19,dN |
move.w dN,dMasl.w #3,dNadd.w dM,dNadd.w dN,dNadd.w dM,dN |
24(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
muls.w #20,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dNadd.w dN,dNadd.w dN,dN |
26(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
muls.w #21,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dNadd.w dN,dNadd.w dN,dNadd.w dM,dN |
26(-5/0) | -6 bytes | Wrong flags High word of dN differentdM different |
muls.w #22,dN |
add.w dN,dNmove.w dN,dMadd.w dM,dNadd.w dM,dNadd.w dN,dNadd.w dN,dNsub.w dM,dN |
24(-5/0) | -10 bytes | Wrong flags High word of dN differentdM different |
muls.w #23,dN |
move.w dN,dMadd.w dN,dNadd.w dM,dNlsl.w #3,dNsub.w dM,dN |
26(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
muls.w #24,dN |
move.w dN,dMadd.w dN,dNadd.w dM,dNlsl.w #3,dN |
24(-2/0) | -6 bytes | Wrong flags High word of dN differentdM different |
muls.w #25,dN |
move.w dN,dMadd.w dN,dNadd.w dM,dNlsl.w #3,dNadd.w dM,dN |
24(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
muls.w #26,dN |
move.w dN,dMadd.w dM,dMadd.w dM,dNasl.w #3,dNadd.w dM,dN |
24(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
muls.w #27,dN |
move.w dN,dMasl.w #3,dNsub.w dM,dNadd.w dN,dNadd.w dN,dNsub.w dM,dN |
26(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
muls.w #28,dN |
move.w dN,dMasl.w #3,dNsub.w dM,dNadd.w dN,dNadd.w dN,dN |
26(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
muls.w #29,dN |
move.w dN,dMasl.w #5,dNsub.w dM,dNsub.w dM,dNsub.w dM,dN |
22(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
muls.w #30,dN |
move.w dN,dMasl.w #5,dNsub.w dM,dNsub.w dM,dN |
24(-2/0) | -4 bytes | Wrong flags High word of dN differentdM different |
muls.w #31,dN |
move.w dN,dMasl.w #5,dNsub.w dM,dN |
30(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
muls.w #32,dN |
asl.w #5,dN |
30(1/0) | 2 bytes | Wrong flags High word of dN differentdM different |
muls.w #33,dN |
move.w dN,dMasl.w #5,dNadd.w dM,dN |
26(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
muls.w #34,dN |
move.w dN,dMasl.w #5,dNadd.w dM,dNadd.w dM,dN |
22(-2/0) | -4 bytes | Wrong flags High word of dN differentdM different |
muls.w #35,dN |
move.w dN,dMasl.w #5,dNadd.w dM,dNadd.w dM,dNadd.w dM,dN |
20(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
muls.w #36,dN |
move.w dN,dMasl.w #3,dNadd.w dM,dNadd.w dN,dNadd.w dN,dN |
22(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
muls.w #37,dN |
move.w dN,dMasl.w #3,dNadd.w dM,dNadd.w dN,dNadd.w dN,dNadd.w dM,dN |
22(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
muls.w #38,dN |
add.w dN,dNmove.w dN,dMasl.w #3,dNadd.w dM,dNadd.w dN,dNadd.w dM,dN |
20(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
muls.w #39,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dNasl.w #3,dNsub.w dM,dN |
22(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
muls.w #40,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dNasl.w #3,dN |
22(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
muls.w #41,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dNasl.w #3,dNadd.w dM,dN |
22(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
mulu.w #42,dN |
move.w dN,dMadd.w dM,dMadd.w dM,dNadd.w dM,dNasl.w #3,dNadd.w dM,dN |
20(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
muls.w #64,dN |
asl.w #6,dN |
28(1/0) | 2 bytes | Wrong flags High word of dN differentdM different |
muls.w #128,dN |
asl.w #7,dN |
26(1/0) | 2 bytes | Wrong flags High word of dN differentdM different |
muls.w #256,dN |
asl.w #8,dN |
24(1/0) | 2 bytes | Wrong flags High word of dN differentdM different |
mulu.w #0,dN |
moveq #0,dN |
38(1/0) | 2 bytes | Wrong flags |
mulu.w #1,dN |
(nothing) | 44(2/0) | 4 bytes | Wrong flags High word of dN different |
mulu.w #2,dN |
add.w dN,dN |
40(1/0) | 2 bytes | Wrong flags High word of dN different |
mulu.w #3,dN |
move.w dN,dMadd.w dN,dNadd.w dM,dN |
34(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
mulu.w #4,dN |
add.w dN,dNadd.w dN,dN |
36(0/0) | 0 bytes | Wrong flags High word of dN different |
mulu.w #5,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dN |
30(-2/0) | -4 bytes | Wrong flags High word of dN differentdM different |
mulu.w #6,dN |
add.w dN,dNmove.w dN,dMadd.w dN,dNadd.w dM,dN |
30(-2/0) | -4 bytes | Wrong flags High word of dN differentdM different |
mulu.w #7,dN |
move.w dN,dMlsl.w #3,dNsub.w dM,dN |
28(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
mulu.w #8,dN |
lsl.w #3,dN |
32(1/0) | 2 bytes | Wrong flags High word of dN differentdM different |
mulu.w #9,dN |
move.w dN,dMlsl.w #3,dNadd.w dM,dN |
26(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
mulu.w #10,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dNadd.w dN,dN |
26(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
mulu.w #11,dN |
move.w dN,dMadd.w dM,dNadd.w dM,dNadd.w dN,dNadd.w dN,dNsub.w dM,dN |
24(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
mulu.w #12,dN |
move.w dN,dMadd.w dM,dNadd.w dM,dNadd.w dN,dNadd.w dN,dN |
26(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
mulu.w #13,dN |
move.w dN,dMadd.w dM,dNadd.w dM,dNadd.w dN,dNadd.w dN,dNadd.w dM,dN |
24(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
mulu.w #14,dN |
move.w dN,dMlsl.w #3,dNsub.w dM,dNadd.w dN,dN |
24(-2/0) | -4 bytes | Wrong flags High word of dN differentdM different |
mulu.w #15,dN |
move.w dN,dMlsl.w #4,dNsub.w dM,dN |
28(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
mulu.w #16,dN |
lsl.w #4,dN |
30(1/0) | 2 bytes | Wrong flags High word of dN differentdM different |
mulu.w #17,dN |
move.w dN,dMlsl.w #4,dNadd.w dM,dN |
24(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
mulu.w #18,dN |
add.w dN,dNmove.w dN,dMlsl.w #3,dNadd.w dM,dN |
22(-2/0) | -4 bytes | Wrong flags High word of dN differentdM different |
mulu.w #19,dN |
move.w dN,dMlsl.w #3,dNadd.w dM,dNadd.w dN,dNadd.w dM,dN |
20(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
mulu.w #20,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dNadd.w dN,dNadd.w dN,dN |
22(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
mulu.w #21,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dNadd.w dN,dNadd.w dN,dNadd.w dM,dN |
20(-5/0) | -10 bytes | Wrong flags High word of dN differentdM different |
mulu.w #22,dN |
add.w dN,dNmove.w dN,dMadd.w dM,dNadd.w dM,dNadd.w dN,dNadd.w dN,dNsub.w dM,dN |
20(-5/0) | -10 bytes | Wrong flags High word of dN differentdM different |
mulu.w #23,dN |
move.w dN,dMadd.w dN,dNadd.w dM,dNlsl.w #3,dNsub.w dM,dN |
22(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
mulu.w #24,dN |
move.w dN,dMadd.w dN,dNadd.w dM,dNlsl.w #3,dN |
22(-2/0) | -6 bytes | Wrong flags High word of dN differentdM different |
mulu.w #25,dN |
move.w dN,dMadd.w dN,dNadd.w dM,dNlsl.w #3,dNadd.w dM,dN |
20(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
mulu.w #26,dN |
move.w dN,dMadd.w dM,dMadd.w dM,dNlsl.w #3,dNadd.w dM,dN |
20(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
mulu.w #27,dN |
move.w dN,dMlsl.w #3,dNsub.w dM,dNadd.w dN,dNadd.w dN,dNsub.w dM,dN |
22(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
mulu.w #28,dN |
move.w dN,dMlsl.w #3,dNsub.w dM,dNadd.w dN,dNadd.w dN,dN |
24(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
mulu.w #29,dN |
move.w dN,dMlsl.w #5,dNsub.w dM,dNsub.w dM,dNsub.w dM,dN |
18(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
mulu.w #30,dN |
move.w dN,dMlsl.w #5,dNsub.w dM,dNsub.w dM,dN |
22(-2/0) | -4 bytes | Wrong flags High word of dN differentdM different |
mulu.w #31,dN |
move.w dN,dMlsl.w #5,dNsub.w dM,dN |
28(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
mulu.w #32,dN |
lsl.w #5,dN |
28(1/0) | 2 bytes | Wrong flags High word of dN differentdM different |
mulu.w #33,dN |
move.w dN,dMlsl.w #5,dNadd.w dM,dN |
22(-1/0) | -2 bytes | Wrong flags High word of dN differentdM different |
mulu.w #34,dN |
move.w dN,dMlsl.w #5,dNadd.w dM,dNadd.w dM,dN |
18(-2/0) | -4 bytes | Wrong flags High word of dN differentdM different |
mulu.w #35,dN |
move.w dN,dMlsl.w #5,dNadd.w dM,dNadd.w dM,dNadd.w dM,dN |
16(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
mulu.w #36,dN |
move.w dN,dMlsl.w #3,dNadd.w dM,dNadd.w dN,dNadd.w dN,dN |
18(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
mulu.w #37,dN |
move.w dN,dMlsl.w #3,dNadd.w dM,dNadd.w dN,dNadd.w dN,dNadd.w dM,dN |
16(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
mulu.w #38,dN |
add.w dN,dNmove.w dN,dMlsl.w #3,dNadd.w dM,dNadd.w dN,dNadd.w dM,dN |
16(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
mulu.w #39,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dNlsl.w #3,dNsub.w dM,dN |
18(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
mulu.w #40,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dNlsl.w #3,dN |
18(-3/0) | -6 bytes | Wrong flags High word of dN differentdM different |
mulu.w #41,dN |
move.w dN,dMadd.w dN,dNadd.w dN,dNadd.w dM,dNlsl.w #3,dNadd.w dM,dN |
16(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
mulu.w #42,dN |
move.w dN,dMadd.w dM,dMadd.w dM,dNadd.w dM,dNlsl.w #3,dNadd.w dM,dN |
16(-4/0) | -8 bytes | Wrong flags High word of dN differentdM different |
mulu.w #64,dN |
lsl.w #6,dN |
26(1/0) | 2 bytes | Wrong flags High word of dN differentdM different |
mulu.w #128,dN |
lsl.w #7,dN |
24(1/0) | 2 bytes | Wrong flags High word of dN differentdM different |
mulu.w #256,dN |
lsl.w #8,dN |
22(1/0) | 2 bytes | Wrong flags High word of dN differentdM different |
Some of the asl and lsl can also be optimized by the respective peephole optimizations.
| Don't use‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Use instead‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ | Time savings | Space savings | Notes‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ |
|---|---|---|---|---|
divu.w #1,dN |
(nothing) | [76,136](1/0) | 2 bytes | Wrong flags |
divu.w #1<<x,dN |
lsr.l #x,dN |
[66,126]-2*x(1/0) | 2 bytes | 1 ≤ x ≤ 8Wrong flags |
divu.w #1<<9,dN |
moveq #9,dMlsr.l dM,dN |
[46,106](0/0) | 0 bytes | Wrong flags |
divu.w #1<<10,dN |
moveq #10,dMlsr.l dM,dN |
[44,104](0/0) | 0 bytes | Wrong flags |
divu.w #1<<(8+x),dN |
andi.w #~((1<<(8+x))-1),dNswap dNrol.l #8-x,dN |
[40,90]+2*x(0/0) | 0 bytes | 3 ≤ x ≤ 7Wrong flags |
divu.w #1<<16,dN |
clr.w dNswap dN |
[68,128](0/0) | 0 bytes | Wrong flags |