1 1.3 cgd * $NetBSD: stwotox.sa,v 1.3 1994/10/26 07:50:15 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 * stwotox.sa 3.1 12/10/90 35 1.1 mycroft * 36 1.1 mycroft * stwotox --- 2**X 37 1.1 mycroft * stwotoxd --- 2**X for denormalized X 38 1.1 mycroft * stentox --- 10**X 39 1.1 mycroft * stentoxd --- 10**X for denormalized X 40 1.1 mycroft * 41 1.1 mycroft * Input: Double-extended number X in location pointed to 42 1.1 mycroft * by address register a0. 43 1.1 mycroft * 44 1.1 mycroft * Output: The function values are returned in Fp0. 45 1.1 mycroft * 46 1.1 mycroft * Accuracy and Monotonicity: The returned result is within 2 ulps in 47 1.1 mycroft * 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the 48 1.1 mycroft * result is subsequently rounded to double precision. The 49 1.1 mycroft * result is provably monotonic in double precision. 50 1.1 mycroft * 51 1.1 mycroft * Speed: The program stwotox takes approximately 190 cycles and the 52 1.1 mycroft * program stentox takes approximately 200 cycles. 53 1.1 mycroft * 54 1.1 mycroft * Algorithm: 55 1.1 mycroft * 56 1.1 mycroft * twotox 57 1.1 mycroft * 1. If |X| > 16480, go to ExpBig. 58 1.1 mycroft * 59 1.1 mycroft * 2. If |X| < 2**(-70), go to ExpSm. 60 1.1 mycroft * 61 1.1 mycroft * 3. Decompose X as X = N/64 + r where |r| <= 1/128. Furthermore 62 1.1 mycroft * decompose N as 63 1.1 mycroft * N = 64(M + M') + j, j = 0,1,2,...,63. 64 1.1 mycroft * 65 1.1 mycroft * 4. Overwrite r := r * log2. Then 66 1.1 mycroft * 2**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r). 67 1.1 mycroft * Go to expr to compute that expression. 68 1.1 mycroft * 69 1.1 mycroft * tentox 70 1.1 mycroft * 1. If |X| > 16480*log_10(2) (base 10 log of 2), go to ExpBig. 71 1.1 mycroft * 72 1.1 mycroft * 2. If |X| < 2**(-70), go to ExpSm. 73 1.1 mycroft * 74 1.1 mycroft * 3. Set y := X*log_2(10)*64 (base 2 log of 10). Set 75 1.1 mycroft * N := round-to-int(y). Decompose N as 76 1.1 mycroft * N = 64(M + M') + j, j = 0,1,2,...,63. 77 1.1 mycroft * 78 1.1 mycroft * 4. Define r as 79 1.1 mycroft * r := ((X - N*L1)-N*L2) * L10 80 1.1 mycroft * where L1, L2 are the leading and trailing parts of log_10(2)/64 81 1.1 mycroft * and L10 is the natural log of 10. Then 82 1.1 mycroft * 10**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r). 83 1.1 mycroft * Go to expr to compute that expression. 84 1.1 mycroft * 85 1.1 mycroft * expr 86 1.1 mycroft * 1. Fetch 2**(j/64) from table as Fact1 and Fact2. 87 1.1 mycroft * 88 1.1 mycroft * 2. Overwrite Fact1 and Fact2 by 89 1.1 mycroft * Fact1 := 2**(M) * Fact1 90 1.1 mycroft * Fact2 := 2**(M) * Fact2 91 1.1 mycroft * Thus Fact1 + Fact2 = 2**(M) * 2**(j/64). 92 1.1 mycroft * 93 1.1 mycroft * 3. Calculate P where 1 + P approximates exp(r): 94 1.1 mycroft * P = r + r*r*(A1+r*(A2+...+r*A5)). 95 1.1 mycroft * 96 1.1 mycroft * 4. Let AdjFact := 2**(M'). Return 97 1.1 mycroft * AdjFact * ( Fact1 + ((Fact1*P) + Fact2) ). 98 1.1 mycroft * Exit. 99 1.1 mycroft * 100 1.1 mycroft * ExpBig 101 1.1 mycroft * 1. Generate overflow by Huge * Huge if X > 0; otherwise, generate 102 1.1 mycroft * underflow by Tiny * Tiny. 103 1.1 mycroft * 104 1.1 mycroft * ExpSm 105 1.1 mycroft * 1. Return 1 + X. 106 1.1 mycroft * 107 1.1 mycroft 108 1.1 mycroft STWOTOX IDNT 2,1 Motorola 040 Floating Point Software Package 109 1.1 mycroft 110 1.1 mycroft section 8 111 1.1 mycroft 112 1.1 mycroft include fpsp.h 113 1.1 mycroft 114 1.1 mycroft BOUNDS1 DC.L $3FB98000,$400D80C0 ... 2^(-70),16480 115 1.1 mycroft BOUNDS2 DC.L $3FB98000,$400B9B07 ... 2^(-70),16480 LOG2/LOG10 116 1.1 mycroft 117 1.1 mycroft L2TEN64 DC.L $406A934F,$0979A371 ... 64LOG10/LOG2 118 1.1 mycroft L10TWO1 DC.L $3F734413,$509F8000 ... LOG2/64LOG10 119 1.1 mycroft 120 1.1 mycroft L10TWO2 DC.L $BFCD0000,$C0219DC1,$DA994FD2,$00000000 121 1.1 mycroft 122 1.1 mycroft LOG10 DC.L $40000000,$935D8DDD,$AAA8AC17,$00000000 123 1.1 mycroft 124 1.1 mycroft LOG2 DC.L $3FFE0000,$B17217F7,$D1CF79AC,$00000000 125 1.1 mycroft 126 1.1 mycroft EXPA5 DC.L $3F56C16D,$6F7BD0B2 127 1.1 mycroft EXPA4 DC.L $3F811112,$302C712C 128 1.1 mycroft EXPA3 DC.L $3FA55555,$55554CC1 129 1.1 mycroft EXPA2 DC.L $3FC55555,$55554A54 130 1.1 mycroft EXPA1 DC.L $3FE00000,$00000000,$00000000,$00000000 131 1.1 mycroft 132 1.1 mycroft HUGE DC.L $7FFE0000,$FFFFFFFF,$FFFFFFFF,$00000000 133 1.1 mycroft TINY DC.L $00010000,$FFFFFFFF,$FFFFFFFF,$00000000 134 1.1 mycroft 135 1.1 mycroft EXPTBL 136 1.1 mycroft DC.L $3FFF0000,$80000000,$00000000,$3F738000 137 1.1 mycroft DC.L $3FFF0000,$8164D1F3,$BC030773,$3FBEF7CA 138 1.1 mycroft DC.L $3FFF0000,$82CD8698,$AC2BA1D7,$3FBDF8A9 139 1.1 mycroft DC.L $3FFF0000,$843A28C3,$ACDE4046,$3FBCD7C9 140 1.1 mycroft DC.L $3FFF0000,$85AAC367,$CC487B15,$BFBDE8DA 141 1.1 mycroft DC.L $3FFF0000,$871F6196,$9E8D1010,$3FBDE85C 142 1.1 mycroft DC.L $3FFF0000,$88980E80,$92DA8527,$3FBEBBF1 143 1.1 mycroft DC.L $3FFF0000,$8A14D575,$496EFD9A,$3FBB80CA 144 1.1 mycroft DC.L $3FFF0000,$8B95C1E3,$EA8BD6E7,$BFBA8373 145 1.1 mycroft DC.L $3FFF0000,$8D1ADF5B,$7E5BA9E6,$BFBE9670 146 1.1 mycroft DC.L $3FFF0000,$8EA4398B,$45CD53C0,$3FBDB700 147 1.1 mycroft DC.L $3FFF0000,$9031DC43,$1466B1DC,$3FBEEEB0 148 1.1 mycroft DC.L $3FFF0000,$91C3D373,$AB11C336,$3FBBFD6D 149 1.1 mycroft DC.L $3FFF0000,$935A2B2F,$13E6E92C,$BFBDB319 150 1.1 mycroft DC.L $3FFF0000,$94F4EFA8,$FEF70961,$3FBDBA2B 151 1.1 mycroft DC.L $3FFF0000,$96942D37,$20185A00,$3FBE91D5 152 1.1 mycroft DC.L $3FFF0000,$9837F051,$8DB8A96F,$3FBE8D5A 153 1.1 mycroft DC.L $3FFF0000,$99E04593,$20B7FA65,$BFBCDE7B 154 1.1 mycroft DC.L $3FFF0000,$9B8D39B9,$D54E5539,$BFBEBAAF 155 1.1 mycroft DC.L $3FFF0000,$9D3ED9A7,$2CFFB751,$BFBD86DA 156 1.1 mycroft DC.L $3FFF0000,$9EF53260,$91A111AE,$BFBEBEDD 157 1.1 mycroft DC.L $3FFF0000,$A0B0510F,$B9714FC2,$3FBCC96E 158 1.1 mycroft DC.L $3FFF0000,$A2704303,$0C496819,$BFBEC90B 159 1.1 mycroft DC.L $3FFF0000,$A43515AE,$09E6809E,$3FBBD1DB 160 1.1 mycroft DC.L $3FFF0000,$A5FED6A9,$B15138EA,$3FBCE5EB 161 1.1 mycroft DC.L $3FFF0000,$A7CD93B4,$E965356A,$BFBEC274 162 1.1 mycroft DC.L $3FFF0000,$A9A15AB4,$EA7C0EF8,$3FBEA83C 163 1.1 mycroft DC.L $3FFF0000,$AB7A39B5,$A93ED337,$3FBECB00 164 1.1 mycroft DC.L $3FFF0000,$AD583EEA,$42A14AC6,$3FBE9301 165 1.1 mycroft DC.L $3FFF0000,$AF3B78AD,$690A4375,$BFBD8367 166 1.1 mycroft DC.L $3FFF0000,$B123F581,$D2AC2590,$BFBEF05F 167 1.1 mycroft DC.L $3FFF0000,$B311C412,$A9112489,$3FBDFB3C 168 1.1 mycroft DC.L $3FFF0000,$B504F333,$F9DE6484,$3FBEB2FB 169 1.1 mycroft DC.L $3FFF0000,$B6FD91E3,$28D17791,$3FBAE2CB 170 1.1 mycroft DC.L $3FFF0000,$B8FBAF47,$62FB9EE9,$3FBCDC3C 171 1.1 mycroft DC.L $3FFF0000,$BAFF5AB2,$133E45FB,$3FBEE9AA 172 1.1 mycroft DC.L $3FFF0000,$BD08A39F,$580C36BF,$BFBEAEFD 173 1.1 mycroft DC.L $3FFF0000,$BF1799B6,$7A731083,$BFBCBF51 174 1.1 mycroft DC.L $3FFF0000,$C12C4CCA,$66709456,$3FBEF88A 175 1.1 mycroft DC.L $3FFF0000,$C346CCDA,$24976407,$3FBD83B2 176 1.1 mycroft DC.L $3FFF0000,$C5672A11,$5506DADD,$3FBDF8AB 177 1.1 mycroft DC.L $3FFF0000,$C78D74C8,$ABB9B15D,$BFBDFB17 178 1.1 mycroft DC.L $3FFF0000,$C9B9BD86,$6E2F27A3,$BFBEFE3C 179 1.1 mycroft DC.L $3FFF0000,$CBEC14FE,$F2727C5D,$BFBBB6F8 180 1.1 mycroft DC.L $3FFF0000,$CE248C15,$1F8480E4,$BFBCEE53 181 1.1 mycroft DC.L $3FFF0000,$D06333DA,$EF2B2595,$BFBDA4AE 182 1.1 mycroft DC.L $3FFF0000,$D2A81D91,$F12AE45A,$3FBC9124 183 1.1 mycroft DC.L $3FFF0000,$D4F35AAB,$CFEDFA1F,$3FBEB243 184 1.1 mycroft DC.L $3FFF0000,$D744FCCA,$D69D6AF4,$3FBDE69A 185 1.1 mycroft DC.L $3FFF0000,$D99D15C2,$78AFD7B6,$BFB8BC61 186 1.1 mycroft DC.L $3FFF0000,$DBFBB797,$DAF23755,$3FBDF610 187 1.1 mycroft DC.L $3FFF0000,$DE60F482,$5E0E9124,$BFBD8BE1 188 1.1 mycroft DC.L $3FFF0000,$E0CCDEEC,$2A94E111,$3FBACB12 189 1.1 mycroft DC.L $3FFF0000,$E33F8972,$BE8A5A51,$3FBB9BFE 190 1.1 mycroft DC.L $3FFF0000,$E5B906E7,$7C8348A8,$3FBCF2F4 191 1.1 mycroft DC.L $3FFF0000,$E8396A50,$3C4BDC68,$3FBEF22F 192 1.1 mycroft DC.L $3FFF0000,$EAC0C6E7,$DD24392F,$BFBDBF4A 193 1.1 mycroft DC.L $3FFF0000,$ED4F301E,$D9942B84,$3FBEC01A 194 1.1 mycroft DC.L $3FFF0000,$EFE4B99B,$DCDAF5CB,$3FBE8CAC 195 1.1 mycroft DC.L $3FFF0000,$F281773C,$59FFB13A,$BFBCBB3F 196 1.1 mycroft DC.L $3FFF0000,$F5257D15,$2486CC2C,$3FBEF73A 197 1.1 mycroft DC.L $3FFF0000,$F7D0DF73,$0AD13BB9,$BFB8B795 198 1.1 mycroft DC.L $3FFF0000,$FA83B2DB,$722A033A,$3FBEF84B 199 1.1 mycroft DC.L $3FFF0000,$FD3E0C0C,$F486C175,$BFBEF581 200 1.1 mycroft 201 1.1 mycroft N equ L_SCR1 202 1.1 mycroft 203 1.1 mycroft X equ FP_SCR1 204 1.1 mycroft XDCARE equ X+2 205 1.1 mycroft XFRAC equ X+4 206 1.1 mycroft 207 1.1 mycroft ADJFACT equ FP_SCR2 208 1.1 mycroft 209 1.1 mycroft FACT1 equ FP_SCR3 210 1.1 mycroft FACT1HI equ FACT1+4 211 1.1 mycroft FACT1LOW equ FACT1+8 212 1.1 mycroft 213 1.1 mycroft FACT2 equ FP_SCR4 214 1.1 mycroft FACT2HI equ FACT2+4 215 1.1 mycroft FACT2LOW equ FACT2+8 216 1.1 mycroft 217 1.1 mycroft xref t_unfl 218 1.1 mycroft xref t_ovfl 219 1.1 mycroft xref t_frcinx 220 1.1 mycroft 221 1.1 mycroft xdef stwotoxd 222 1.1 mycroft stwotoxd: 223 1.1 mycroft *--ENTRY POINT FOR 2**(X) FOR DENORMALIZED ARGUMENT 224 1.1 mycroft 225 1.1 mycroft fmove.l d1,fpcr ...set user's rounding mode/precision 226 1.1 mycroft Fmove.S #:3F800000,FP0 ...RETURN 1 + X 227 1.1 mycroft move.l (a0),d0 228 1.1 mycroft or.l #$00800001,d0 229 1.1 mycroft fadd.s d0,fp0 230 1.1 mycroft bra t_frcinx 231 1.1 mycroft 232 1.1 mycroft xdef stwotox 233 1.1 mycroft stwotox: 234 1.1 mycroft *--ENTRY POINT FOR 2**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S 235 1.1 mycroft FMOVEM.X (a0),FP0 ...LOAD INPUT, do not set cc's 236 1.1 mycroft 237 1.1 mycroft MOVE.L (A0),D0 238 1.1 mycroft MOVE.W 4(A0),D0 239 1.1 mycroft FMOVE.X FP0,X(a6) 240 1.1 mycroft ANDI.L #$7FFFFFFF,D0 241 1.1 mycroft 242 1.1 mycroft CMPI.L #$3FB98000,D0 ...|X| >= 2**(-70)? 243 1.1 mycroft BGE.B TWOOK1 244 1.1 mycroft BRA.W EXPBORS 245 1.1 mycroft 246 1.1 mycroft TWOOK1: 247 1.1 mycroft CMPI.L #$400D80C0,D0 ...|X| > 16480? 248 1.1 mycroft BLE.B TWOMAIN 249 1.1 mycroft BRA.W EXPBORS 250 1.1 mycroft 251 1.1 mycroft 252 1.1 mycroft TWOMAIN: 253 1.1 mycroft *--USUAL CASE, 2^(-70) <= |X| <= 16480 254 1.1 mycroft 255 1.1 mycroft FMOVE.X FP0,FP1 256 1.1 mycroft FMUL.S #:42800000,FP1 ...64 * X 257 1.1 mycroft 258 1.1 mycroft FMOVE.L FP1,N(a6) ...N = ROUND-TO-INT(64 X) 259 1.1 mycroft MOVE.L d2,-(sp) 260 1.1 mycroft LEA EXPTBL,a1 ...LOAD ADDRESS OF TABLE OF 2^(J/64) 261 1.1 mycroft FMOVE.L N(a6),FP1 ...N --> FLOATING FMT 262 1.1 mycroft MOVE.L N(a6),D0 263 1.1 mycroft MOVE.L D0,d2 264 1.1 mycroft ANDI.L #$3F,D0 ...D0 IS J 265 1.1 mycroft ASL.L #4,D0 ...DISPLACEMENT FOR 2^(J/64) 266 1.1 mycroft ADDA.L D0,a1 ...ADDRESS FOR 2^(J/64) 267 1.1 mycroft ASR.L #6,d2 ...d2 IS L, N = 64L + J 268 1.1 mycroft MOVE.L d2,D0 269 1.1 mycroft ASR.L #1,D0 ...D0 IS M 270 1.1 mycroft SUB.L D0,d2 ...d2 IS M', N = 64(M+M') + J 271 1.1 mycroft ADDI.L #$3FFF,d2 272 1.1 mycroft MOVE.W d2,ADJFACT(a6) ...ADJFACT IS 2^(M') 273 1.1 mycroft MOVE.L (sp)+,d2 274 1.1 mycroft *--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64), 275 1.1 mycroft *--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN. 276 1.1 mycroft *--ADJFACT = 2^(M'). 277 1.1 mycroft *--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2. 278 1.1 mycroft 279 1.1 mycroft FMUL.S #:3C800000,FP1 ...(1/64)*N 280 1.1 mycroft MOVE.L (a1)+,FACT1(a6) 281 1.1 mycroft MOVE.L (a1)+,FACT1HI(a6) 282 1.1 mycroft MOVE.L (a1)+,FACT1LOW(a6) 283 1.1 mycroft MOVE.W (a1)+,FACT2(a6) 284 1.1 mycroft clr.w FACT2+2(a6) 285 1.1 mycroft 286 1.1 mycroft FSUB.X FP1,FP0 ...X - (1/64)*INT(64 X) 287 1.1 mycroft 288 1.1 mycroft MOVE.W (a1)+,FACT2HI(a6) 289 1.1 mycroft clr.w FACT2HI+2(a6) 290 1.1 mycroft clr.l FACT2LOW(a6) 291 1.1 mycroft ADD.W D0,FACT1(a6) 292 1.1 mycroft 293 1.1 mycroft FMUL.X LOG2,FP0 ...FP0 IS R 294 1.1 mycroft ADD.W D0,FACT2(a6) 295 1.1 mycroft 296 1.1 mycroft BRA.W expr 297 1.1 mycroft 298 1.1 mycroft EXPBORS: 299 1.1 mycroft *--FPCR, D0 SAVED 300 1.1 mycroft CMPI.L #$3FFF8000,D0 301 1.1 mycroft BGT.B EXPBIG 302 1.1 mycroft 303 1.1 mycroft EXPSM: 304 1.1 mycroft *--|X| IS SMALL, RETURN 1 + X 305 1.1 mycroft 306 1.1 mycroft FMOVE.L d1,FPCR ;restore users exceptions 307 1.1 mycroft FADD.S #:3F800000,FP0 ...RETURN 1 + X 308 1.1 mycroft 309 1.1 mycroft bra t_frcinx 310 1.1 mycroft 311 1.1 mycroft EXPBIG: 312 1.1 mycroft *--|X| IS LARGE, GENERATE OVERFLOW IF X > 0; ELSE GENERATE UNDERFLOW 313 1.1 mycroft *--REGISTERS SAVE SO FAR ARE FPCR AND D0 314 1.1 mycroft MOVE.L X(a6),D0 315 1.2 mycroft TST.L D0 316 1.1 mycroft BLT.B EXPNEG 317 1.1 mycroft 318 1.1 mycroft bclr.b #7,(a0) ;t_ovfl expects positive value 319 1.1 mycroft bra t_ovfl 320 1.1 mycroft 321 1.1 mycroft EXPNEG: 322 1.1 mycroft bclr.b #7,(a0) ;t_unfl expects positive value 323 1.1 mycroft bra t_unfl 324 1.1 mycroft 325 1.1 mycroft xdef stentoxd 326 1.1 mycroft stentoxd: 327 1.1 mycroft *--ENTRY POINT FOR 10**(X) FOR DENORMALIZED ARGUMENT 328 1.1 mycroft 329 1.1 mycroft fmove.l d1,fpcr ...set user's rounding mode/precision 330 1.1 mycroft Fmove.S #:3F800000,FP0 ...RETURN 1 + X 331 1.1 mycroft move.l (a0),d0 332 1.1 mycroft or.l #$00800001,d0 333 1.1 mycroft fadd.s d0,fp0 334 1.1 mycroft bra t_frcinx 335 1.1 mycroft 336 1.1 mycroft xdef stentox 337 1.1 mycroft stentox: 338 1.1 mycroft *--ENTRY POINT FOR 10**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S 339 1.1 mycroft FMOVEM.X (a0),FP0 ...LOAD INPUT, do not set cc's 340 1.1 mycroft 341 1.1 mycroft MOVE.L (A0),D0 342 1.1 mycroft MOVE.W 4(A0),D0 343 1.1 mycroft FMOVE.X FP0,X(a6) 344 1.1 mycroft ANDI.L #$7FFFFFFF,D0 345 1.1 mycroft 346 1.1 mycroft CMPI.L #$3FB98000,D0 ...|X| >= 2**(-70)? 347 1.1 mycroft BGE.B TENOK1 348 1.1 mycroft BRA.W EXPBORS 349 1.1 mycroft 350 1.1 mycroft TENOK1: 351 1.1 mycroft CMPI.L #$400B9B07,D0 ...|X| <= 16480*log2/log10 ? 352 1.1 mycroft BLE.B TENMAIN 353 1.1 mycroft BRA.W EXPBORS 354 1.1 mycroft 355 1.1 mycroft TENMAIN: 356 1.1 mycroft *--USUAL CASE, 2^(-70) <= |X| <= 16480 LOG 2 / LOG 10 357 1.1 mycroft 358 1.1 mycroft FMOVE.X FP0,FP1 359 1.1 mycroft FMUL.D L2TEN64,FP1 ...X*64*LOG10/LOG2 360 1.1 mycroft 361 1.1 mycroft FMOVE.L FP1,N(a6) ...N=INT(X*64*LOG10/LOG2) 362 1.1 mycroft MOVE.L d2,-(sp) 363 1.1 mycroft LEA EXPTBL,a1 ...LOAD ADDRESS OF TABLE OF 2^(J/64) 364 1.1 mycroft FMOVE.L N(a6),FP1 ...N --> FLOATING FMT 365 1.1 mycroft MOVE.L N(a6),D0 366 1.1 mycroft MOVE.L D0,d2 367 1.1 mycroft ANDI.L #$3F,D0 ...D0 IS J 368 1.1 mycroft ASL.L #4,D0 ...DISPLACEMENT FOR 2^(J/64) 369 1.1 mycroft ADDA.L D0,a1 ...ADDRESS FOR 2^(J/64) 370 1.1 mycroft ASR.L #6,d2 ...d2 IS L, N = 64L + J 371 1.1 mycroft MOVE.L d2,D0 372 1.1 mycroft ASR.L #1,D0 ...D0 IS M 373 1.1 mycroft SUB.L D0,d2 ...d2 IS M', N = 64(M+M') + J 374 1.1 mycroft ADDI.L #$3FFF,d2 375 1.1 mycroft MOVE.W d2,ADJFACT(a6) ...ADJFACT IS 2^(M') 376 1.1 mycroft MOVE.L (sp)+,d2 377 1.1 mycroft 378 1.1 mycroft *--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64), 379 1.1 mycroft *--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN. 380 1.1 mycroft *--ADJFACT = 2^(M'). 381 1.1 mycroft *--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2. 382 1.1 mycroft 383 1.1 mycroft FMOVE.X FP1,FP2 384 1.1 mycroft 385 1.1 mycroft FMUL.D L10TWO1,FP1 ...N*(LOG2/64LOG10)_LEAD 386 1.1 mycroft MOVE.L (a1)+,FACT1(a6) 387 1.1 mycroft 388 1.1 mycroft FMUL.X L10TWO2,FP2 ...N*(LOG2/64LOG10)_TRAIL 389 1.1 mycroft 390 1.1 mycroft MOVE.L (a1)+,FACT1HI(a6) 391 1.1 mycroft MOVE.L (a1)+,FACT1LOW(a6) 392 1.1 mycroft FSUB.X FP1,FP0 ...X - N L_LEAD 393 1.1 mycroft MOVE.W (a1)+,FACT2(a6) 394 1.1 mycroft 395 1.1 mycroft FSUB.X FP2,FP0 ...X - N L_TRAIL 396 1.1 mycroft 397 1.1 mycroft clr.w FACT2+2(a6) 398 1.1 mycroft MOVE.W (a1)+,FACT2HI(a6) 399 1.1 mycroft clr.w FACT2HI+2(a6) 400 1.1 mycroft clr.l FACT2LOW(a6) 401 1.1 mycroft 402 1.1 mycroft FMUL.X LOG10,FP0 ...FP0 IS R 403 1.1 mycroft 404 1.1 mycroft ADD.W D0,FACT1(a6) 405 1.1 mycroft ADD.W D0,FACT2(a6) 406 1.1 mycroft 407 1.1 mycroft expr: 408 1.1 mycroft *--FPCR, FP2, FP3 ARE SAVED IN ORDER AS SHOWN. 409 1.1 mycroft *--ADJFACT CONTAINS 2**(M'), FACT1 + FACT2 = 2**(M) * 2**(J/64). 410 1.1 mycroft *--FP0 IS R. THE FOLLOWING CODE COMPUTES 411 1.1 mycroft *-- 2**(M'+M) * 2**(J/64) * EXP(R) 412 1.1 mycroft 413 1.1 mycroft FMOVE.X FP0,FP1 414 1.1 mycroft FMUL.X FP1,FP1 ...FP1 IS S = R*R 415 1.1 mycroft 416 1.1 mycroft FMOVE.D EXPA5,FP2 ...FP2 IS A5 417 1.1 mycroft FMOVE.D EXPA4,FP3 ...FP3 IS A4 418 1.1 mycroft 419 1.1 mycroft FMUL.X FP1,FP2 ...FP2 IS S*A5 420 1.1 mycroft FMUL.X FP1,FP3 ...FP3 IS S*A4 421 1.1 mycroft 422 1.1 mycroft FADD.D EXPA3,FP2 ...FP2 IS A3+S*A5 423 1.1 mycroft FADD.D EXPA2,FP3 ...FP3 IS A2+S*A4 424 1.1 mycroft 425 1.1 mycroft FMUL.X FP1,FP2 ...FP2 IS S*(A3+S*A5) 426 1.1 mycroft FMUL.X FP1,FP3 ...FP3 IS S*(A2+S*A4) 427 1.1 mycroft 428 1.1 mycroft FADD.D EXPA1,FP2 ...FP2 IS A1+S*(A3+S*A5) 429 1.1 mycroft FMUL.X FP0,FP3 ...FP3 IS R*S*(A2+S*A4) 430 1.1 mycroft 431 1.1 mycroft FMUL.X FP1,FP2 ...FP2 IS S*(A1+S*(A3+S*A5)) 432 1.1 mycroft FADD.X FP3,FP0 ...FP0 IS R+R*S*(A2+S*A4) 433 1.1 mycroft 434 1.1 mycroft FADD.X FP2,FP0 ...FP0 IS EXP(R) - 1 435 1.1 mycroft 436 1.1 mycroft 437 1.1 mycroft *--FINAL RECONSTRUCTION PROCESS 438 1.1 mycroft *--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP(R)-1) - (1 OR 0) 439 1.1 mycroft 440 1.1 mycroft FMUL.X FACT1(a6),FP0 441 1.1 mycroft FADD.X FACT2(a6),FP0 442 1.1 mycroft FADD.X FACT1(a6),FP0 443 1.1 mycroft 444 1.1 mycroft FMOVE.L d1,FPCR ;restore users exceptions 445 1.1 mycroft clr.w ADJFACT+2(a6) 446 1.1 mycroft move.l #$80000000,ADJFACT+4(a6) 447 1.1 mycroft clr.l ADJFACT+8(a6) 448 1.1 mycroft FMUL.X ADJFACT(a6),FP0 ...FINAL ADJUSTMENT 449 1.1 mycroft 450 1.1 mycroft bra t_frcinx 451 1.1 mycroft 452 1.1 mycroft end 453