|
|
1.1 ! root 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() 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 2 ! 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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.