xref: /original-bsd/old/libm/liboldnm/tanh.s (revision e1db577d)
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) 05/08/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|
27t1:	cmpd	r6,$0d2.0e+1
28	jleq	t2
29	movd	$0d1.0e+0,r0
30	xorw2	r10,r0
31	ret
32t2:	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
43t3:	subd3	(sp),r8,r0
44t4:				# 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
51pcoef:
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
58