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