53 lines
658 B
ArmAsm
53 lines
658 B
ArmAsm
.define .mlu
|
|
.sect .text
|
|
.sect .rom
|
|
.sect .data
|
|
.sect .bss
|
|
|
|
! entry : d0 multiplicand
|
|
! d1 multiplier
|
|
! exit : d0 high order result
|
|
! d1 low order result
|
|
|
|
.sect .text
|
|
.mlu:
|
|
movem.l d3/d4/d6,-(sp)
|
|
move.l 16(sp),d1
|
|
move.l 20(sp),d0
|
|
cmp.l #32768,d0
|
|
bgt 1f
|
|
cmp.l #32768,d1
|
|
bls 2f
|
|
1:
|
|
move.l d1,d3
|
|
move.l d1,d2
|
|
swap d2
|
|
move.l d2,d4
|
|
mulu d0,d1
|
|
mulu d0,d2
|
|
swap d0
|
|
mulu d0,d3
|
|
mulu d4,d0
|
|
clr.l d6
|
|
swap d1
|
|
add d2,d1
|
|
addx.l d6,d0
|
|
add d3,d1
|
|
addx.l d6,d0
|
|
swap d1
|
|
clr d2
|
|
clr d3
|
|
swap d2
|
|
swap d3
|
|
add.l d2,d0
|
|
add.l d3,a0
|
|
bra 3f
|
|
2: mulu d0,d1
|
|
clr d0
|
|
3:
|
|
movem.l (sp)+,d3/d4/d6
|
|
move.l (sp)+,a0
|
|
add #8,sp
|
|
jmp (a0)
|
|
.align 2
|