Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/m68k/fpsp040/stwotox.S
10817 views
1
|
2
| stwotox.sa 3.1 12/10/90
3
|
4
| stwotox --- 2**X
5
| stwotoxd --- 2**X for denormalized X
6
| stentox --- 10**X
7
| stentoxd --- 10**X for denormalized X
8
|
9
| Input: Double-extended number X in location pointed to
10
| by address register a0.
11
|
12
| Output: The function values are returned in Fp0.
13
|
14
| Accuracy and Monotonicity: The returned result is within 2 ulps in
15
| 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
16
| result is subsequently rounded to double precision. The
17
| result is provably monotonic in double precision.
18
|
19
| Speed: The program stwotox takes approximately 190 cycles and the
20
| program stentox takes approximately 200 cycles.
21
|
22
| Algorithm:
23
|
24
| twotox
25
| 1. If |X| > 16480, go to ExpBig.
26
|
27
| 2. If |X| < 2**(-70), go to ExpSm.
28
|
29
| 3. Decompose X as X = N/64 + r where |r| <= 1/128. Furthermore
30
| decompose N as
31
| N = 64(M + M') + j, j = 0,1,2,...,63.
32
|
33
| 4. Overwrite r := r * log2. Then
34
| 2**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
35
| Go to expr to compute that expression.
36
|
37
| tentox
38
| 1. If |X| > 16480*log_10(2) (base 10 log of 2), go to ExpBig.
39
|
40
| 2. If |X| < 2**(-70), go to ExpSm.
41
|
42
| 3. Set y := X*log_2(10)*64 (base 2 log of 10). Set
43
| N := round-to-int(y). Decompose N as
44
| N = 64(M + M') + j, j = 0,1,2,...,63.
45
|
46
| 4. Define r as
47
| r := ((X - N*L1)-N*L2) * L10
48
| where L1, L2 are the leading and trailing parts of log_10(2)/64
49
| and L10 is the natural log of 10. Then
50
| 10**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
51
| Go to expr to compute that expression.
52
|
53
| expr
54
| 1. Fetch 2**(j/64) from table as Fact1 and Fact2.
55
|
56
| 2. Overwrite Fact1 and Fact2 by
57
| Fact1 := 2**(M) * Fact1
58
| Fact2 := 2**(M) * Fact2
59
| Thus Fact1 + Fact2 = 2**(M) * 2**(j/64).
60
|
61
| 3. Calculate P where 1 + P approximates exp(r):
62
| P = r + r*r*(A1+r*(A2+...+r*A5)).
63
|
64
| 4. Let AdjFact := 2**(M'). Return
65
| AdjFact * ( Fact1 + ((Fact1*P) + Fact2) ).
66
| Exit.
67
|
68
| ExpBig
69
| 1. Generate overflow by Huge * Huge if X > 0; otherwise, generate
70
| underflow by Tiny * Tiny.
71
|
72
| ExpSm
73
| 1. Return 1 + X.
74
|
75
76
| Copyright (C) Motorola, Inc. 1990
77
| All Rights Reserved
78
|
79
| For details on the license for this file, please see the
80
| file, README, in this same directory.
81
82
|STWOTOX idnt 2,1 | Motorola 040 Floating Point Software Package
83
84
|section 8
85
86
#include "fpsp.h"
87
88
BOUNDS1: .long 0x3FB98000,0x400D80C0 | ... 2^(-70),16480
89
BOUNDS2: .long 0x3FB98000,0x400B9B07 | ... 2^(-70),16480 LOG2/LOG10
90
91
L2TEN64: .long 0x406A934F,0x0979A371 | ... 64LOG10/LOG2
92
L10TWO1: .long 0x3F734413,0x509F8000 | ... LOG2/64LOG10
93
94
L10TWO2: .long 0xBFCD0000,0xC0219DC1,0xDA994FD2,0x00000000
95
96
LOG10: .long 0x40000000,0x935D8DDD,0xAAA8AC17,0x00000000
97
98
LOG2: .long 0x3FFE0000,0xB17217F7,0xD1CF79AC,0x00000000
99
100
EXPA5: .long 0x3F56C16D,0x6F7BD0B2
101
EXPA4: .long 0x3F811112,0x302C712C
102
EXPA3: .long 0x3FA55555,0x55554CC1
103
EXPA2: .long 0x3FC55555,0x55554A54
104
EXPA1: .long 0x3FE00000,0x00000000,0x00000000,0x00000000
105
106
HUGE: .long 0x7FFE0000,0xFFFFFFFF,0xFFFFFFFF,0x00000000
107
TINY: .long 0x00010000,0xFFFFFFFF,0xFFFFFFFF,0x00000000
108
109
EXPTBL:
110
.long 0x3FFF0000,0x80000000,0x00000000,0x3F738000
111
.long 0x3FFF0000,0x8164D1F3,0xBC030773,0x3FBEF7CA
112
.long 0x3FFF0000,0x82CD8698,0xAC2BA1D7,0x3FBDF8A9
113
.long 0x3FFF0000,0x843A28C3,0xACDE4046,0x3FBCD7C9
114
.long 0x3FFF0000,0x85AAC367,0xCC487B15,0xBFBDE8DA
115
.long 0x3FFF0000,0x871F6196,0x9E8D1010,0x3FBDE85C
116
.long 0x3FFF0000,0x88980E80,0x92DA8527,0x3FBEBBF1
117
.long 0x3FFF0000,0x8A14D575,0x496EFD9A,0x3FBB80CA
118
.long 0x3FFF0000,0x8B95C1E3,0xEA8BD6E7,0xBFBA8373
119
.long 0x3FFF0000,0x8D1ADF5B,0x7E5BA9E6,0xBFBE9670
120
.long 0x3FFF0000,0x8EA4398B,0x45CD53C0,0x3FBDB700
121
.long 0x3FFF0000,0x9031DC43,0x1466B1DC,0x3FBEEEB0
122
.long 0x3FFF0000,0x91C3D373,0xAB11C336,0x3FBBFD6D
123
.long 0x3FFF0000,0x935A2B2F,0x13E6E92C,0xBFBDB319
124
.long 0x3FFF0000,0x94F4EFA8,0xFEF70961,0x3FBDBA2B
125
.long 0x3FFF0000,0x96942D37,0x20185A00,0x3FBE91D5
126
.long 0x3FFF0000,0x9837F051,0x8DB8A96F,0x3FBE8D5A
127
.long 0x3FFF0000,0x99E04593,0x20B7FA65,0xBFBCDE7B
128
.long 0x3FFF0000,0x9B8D39B9,0xD54E5539,0xBFBEBAAF
129
.long 0x3FFF0000,0x9D3ED9A7,0x2CFFB751,0xBFBD86DA
130
.long 0x3FFF0000,0x9EF53260,0x91A111AE,0xBFBEBEDD
131
.long 0x3FFF0000,0xA0B0510F,0xB9714FC2,0x3FBCC96E
132
.long 0x3FFF0000,0xA2704303,0x0C496819,0xBFBEC90B
133
.long 0x3FFF0000,0xA43515AE,0x09E6809E,0x3FBBD1DB
134
.long 0x3FFF0000,0xA5FED6A9,0xB15138EA,0x3FBCE5EB
135
.long 0x3FFF0000,0xA7CD93B4,0xE965356A,0xBFBEC274
136
.long 0x3FFF0000,0xA9A15AB4,0xEA7C0EF8,0x3FBEA83C
137
.long 0x3FFF0000,0xAB7A39B5,0xA93ED337,0x3FBECB00
138
.long 0x3FFF0000,0xAD583EEA,0x42A14AC6,0x3FBE9301
139
.long 0x3FFF0000,0xAF3B78AD,0x690A4375,0xBFBD8367
140
.long 0x3FFF0000,0xB123F581,0xD2AC2590,0xBFBEF05F
141
.long 0x3FFF0000,0xB311C412,0xA9112489,0x3FBDFB3C
142
.long 0x3FFF0000,0xB504F333,0xF9DE6484,0x3FBEB2FB
143
.long 0x3FFF0000,0xB6FD91E3,0x28D17791,0x3FBAE2CB
144
.long 0x3FFF0000,0xB8FBAF47,0x62FB9EE9,0x3FBCDC3C
145
.long 0x3FFF0000,0xBAFF5AB2,0x133E45FB,0x3FBEE9AA
146
.long 0x3FFF0000,0xBD08A39F,0x580C36BF,0xBFBEAEFD
147
.long 0x3FFF0000,0xBF1799B6,0x7A731083,0xBFBCBF51
148
.long 0x3FFF0000,0xC12C4CCA,0x66709456,0x3FBEF88A
149
.long 0x3FFF0000,0xC346CCDA,0x24976407,0x3FBD83B2
150
.long 0x3FFF0000,0xC5672A11,0x5506DADD,0x3FBDF8AB
151
.long 0x3FFF0000,0xC78D74C8,0xABB9B15D,0xBFBDFB17
152
.long 0x3FFF0000,0xC9B9BD86,0x6E2F27A3,0xBFBEFE3C
153
.long 0x3FFF0000,0xCBEC14FE,0xF2727C5D,0xBFBBB6F8
154
.long 0x3FFF0000,0xCE248C15,0x1F8480E4,0xBFBCEE53
155
.long 0x3FFF0000,0xD06333DA,0xEF2B2595,0xBFBDA4AE
156
.long 0x3FFF0000,0xD2A81D91,0xF12AE45A,0x3FBC9124
157
.long 0x3FFF0000,0xD4F35AAB,0xCFEDFA1F,0x3FBEB243
158
.long 0x3FFF0000,0xD744FCCA,0xD69D6AF4,0x3FBDE69A
159
.long 0x3FFF0000,0xD99D15C2,0x78AFD7B6,0xBFB8BC61
160
.long 0x3FFF0000,0xDBFBB797,0xDAF23755,0x3FBDF610
161
.long 0x3FFF0000,0xDE60F482,0x5E0E9124,0xBFBD8BE1
162
.long 0x3FFF0000,0xE0CCDEEC,0x2A94E111,0x3FBACB12
163
.long 0x3FFF0000,0xE33F8972,0xBE8A5A51,0x3FBB9BFE
164
.long 0x3FFF0000,0xE5B906E7,0x7C8348A8,0x3FBCF2F4
165
.long 0x3FFF0000,0xE8396A50,0x3C4BDC68,0x3FBEF22F
166
.long 0x3FFF0000,0xEAC0C6E7,0xDD24392F,0xBFBDBF4A
167
.long 0x3FFF0000,0xED4F301E,0xD9942B84,0x3FBEC01A
168
.long 0x3FFF0000,0xEFE4B99B,0xDCDAF5CB,0x3FBE8CAC
169
.long 0x3FFF0000,0xF281773C,0x59FFB13A,0xBFBCBB3F
170
.long 0x3FFF0000,0xF5257D15,0x2486CC2C,0x3FBEF73A
171
.long 0x3FFF0000,0xF7D0DF73,0x0AD13BB9,0xBFB8B795
172
.long 0x3FFF0000,0xFA83B2DB,0x722A033A,0x3FBEF84B
173
.long 0x3FFF0000,0xFD3E0C0C,0xF486C175,0xBFBEF581
174
175
.set N,L_SCR1
176
177
.set X,FP_SCR1
178
.set XDCARE,X+2
179
.set XFRAC,X+4
180
181
.set ADJFACT,FP_SCR2
182
183
.set FACT1,FP_SCR3
184
.set FACT1HI,FACT1+4
185
.set FACT1LOW,FACT1+8
186
187
.set FACT2,FP_SCR4
188
.set FACT2HI,FACT2+4
189
.set FACT2LOW,FACT2+8
190
191
| xref t_unfl
192
|xref t_ovfl
193
|xref t_frcinx
194
195
.global stwotoxd
196
stwotoxd:
197
|--ENTRY POINT FOR 2**(X) FOR DENORMALIZED ARGUMENT
198
199
fmovel %d1,%fpcr | ...set user's rounding mode/precision
200
fmoves #0x3F800000,%fp0 | ...RETURN 1 + X
201
movel (%a0),%d0
202
orl #0x00800001,%d0
203
fadds %d0,%fp0
204
bra t_frcinx
205
206
.global stwotox
207
stwotox:
208
|--ENTRY POINT FOR 2**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
209
fmovemx (%a0),%fp0-%fp0 | ...LOAD INPUT, do not set cc's
210
211
movel (%a0),%d0
212
movew 4(%a0),%d0
213
fmovex %fp0,X(%a6)
214
andil #0x7FFFFFFF,%d0
215
216
cmpil #0x3FB98000,%d0 | ...|X| >= 2**(-70)?
217
bges TWOOK1
218
bra EXPBORS
219
220
TWOOK1:
221
cmpil #0x400D80C0,%d0 | ...|X| > 16480?
222
bles TWOMAIN
223
bra EXPBORS
224
225
226
TWOMAIN:
227
|--USUAL CASE, 2^(-70) <= |X| <= 16480
228
229
fmovex %fp0,%fp1
230
fmuls #0x42800000,%fp1 | ...64 * X
231
232
fmovel %fp1,N(%a6) | ...N = ROUND-TO-INT(64 X)
233
movel %d2,-(%sp)
234
lea EXPTBL,%a1 | ...LOAD ADDRESS OF TABLE OF 2^(J/64)
235
fmovel N(%a6),%fp1 | ...N --> FLOATING FMT
236
movel N(%a6),%d0
237
movel %d0,%d2
238
andil #0x3F,%d0 | ...D0 IS J
239
asll #4,%d0 | ...DISPLACEMENT FOR 2^(J/64)
240
addal %d0,%a1 | ...ADDRESS FOR 2^(J/64)
241
asrl #6,%d2 | ...d2 IS L, N = 64L + J
242
movel %d2,%d0
243
asrl #1,%d0 | ...D0 IS M
244
subl %d0,%d2 | ...d2 IS M', N = 64(M+M') + J
245
addil #0x3FFF,%d2
246
movew %d2,ADJFACT(%a6) | ...ADJFACT IS 2^(M')
247
movel (%sp)+,%d2
248
|--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
249
|--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
250
|--ADJFACT = 2^(M').
251
|--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
252
253
fmuls #0x3C800000,%fp1 | ...(1/64)*N
254
movel (%a1)+,FACT1(%a6)
255
movel (%a1)+,FACT1HI(%a6)
256
movel (%a1)+,FACT1LOW(%a6)
257
movew (%a1)+,FACT2(%a6)
258
clrw FACT2+2(%a6)
259
260
fsubx %fp1,%fp0 | ...X - (1/64)*INT(64 X)
261
262
movew (%a1)+,FACT2HI(%a6)
263
clrw FACT2HI+2(%a6)
264
clrl FACT2LOW(%a6)
265
addw %d0,FACT1(%a6)
266
267
fmulx LOG2,%fp0 | ...FP0 IS R
268
addw %d0,FACT2(%a6)
269
270
bra expr
271
272
EXPBORS:
273
|--FPCR, D0 SAVED
274
cmpil #0x3FFF8000,%d0
275
bgts EXPBIG
276
277
EXPSM:
278
|--|X| IS SMALL, RETURN 1 + X
279
280
fmovel %d1,%FPCR |restore users exceptions
281
fadds #0x3F800000,%fp0 | ...RETURN 1 + X
282
283
bra t_frcinx
284
285
EXPBIG:
286
|--|X| IS LARGE, GENERATE OVERFLOW IF X > 0; ELSE GENERATE UNDERFLOW
287
|--REGISTERS SAVE SO FAR ARE FPCR AND D0
288
movel X(%a6),%d0
289
cmpil #0,%d0
290
blts EXPNEG
291
292
bclrb #7,(%a0) |t_ovfl expects positive value
293
bra t_ovfl
294
295
EXPNEG:
296
bclrb #7,(%a0) |t_unfl expects positive value
297
bra t_unfl
298
299
.global stentoxd
300
stentoxd:
301
|--ENTRY POINT FOR 10**(X) FOR DENORMALIZED ARGUMENT
302
303
fmovel %d1,%fpcr | ...set user's rounding mode/precision
304
fmoves #0x3F800000,%fp0 | ...RETURN 1 + X
305
movel (%a0),%d0
306
orl #0x00800001,%d0
307
fadds %d0,%fp0
308
bra t_frcinx
309
310
.global stentox
311
stentox:
312
|--ENTRY POINT FOR 10**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
313
fmovemx (%a0),%fp0-%fp0 | ...LOAD INPUT, do not set cc's
314
315
movel (%a0),%d0
316
movew 4(%a0),%d0
317
fmovex %fp0,X(%a6)
318
andil #0x7FFFFFFF,%d0
319
320
cmpil #0x3FB98000,%d0 | ...|X| >= 2**(-70)?
321
bges TENOK1
322
bra EXPBORS
323
324
TENOK1:
325
cmpil #0x400B9B07,%d0 | ...|X| <= 16480*log2/log10 ?
326
bles TENMAIN
327
bra EXPBORS
328
329
TENMAIN:
330
|--USUAL CASE, 2^(-70) <= |X| <= 16480 LOG 2 / LOG 10
331
332
fmovex %fp0,%fp1
333
fmuld L2TEN64,%fp1 | ...X*64*LOG10/LOG2
334
335
fmovel %fp1,N(%a6) | ...N=INT(X*64*LOG10/LOG2)
336
movel %d2,-(%sp)
337
lea EXPTBL,%a1 | ...LOAD ADDRESS OF TABLE OF 2^(J/64)
338
fmovel N(%a6),%fp1 | ...N --> FLOATING FMT
339
movel N(%a6),%d0
340
movel %d0,%d2
341
andil #0x3F,%d0 | ...D0 IS J
342
asll #4,%d0 | ...DISPLACEMENT FOR 2^(J/64)
343
addal %d0,%a1 | ...ADDRESS FOR 2^(J/64)
344
asrl #6,%d2 | ...d2 IS L, N = 64L + J
345
movel %d2,%d0
346
asrl #1,%d0 | ...D0 IS M
347
subl %d0,%d2 | ...d2 IS M', N = 64(M+M') + J
348
addil #0x3FFF,%d2
349
movew %d2,ADJFACT(%a6) | ...ADJFACT IS 2^(M')
350
movel (%sp)+,%d2
351
352
|--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
353
|--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
354
|--ADJFACT = 2^(M').
355
|--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
356
357
fmovex %fp1,%fp2
358
359
fmuld L10TWO1,%fp1 | ...N*(LOG2/64LOG10)_LEAD
360
movel (%a1)+,FACT1(%a6)
361
362
fmulx L10TWO2,%fp2 | ...N*(LOG2/64LOG10)_TRAIL
363
364
movel (%a1)+,FACT1HI(%a6)
365
movel (%a1)+,FACT1LOW(%a6)
366
fsubx %fp1,%fp0 | ...X - N L_LEAD
367
movew (%a1)+,FACT2(%a6)
368
369
fsubx %fp2,%fp0 | ...X - N L_TRAIL
370
371
clrw FACT2+2(%a6)
372
movew (%a1)+,FACT2HI(%a6)
373
clrw FACT2HI+2(%a6)
374
clrl FACT2LOW(%a6)
375
376
fmulx LOG10,%fp0 | ...FP0 IS R
377
378
addw %d0,FACT1(%a6)
379
addw %d0,FACT2(%a6)
380
381
expr:
382
|--FPCR, FP2, FP3 ARE SAVED IN ORDER AS SHOWN.
383
|--ADJFACT CONTAINS 2**(M'), FACT1 + FACT2 = 2**(M) * 2**(J/64).
384
|--FP0 IS R. THE FOLLOWING CODE COMPUTES
385
|-- 2**(M'+M) * 2**(J/64) * EXP(R)
386
387
fmovex %fp0,%fp1
388
fmulx %fp1,%fp1 | ...FP1 IS S = R*R
389
390
fmoved EXPA5,%fp2 | ...FP2 IS A5
391
fmoved EXPA4,%fp3 | ...FP3 IS A4
392
393
fmulx %fp1,%fp2 | ...FP2 IS S*A5
394
fmulx %fp1,%fp3 | ...FP3 IS S*A4
395
396
faddd EXPA3,%fp2 | ...FP2 IS A3+S*A5
397
faddd EXPA2,%fp3 | ...FP3 IS A2+S*A4
398
399
fmulx %fp1,%fp2 | ...FP2 IS S*(A3+S*A5)
400
fmulx %fp1,%fp3 | ...FP3 IS S*(A2+S*A4)
401
402
faddd EXPA1,%fp2 | ...FP2 IS A1+S*(A3+S*A5)
403
fmulx %fp0,%fp3 | ...FP3 IS R*S*(A2+S*A4)
404
405
fmulx %fp1,%fp2 | ...FP2 IS S*(A1+S*(A3+S*A5))
406
faddx %fp3,%fp0 | ...FP0 IS R+R*S*(A2+S*A4)
407
408
faddx %fp2,%fp0 | ...FP0 IS EXP(R) - 1
409
410
411
|--FINAL RECONSTRUCTION PROCESS
412
|--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP(R)-1) - (1 OR 0)
413
414
fmulx FACT1(%a6),%fp0
415
faddx FACT2(%a6),%fp0
416
faddx FACT1(%a6),%fp0
417
418
fmovel %d1,%FPCR |restore users exceptions
419
clrw ADJFACT+2(%a6)
420
movel #0x80000000,ADJFACT+4(%a6)
421
clrl ADJFACT+8(%a6)
422
fmulx ADJFACT(%a6),%fp0 | ...FINAL ADJUSTMENT
423
424
bra t_frcinx
425
426
|end
427
428