Research V7 development
[unix-history] / .ref-Research-V6 / usr / source / s3 / exp.s
CommitLineData
6b92951c
KT
1.globl exp, _exp
2/
3ldfps = 170100^tst
4stfps = 170200^tst
5ldexp = 176400^movif
6stexp = 175000^movfi
7/
8/ exp accepts its argument and returns its result
9/ in fr0. The carry bit is set if the result overflows.
10/ The coefficients are #1067 from Hart & Cheney.
11/
12/ movf arg,fr0
13/ jsr pc,exp
14/ movf fr0,result
15/
16_exp:
17 mov r5,-(sp)
18 mov sp,r5
19 mov 4(r5),fr0
20 jsr pc,exp
21 mov (sp)+,r5
22 rts pc
23
24exp:
25 stfps -(sp)
26 ldfps $200 /di mode
27 movf fr2,-(sp)
28 movf fr1,-(sp)
29 tstf fr0
30 cfcc
31 bne 1f
32 movf $one,fr0 /exp(0)
33 clc
34 br out
351:
36 modf log2e,fr0 /exp(x) = 2^(x*log2(e))
37 cfcc
38 bmi 2f
39 movfi fr1,-(sp) /save integer part
40 subf $half,fr0
41 br 3f
422:
43 movfi fr1,-(sp)
44 dec (sp)
45 addf $half,fr0
463:
47 movf fr0,fr1 / -.5 < x < +.5
48 mulf fr1,fr1 /arg**2
49/
50 movf P2,fr2
51 mulf fr1,fr2
52 addf P1,fr2
53 mulf fr1,fr2
54 addf P0,fr2
55 mulf fr2,fr0 /xP(x**2)
56/
57 movf fr1,fr2
58 addf Q1,fr2
59 mulf fr1,fr2
60 addf Q0,fr2 /Q(x**2)
61/
62 movf fr2,fr1
63 subf fr0,fr1
64 addf fr2,fr0
65 divf fr1,fr0 /(Q+xP)/(Q-xP)
66 mulf sqrt2,fr0
67/
68 stexp fr0,-(sp)
69 add (sp)+,(sp)
70/
71 cmp (sp),$177
72 ble 2f
73 tst (sp)+
74 movf big,fr0 /overflow
75 sec
76 br 1f
772:
78 cmp (sp),$-177
79 bge 2f
80 tst (sp)+
81 clrf fr0 /underflow
82 clc
83 br 1f
842:
85 ldexp (sp)+,fr0
86 clc
871:
88out:
89 movf (sp)+,fr1
90 movf (sp)+,fr2
91 ldfps (sp)+
92 rts pc
93/
94/
95 .data
96P0: 42675; 36404; 77563; 46675
97P1: 41241; 116724; 114237; 60333
98P2: 36675; 27102; 125560; 136652
99Q0: 43210; 100661; 76072; 62453
100Q1: 42151; 27450; 75350; 112503
101log2e: 40270; 125073; 24534; 13761
102sqrt2: 40265; 02363; 31771; 157144
103half = 40000
104one = 40200
105/
106big: 77777; 177777; 177777; 177777
107/
108/ P0 = .15139 06799 05433 89158 94328 d4
109/ P1 = .20202 06565 12869 27227 886 d2
110/ P2 = .23093 34775 37502 33624 d-1
111/
112/ Q0 = .43682 11662 72755 84984 96814 d4
113/ Q1 = .23318 42114 27481 62379 0295 d3
114/ Q2 = .1 d1
115/
116/ log2e = 1.44269 50408 88963 40735 99246
117/ sqrt2 = 1.41421 35623 73095 04880 16887