|
|
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 0x07c0 ! 13: bispsw $0xe0 ! 14: clrl r10 # sign bit ! 15: movd 4(ap),r6 ! 16: jgeq t1 ! 17: movw $0x8000,r10 ! 18: xorw2 r10,r6 # co|arg| ! 19: t1: cmpd r6,$0d2.0e+1 ! 20: jleq t2 ! 21: movd $0d1.0e+0,r0 ! 22: xorw2 r10,r0 ! 23: ret ! 24: t2: movd r6,-(sp) ! 25: calls $2,_exp ! 26: movd r0,r8 ! 27: divd3 r8,$0d1.0e+0,-(sp) # exp(-|arg|) ! 28: cmpd r6,$0d0.5e+0 ! 29: jgeq t3 ! 30: muld3 r6,r6,r0 # |arg|<0.5, sinh() from poly approx ! 31: polyd r0,$5,pcoef ! 32: muld2 r6,r0 ! 33: muld2 $0d2.0e+0,r0 ! 34: jbr t4 ! 35: t3: subd3 (sp),r8,r0 ! 36: t4: # r0,1 = 2*sinh(|arg|) ! 37: addd3 (sp),r8,r2 # r2,3 = cosh(|arg|); ! 38: divd2 r2,r0 # r0,1 = tanh(|arg|) ! 39: xorw2 r10,r0 # r0,1 = tanh(arg) ! 40: ret ! 41: .data ! 42: .align 2 ! 43: pcoef: ! 44: .double 0d0.251726188251e-7 ! 45: .double 0d0.275569807356154e-5 ! 46: .double 0d0.1984127027907999e-3 ! 47: .double 0d0.833333333307759961e-2 ! 48: .double 0d0.16666666666667212324e+0 ! 49: .double 0d0.99999999999999998116e+0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.