!
!   arith.s  Takes care of standard arithmetic routines.
!
!**********************************************************************
!
!   JCC mul   (see appendice E)
!
!**********************************************************************
.seg "text"
.global .mul
.mul:
mov  %o0, %y
andncc %o0, 0xfff, %g0
be   mul.short
andcc  %g0, %g0, %o4
mulscc %o4, %o1, %o4  ! iteration 1 
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4  ! iteration 32
mulscc %o4, %g0, %o4  ! shifts only
tst   %o0
rd   %y, %o0
bge  mul.1
tst   %o0
sub  %o4, %o1, %o4
mul.1:
bge  mul.2
addcc  %o4, %g0, %o1
retl
subcc  %o4, -1, %g0
mul.2:
retl
nop
mul.short:
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4
mulscc %o4, %o1, %o4  ! iteration 12
mulscc %o4, %g0, %o4  ! shifts only
rd   %y, %o5
sll   %o4, 12, %o0
srl   %o5, 20, %o5
orcc   %o5, %o0, %o0
bge  mul.3
sra  %o4, 20, %o1
retl
subcc  %o1, -1, %g0
mul.3:
retl
addcc  %o1, %g0, %g0