118 lines
1.9 KiB
ArmAsm
118 lines
1.9 KiB
ArmAsm
.globl exp, _exp
|
|
/
|
|
ldfps = 170100^tst
|
|
stfps = 170200^tst
|
|
ldexp = 176400^movif
|
|
stexp = 175000^movfi
|
|
/
|
|
/ exp accepts its argument and returns its result
|
|
/ in fr0. The carry bit is set if the result overflows.
|
|
/ The coefficients are #1067 from Hart & Cheney.
|
|
/
|
|
/ movf arg,fr0
|
|
/ jsr pc,exp
|
|
/ movf fr0,result
|
|
/
|
|
_exp:
|
|
mov r5,-(sp)
|
|
mov sp,r5
|
|
mov 4(r5),fr0
|
|
jsr pc,exp
|
|
mov (sp)+,r5
|
|
rts pc
|
|
|
|
exp:
|
|
stfps -(sp)
|
|
ldfps $200 /di mode
|
|
movf fr2,-(sp)
|
|
movf fr1,-(sp)
|
|
tstf fr0
|
|
cfcc
|
|
bne 1f
|
|
movf $one,fr0 /exp(0)
|
|
clc
|
|
br out
|
|
1:
|
|
modf log2e,fr0 /exp(x) = 2^(x*log2(e))
|
|
cfcc
|
|
bmi 2f
|
|
movfi fr1,-(sp) /save integer part
|
|
subf $half,fr0
|
|
br 3f
|
|
2:
|
|
movfi fr1,-(sp)
|
|
dec (sp)
|
|
addf $half,fr0
|
|
3:
|
|
movf fr0,fr1 / -.5 < x < +.5
|
|
mulf fr1,fr1 /arg**2
|
|
/
|
|
movf P2,fr2
|
|
mulf fr1,fr2
|
|
addf P1,fr2
|
|
mulf fr1,fr2
|
|
addf P0,fr2
|
|
mulf fr2,fr0 /xP(x**2)
|
|
/
|
|
movf fr1,fr2
|
|
addf Q1,fr2
|
|
mulf fr1,fr2
|
|
addf Q0,fr2 /Q(x**2)
|
|
/
|
|
movf fr2,fr1
|
|
subf fr0,fr1
|
|
addf fr2,fr0
|
|
divf fr1,fr0 /(Q+xP)/(Q-xP)
|
|
mulf sqrt2,fr0
|
|
/
|
|
stexp fr0,-(sp)
|
|
add (sp)+,(sp)
|
|
/
|
|
cmp (sp),$177
|
|
ble 2f
|
|
tst (sp)+
|
|
movf big,fr0 /overflow
|
|
sec
|
|
br 1f
|
|
2:
|
|
cmp (sp),$-177
|
|
bge 2f
|
|
tst (sp)+
|
|
clrf fr0 /underflow
|
|
clc
|
|
br 1f
|
|
2:
|
|
ldexp (sp)+,fr0
|
|
clc
|
|
1:
|
|
out:
|
|
movf (sp)+,fr1
|
|
movf (sp)+,fr2
|
|
ldfps (sp)+
|
|
rts pc
|
|
/
|
|
/
|
|
.data
|
|
P0: 42675; 36404; 77563; 46675
|
|
P1: 41241; 116724; 114237; 60333
|
|
P2: 36675; 27102; 125560; 136652
|
|
Q0: 43210; 100661; 76072; 62453
|
|
Q1: 42151; 27450; 75350; 112503
|
|
log2e: 40270; 125073; 24534; 13761
|
|
sqrt2: 40265; 02363; 31771; 157144
|
|
half = 40000
|
|
one = 40200
|
|
/
|
|
big: 77777; 177777; 177777; 177777
|
|
/
|
|
/ P0 = .15139 06799 05433 89158 94328 d4
|
|
/ P1 = .20202 06565 12869 27227 886 d2
|
|
/ P2 = .23093 34775 37502 33624 d-1
|
|
/
|
|
/ Q0 = .43682 11662 72755 84984 96814 d4
|
|
/ Q1 = .23318 42114 27481 62379 0295 d3
|
|
/ Q2 = .1 d1
|
|
/
|
|
/ log2e = 1.44269 50408 88963 40735 99246
|
|
/ sqrt2 = 1.41421 35623 73095 04880 16887
|