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