MiniUnix/usr/source/s3/pow.s
.globl pow, _pow
.globl log, exp
_pow:
mov r5,-(sp)
mov sp,r5
movf 4(r5),fr0
movf 12.(r5),fr1
jsr pc,pow
mov (sp)+,r5
rts pc
pow:
/ 0^0~ is 0
tstf fr0
cfcc
bne 1f
tstf fr1
cfcc
beq bad
rts pc
1:
/ -^i is +^i fixed sign
bpl 1f
movf fr1,-(sp)
modf $one,fr1
cfcc
bne bad1
movf (sp)+,fr1
absf fr0
jsr pc,1f
bes bad
movf fr1,-(sp)
modf $half,fr1
cfcc
beq 2f
negf fr0
2:
movf (sp)+,fr1
rts pc
1:
jsr pc,log
bes 1f
mulf fr1,fr0
jsr pc,exp
1:
rts pc
bad1:
movf (sp)+,fr1
bad:
sec
rts pc
one = 40200
half = 40000