Commit | Line | Data |
---|---|---|
7049871b TL |
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(9 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 3 | |
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 |