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