------- Comment #1 from ami_stuff at o2 dot pl 2009-08-22 00:43 ------- Here is asm output from GCC 4.2.5 (-m68060 -fomit-frame-pointer -O3):
#NO_APP .text .even .globl _MUL64 _MUL64: movm.l #0x3e00,-(sp) move.l 24(sp),a1 move.l 28(sp),a0 #APP | Inlined umul_ppmm move.l a1,d0 move.l a0,d1 move.l d0,d2 swap d0 move.l d1,d3 swap d1 move.w d2,d4 mulu d3,d4 mulu d1,d2 mulu d0,d3 mulu d0,d1 move.l d4,d0 eor.w d0,d0 swap d0 add.l d0,d2 add.l d3,d2 jcc 1f add.l #65536,d1 1: swap d2 moveq #0,d0 move.w d2,d0 move.w d4,d2 move.l d2,d6 add.l d1,d0 move.l d0,d5 #NO_APP tst.l a1 jblt L8 L2: tst.l a0 jbge L4 sub.l a1,d5 jbra L4 L8: sub.l a0,d5 jbra L2 L4: move.l d5,d0 clr.l d1 or.l d6,d1 movm.l (sp)+,#0x7c rts GCC 4.3.2 asm output looks worse: #NO_APP .text .even .globl _MUL64 _MUL64: movem.l #15872,-(sp) move.l 24(sp),d5 move.l 28(sp),a1 #APP ;# 45 "test2.c" 1 | Inlined umul_ppmm move.l d5,d0 move.l a1,d1 move.l d0,d2 swap d0 move.l d1,d3 swap d1 move.w d2,d4 mulu d3,d4 mulu d1,d2 mulu d0,d3 mulu d0,d1 move.l d4,d0 eor.w d0,d0 swap d0 add.l d0,d2 add.l d3,d2 jcc 1f add.l #65536,d1 1: swap d2 moveq #0,d0 move.w d2,d0 move.w d4,d2 move.l d2,d6 add.l d1,d0 move.l d0,a0 #NO_APP tst.l d5 jlt L6 tst.l a1 jlt L7 L3: move.l a0,d1 clr.l d2 or.l d6,d2 move.l d1,d0 move.l d2,d1 movem.l (sp)+,#124 rts L7: sub.l d5,a0 move.l a0,d1 clr.l d2 or.l d6,d2 move.l d1,d0 move.l d2,d1 movem.l (sp)+,#124 rts L6: sub.l a1,a0 tst.l a1 jge L3 jra L7 -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40977