Bell 32V development
[unix-history] / usr / src / libnm / tanh.s
CommitLineData
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|
18t1: cmpd r6,$0d2.0e+1
19 jleq t2
20 movd $0d1.0e+0,r0
21 xorw2 r10,r0
22 ret
23t2: 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
34t3: subd3 (sp),r8,r0
35t4: # 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
42pcoef:
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