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