|
|
1.1 root 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
20: argtst:
21: jnequ smlarg
22: movd $0d1.0e+0,r0
23: ret
24: smlarg:
25: cmpd r0,minarg
26: jgeq lrgarg
27: mnegd huge,r0
28: ret
29: lrgarg:
30: cmpd r0,maxarg
31: jleq range
32: movl $ERANGE,_errno
33: movd huge,r0
34: ret
35: range:
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
42: l1: subd2 $0d0.5e+0,r6
43: l2: # 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 2
58: pcoef:
59: .double 0d0.23093347753750233624e-1
60: .double 0d0.20202065651286927227886e+2
61: .double 0d0.15139067990543389159e+4
62: qcoef:
63: .double 0d0.1e+1
64: .double 0d0.23318421142748162379e+3
65: .double 0d0.43682116627275584985e+4
66: minarg:
67: .double 0d-88.028e+0
68: maxarg:
69: .double 0d88.028e+0
70: huge: .double 0d1.7e+38
71: loge10:
72: .double 0d2.30258509299404568401e+0
73: sqrt2:
74: .double 0d1.41421356237309504880e+0
75: log2e:
76: .double 0d1.44269504088896340735e+0
77: log2ex:
78: .byte 0xbb
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.