ack/mach/sparc/libem/dvu.s
1993-10-04 14:13:51 +00:00

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