home *** CD-ROM | disk | FTP | other *** search
- # double tan(arg)
- # double arg;
- #method: range reduction to [0,pi/4] followed by polynomial
- # approximation: Hart&Cheney TAN 4285 D=19.74
- .globl _tan
- .text
- .align 1
- _tan:
- .word 0x07c0
- clrl r10 # sign flag, !=0 negate result
- movd 4(ap),r0
- jgeq c1
- xorw2 $0x8000,r10
- mnegd r0,r0
- c1:
- emodd fopi,fopix,r0,r2,r6
- bicl2 $~3,r2
- caseb r2,$0,$3
- a0: .word a1-a0,a2-a0,a3-a0,a4-a0
- a2: subd3 r6,$0d1.0e+0,r6
- jbr b1
- a3: xorw2 $0x8000,r10
- b1: bsbb rtan
- jneq b2 # tests final result cmptd in rtan
- movd $0d1.7e+38,r0
- jmp b3
- b2: divd3 r0,$0d1.0e+0,r0
- b3: xorw2 r10,r0 # negate result if flag != 0
- ret
- a4: subd3 r6,$0d1.0e+0,r6
- xorw2 $0x8000,r10
- a1: bsbb rtan
- xorw2 r10,r0
- ret
- rtan:
- muld3 r6,r6,r8
- polyd r8,$4,pcoef
- muld2 r0,r6
- polyd r8,$3,qcoef
- divd3 r0,r6,r0
- rsb
- .data
- .align 2
- pcoef:
- .double 0d0.33866386426771720960e-4
- .double 0d0.34225543872410034353e-1
- .double 0d-0.15506856534832663769e+2
- .double 0d0.10559709017149531936e+4
- .double 0d-0.13068202647548256682e+5
- qcoef:
- .double 0d1.0e+0
- .double 0d-0.15550331640317099669e+3
- .double 0d0.47657513629164836989e+4
- .double 0d-0.16638952389471190018e+5
- fopi:
- .double 0d1.27323954473516268e+0
- fopix: .byte 0x29
-