stwotox.sa revision 1.3 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