|
|
1.1 root 1: # double atan(arg1); -pi/2 < atan < pi/2
2: #double atan2(arg1,arg2); -pi< atan2<pi
3: #double arg1,arg2
4: #method: range reduction to [sqrt(2)-1,sqrt(2)+1]
5: # followed by Hart&Cheney ARCTN 5076 D=17.55
6: # J. F. Jarvis August 8, 1978
7: .globl _atan
8: .globl _atan2
9: .text
10: .align 1
11: _atan:
12: .word 0x03c0
13: movd 4(ap),r0
14: jgtr a1
15: mnegd r0,r0 # atan(arg1), arg1<0
16: bsbb satan
17: mnegd r0,r0
18: ret
19: a1: bsbb satan # atan(arg1), arg1>=0
20: ret
21: #
22: .align 1
23: _atan2:
24: .word 0x03c0
25: movd 4(ap),r0 # atan(arg1/arg2)
26: movd 12(ap),r2
27: addd3 r0,r2,r4
28: cmpd r0,r4
29: jneq b1
30: tstd r0
31: jgeq b2
32: mnegd pio2,r0
33: ret
34: b2: movd pio2,r0
35: ret
36: #
37: b1: tstd r2
38: jgeq b3
39: divd2 r2,r0
40: jleq b4
41: bsbb satan # arg1<0, arg2<0
42: subd2 pi,r0
43: ret
44: b4: mnegd r0,r0 # arg1>0, arg2<0
45: bsbb satan
46: subd3 r0,pi,r0
47: ret
48: #
49: b3: divd2 r2,r0
50: jleq b5
51: bsbb satan # arg1>0, arg2>0
52: ret
53: b5: mnegd r0,r0 # arg1<0, arg2>0
54: bsbb satan
55: mnegd r0,r0
56: ret
57: #
58: .globl satan
59: satan: # range reduction on positive arg(r0)
60: cmpd r0,sq2m1
61: jgeq c1
62: bsbb xatan
63: rsb
64: c1: cmpd r0,sq2p1
65: jleq c2
66: divd3 r0,$0d1.0e+0,r0
67: bsbb xatan
68: subd3 r0,pio2,r0
69: rsb
70: c2: addd3 $0d1.0e+0,r0,r2
71: subd2 $0d1.0e+0,r0
72: divd2 r2,r0
73: bsbb xatan
74: addd2 pio4,r0
75: rsb
76: #
77: xatan: # compute arctan(r0) for:sqrt(2)-1<r0<sqrt(2)+1
78: # Hart&Cheney ARCTN 5076 is evaluated
79: movd r0,r8
80: muld3 r0,r0,r6
81: polyd r6,$4,pcoef
82: muld2 r0,r8
83: polyd r6,$4,qcoef
84: divd3 r0,r8,r0
85: rsb
86: .data
87: .align 2
88: pcoef:
89: .double 0d0.1589740288482307048e+0
90: .double 0d0.66605790170092626575e+1
91: .double 0d0.40969264832102256374e+2
92: .double 0d0.77477687719204208616e+2
93: .double 0d0.44541340059290680319e+2
94: qcoef:
95: .double 0d1.0e+0
96: .double 0d0.15503977551421987525e+2
97: .double 0d0.62835930511032376833e+2
98: .double 0d0.92324801072300974840e+2
99: .double 0d0.44541340059290680444e+2
100: pio4: .double 0d0.78539816339744830961e+0
101: pio2: .double 0d1.57079632679489661923e+0
102: sq2p1: .double 0d2.41421356237309504880e+0
103: sq2m1: .double 0d0.41421356237309504880e+0
104: pi: .double 0d3.14159265358979323846e+0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.