satan.sa revision 1.3 1 1.3 cgd * $NetBSD: satan.sa,v 1.3 1994/10/26 07:49:31 cgd Exp $
2 1.3 cgd
3 1.1 mycroft * MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
4 1.1 mycroft * M68000 Hi-Performance Microprocessor Division
5 1.1 mycroft * M68040 Software Package
6 1.1 mycroft *
7 1.1 mycroft * M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
8 1.1 mycroft * All rights reserved.
9 1.1 mycroft *
10 1.1 mycroft * THE SOFTWARE is provided on an "AS IS" basis and without warranty.
11 1.1 mycroft * To the maximum extent permitted by applicable law,
12 1.1 mycroft * MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
13 1.1 mycroft * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
14 1.1 mycroft * PARTICULAR PURPOSE and any warranty against infringement with
15 1.1 mycroft * regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
16 1.1 mycroft * and any accompanying written materials.
17 1.1 mycroft *
18 1.1 mycroft * To the maximum extent permitted by applicable law,
19 1.1 mycroft * IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
20 1.1 mycroft * (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
21 1.1 mycroft * PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
22 1.1 mycroft * OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
23 1.1 mycroft * SOFTWARE. Motorola assumes no responsibility for the maintenance
24 1.1 mycroft * and support of the SOFTWARE.
25 1.1 mycroft *
26 1.1 mycroft * You are hereby granted a copyright license to use, modify, and
27 1.1 mycroft * distribute the SOFTWARE so long as this entire notice is retained
28 1.1 mycroft * without alteration in any modified and/or redistributed versions,
29 1.1 mycroft * and that such modified versions are clearly identified as such.
30 1.1 mycroft * No licenses are granted by implication, estoppel or otherwise
31 1.1 mycroft * under any patents or trademarks of Motorola, Inc.
32 1.1 mycroft
33 1.1 mycroft *
34 1.1 mycroft * satan.sa 3.3 12/19/90
35 1.1 mycroft *
36 1.1 mycroft * The entry point satan computes the arctagent of an
37 1.1 mycroft * input value. satand does the same except the input value is a
38 1.1 mycroft * denormalized number.
39 1.1 mycroft *
40 1.1 mycroft * Input: Double-extended value in memory location pointed to by address
41 1.1 mycroft * register a0.
42 1.1 mycroft *
43 1.1 mycroft * Output: Arctan(X) returned in floating-point register Fp0.
44 1.1 mycroft *
45 1.1 mycroft * Accuracy and Monotonicity: The returned result is within 2 ulps in
46 1.1 mycroft * 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
47 1.1 mycroft * result is subsequently rounded to double precision. The
48 1.1 mycroft * result is provably monotonic in double precision.
49 1.1 mycroft *
50 1.1 mycroft * Speed: The program satan takes approximately 160 cycles for input
51 1.1 mycroft * argument X such that 1/16 < |X| < 16. For the other arguments,
52 1.1 mycroft * the program will run no worse than 10% slower.
53 1.1 mycroft *
54 1.1 mycroft * Algorithm:
55 1.1 mycroft * Step 1. If |X| >= 16 or |X| < 1/16, go to Step 5.
56 1.1 mycroft *
57 1.1 mycroft * Step 2. Let X = sgn * 2**k * 1.xxxxxxxx...x. Note that k = -4, -3,..., or 3.
58 1.1 mycroft * Define F = sgn * 2**k * 1.xxxx1, i.e. the first 5 significant bits
59 1.1 mycroft * of X with a bit-1 attached at the 6-th bit position. Define u
60 1.1 mycroft * to be u = (X-F) / (1 + X*F).
61 1.1 mycroft *
62 1.1 mycroft * Step 3. Approximate arctan(u) by a polynomial poly.
63 1.1 mycroft *
64 1.1 mycroft * Step 4. Return arctan(F) + poly, arctan(F) is fetched from a table of values
65 1.1 mycroft * calculated beforehand. Exit.
66 1.1 mycroft *
67 1.1 mycroft * Step 5. If |X| >= 16, go to Step 7.
68 1.1 mycroft *
69 1.1 mycroft * Step 6. Approximate arctan(X) by an odd polynomial in X. Exit.
70 1.1 mycroft *
71 1.1 mycroft * Step 7. Define X' = -1/X. Approximate arctan(X') by an odd polynomial in X'.
72 1.1 mycroft * Arctan(X) = sign(X)*Pi/2 + arctan(X'). Exit.
73 1.1 mycroft *
74 1.1 mycroft
75 1.1 mycroft satan IDNT 2,1 Motorola 040 Floating Point Software Package
76 1.1 mycroft
77 1.1 mycroft section 8
78 1.1 mycroft
79 1.1 mycroft include fpsp.h
80 1.1 mycroft
81 1.1 mycroft BOUNDS1 DC.L $3FFB8000,$4002FFFF
82 1.1 mycroft
83 1.1 mycroft ONE DC.L $3F800000
84 1.1 mycroft
85 1.1 mycroft DC.L $00000000
86 1.1 mycroft
87 1.1 mycroft ATANA3 DC.L $BFF6687E,$314987D8
88 1.1 mycroft ATANA2 DC.L $4002AC69,$34A26DB3
89 1.1 mycroft
90 1.1 mycroft ATANA1 DC.L $BFC2476F,$4E1DA28E
91 1.1 mycroft ATANB6 DC.L $3FB34444,$7F876989
92 1.1 mycroft
93 1.1 mycroft ATANB5 DC.L $BFB744EE,$7FAF45DB
94 1.1 mycroft ATANB4 DC.L $3FBC71C6,$46940220
95 1.1 mycroft
96 1.1 mycroft ATANB3 DC.L $BFC24924,$921872F9
97 1.1 mycroft ATANB2 DC.L $3FC99999,$99998FA9
98 1.1 mycroft
99 1.1 mycroft ATANB1 DC.L $BFD55555,$55555555
100 1.1 mycroft ATANC5 DC.L $BFB70BF3,$98539E6A
101 1.1 mycroft
102 1.1 mycroft ATANC4 DC.L $3FBC7187,$962D1D7D
103 1.1 mycroft ATANC3 DC.L $BFC24924,$827107B8
104 1.1 mycroft
105 1.1 mycroft ATANC2 DC.L $3FC99999,$9996263E
106 1.1 mycroft ATANC1 DC.L $BFD55555,$55555536
107 1.1 mycroft
108 1.1 mycroft PPIBY2 DC.L $3FFF0000,$C90FDAA2,$2168C235,$00000000
109 1.1 mycroft NPIBY2 DC.L $BFFF0000,$C90FDAA2,$2168C235,$00000000
110 1.1 mycroft PTINY DC.L $00010000,$80000000,$00000000,$00000000
111 1.1 mycroft NTINY DC.L $80010000,$80000000,$00000000,$00000000
112 1.1 mycroft
113 1.1 mycroft ATANTBL:
114 1.1 mycroft DC.L $3FFB0000,$83D152C5,$060B7A51,$00000000
115 1.1 mycroft DC.L $3FFB0000,$8BC85445,$65498B8B,$00000000
116 1.1 mycroft DC.L $3FFB0000,$93BE4060,$17626B0D,$00000000
117 1.1 mycroft DC.L $3FFB0000,$9BB3078D,$35AEC202,$00000000
118 1.1 mycroft DC.L $3FFB0000,$A3A69A52,$5DDCE7DE,$00000000
119 1.1 mycroft DC.L $3FFB0000,$AB98E943,$62765619,$00000000
120 1.1 mycroft DC.L $3FFB0000,$B389E502,$F9C59862,$00000000
121 1.1 mycroft DC.L $3FFB0000,$BB797E43,$6B09E6FB,$00000000
122 1.1 mycroft DC.L $3FFB0000,$C367A5C7,$39E5F446,$00000000
123 1.1 mycroft DC.L $3FFB0000,$CB544C61,$CFF7D5C6,$00000000
124 1.1 mycroft DC.L $3FFB0000,$D33F62F8,$2488533E,$00000000
125 1.1 mycroft DC.L $3FFB0000,$DB28DA81,$62404C77,$00000000
126 1.1 mycroft DC.L $3FFB0000,$E310A407,$8AD34F18,$00000000
127 1.1 mycroft DC.L $3FFB0000,$EAF6B0A8,$188EE1EB,$00000000
128 1.1 mycroft DC.L $3FFB0000,$F2DAF194,$9DBE79D5,$00000000
129 1.1 mycroft DC.L $3FFB0000,$FABD5813,$61D47E3E,$00000000
130 1.1 mycroft DC.L $3FFC0000,$8346AC21,$0959ECC4,$00000000
131 1.1 mycroft DC.L $3FFC0000,$8B232A08,$304282D8,$00000000
132 1.1 mycroft DC.L $3FFC0000,$92FB70B8,$D29AE2F9,$00000000
133 1.1 mycroft DC.L $3FFC0000,$9ACF476F,$5CCD1CB4,$00000000
134 1.1 mycroft DC.L $3FFC0000,$A29E7630,$4954F23F,$00000000
135 1.1 mycroft DC.L $3FFC0000,$AA68C5D0,$8AB85230,$00000000
136 1.1 mycroft DC.L $3FFC0000,$B22DFFFD,$9D539F83,$00000000
137 1.1 mycroft DC.L $3FFC0000,$B9EDEF45,$3E900EA5,$00000000
138 1.1 mycroft DC.L $3FFC0000,$C1A85F1C,$C75E3EA5,$00000000
139 1.1 mycroft DC.L $3FFC0000,$C95D1BE8,$28138DE6,$00000000
140 1.1 mycroft DC.L $3FFC0000,$D10BF300,$840D2DE4,$00000000
141 1.1 mycroft DC.L $3FFC0000,$D8B4B2BA,$6BC05E7A,$00000000
142 1.1 mycroft DC.L $3FFC0000,$E0572A6B,$B42335F6,$00000000
143 1.1 mycroft DC.L $3FFC0000,$E7F32A70,$EA9CAA8F,$00000000
144 1.1 mycroft DC.L $3FFC0000,$EF888432,$64ECEFAA,$00000000
145 1.1 mycroft DC.L $3FFC0000,$F7170A28,$ECC06666,$00000000
146 1.1 mycroft DC.L $3FFD0000,$812FD288,$332DAD32,$00000000
147 1.1 mycroft DC.L $3FFD0000,$88A8D1B1,$218E4D64,$00000000
148 1.1 mycroft DC.L $3FFD0000,$9012AB3F,$23E4AEE8,$00000000
149 1.1 mycroft DC.L $3FFD0000,$976CC3D4,$11E7F1B9,$00000000
150 1.1 mycroft DC.L $3FFD0000,$9EB68949,$3889A227,$00000000
151 1.1 mycroft DC.L $3FFD0000,$A5EF72C3,$4487361B,$00000000
152 1.1 mycroft DC.L $3FFD0000,$AD1700BA,$F07A7227,$00000000
153 1.1 mycroft DC.L $3FFD0000,$B42CBCFA,$FD37EFB7,$00000000
154 1.1 mycroft DC.L $3FFD0000,$BB303A94,$0BA80F89,$00000000
155 1.1 mycroft DC.L $3FFD0000,$C22115C6,$FCAEBBAF,$00000000
156 1.1 mycroft DC.L $3FFD0000,$C8FEF3E6,$86331221,$00000000
157 1.1 mycroft DC.L $3FFD0000,$CFC98330,$B4000C70,$00000000
158 1.1 mycroft DC.L $3FFD0000,$D6807AA1,$102C5BF9,$00000000
159 1.1 mycroft DC.L $3FFD0000,$DD2399BC,$31252AA3,$00000000
160 1.1 mycroft DC.L $3FFD0000,$E3B2A855,$6B8FC517,$00000000
161 1.1 mycroft DC.L $3FFD0000,$EA2D764F,$64315989,$00000000
162 1.1 mycroft DC.L $3FFD0000,$F3BF5BF8,$BAD1A21D,$00000000
163 1.1 mycroft DC.L $3FFE0000,$801CE39E,$0D205C9A,$00000000
164 1.1 mycroft DC.L $3FFE0000,$8630A2DA,$DA1ED066,$00000000
165 1.1 mycroft DC.L $3FFE0000,$8C1AD445,$F3E09B8C,$00000000
166 1.1 mycroft DC.L $3FFE0000,$91DB8F16,$64F350E2,$00000000
167 1.1 mycroft DC.L $3FFE0000,$97731420,$365E538C,$00000000
168 1.1 mycroft DC.L $3FFE0000,$9CE1C8E6,$A0B8CDBA,$00000000
169 1.1 mycroft DC.L $3FFE0000,$A22832DB,$CADAAE09,$00000000
170 1.1 mycroft DC.L $3FFE0000,$A746F2DD,$B7602294,$00000000
171 1.1 mycroft DC.L $3FFE0000,$AC3EC0FB,$997DD6A2,$00000000
172 1.1 mycroft DC.L $3FFE0000,$B110688A,$EBDC6F6A,$00000000
173 1.1 mycroft DC.L $3FFE0000,$B5BCC490,$59ECC4B0,$00000000
174 1.1 mycroft DC.L $3FFE0000,$BA44BC7D,$D470782F,$00000000
175 1.1 mycroft DC.L $3FFE0000,$BEA94144,$FD049AAC,$00000000
176 1.1 mycroft DC.L $3FFE0000,$C2EB4ABB,$661628B6,$00000000
177 1.1 mycroft DC.L $3FFE0000,$C70BD54C,$E602EE14,$00000000
178 1.1 mycroft DC.L $3FFE0000,$CD000549,$ADEC7159,$00000000
179 1.1 mycroft DC.L $3FFE0000,$D48457D2,$D8EA4EA3,$00000000
180 1.1 mycroft DC.L $3FFE0000,$DB948DA7,$12DECE3B,$00000000
181 1.1 mycroft DC.L $3FFE0000,$E23855F9,$69E8096A,$00000000
182 1.1 mycroft DC.L $3FFE0000,$E8771129,$C4353259,$00000000
183 1.1 mycroft DC.L $3FFE0000,$EE57C16E,$0D379C0D,$00000000
184 1.1 mycroft DC.L $3FFE0000,$F3E10211,$A87C3779,$00000000
185 1.1 mycroft DC.L $3FFE0000,$F919039D,$758B8D41,$00000000
186 1.1 mycroft DC.L $3FFE0000,$FE058B8F,$64935FB3,$00000000
187 1.1 mycroft DC.L $3FFF0000,$8155FB49,$7B685D04,$00000000
188 1.1 mycroft DC.L $3FFF0000,$83889E35,$49D108E1,$00000000
189 1.1 mycroft DC.L $3FFF0000,$859CFA76,$511D724B,$00000000
190 1.1 mycroft DC.L $3FFF0000,$87952ECF,$FF8131E7,$00000000
191 1.1 mycroft DC.L $3FFF0000,$89732FD1,$9557641B,$00000000
192 1.1 mycroft DC.L $3FFF0000,$8B38CAD1,$01932A35,$00000000
193 1.1 mycroft DC.L $3FFF0000,$8CE7A8D8,$301EE6B5,$00000000
194 1.1 mycroft DC.L $3FFF0000,$8F46A39E,$2EAE5281,$00000000
195 1.1 mycroft DC.L $3FFF0000,$922DA7D7,$91888487,$00000000
196 1.1 mycroft DC.L $3FFF0000,$94D19FCB,$DEDF5241,$00000000
197 1.1 mycroft DC.L $3FFF0000,$973AB944,$19D2A08B,$00000000
198 1.1 mycroft DC.L $3FFF0000,$996FF00E,$08E10B96,$00000000
199 1.1 mycroft DC.L $3FFF0000,$9B773F95,$12321DA7,$00000000
200 1.1 mycroft DC.L $3FFF0000,$9D55CC32,$0F935624,$00000000
201 1.1 mycroft DC.L $3FFF0000,$9F100575,$006CC571,$00000000
202 1.1 mycroft DC.L $3FFF0000,$A0A9C290,$D97CC06C,$00000000
203 1.1 mycroft DC.L $3FFF0000,$A22659EB,$EBC0630A,$00000000
204 1.1 mycroft DC.L $3FFF0000,$A388B4AF,$F6EF0EC9,$00000000
205 1.1 mycroft DC.L $3FFF0000,$A4D35F10,$61D292C4,$00000000
206 1.1 mycroft DC.L $3FFF0000,$A60895DC,$FBE3187E,$00000000
207 1.1 mycroft DC.L $3FFF0000,$A72A51DC,$7367BEAC,$00000000
208 1.1 mycroft DC.L $3FFF0000,$A83A5153,$0956168F,$00000000
209 1.1 mycroft DC.L $3FFF0000,$A93A2007,$7539546E,$00000000
210 1.1 mycroft DC.L $3FFF0000,$AA9E7245,$023B2605,$00000000
211 1.1 mycroft DC.L $3FFF0000,$AC4C84BA,$6FE4D58F,$00000000
212 1.1 mycroft DC.L $3FFF0000,$ADCE4A4A,$606B9712,$00000000
213 1.1 mycroft DC.L $3FFF0000,$AF2A2DCD,$8D263C9C,$00000000
214 1.1 mycroft DC.L $3FFF0000,$B0656F81,$F22265C7,$00000000
215 1.1 mycroft DC.L $3FFF0000,$B1846515,$0F71496A,$00000000
216 1.1 mycroft DC.L $3FFF0000,$B28AAA15,$6F9ADA35,$00000000
217 1.1 mycroft DC.L $3FFF0000,$B37B44FF,$3766B895,$00000000
218 1.1 mycroft DC.L $3FFF0000,$B458C3DC,$E9630433,$00000000
219 1.1 mycroft DC.L $3FFF0000,$B525529D,$562246BD,$00000000
220 1.1 mycroft DC.L $3FFF0000,$B5E2CCA9,$5F9D88CC,$00000000
221 1.1 mycroft DC.L $3FFF0000,$B692CADA,$7ACA1ADA,$00000000
222 1.1 mycroft DC.L $3FFF0000,$B736AEA7,$A6925838,$00000000
223 1.1 mycroft DC.L $3FFF0000,$B7CFAB28,$7E9F7B36,$00000000
224 1.1 mycroft DC.L $3FFF0000,$B85ECC66,$CB219835,$00000000
225 1.1 mycroft DC.L $3FFF0000,$B8E4FD5A,$20A593DA,$00000000
226 1.1 mycroft DC.L $3FFF0000,$B99F41F6,$4AFF9BB5,$00000000
227 1.1 mycroft DC.L $3FFF0000,$BA7F1E17,$842BBE7B,$00000000
228 1.1 mycroft DC.L $3FFF0000,$BB471285,$7637E17D,$00000000
229 1.1 mycroft DC.L $3FFF0000,$BBFABE8A,$4788DF6F,$00000000
230 1.1 mycroft DC.L $3FFF0000,$BC9D0FAD,$2B689D79,$00000000
231 1.1 mycroft DC.L $3FFF0000,$BD306A39,$471ECD86,$00000000
232 1.1 mycroft DC.L $3FFF0000,$BDB6C731,$856AF18A,$00000000
233 1.1 mycroft DC.L $3FFF0000,$BE31CAC5,$02E80D70,$00000000
234 1.1 mycroft DC.L $3FFF0000,$BEA2D55C,$E33194E2,$00000000
235 1.1 mycroft DC.L $3FFF0000,$BF0B10B7,$C03128F0,$00000000
236 1.1 mycroft DC.L $3FFF0000,$BF6B7A18,$DACB778D,$00000000
237 1.1 mycroft DC.L $3FFF0000,$BFC4EA46,$63FA18F6,$00000000
238 1.1 mycroft DC.L $3FFF0000,$C0181BDE,$8B89A454,$00000000
239 1.1 mycroft DC.L $3FFF0000,$C065B066,$CFBF6439,$00000000
240 1.1 mycroft DC.L $3FFF0000,$C0AE345F,$56340AE6,$00000000
241 1.1 mycroft DC.L $3FFF0000,$C0F22291,$9CB9E6A7,$00000000
242 1.1 mycroft
243 1.1 mycroft X equ FP_SCR1
244 1.1 mycroft XDCARE equ X+2
245 1.1 mycroft XFRAC equ X+4
246 1.1 mycroft XFRACLO equ X+8
247 1.1 mycroft
248 1.1 mycroft ATANF equ FP_SCR2
249 1.1 mycroft ATANFHI equ ATANF+4
250 1.1 mycroft ATANFLO equ ATANF+8
251 1.1 mycroft
252 1.1 mycroft
253 1.1 mycroft xref t_frcinx
254 1.1 mycroft xref t_extdnrm
255 1.1 mycroft
256 1.1 mycroft xdef satand
257 1.1 mycroft satand:
258 1.1 mycroft *--ENTRY POINT FOR ATAN(X) FOR DENORMALIZED ARGUMENT
259 1.1 mycroft
260 1.1 mycroft bra t_extdnrm
261 1.1 mycroft
262 1.1 mycroft xdef satan
263 1.1 mycroft satan:
264 1.1 mycroft *--ENTRY POINT FOR ATAN(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
265 1.1 mycroft
266 1.1 mycroft FMOVE.X (A0),FP0 ...LOAD INPUT
267 1.1 mycroft
268 1.1 mycroft MOVE.L (A0),D0
269 1.1 mycroft MOVE.W 4(A0),D0
270 1.1 mycroft FMOVE.X FP0,X(a6)
271 1.1 mycroft ANDI.L #$7FFFFFFF,D0
272 1.1 mycroft
273 1.1 mycroft CMPI.L #$3FFB8000,D0 ...|X| >= 1/16?
274 1.1 mycroft BGE.B ATANOK1
275 1.1 mycroft BRA.W ATANSM
276 1.1 mycroft
277 1.1 mycroft ATANOK1:
278 1.1 mycroft CMPI.L #$4002FFFF,D0 ...|X| < 16 ?
279 1.1 mycroft BLE.B ATANMAIN
280 1.1 mycroft BRA.W ATANBIG
281 1.1 mycroft
282 1.1 mycroft
283 1.1 mycroft *--THE MOST LIKELY CASE, |X| IN [1/16, 16). WE USE TABLE TECHNIQUE
284 1.1 mycroft *--THE IDEA IS ATAN(X) = ATAN(F) + ATAN( [X-F] / [1+XF] ).
285 1.1 mycroft *--SO IF F IS CHOSEN TO BE CLOSE TO X AND ATAN(F) IS STORED IN
286 1.1 mycroft *--A TABLE, ALL WE NEED IS TO APPROXIMATE ATAN(U) WHERE
287 1.1 mycroft *--U = (X-F)/(1+XF) IS SMALL (REMEMBER F IS CLOSE TO X). IT IS
288 1.1 mycroft *--TRUE THAT A DIVIDE IS NOW NEEDED, BUT THE APPROXIMATION FOR
289 1.1 mycroft *--ATAN(U) IS A VERY SHORT POLYNOMIAL AND THE INDEXING TO
290 1.1 mycroft *--FETCH F AND SAVING OF REGISTERS CAN BE ALL HIDED UNDER THE
291 1.1 mycroft *--DIVIDE. IN THE END THIS METHOD IS MUCH FASTER THAN A TRADITIONAL
292 1.1 mycroft *--ONE. NOTE ALSO THAT THE TRADITIONAL SCHEME THAT APPROXIMATE
293 1.1 mycroft *--ATAN(X) DIRECTLY WILL NEED TO USE A RATIONAL APPROXIMATION
294 1.1 mycroft *--(DIVISION NEEDED) ANYWAY BECAUSE A POLYNOMIAL APPROXIMATION
295 1.1 mycroft *--WILL INVOLVE A VERY LONG POLYNOMIAL.
296 1.1 mycroft
297 1.1 mycroft *--NOW WE SEE X AS +-2^K * 1.BBBBBBB....B <- 1. + 63 BITS
298 1.1 mycroft *--WE CHOSE F TO BE +-2^K * 1.BBBB1
299 1.1 mycroft *--THAT IS IT MATCHES THE EXPONENT AND FIRST 5 BITS OF X, THE
300 1.1 mycroft *--SIXTH BITS IS SET TO BE 1. SINCE K = -4, -3, ..., 3, THERE
301 1.1 mycroft *--ARE ONLY 8 TIMES 16 = 2^7 = 128 |F|'S. SINCE ATAN(-|F|) IS
302 1.1 mycroft *-- -ATAN(|F|), WE NEED TO STORE ONLY ATAN(|F|).
303 1.1 mycroft
304 1.1 mycroft ATANMAIN:
305 1.1 mycroft
306 1.2 mycroft CLR.W XDCARE(a6) ...CLEAN UP X JUST IN CASE
307 1.1 mycroft ANDI.L #$F8000000,XFRAC(a6) ...FIRST 5 BITS
308 1.1 mycroft ORI.L #$04000000,XFRAC(a6) ...SET 6-TH BIT TO 1
309 1.2 mycroft CLR.L XFRACLO(a6) ...LOCATION OF X IS NOW F
310 1.1 mycroft
311 1.1 mycroft FMOVE.X FP0,FP1 ...FP1 IS X
312 1.1 mycroft FMUL.X X(a6),FP1 ...FP1 IS X*F, NOTE THAT X*F > 0
313 1.1 mycroft FSUB.X X(a6),FP0 ...FP0 IS X-F
314 1.1 mycroft FADD.S #:3F800000,FP1 ...FP1 IS 1 + X*F
315 1.1 mycroft FDIV.X FP1,FP0 ...FP0 IS U = (X-F)/(1+X*F)
316 1.1 mycroft
317 1.1 mycroft *--WHILE THE DIVISION IS TAKING ITS TIME, WE FETCH ATAN(|F|)
318 1.1 mycroft *--CREATE ATAN(F) AND STORE IT IN ATANF, AND
319 1.1 mycroft *--SAVE REGISTERS FP2.
320 1.1 mycroft
321 1.1 mycroft MOVE.L d2,-(a7) ...SAVE d2 TEMPORARILY
322 1.1 mycroft MOVE.L d0,d2 ...THE EXPO AND 16 BITS OF X
323 1.1 mycroft ANDI.L #$00007800,d0 ...4 VARYING BITS OF F'S FRACTION
324 1.1 mycroft ANDI.L #$7FFF0000,d2 ...EXPONENT OF F
325 1.1 mycroft SUBI.L #$3FFB0000,d2 ...K+4
326 1.1 mycroft ASR.L #1,d2
327 1.1 mycroft ADD.L d2,d0 ...THE 7 BITS IDENTIFYING F
328 1.1 mycroft ASR.L #7,d0 ...INDEX INTO TBL OF ATAN(|F|)
329 1.1 mycroft LEA ATANTBL,a1
330 1.1 mycroft ADDA.L d0,a1 ...ADDRESS OF ATAN(|F|)
331 1.1 mycroft MOVE.L (a1)+,ATANF(a6)
332 1.1 mycroft MOVE.L (a1)+,ATANFHI(a6)
333 1.1 mycroft MOVE.L (a1)+,ATANFLO(a6) ...ATANF IS NOW ATAN(|F|)
334 1.1 mycroft MOVE.L X(a6),d0 ...LOAD SIGN AND EXPO. AGAIN
335 1.1 mycroft ANDI.L #$80000000,d0 ...SIGN(F)
336 1.1 mycroft OR.L d0,ATANF(a6) ...ATANF IS NOW SIGN(F)*ATAN(|F|)
337 1.1 mycroft MOVE.L (a7)+,d2 ...RESTORE d2
338 1.1 mycroft
339 1.1 mycroft *--THAT'S ALL I HAVE TO DO FOR NOW,
340 1.1 mycroft *--BUT ALAS, THE DIVIDE IS STILL CRANKING!
341 1.1 mycroft
342 1.1 mycroft *--U IN FP0, WE ARE NOW READY TO COMPUTE ATAN(U) AS
343 1.1 mycroft *--U + A1*U*V*(A2 + V*(A3 + V)), V = U*U
344 1.1 mycroft *--THE POLYNOMIAL MAY LOOK STRANGE, BUT IS NEVERTHELESS CORRECT.
345 1.1 mycroft *--THE NATURAL FORM IS U + U*V*(A1 + V*(A2 + V*A3))
346 1.1 mycroft *--WHAT WE HAVE HERE IS MERELY A1 = A3, A2 = A1/A3, A3 = A2/A3.
347 1.1 mycroft *--THE REASON FOR THIS REARRANGEMENT IS TO MAKE THE INDEPENDENT
348 1.1 mycroft *--PARTS A1*U*V AND (A2 + ... STUFF) MORE LOAD-BALANCED
349 1.1 mycroft
350 1.1 mycroft
351 1.1 mycroft FMOVE.X FP0,FP1
352 1.1 mycroft FMUL.X FP1,FP1
353 1.1 mycroft FMOVE.D ATANA3,FP2
354 1.1 mycroft FADD.X FP1,FP2 ...A3+V
355 1.1 mycroft FMUL.X FP1,FP2 ...V*(A3+V)
356 1.1 mycroft FMUL.X FP0,FP1 ...U*V
357 1.1 mycroft FADD.D ATANA2,FP2 ...A2+V*(A3+V)
358 1.1 mycroft FMUL.D ATANA1,FP1 ...A1*U*V
359 1.1 mycroft FMUL.X FP2,FP1 ...A1*U*V*(A2+V*(A3+V))
360 1.1 mycroft
361 1.1 mycroft FADD.X FP1,FP0 ...ATAN(U), FP1 RELEASED
362 1.1 mycroft FMOVE.L d1,FPCR ;restore users exceptions
363 1.1 mycroft FADD.X ATANF(a6),FP0 ...ATAN(X)
364 1.1 mycroft bra t_frcinx
365 1.1 mycroft
366 1.1 mycroft ATANBORS:
367 1.1 mycroft *--|X| IS IN d0 IN COMPACT FORM. FP1, d0 SAVED.
368 1.1 mycroft *--FP0 IS X AND |X| <= 1/16 OR |X| >= 16.
369 1.1 mycroft CMPI.L #$3FFF8000,d0
370 1.1 mycroft BGT.W ATANBIG ...I.E. |X| >= 16
371 1.1 mycroft
372 1.1 mycroft ATANSM:
373 1.1 mycroft *--|X| <= 1/16
374 1.1 mycroft *--IF |X| < 2^(-40), RETURN X AS ANSWER. OTHERWISE, APPROXIMATE
375 1.1 mycroft *--ATAN(X) BY X + X*Y*(B1+Y*(B2+Y*(B3+Y*(B4+Y*(B5+Y*B6)))))
376 1.1 mycroft *--WHICH IS X + X*Y*( [B1+Z*(B3+Z*B5)] + [Y*(B2+Z*(B4+Z*B6)] )
377 1.1 mycroft *--WHERE Y = X*X, AND Z = Y*Y.
378 1.1 mycroft
379 1.1 mycroft CMPI.L #$3FD78000,d0
380 1.1 mycroft BLT.W ATANTINY
381 1.1 mycroft *--COMPUTE POLYNOMIAL
382 1.1 mycroft FMUL.X FP0,FP0 ...FP0 IS Y = X*X
383 1.1 mycroft
384 1.1 mycroft
385 1.2 mycroft CLR.W XDCARE(a6)
386 1.1 mycroft
387 1.1 mycroft FMOVE.X FP0,FP1
388 1.1 mycroft FMUL.X FP1,FP1 ...FP1 IS Z = Y*Y
389 1.1 mycroft
390 1.1 mycroft FMOVE.D ATANB6,FP2
391 1.1 mycroft FMOVE.D ATANB5,FP3
392 1.1 mycroft
393 1.1 mycroft FMUL.X FP1,FP2 ...Z*B6
394 1.1 mycroft FMUL.X FP1,FP3 ...Z*B5
395 1.1 mycroft
396 1.1 mycroft FADD.D ATANB4,FP2 ...B4+Z*B6
397 1.1 mycroft FADD.D ATANB3,FP3 ...B3+Z*B5
398 1.1 mycroft
399 1.1 mycroft FMUL.X FP1,FP2 ...Z*(B4+Z*B6)
400 1.1 mycroft FMUL.X FP3,FP1 ...Z*(B3+Z*B5)
401 1.1 mycroft
402 1.1 mycroft FADD.D ATANB2,FP2 ...B2+Z*(B4+Z*B6)
403 1.1 mycroft FADD.D ATANB1,FP1 ...B1+Z*(B3+Z*B5)
404 1.1 mycroft
405 1.1 mycroft FMUL.X FP0,FP2 ...Y*(B2+Z*(B4+Z*B6))
406 1.1 mycroft FMUL.X X(a6),FP0 ...X*Y
407 1.1 mycroft
408 1.1 mycroft FADD.X FP2,FP1 ...[B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))]
409 1.1 mycroft
410 1.1 mycroft
411 1.1 mycroft FMUL.X FP1,FP0 ...X*Y*([B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))])
412 1.1 mycroft
413 1.1 mycroft FMOVE.L d1,FPCR ;restore users exceptions
414 1.1 mycroft FADD.X X(a6),FP0
415 1.1 mycroft
416 1.1 mycroft bra t_frcinx
417 1.1 mycroft
418 1.1 mycroft ATANTINY:
419 1.1 mycroft *--|X| < 2^(-40), ATAN(X) = X
420 1.2 mycroft CLR.W XDCARE(a6)
421 1.1 mycroft
422 1.1 mycroft FMOVE.L d1,FPCR ;restore users exceptions
423 1.1 mycroft FMOVE.X X(a6),FP0 ;last inst - possible exception set
424 1.1 mycroft
425 1.1 mycroft bra t_frcinx
426 1.1 mycroft
427 1.1 mycroft ATANBIG:
428 1.1 mycroft *--IF |X| > 2^(100), RETURN SIGN(X)*(PI/2 - TINY). OTHERWISE,
429 1.1 mycroft *--RETURN SIGN(X)*PI/2 + ATAN(-1/X).
430 1.1 mycroft CMPI.L #$40638000,d0
431 1.1 mycroft BGT.W ATANHUGE
432 1.1 mycroft
433 1.1 mycroft *--APPROXIMATE ATAN(-1/X) BY
434 1.1 mycroft *--X'+X'*Y*(C1+Y*(C2+Y*(C3+Y*(C4+Y*C5)))), X' = -1/X, Y = X'*X'
435 1.1 mycroft *--THIS CAN BE RE-WRITTEN AS
436 1.1 mycroft *--X'+X'*Y*( [C1+Z*(C3+Z*C5)] + [Y*(C2+Z*C4)] ), Z = Y*Y.
437 1.1 mycroft
438 1.1 mycroft FMOVE.S #:BF800000,FP1 ...LOAD -1
439 1.1 mycroft FDIV.X FP0,FP1 ...FP1 IS -1/X
440 1.1 mycroft
441 1.1 mycroft
442 1.1 mycroft *--DIVIDE IS STILL CRANKING
443 1.1 mycroft
444 1.1 mycroft FMOVE.X FP1,FP0 ...FP0 IS X'
445 1.1 mycroft FMUL.X FP0,FP0 ...FP0 IS Y = X'*X'
446 1.1 mycroft FMOVE.X FP1,X(a6) ...X IS REALLY X'
447 1.1 mycroft
448 1.1 mycroft FMOVE.X FP0,FP1
449 1.1 mycroft FMUL.X FP1,FP1 ...FP1 IS Z = Y*Y
450 1.1 mycroft
451 1.1 mycroft FMOVE.D ATANC5,FP3
452 1.1 mycroft FMOVE.D ATANC4,FP2
453 1.1 mycroft
454 1.1 mycroft FMUL.X FP1,FP3 ...Z*C5
455 1.1 mycroft FMUL.X FP1,FP2 ...Z*B4
456 1.1 mycroft
457 1.1 mycroft FADD.D ATANC3,FP3 ...C3+Z*C5
458 1.1 mycroft FADD.D ATANC2,FP2 ...C2+Z*C4
459 1.1 mycroft
460 1.1 mycroft FMUL.X FP3,FP1 ...Z*(C3+Z*C5), FP3 RELEASED
461 1.1 mycroft FMUL.X FP0,FP2 ...Y*(C2+Z*C4)
462 1.1 mycroft
463 1.1 mycroft FADD.D ATANC1,FP1 ...C1+Z*(C3+Z*C5)
464 1.1 mycroft FMUL.X X(a6),FP0 ...X'*Y
465 1.1 mycroft
466 1.1 mycroft FADD.X FP2,FP1 ...[Y*(C2+Z*C4)]+[C1+Z*(C3+Z*C5)]
467 1.1 mycroft
468 1.1 mycroft
469 1.1 mycroft FMUL.X FP1,FP0 ...X'*Y*([B1+Z*(B3+Z*B5)]
470 1.1 mycroft * ... +[Y*(B2+Z*(B4+Z*B6))])
471 1.1 mycroft FADD.X X(a6),FP0
472 1.1 mycroft
473 1.1 mycroft FMOVE.L d1,FPCR ;restore users exceptions
474 1.1 mycroft
475 1.1 mycroft btst.b #7,(a0)
476 1.1 mycroft beq.b pos_big
477 1.1 mycroft
478 1.1 mycroft neg_big:
479 1.1 mycroft FADD.X NPIBY2,FP0
480 1.1 mycroft bra t_frcinx
481 1.1 mycroft
482 1.1 mycroft pos_big:
483 1.1 mycroft FADD.X PPIBY2,FP0
484 1.1 mycroft bra t_frcinx
485 1.1 mycroft
486 1.1 mycroft ATANHUGE:
487 1.1 mycroft *--RETURN SIGN(X)*(PIBY2 - TINY) = SIGN(X)*PIBY2 - SIGN(X)*TINY
488 1.1 mycroft btst.b #7,(a0)
489 1.1 mycroft beq.b pos_huge
490 1.1 mycroft
491 1.1 mycroft neg_huge:
492 1.1 mycroft FMOVE.X NPIBY2,fp0
493 1.1 mycroft fmove.l d1,fpcr
494 1.1 mycroft fsub.x NTINY,fp0
495 1.1 mycroft bra t_frcinx
496 1.1 mycroft
497 1.1 mycroft pos_huge:
498 1.1 mycroft FMOVE.X PPIBY2,fp0
499 1.1 mycroft fmove.l d1,fpcr
500 1.1 mycroft fsub.x PTINY,fp0
501 1.1 mycroft bra t_frcinx
502 1.1 mycroft
503 1.1 mycroft end
504