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