Bell 32V development
[unix-history] / usr / src / libnm / exp.s
CommitLineData
11f0f1d9
TL
1# double exp(arg)
2# double arg; 0<= arg< 88
3# double exp10(arg)
4# method: range reduction to [-0.5,0.5], Hart&Chenet EXPB 1067
5# J F Jarvis, August 5, 1978
6.set ERANGE,34
7.globl _exp
8.globl _exp10
9.globl _errno
10.text
11.align 1
12_exp10:
13 .word 0x07c0
14 muld3 4(ap),loge10,r0
15 jbr argtst
16.align 1
17_exp:
18 .word 0x07c0
19 movd 4(ap),r0
20argtst:
21 jnequ smlarg
22 movd $0d1.0e+0,r0
23 ret
24smlarg:
25 cmpd r0,minarg
26 jgeq lrgarg
27 mnegd huge,r0
28 ret
29lrgarg:
30 cmpd r0,maxarg
31 jleq range
32 movl $ERANGE,_errno
33 movd $huge,r0
34 ret
35range:
36 emodd log2e,log2ex,r0,r10,r6 # r10=int(arg), r6=frac(arg)
37 tstd r0
38 jgtr l1
39 addd2 $0d0.5e+0,r6
40 subw2 $1,r10
41 jbr l2
42l1: subd2 $0d0.5e+0,r6
43l2: # Hart&Cheney EXPB 1067
44 muld3 r6,r6,r8 # range [-.5,.5] D=18.1
45 polyd r8,$2,pcoef
46 muld2 r0,r6
47 polyd r8,$2,qcoef
48 subd3 r6,r0,r2
49 addd2 r6,r0
50 divd2 r2,r0
51 muld2 sqrt2,r0
52 extzv $7,$8,r0,r2
53 addl2 r2,r10
54 insv r10,$7,$8,r0 # load correct exponent
55 ret
56.data
57.align 3
58pcoef:
59 .double 0d0.23093347753750233624e-1
60 .double 0d0.20202065651286927227886e+2
61 .double 0d0.15139067990543389159e+4
62qcoef:
63 .double 0d0.1e+1
64 .double 0d0.23318421142748162379e+3
65 .double 0d0.43682116627275584985e+4
66minarg:
67 .double 0d-88.028e+0
68maxarg:
69 .double 0d88.028e+0
70huge: .double 0d1.7e+38
71loge10:
72 .double 0d2.30258509299404568401e+0
73sqrt2:
74 .double 0d1.41421356237309504880e+0
75log2e:
76 .double 0d1.44269504088896340735e+0
77log2ex:
78 .byte 0xbb