|
|
1.1 root 1: # double tanh(arg)
2: # double arg
3: # method: tanh(arg)=sinh(arg)/cosh(arg); if |arg|<0.5 sinh(9 is computed from
4: # a polynomial approx otherwise from exp().
5: # Only 1 call to exp() is made.
6: # J F Jarvis, August 17, 1978
7: .globl _tanh
8: .globl _exp
9: .text
10: .align 1
11: _tanh:
12: .word 0x7c0
13: clrl r10 # sign bit
14: movd 4(ap),r6
15: jgeq t1
16: movw $0x8000,r10
17: xorw2 r10,r6 # co|arg|
18: t1: cmpd r6,$0d2.0e+1
19: jleq t2
20: movd $0d1.0e+0,r0
21: xorw2 r10,r0
22: ret
23: t2: movd r6,-(sp)
24: calls $2,_exp
25: movd r0,r8
26: divd3 r8,$0d1.0e+0,-(sp) # exp(-|arg|)
27: cmpd r6,$0d0.5e+0
28: jgeq t3
29: muld3 r6,r6,r0 # |arg|<0.5, sinh() from poly approx
30: polyd r0,$5,pcoef
31: muld2 r6,r0
32: muld2 $0d2.0e+0,r0
33: jbr t4
34: t3: subd3 (sp),r8,r0
35: t4: # r0,1 = 2*sinh(|arg|)
36: addd3 (sp),r8,r2 # r2,3 = cosh(|arg|);
37: divd2 r2,r0 # r0,1 = tanh(|arg|)
38: xorw2 r10,r0 # r0,1 = tanh(arg)
39: ret
40: .data
41: .align 2
42: pcoef:
43: .double 0d0.251726188251e-7
44: .double 0d0.275569807356154e-5
45: .double 0d0.1984127027907999e-3
46: .double 0d0.833333333307759961e-2
47: .double 0d0.16666666666667212324e+0
48: .double 0d0.99999999999999998116e+0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.