| 1 | # double tan(arg) |
| 2 | # double arg; |
| 3 | #method: range reduction to [0,pi/4] followed by polynomial |
| 4 | # approximation: Hart&Cheney TAN 4285 D=19.74 |
| 5 | .globl _tan |
| 6 | .text |
| 7 | .align 1 |
| 8 | _tan: |
| 9 | .word 0x07c0 |
| 10 | clrl r10 # sign flag, !=0 negate result |
| 11 | movd 4(ap),r0 |
| 12 | jgeq c1 |
| 13 | xorw2 $0x8000,r10 |
| 14 | mnegd r0,r0 |
| 15 | c1: |
| 16 | emodd fopi,fopix,r0,r2,r6 |
| 17 | bicl2 $~3,r2 |
| 18 | caseb r2,$0,$3 |
| 19 | a0: .word a1-a0,a2-a0,a3-a0,a4-a0 |
| 20 | a2: subd3 r6,$0d1.0e+0,r6 |
| 21 | jbr b1 |
| 22 | a3: xorw2 $0x8000,r10 |
| 23 | b1: bsbb rtan |
| 24 | jneq b2 # tests final result cmptd in rtan |
| 25 | movd $0d1.7e+38,r0 |
| 26 | jbr b3 |
| 27 | b2: divd3 r0,$0d1.0e+0,r0 |
| 28 | b3: xorw2 r10,r0 # negate result if flag != 0 |
| 29 | ret |
| 30 | a4: subd3 r6,$0d1.0e+0,r6 |
| 31 | xorw2 $0x8000,r10 |
| 32 | a1: bsbb rtan |
| 33 | xorw2 r10,r0 |
| 34 | ret |
| 35 | rtan: |
| 36 | muld3 r6,r6,r8 |
| 37 | polyd r8,$4,pcoef |
| 38 | muld2 r0,r6 |
| 39 | polyd r8,$3,qcoef |
| 40 | divd3 r0,r6,r0 |
| 41 | rsb |
| 42 | .data |
| 43 | .align 3 |
| 44 | pcoef: |
| 45 | .double 0d0.33866386426771720960e-4 |
| 46 | .double 0d0.34225543872410034353e-1 |
| 47 | .double 0d-0.15506856534832663769e+2 |
| 48 | .double 0d0.10559709017149531936e+4 |
| 49 | .double 0d-0.13068202647548256682e+5 |
| 50 | qcoef: |
| 51 | .double 0d1.0e+0 |
| 52 | .double 0d-0.15550331640317099669e+3 |
| 53 | .double 0d0.47657513629164836989e+4 |
| 54 | .double 0d-0.16638952389471190018e+5 |
| 55 | fopi: |
| 56 | .double 0d1.27323954473516268e+0 |
| 57 | fopix: .byte 0x29 |