177 lines
1.6 KiB
ArmAsm
177 lines
1.6 KiB
ArmAsm
.global dvu4
|
|
.global dvi4
|
|
.global mathdvi4
|
|
|
|
EIDIVZ=6
|
|
|
|
dvi4:
|
|
! %o0' = %o0 / %o1
|
|
! %o1' = %o0 % %o1
|
|
tst %o1
|
|
be 0f
|
|
clr %o5
|
|
tst %o0
|
|
bge 1f
|
|
nop
|
|
neg %o0
|
|
xor %o5, 1, %o5
|
|
1:
|
|
tst %o1
|
|
bge 3f
|
|
nop
|
|
neg %o1
|
|
xor %o5, 2, %o5
|
|
|
|
3: /* div common */
|
|
clr %o2
|
|
mov %o1, %o3
|
|
clr %o4
|
|
|
|
4:
|
|
cmp %o1, %o0
|
|
bgeu 5f
|
|
nop
|
|
inc %o4
|
|
sll %o1, 1, %o1
|
|
b 4b
|
|
nop
|
|
|
|
5:
|
|
sll %o2, 1, %o2
|
|
subcc %o0, %o1, %o0
|
|
bgeu 3f
|
|
nop
|
|
add %o0, %o1, %o0
|
|
b 4f
|
|
nop
|
|
3:
|
|
inc %o2
|
|
4:
|
|
srl %o1, 1, %o1
|
|
tst %o4
|
|
bz 5f
|
|
nop
|
|
dec %o4
|
|
b 5b
|
|
nop
|
|
|
|
5:
|
|
andcc %o5, 1, %g0
|
|
bz 6f
|
|
nop
|
|
neg %o0
|
|
neg %o2
|
|
6:
|
|
andcc %o5, 2, %g0
|
|
bz 8f
|
|
nop
|
|
neg %o2
|
|
8:
|
|
mov %o0, %o1
|
|
mov %o2, %o0
|
|
retl
|
|
nop
|
|
|
|
dvu4:
|
|
! %o0' = %o0 / %o1
|
|
! %o1' = %o0 % %o1
|
|
tst %o1
|
|
be 0f
|
|
nop
|
|
clr %o5
|
|
tst %o0
|
|
bge 3f /* jump if msb clear */
|
|
nop
|
|
|
|
clr %o2
|
|
mov %o1, %o3
|
|
clr %o4
|
|
1: tst %o1
|
|
bl 5f /* jump if msb set */
|
|
nop
|
|
sll %o1, 1, %o1
|
|
inc %o4
|
|
b 1b
|
|
nop
|
|
|
|
|
|
mathdvi4:
|
|
! %o0' = %o0 / %o1
|
|
! %o1' = %o0 % %o1
|
|
tst %o1
|
|
be 0f
|
|
clr %o5
|
|
tst %o0
|
|
bge 1f
|
|
nop
|
|
neg %o0
|
|
xor %o5, 1, %o5
|
|
1:
|
|
tst %o1
|
|
bge 3f
|
|
nop
|
|
neg %o1
|
|
xor %o5, 3, %o5
|
|
|
|
3: /* div common */
|
|
clr %o2
|
|
mov %o1, %o3
|
|
clr %o4
|
|
|
|
4:
|
|
cmp %o1, %o0
|
|
bgeu 5f
|
|
nop
|
|
inc %o4
|
|
sll %o1, 1, %o1
|
|
b 4b
|
|
nop
|
|
|
|
5: /* div common for dvu4 && ( %o0 & 0x80000000) */
|
|
sll %o2, 1, %o2
|
|
subcc %o0, %o1, %o0
|
|
bgeu 3f
|
|
nop
|
|
add %o0, %o1, %o0
|
|
b 4f
|
|
nop
|
|
3:
|
|
inc %o2
|
|
4:
|
|
srl %o1, 1, %o1
|
|
tst %o4
|
|
bz 5f
|
|
nop
|
|
dec %o4
|
|
b 5b
|
|
nop
|
|
|
|
5:
|
|
andcc %o5, 1, %g0
|
|
bz 6f
|
|
nop
|
|
tst %o0
|
|
bz 7f
|
|
nop
|
|
inc %o2
|
|
sub %o3, %o0, %o0
|
|
7:
|
|
neg %o2
|
|
6:
|
|
andcc %o5, 2, %g0
|
|
bz 8f
|
|
nop
|
|
neg %o0
|
|
8:
|
|
mov %o0, %o1
|
|
mov %o2, %o0
|
|
retl
|
|
nop
|
|
|
|
0: /* divide by zero */
|
|
set EIDIVZ, %o0
|
|
call trp
|
|
nop
|
|
retl
|
|
nop
|