@@ -9,24 +9,20 @@ import {
9
9
LOAD
10
10
} from "./arraybuffer" ;
11
11
12
- @lazy export const MAX_DOUBLE_LENGTH = 28 ;
13
-
14
- @inline
15
- export function POWERS10 ( ) : u32 [ ] {
16
- const table : u32 [ ] = [
17
- 1 ,
18
- 10 ,
19
- 100 ,
20
- 1000 ,
21
- 10000 ,
22
- 100000 ,
23
- 1000000 ,
24
- 10000000 ,
25
- 100000000 ,
26
- 1000000000
27
- ] ;
28
- return table ; // inlines to a constant memory offset
29
- }
12
+ @inline export const MAX_DOUBLE_LENGTH = 28 ;
13
+
14
+ @lazy @inline const POWERS10 : u32 [ ] = [
15
+ 1 ,
16
+ 10 ,
17
+ 100 ,
18
+ 1000 ,
19
+ 10000 ,
20
+ 100000 ,
21
+ 1000000 ,
22
+ 10000000 ,
23
+ 100000000 ,
24
+ 1000000000
25
+ ] ;
30
26
31
27
/*
32
28
Lookup table for pairwise char codes in range [0-99]
@@ -42,78 +38,66 @@ export function POWERS10(): u32[] {
42
38
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89",
43
39
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99"
44
40
*/
45
- @inline
46
- export function DIGITS ( ) : u32 [ ] {
47
- const table : u32 [ ] = [
48
- 0x00300030 , 0x00310030 , 0x00320030 , 0x00330030 , 0x00340030 ,
49
- 0x00350030 , 0x00360030 , 0x00370030 , 0x00380030 , 0x00390030 ,
50
- 0x00300031 , 0x00310031 , 0x00320031 , 0x00330031 , 0x00340031 ,
51
- 0x00350031 , 0x00360031 , 0x00370031 , 0x00380031 , 0x00390031 ,
52
- 0x00300032 , 0x00310032 , 0x00320032 , 0x00330032 , 0x00340032 ,
53
- 0x00350032 , 0x00360032 , 0x00370032 , 0x00380032 , 0x00390032 ,
54
- 0x00300033 , 0x00310033 , 0x00320033 , 0x00330033 , 0x00340033 ,
55
- 0x00350033 , 0x00360033 , 0x00370033 , 0x00380033 , 0x00390033 ,
56
- 0x00300034 , 0x00310034 , 0x00320034 , 0x00330034 , 0x00340034 ,
57
- 0x00350034 , 0x00360034 , 0x00370034 , 0x00380034 , 0x00390034 ,
58
- 0x00300035 , 0x00310035 , 0x00320035 , 0x00330035 , 0x00340035 ,
59
- 0x00350035 , 0x00360035 , 0x00370035 , 0x00380035 , 0x00390035 ,
60
- 0x00300036 , 0x00310036 , 0x00320036 , 0x00330036 , 0x00340036 ,
61
- 0x00350036 , 0x00360036 , 0x00370036 , 0x00380036 , 0x00390036 ,
62
- 0x00300037 , 0x00310037 , 0x00320037 , 0x00330037 , 0x00340037 ,
63
- 0x00350037 , 0x00360037 , 0x00370037 , 0x00380037 , 0x00390037 ,
64
- 0x00300038 , 0x00310038 , 0x00320038 , 0x00330038 , 0x00340038 ,
65
- 0x00350038 , 0x00360038 , 0x00370038 , 0x00380038 , 0x00390038 ,
66
- 0x00300039 , 0x00310039 , 0x00320039 , 0x00330039 , 0x00340039 ,
67
- 0x00350039 , 0x00360039 , 0x00370039 , 0x00380039 , 0x00390039
68
- ] ;
69
- return table ; // inlines to a constant memory offset
70
- }
71
-
72
- @inline
73
- function EXP_POWERS ( ) : i16 [ ] {
74
- const table : i16 [ ] = [
75
- - 1220 , - 1193 , - 1166 , - 1140 , - 1113 , - 1087 , - 1060 , - 1034 , - 1007 , - 980 ,
76
- - 954 , - 927 , - 901 , - 874 , - 847 , - 821 , - 794 , - 768 , - 741 , - 715 ,
77
- - 688 , - 661 , - 635 , - 608 , - 582 , - 555 , - 529 , - 502 , - 475 , - 449 ,
78
- - 422 , - 396 , - 369 , - 343 , - 316 , - 289 , - 263 , - 236 , - 210 , - 183 ,
79
- - 157 , - 130 , - 103 , - 77 , - 50 , - 24 , 3 , 30 , 56 , 83 ,
80
- 109 , 136 , 162 , 189 , 216 , 242 , 269 , 295 , 322 , 348 ,
81
- 375 , 402 , 428 , 455 , 481 , 508 , 534 , 561 , 588 , 614 ,
82
- 641 , 667 , 694 , 720 , 747 , 774 , 800 , 827 , 853 , 880 ,
83
- 907 , 933 , 960 , 986 , 1013 , 1039 , 1066
84
- ] ;
85
- return table ;
86
- }
41
+ @lazy @inline const DIGITS : u32 [ ] = [
42
+ 0x00300030 , 0x00310030 , 0x00320030 , 0x00330030 , 0x00340030 ,
43
+ 0x00350030 , 0x00360030 , 0x00370030 , 0x00380030 , 0x00390030 ,
44
+ 0x00300031 , 0x00310031 , 0x00320031 , 0x00330031 , 0x00340031 ,
45
+ 0x00350031 , 0x00360031 , 0x00370031 , 0x00380031 , 0x00390031 ,
46
+ 0x00300032 , 0x00310032 , 0x00320032 , 0x00330032 , 0x00340032 ,
47
+ 0x00350032 , 0x00360032 , 0x00370032 , 0x00380032 , 0x00390032 ,
48
+ 0x00300033 , 0x00310033 , 0x00320033 , 0x00330033 , 0x00340033 ,
49
+ 0x00350033 , 0x00360033 , 0x00370033 , 0x00380033 , 0x00390033 ,
50
+ 0x00300034 , 0x00310034 , 0x00320034 , 0x00330034 , 0x00340034 ,
51
+ 0x00350034 , 0x00360034 , 0x00370034 , 0x00380034 , 0x00390034 ,
52
+ 0x00300035 , 0x00310035 , 0x00320035 , 0x00330035 , 0x00340035 ,
53
+ 0x00350035 , 0x00360035 , 0x00370035 , 0x00380035 , 0x00390035 ,
54
+ 0x00300036 , 0x00310036 , 0x00320036 , 0x00330036 , 0x00340036 ,
55
+ 0x00350036 , 0x00360036 , 0x00370036 , 0x00380036 , 0x00390036 ,
56
+ 0x00300037 , 0x00310037 , 0x00320037 , 0x00330037 , 0x00340037 ,
57
+ 0x00350037 , 0x00360037 , 0x00370037 , 0x00380037 , 0x00390037 ,
58
+ 0x00300038 , 0x00310038 , 0x00320038 , 0x00330038 , 0x00340038 ,
59
+ 0x00350038 , 0x00360038 , 0x00370038 , 0x00380038 , 0x00390038 ,
60
+ 0x00300039 , 0x00310039 , 0x00320039 , 0x00330039 , 0x00340039 ,
61
+ 0x00350039 , 0x00360039 , 0x00370039 , 0x00380039 , 0x00390039
62
+ ] ;
63
+
64
+ @lazy @inline const EXP_POWERS : i16 [ ] = [
65
+ - 1220 , - 1193 , - 1166 , - 1140 , - 1113 , - 1087 , - 1060 , - 1034 , - 1007 , - 980 ,
66
+ - 954 , - 927 , - 901 , - 874 , - 847 , - 821 , - 794 , - 768 , - 741 , - 715 ,
67
+ - 688 , - 661 , - 635 , - 608 , - 582 , - 555 , - 529 , - 502 , - 475 , - 449 ,
68
+ - 422 , - 396 , - 369 , - 343 , - 316 , - 289 , - 263 , - 236 , - 210 , - 183 ,
69
+ - 157 , - 130 , - 103 , - 77 , - 50 , - 24 , 3 , 30 , 56 , 83 ,
70
+ 109 , 136 , 162 , 189 , 216 , 242 , 269 , 295 , 322 , 348 ,
71
+ 375 , 402 , 428 , 455 , 481 , 508 , 534 , 561 , 588 , 614 ,
72
+ 641 , 667 , 694 , 720 , 747 , 774 , 800 , 827 , 853 , 880 ,
73
+ 907 , 933 , 960 , 986 , 1013 , 1039 , 1066
74
+ ] ;
87
75
88
76
// 1e-348, 1e-340, ..., 1e340
89
- @inline
90
- function FRC_POWERS ( ) : u64 [ ] {
91
- const table : u64 [ ] = [
92
- 0xFA8FD5A0081C0288 , 0xBAAEE17FA23EBF76 , 0x8B16FB203055AC76 , 0xCF42894A5DCE35EA ,
93
- 0x9A6BB0AA55653B2D , 0xE61ACF033D1A45DF , 0xAB70FE17C79AC6CA , 0xFF77B1FCBEBCDC4F ,
94
- 0xBE5691EF416BD60C , 0x8DD01FAD907FFC3C , 0xD3515C2831559A83 , 0x9D71AC8FADA6C9B5 ,
95
- 0xEA9C227723EE8BCB , 0xAECC49914078536D , 0x823C12795DB6CE57 , 0xC21094364DFB5637 ,
96
- 0x9096EA6F3848984F , 0xD77485CB25823AC7 , 0xA086CFCD97BF97F4 , 0xEF340A98172AACE5 ,
97
- 0xB23867FB2A35B28E , 0x84C8D4DFD2C63F3B , 0xC5DD44271AD3CDBA , 0x936B9FCEBB25C996 ,
98
- 0xDBAC6C247D62A584 , 0xA3AB66580D5FDAF6 , 0xF3E2F893DEC3F126 , 0xB5B5ADA8AAFF80B8 ,
99
- 0x87625F056C7C4A8B , 0xC9BCFF6034C13053 , 0x964E858C91BA2655 , 0xDFF9772470297EBD ,
100
- 0xA6DFBD9FB8E5B88F , 0xF8A95FCF88747D94 , 0xB94470938FA89BCF , 0x8A08F0F8BF0F156B ,
101
- 0xCDB02555653131B6 , 0x993FE2C6D07B7FAC , 0xE45C10C42A2B3B06 , 0xAA242499697392D3 ,
102
- 0xFD87B5F28300CA0E , 0xBCE5086492111AEB , 0x8CBCCC096F5088CC , 0xD1B71758E219652C ,
103
- 0x9C40000000000000 , 0xE8D4A51000000000 , 0xAD78EBC5AC620000 , 0x813F3978F8940984 ,
104
- 0xC097CE7BC90715B3 , 0x8F7E32CE7BEA5C70 , 0xD5D238A4ABE98068 , 0x9F4F2726179A2245 ,
105
- 0xED63A231D4C4FB27 , 0xB0DE65388CC8ADA8 , 0x83C7088E1AAB65DB , 0xC45D1DF942711D9A ,
106
- 0x924D692CA61BE758 , 0xDA01EE641A708DEA , 0xA26DA3999AEF774A , 0xF209787BB47D6B85 ,
107
- 0xB454E4A179DD1877 , 0x865B86925B9BC5C2 , 0xC83553C5C8965D3D , 0x952AB45CFA97A0B3 ,
108
- 0xDE469FBD99A05FE3 , 0xA59BC234DB398C25 , 0xF6C69A72A3989F5C , 0xB7DCBF5354E9BECE ,
109
- 0x88FCF317F22241E2 , 0xCC20CE9BD35C78A5 , 0x98165AF37B2153DF , 0xE2A0B5DC971F303A ,
110
- 0xA8D9D1535CE3B396 , 0xFB9B7CD9A4A7443C , 0xBB764C4CA7A44410 , 0x8BAB8EEFB6409C1A ,
111
- 0xD01FEF10A657842C , 0x9B10A4E5E9913129 , 0xE7109BFBA19C0C9D , 0xAC2820D9623BF429 ,
112
- 0x80444B5E7AA7CF85 , 0xBF21E44003ACDD2D , 0x8E679C2F5E44FF8F , 0xD433179D9C8CB841 ,
113
- 0x9E19DB92B4E31BA9 , 0xEB96BF6EBADF77D9 , 0xAF87023B9BF0EE6B
114
- ] ;
115
- return table ;
116
- }
77
+ @lazy @inline const FRC_POWERS : u64 [ ] = [
78
+ 0xFA8FD5A0081C0288 , 0xBAAEE17FA23EBF76 , 0x8B16FB203055AC76 , 0xCF42894A5DCE35EA ,
79
+ 0x9A6BB0AA55653B2D , 0xE61ACF033D1A45DF , 0xAB70FE17C79AC6CA , 0xFF77B1FCBEBCDC4F ,
80
+ 0xBE5691EF416BD60C , 0x8DD01FAD907FFC3C , 0xD3515C2831559A83 , 0x9D71AC8FADA6C9B5 ,
81
+ 0xEA9C227723EE8BCB , 0xAECC49914078536D , 0x823C12795DB6CE57 , 0xC21094364DFB5637 ,
82
+ 0x9096EA6F3848984F , 0xD77485CB25823AC7 , 0xA086CFCD97BF97F4 , 0xEF340A98172AACE5 ,
83
+ 0xB23867FB2A35B28E , 0x84C8D4DFD2C63F3B , 0xC5DD44271AD3CDBA , 0x936B9FCEBB25C996 ,
84
+ 0xDBAC6C247D62A584 , 0xA3AB66580D5FDAF6 , 0xF3E2F893DEC3F126 , 0xB5B5ADA8AAFF80B8 ,
85
+ 0x87625F056C7C4A8B , 0xC9BCFF6034C13053 , 0x964E858C91BA2655 , 0xDFF9772470297EBD ,
86
+ 0xA6DFBD9FB8E5B88F , 0xF8A95FCF88747D94 , 0xB94470938FA89BCF , 0x8A08F0F8BF0F156B ,
87
+ 0xCDB02555653131B6 , 0x993FE2C6D07B7FAC , 0xE45C10C42A2B3B06 , 0xAA242499697392D3 ,
88
+ 0xFD87B5F28300CA0E , 0xBCE5086492111AEB , 0x8CBCCC096F5088CC , 0xD1B71758E219652C ,
89
+ 0x9C40000000000000 , 0xE8D4A51000000000 , 0xAD78EBC5AC620000 , 0x813F3978F8940984 ,
90
+ 0xC097CE7BC90715B3 , 0x8F7E32CE7BEA5C70 , 0xD5D238A4ABE98068 , 0x9F4F2726179A2245 ,
91
+ 0xED63A231D4C4FB27 , 0xB0DE65388CC8ADA8 , 0x83C7088E1AAB65DB , 0xC45D1DF942711D9A ,
92
+ 0x924D692CA61BE758 , 0xDA01EE641A708DEA , 0xA26DA3999AEF774A , 0xF209787BB47D6B85 ,
93
+ 0xB454E4A179DD1877 , 0x865B86925B9BC5C2 , 0xC83553C5C8965D3D , 0x952AB45CFA97A0B3 ,
94
+ 0xDE469FBD99A05FE3 , 0xA59BC234DB398C25 , 0xF6C69A72A3989F5C , 0xB7DCBF5354E9BECE ,
95
+ 0x88FCF317F22241E2 , 0xCC20CE9BD35C78A5 , 0x98165AF37B2153DF , 0xE2A0B5DC971F303A ,
96
+ 0xA8D9D1535CE3B396 , 0xFB9B7CD9A4A7443C , 0xBB764C4CA7A44410 , 0x8BAB8EEFB6409C1A ,
97
+ 0xD01FEF10A657842C , 0x9B10A4E5E9913129 , 0xE7109BFBA19C0C9D , 0xAC2820D9623BF429 ,
98
+ 0x80444B5E7AA7CF85 , 0xBF21E44003ACDD2D , 0x8E679C2F5E44FF8F , 0xD433179D9C8CB841 ,
99
+ 0x9E19DB92B4E31BA9 , 0xEB96BF6EBADF77D9 , 0xAF87023B9BF0EE6B
100
+ ] ;
117
101
118
102
// Count number of decimals for u32 values
119
103
// In our case input value always non-zero so we can simplify some parts
@@ -122,7 +106,7 @@ export function decimalCount32(value: u32): u32 {
122
106
let l : u32 = 32 - clz < u32 > ( value ) ; // log2
123
107
let t = l * 1233 >>> 12 ; // log10
124
108
125
- let lutbuf = < ArrayBuffer > POWERS10 ( ) . buffer_ ;
109
+ let lutbuf = < ArrayBuffer > POWERS10 . buffer_ ;
126
110
let power = LOAD < u32 > ( lutbuf , t ) ;
127
111
t -= < u32 > ( value < power ) ;
128
112
return t + 1 ;
@@ -152,7 +136,7 @@ export function decimalCount64(value: u64): u32 {
152
136
let l : u32 = 64 - < u32 > clz < u64 > ( value ) ; // log2
153
137
let t = l * 1233 >>> 12 ; // log10
154
138
155
- let lutbuf = < ArrayBuffer > POWERS10 ( ) . buffer_ ;
139
+ let lutbuf = < ArrayBuffer > POWERS10 . buffer_ ;
156
140
let power = LOAD < u32 , u64 > ( lutbuf , t - 10 ) ;
157
141
t -= < u32 > ( value < 10000000000 * power ) ;
158
142
return t + 1 ;
@@ -176,7 +160,7 @@ export function decimalCount64(value: u64): u32 {
176
160
}
177
161
178
162
function utoa32_lut ( buffer : usize , num : u32 , offset : usize ) : void {
179
- var lutbuf = < ArrayBuffer > DIGITS ( ) . buffer_ ;
163
+ var lutbuf = < ArrayBuffer > DIGITS . buffer_ ;
180
164
181
165
while ( num >= 10000 ) {
182
166
// in most VMs i32/u32 div and modulo by constant can be shared and simplificate
@@ -215,7 +199,7 @@ function utoa32_lut(buffer: usize, num: u32, offset: usize): void {
215
199
}
216
200
217
201
function utoa64_lut ( buffer : usize , num : u64 , offset : usize ) : void {
218
- var lutbuf = < ArrayBuffer > DIGITS ( ) . buffer_ ;
202
+ var lutbuf = < ArrayBuffer > DIGITS . buffer_ ;
219
203
220
204
while ( num >= 100000000 ) {
221
205
let t = num / 100000000 ;
@@ -432,8 +416,8 @@ function getCachedPower(minExp: i32): void {
432
416
433
417
var index = ( k >> 3 ) + 1 ;
434
418
_K = 348 - ( index << 3 ) ; // decimal exponent no need lookup table
435
- var frcPowers = < ArrayBuffer > FRC_POWERS ( ) . buffer_ ;
436
- var expPowers = < ArrayBuffer > EXP_POWERS ( ) . buffer_ ;
419
+ var frcPowers = < ArrayBuffer > FRC_POWERS . buffer_ ;
420
+ var expPowers = < ArrayBuffer > EXP_POWERS . buffer_ ;
437
421
_frc_pow = LOAD < u64 > ( frcPowers , index ) ;
438
422
_exp_pow = LOAD < i16 , i32 > ( expPowers , index ) ;
439
423
}
@@ -485,7 +469,7 @@ function genDigits(buffer: usize, w_frc: u64, w_exp: i32, mp_frc: u64, mp_exp: i
485
469
var kappa = < i32 > decimalCount32 ( p1 ) ;
486
470
var len = sign ;
487
471
488
- var powers10 = < ArrayBuffer > POWERS10 ( ) . buffer_ ;
472
+ var powers10 = < ArrayBuffer > POWERS10 . buffer_ ;
489
473
490
474
while ( kappa > 0 ) {
491
475
let d : u32 ;
0 commit comments