1: #
2: # Copyright (c) 1980 Regents of the University of California.
3: # All rights reserved. The Berkeley software License Agreement
4: # specifies the terms and conditions for redistribution.
5: #
6: # @(#)tanh.s 5.1 (Berkeley) 5/8/85
7: #
8: #
9: # double tanh(arg)
10: # double arg
11: # method: tanh(arg)=sinh(arg)/cosh(arg); if |arg|<0.5 sinh(9 is computed from
12: # a polynomial approx otherwise from exp().
13: # Only 1 call to exp() is made.
14: # J F Jarvis, August 17, 1978
15: .globl _tanh
16: .globl _exp
17: .text
18: .align 1
19: _tanh:
20: .word 0x07c0
21: bispsw $0xe0
22: clrl r10 # sign bit
23: movd 4(ap),r6
24: jgeq t1
25: movw $0x8000,r10
26: xorw2 r10,r6 # co|arg|
27: t1: cmpd r6,$0d2.0e+1
28: jleq t2
29: movd $0d1.0e+0,r0
30: xorw2 r10,r0
31: ret
32: t2: movd r6,-(sp)
33: calls $2,_exp
34: movd r0,r8
35: divd3 r8,$0d1.0e+0,-(sp) # exp(-|arg|)
36: cmpd r6,$0d0.5e+0
37: jgeq t3
38: muld3 r6,r6,r0 # |arg|<0.5, sinh() from poly approx
39: polyd r0,$5,pcoef
40: muld2 r6,r0
41: muld2 $0d2.0e+0,r0
42: jbr t4
43: t3: subd3 (sp),r8,r0
44: t4: # r0,1 = 2*sinh(|arg|)
45: addd3 (sp),r8,r2 # r2,3 = cosh(|arg|);
46: divd2 r2,r0 # r0,1 = tanh(|arg|)
47: xorw2 r10,r0 # r0,1 = tanh(arg)
48: ret
49: .data
50: .align 2
51: pcoef:
52: .double 0d0.251726188251e-7
53: .double 0d0.275569807356154e-5
54: .double 0d0.1984127027907999e-3
55: .double 0d0.833333333307759961e-2
56: .double 0d0.16666666666667212324e+0
57: .double 0d0.99999999999999998116e+0
Defined functions
_tanh
declared in line
15; defined in line
19; used 7 times
t1
defined in line
27; used 1 times
t2
defined in line
32; used 1 times
t3
defined in line
43; used 1 times
t4
defined in line
44; used 1 times
Defined variables
pcoef
defined in line
51; used 1 times