porffor 0.2.0-2265539 → 0.2.0-22b3092
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/launch.json +18 -0
- package/LICENSE +20 -20
- package/README.md +61 -43
- package/asur/README.md +2 -0
- package/asur/index.js +1262 -0
- package/byg/index.js +237 -0
- package/compiler/2c.js +1 -1
- package/compiler/{sections.js → assemble.js} +57 -10
- package/compiler/builtins/annexb_string.js +72 -0
- package/compiler/builtins/annexb_string.ts +19 -0
- package/compiler/builtins/array.ts +145 -0
- package/compiler/builtins/base64.ts +49 -39
- package/compiler/builtins/crypto.ts +120 -0
- package/compiler/builtins/escape.ts +141 -0
- package/compiler/builtins/int.ts +147 -0
- package/compiler/builtins/number.ts +527 -0
- package/compiler/builtins/porffor.d.ts +26 -19
- package/compiler/builtins/string.ts +1055 -0
- package/compiler/builtins/tostring.ts +45 -0
- package/compiler/builtins.js +412 -105
- package/compiler/{codeGen.js → codegen.js} +674 -287
- package/compiler/embedding.js +22 -22
- package/compiler/encoding.js +108 -10
- package/compiler/generated_builtins.js +684 -4
- package/compiler/index.js +16 -14
- package/compiler/log.js +6 -3
- package/compiler/opt.js +23 -22
- package/compiler/parse.js +31 -25
- package/compiler/precompile.js +19 -25
- package/compiler/prefs.js +2 -2
- package/compiler/prototype.js +2 -18
- package/compiler/types.js +37 -0
- package/compiler/wasmSpec.js +27 -8
- package/compiler/wrap.js +46 -45
- package/package.json +9 -5
- package/porf +2 -0
- package/rhemyn/compile.js +3 -2
- package/rhemyn/parse.js +323 -320
- package/rhemyn/test/parse.js +58 -58
- package/runner/compare.js +34 -34
- package/runner/debug.js +122 -0
- package/runner/index.js +31 -9
- package/runner/profiler.js +102 -0
- package/runner/repl.js +40 -7
- package/runner/sizes.js +37 -37
- package/test262_changes_from_1afe9b87d2_to_04-09.md +270 -0
- package/demo.js +0 -3
- package/demo.ts +0 -1
- package/filesize.cmd +0 -2
- package/hello +0 -0
- package/runner/info.js +0 -89
- package/runner/profile.js +0 -46
- package/runner/results.json +0 -1
- package/runner/transform.js +0 -15
- package/tmp.c +0 -152
- package/util/enum.js +0 -20
@@ -0,0 +1,45 @@
|
|
1
|
+
// // @porf -funsafe-no-unlikely-proto-checks -valtype=i32
|
2
|
+
|
3
|
+
export const __Boolean_prototype_toString = (_this: boolean) => {
|
4
|
+
let out: bytestring = '';
|
5
|
+
if (_this) out = 'true';
|
6
|
+
else out = 'false';
|
7
|
+
|
8
|
+
return out;
|
9
|
+
};
|
10
|
+
|
11
|
+
export const __String_prototype_toString = (_this: string) => {
|
12
|
+
let out: string = Porffor.s``;
|
13
|
+
Porffor.clone(_this, out);
|
14
|
+
return out;
|
15
|
+
};
|
16
|
+
|
17
|
+
export const ___bytestring_prototype_toString = (_this: bytestring) => {
|
18
|
+
let out: bytestring = Porffor.bs``;
|
19
|
+
Porffor.clone(_this, out);
|
20
|
+
return out;
|
21
|
+
};
|
22
|
+
|
23
|
+
// // export const __undefined_prototype_toString = (_this: number) => {
|
24
|
+
|
25
|
+
// // };
|
26
|
+
|
27
|
+
export const __Object_prototype_toString = (_this: object) => {
|
28
|
+
let out: bytestring = '[object Object]';
|
29
|
+
return out;
|
30
|
+
};
|
31
|
+
|
32
|
+
export const __Function_prototype_toString = (_this: Function) => {
|
33
|
+
// todo: actually use source
|
34
|
+
let out: bytestring = 'function () {}';
|
35
|
+
return out;
|
36
|
+
};
|
37
|
+
|
38
|
+
|
39
|
+
// // export const ___array_prototype_toString = (_this: any[]) => {
|
40
|
+
// // return _this.join();
|
41
|
+
// // };
|
42
|
+
|
43
|
+
// // export const ___regexp_prototype_toString = (_this: number) => {
|
44
|
+
|
45
|
+
// // };
|
package/compiler/builtins.js
CHANGED
@@ -2,6 +2,7 @@ import { Blocktype, Opcodes, Valtype, ValtypeSize } from "./wasmSpec.js";
|
|
2
2
|
import { number, i32x4 } from "./embedding.js";
|
3
3
|
import Prefs from './prefs.js';
|
4
4
|
import * as GeneratedBuiltins from './generated_builtins.js';
|
5
|
+
import { TYPES } from './types.js';
|
5
6
|
|
6
7
|
export const importedFuncs = [
|
7
8
|
{
|
@@ -21,6 +22,18 @@ export const importedFuncs = [
|
|
21
22
|
import: 't',
|
22
23
|
params: 0,
|
23
24
|
returns: 1
|
25
|
+
},
|
26
|
+
{
|
27
|
+
name: 'profile1',
|
28
|
+
import: 'y',
|
29
|
+
params: 1,
|
30
|
+
returns: 0
|
31
|
+
},
|
32
|
+
{
|
33
|
+
name: 'profile2',
|
34
|
+
import: 'z',
|
35
|
+
params: 1,
|
36
|
+
returns: 0
|
24
37
|
}
|
25
38
|
];
|
26
39
|
|
@@ -52,10 +65,10 @@ export const NULL = 0;
|
|
52
65
|
|
53
66
|
export const BuiltinVars = function() {
|
54
67
|
this.undefined = number(UNDEFINED);
|
55
|
-
this.undefined.type =
|
68
|
+
this.undefined.type = TYPES.undefined;
|
56
69
|
|
57
70
|
this.null = number(NULL);
|
58
|
-
this.null.type =
|
71
|
+
this.null.type = TYPES.object;
|
59
72
|
|
60
73
|
this.NaN = number(NaN);
|
61
74
|
this.NaN.floatOnly = true;
|
@@ -119,6 +132,14 @@ export const BuiltinVars = function() {
|
|
119
132
|
|
120
133
|
// stubs just so that parent objects exist
|
121
134
|
this.Math = number(1);
|
135
|
+
|
136
|
+
// wintercg(tm)
|
137
|
+
this.__navigator_userAgent = (scope, { makeString }) => makeString(scope, `Porffor/0.2.0`, false, '__navigator_userAgent');
|
138
|
+
this.__navigator_userAgent.type = Prefs.bytestring ? TYPES._bytestring : TYPES.string;
|
139
|
+
|
140
|
+
for (const x in TYPES) {
|
141
|
+
this['__Porffor_TYPES_' + x] = number(TYPES[x]);
|
142
|
+
}
|
122
143
|
};
|
123
144
|
|
124
145
|
export const BuiltinFuncs = function() {
|
@@ -177,9 +198,10 @@ export const BuiltinFuncs = function() {
|
|
177
198
|
params: [ valtypeBinary ],
|
178
199
|
locals: [],
|
179
200
|
returns: [ valtypeBinary ],
|
180
|
-
returnType:
|
201
|
+
returnType: TYPES.object,
|
181
202
|
wasm: [
|
182
|
-
[ Opcodes.local_get, 0 ]
|
203
|
+
// [ Opcodes.local_get, 0 ]
|
204
|
+
...number(1)
|
183
205
|
]
|
184
206
|
};
|
185
207
|
|
@@ -189,7 +211,7 @@ export const BuiltinFuncs = function() {
|
|
189
211
|
typedParams: true,
|
190
212
|
locals: [ Valtype.i32, Valtype.i32 ],
|
191
213
|
returns: [],
|
192
|
-
wasm: (scope, {
|
214
|
+
wasm: (scope, { typeSwitch }) => [
|
193
215
|
...typeSwitch(scope, [ [ Opcodes.local_get, 1 ] ], {
|
194
216
|
[TYPES.number]: [
|
195
217
|
[ Opcodes.local_get, 0 ],
|
@@ -351,7 +373,7 @@ export const BuiltinFuncs = function() {
|
|
351
373
|
params: [ valtypeBinary ],
|
352
374
|
locals: [],
|
353
375
|
returns: [ valtypeBinary ],
|
354
|
-
returnType:
|
376
|
+
returnType: TYPES.boolean,
|
355
377
|
wasm: [
|
356
378
|
[ Opcodes.local_get, 0 ],
|
357
379
|
[ Opcodes.local_get, 0 ],
|
@@ -366,7 +388,7 @@ export const BuiltinFuncs = function() {
|
|
366
388
|
params: [ valtypeBinary ],
|
367
389
|
locals: [ valtypeBinary ],
|
368
390
|
returns: [ valtypeBinary ],
|
369
|
-
returnType:
|
391
|
+
returnType: TYPES.boolean,
|
370
392
|
wasm: [
|
371
393
|
[ Opcodes.local_get, 0 ],
|
372
394
|
[ Opcodes.local_get, 0 ],
|
@@ -385,7 +407,7 @@ export const BuiltinFuncs = function() {
|
|
385
407
|
params: [ valtypeBinary ],
|
386
408
|
locals: [],
|
387
409
|
returns: [ valtypeBinary ],
|
388
|
-
returnType:
|
410
|
+
returnType: TYPES.boolean,
|
389
411
|
wasm: [
|
390
412
|
[ Opcodes.local_get, 0 ],
|
391
413
|
[ Opcodes.local_get, 0 ],
|
@@ -400,7 +422,7 @@ export const BuiltinFuncs = function() {
|
|
400
422
|
params: [ valtypeBinary ],
|
401
423
|
locals: [],
|
402
424
|
returns: [ valtypeBinary ],
|
403
|
-
returnType:
|
425
|
+
returnType: TYPES.boolean,
|
404
426
|
wasm: [
|
405
427
|
[ Opcodes.local_get, 0 ],
|
406
428
|
[ Opcodes.local_get, 0 ],
|
@@ -540,61 +562,314 @@ export const BuiltinFuncs = function() {
|
|
540
562
|
|
541
563
|
// this is an implementation of xorshift128+ (in wasm bytecode)
|
542
564
|
// fun fact: v8, SM, JSC also use this (you will need this fun fact to maintain your sanity reading this code)
|
543
|
-
const prngSeed0 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER), prngSeed1 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
|
565
|
+
// const prngSeed0 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER), prngSeed1 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
|
566
|
+
const prngSeed0 = (Math.random() * (2 ** 30)) | 0, prngSeed1 = (Math.random() * (2 ** 30)) | 0;
|
567
|
+
|
568
|
+
const prng = ({
|
569
|
+
'lcg32_glibc': {
|
570
|
+
globals: [ Valtype.i32 ],
|
571
|
+
locals: [],
|
572
|
+
returns: Valtype.i32,
|
573
|
+
wasm: [
|
574
|
+
// seed = (MULTIPLIER * seed + INCREMENT) % MODULUS
|
575
|
+
// MULTIPLIER * state0
|
576
|
+
[ Opcodes.global_get, 0 ],
|
577
|
+
...number(1103515245, Valtype.i32),
|
578
|
+
[ Opcodes.i32_mul ],
|
579
|
+
|
580
|
+
// + INCREMENT
|
581
|
+
...number(12345, Valtype.i32),
|
582
|
+
[ Opcodes.i32_add ],
|
583
|
+
|
584
|
+
// % MODULUS
|
585
|
+
...number(2 ** 31, Valtype.i32),
|
586
|
+
[ Opcodes.i32_rem_s ],
|
587
|
+
|
588
|
+
// state0 =
|
589
|
+
[ Opcodes.global_set, 0 ],
|
590
|
+
|
591
|
+
// state0
|
592
|
+
[ Opcodes.global_get, 0 ],
|
593
|
+
],
|
594
|
+
},
|
595
|
+
'lcg32_minstd': {
|
596
|
+
globals: [ Valtype.i32 ],
|
597
|
+
locals: [],
|
598
|
+
returns: Valtype.i32,
|
599
|
+
wasm: [
|
600
|
+
// seed = (MULTIPLIER * seed + INCREMENT) % MODULUS
|
601
|
+
// MULTIPLIER * state0
|
602
|
+
[ Opcodes.global_get, 0 ],
|
603
|
+
...number(48271, Valtype.i32),
|
604
|
+
[ Opcodes.i32_mul ],
|
605
|
+
|
606
|
+
// % MODULUS
|
607
|
+
...number((2 ** 31) - 1, Valtype.i32),
|
608
|
+
[ Opcodes.i32_rem_s ],
|
609
|
+
|
610
|
+
// state0 =
|
611
|
+
[ Opcodes.global_set, 0 ],
|
612
|
+
|
613
|
+
// state0
|
614
|
+
[ Opcodes.global_get, 0 ],
|
615
|
+
],
|
616
|
+
},
|
617
|
+
'lcg64_musl': 0, // todo
|
618
|
+
|
619
|
+
'xorshift32+': {
|
620
|
+
globals: [ Valtype.i32 ],
|
621
|
+
locals: [ Valtype.i32 ],
|
622
|
+
returns: Valtype.i32,
|
623
|
+
wasm: [
|
624
|
+
// setup: s1 = state0
|
625
|
+
[ Opcodes.global_get, 0 ], // state0
|
626
|
+
[ Opcodes.local_tee, 0 ], // s1
|
627
|
+
|
628
|
+
// s1 ^= s1 << 13
|
629
|
+
[ Opcodes.local_get, 0 ], // s1
|
630
|
+
[ Opcodes.i32_const, 13 ],
|
631
|
+
[ Opcodes.i32_shl ], // <<
|
632
|
+
[ Opcodes.i32_xor ], // ^
|
633
|
+
[ Opcodes.local_tee, 0 ], // s1
|
634
|
+
|
635
|
+
// s1 ^= s1 >> 17
|
636
|
+
[ Opcodes.local_get, 0 ], // s1
|
637
|
+
[ Opcodes.i32_const, 17 ],
|
638
|
+
[ Opcodes.i32_shr_s ], // >>
|
639
|
+
[ Opcodes.i32_xor ], // ^
|
640
|
+
[ Opcodes.local_tee, 0 ], // s1
|
641
|
+
|
642
|
+
// s1 ^= s1 << 5
|
643
|
+
[ Opcodes.local_get, 0 ], // s1
|
644
|
+
[ Opcodes.i32_const, 5 ],
|
645
|
+
[ Opcodes.i32_shl ], // <<
|
646
|
+
[ Opcodes.i32_xor ], // ^
|
647
|
+
[ Opcodes.local_tee, 0 ], // s1
|
648
|
+
|
649
|
+
// state0 = s1
|
650
|
+
[ Opcodes.global_set, 0 ],
|
651
|
+
|
652
|
+
// s1
|
653
|
+
[ Opcodes.local_get, 0 ],
|
654
|
+
],
|
655
|
+
},
|
656
|
+
|
657
|
+
'xorshift64+': {
|
658
|
+
globals: [ Valtype.i64 ],
|
659
|
+
locals: [ Valtype.i64 ],
|
660
|
+
returns: Valtype.i64,
|
661
|
+
wasm: [
|
662
|
+
// setup: s1 = state0
|
663
|
+
[ Opcodes.global_get, 0 ], // state0
|
664
|
+
[ Opcodes.local_tee, 0 ], // s1
|
665
|
+
|
666
|
+
// s1 ^= s1 >> 12
|
667
|
+
[ Opcodes.local_get, 0 ], // s1
|
668
|
+
[ Opcodes.i64_const, 12 ],
|
669
|
+
[ Opcodes.i64_shr_s ], // >>
|
670
|
+
[ Opcodes.i64_xor ], // ^
|
671
|
+
[ Opcodes.local_tee, 0 ], // s1
|
672
|
+
|
673
|
+
// s1 ^= s1 << 25
|
674
|
+
[ Opcodes.local_get, 0 ], // s1
|
675
|
+
[ Opcodes.i64_const, 25 ],
|
676
|
+
[ Opcodes.i64_shl ], // <<
|
677
|
+
[ Opcodes.i64_xor ], // ^
|
678
|
+
[ Opcodes.local_tee, 0 ], // s1
|
679
|
+
|
680
|
+
// s1 ^= s1 >> 27
|
681
|
+
[ Opcodes.local_get, 0 ], // s1
|
682
|
+
[ Opcodes.i64_const, 27 ],
|
683
|
+
[ Opcodes.i64_shr_s ], // >>
|
684
|
+
[ Opcodes.i64_xor ], // ^
|
685
|
+
[ Opcodes.local_tee, 0 ], // s1
|
686
|
+
|
687
|
+
// state0 = s1
|
688
|
+
[ Opcodes.global_set, 0 ],
|
689
|
+
|
690
|
+
// // s1 * 0x2545F4914F6CDD1D
|
691
|
+
// [ Opcodes.local_get, 0 ],
|
692
|
+
// [ Opcodes.i64_const, 0x9d, 0xba, 0xb3, 0xfb, 0x94, 0x92, 0xfd, 0xa2, 0x25 ],
|
693
|
+
// [ Opcodes.i64_mul ]
|
694
|
+
|
695
|
+
// s1
|
696
|
+
[ Opcodes.local_get, 0 ],
|
697
|
+
],
|
698
|
+
},
|
699
|
+
|
700
|
+
'xorshift128+': {
|
701
|
+
globals: [ Valtype.i64, Valtype.i64 ],
|
702
|
+
locals: [ Valtype.i64, Valtype.i64 ],
|
703
|
+
returns: Valtype.i64,
|
704
|
+
wasm: [
|
705
|
+
// setup: s1 = state0, s0 = state1, state0 = s0
|
706
|
+
[ Opcodes.global_get, 0 ], // state0
|
707
|
+
[ Opcodes.local_tee, 0 ], // s1
|
708
|
+
[ Opcodes.global_get, 1 ], // state1
|
709
|
+
[ Opcodes.local_tee, 1, ], // s0
|
710
|
+
[ Opcodes.global_set, 0 ], // state0
|
711
|
+
|
712
|
+
// s1 ^= s1 << 23
|
713
|
+
// [ Opcodes.local_get, 0 ], // s1
|
714
|
+
[ Opcodes.local_get, 0 ], // s1
|
715
|
+
[ Opcodes.i64_const, 23 ],
|
716
|
+
[ Opcodes.i64_shl ], // <<
|
717
|
+
[ Opcodes.i64_xor ], // ^
|
718
|
+
[ Opcodes.local_set, 0 ], // s1
|
719
|
+
|
720
|
+
// state1 = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26)
|
721
|
+
// s1 ^ s0
|
722
|
+
[ Opcodes.local_get, 0 ], // s1
|
723
|
+
[ Opcodes.local_get, 1 ], // s0
|
724
|
+
[ Opcodes.i64_xor ], // ^
|
725
|
+
|
726
|
+
// ^ (s1 >> 17)
|
727
|
+
[ Opcodes.local_get, 0 ], // s1
|
728
|
+
[ Opcodes.i64_const, 17 ],
|
729
|
+
[ Opcodes.i64_shr_u ], // >>
|
730
|
+
[ Opcodes.i64_xor ], // ^
|
731
|
+
|
732
|
+
// ^ (s0 >> 26)
|
733
|
+
[ Opcodes.local_get, 1 ], // s0
|
734
|
+
[ Opcodes.i64_const, 26 ],
|
735
|
+
[ Opcodes.i64_shr_u ], // >>
|
736
|
+
[ Opcodes.i64_xor ], // ^
|
737
|
+
|
738
|
+
// state1 =
|
739
|
+
[ Opcodes.global_set, 1 ],
|
740
|
+
|
741
|
+
// state1 + s0
|
742
|
+
[ Opcodes.global_get, 1 ], // state1
|
743
|
+
[ Opcodes.local_get, 1 ], // s0
|
744
|
+
[ Opcodes.i64_add ]
|
745
|
+
]
|
746
|
+
},
|
747
|
+
|
748
|
+
'xoroshiro128+': {
|
749
|
+
globals: [ Valtype.i64, Valtype.i64 ],
|
750
|
+
locals: [ Valtype.i64, Valtype.i64, Valtype.i64 ],
|
751
|
+
returns: Valtype.i64,
|
752
|
+
wasm: [
|
753
|
+
// setup: s1 = state1, s0 = state0
|
754
|
+
[ Opcodes.global_get, 1 ], // state0
|
755
|
+
[ Opcodes.local_tee, 0 ], // s1
|
756
|
+
[ Opcodes.global_get, 0 ], // state1
|
757
|
+
[ Opcodes.local_tee, 1, ], // s0
|
758
|
+
|
759
|
+
// result = s0 + s1
|
760
|
+
[ Opcodes.i64_add ],
|
761
|
+
[ Opcodes.local_set, 2 ], // result
|
762
|
+
|
763
|
+
// s1 ^= s0
|
764
|
+
[ Opcodes.local_get, 0 ], // s1
|
765
|
+
[ Opcodes.local_get, 1 ], // s0
|
766
|
+
[ Opcodes.i64_xor ],
|
767
|
+
[ Opcodes.local_set, 0 ], // s1
|
768
|
+
|
769
|
+
// state0 = rotl(s0, 24) ^ s1 ^ (s1 << 16)
|
770
|
+
|
771
|
+
// rotl(s0, 24) ^ s1
|
772
|
+
[ Opcodes.local_get, 1 ], // s0
|
773
|
+
...number(24, Valtype.i64),
|
774
|
+
[ Opcodes.i64_rotl ],
|
775
|
+
[ Opcodes.local_get, 0 ], // s1
|
776
|
+
[ Opcodes.i64_xor ],
|
777
|
+
|
778
|
+
// ^ (s1 << 16)
|
779
|
+
[ Opcodes.local_get, 0 ], // s1
|
780
|
+
...number(16, Valtype.i64),
|
781
|
+
[ Opcodes.i64_shl ],
|
782
|
+
[ Opcodes.i64_xor ],
|
783
|
+
|
784
|
+
// state0 =
|
785
|
+
[ Opcodes.global_set, 0 ], // state0
|
786
|
+
|
787
|
+
// state1 = rotl(s1, 37)
|
788
|
+
[ Opcodes.local_get, 0 ], // s1
|
789
|
+
...number(37, Valtype.i64),
|
790
|
+
[ Opcodes.i64_rotl ],
|
791
|
+
[ Opcodes.global_set, 1 ], // state1
|
792
|
+
|
793
|
+
// result
|
794
|
+
[ Opcodes.local_get, 2 ],
|
795
|
+
]
|
796
|
+
},
|
797
|
+
|
798
|
+
'xoshiro128+': {
|
799
|
+
globals: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
|
800
|
+
locals: [ Valtype.i32, Valtype.i32 ],
|
801
|
+
returns: Valtype.i32,
|
802
|
+
wasm: [
|
803
|
+
// result = state0 + state3
|
804
|
+
[ Opcodes.global_get, 0 ], // state0
|
805
|
+
[ Opcodes.global_get, 3 ], // state0
|
806
|
+
[ Opcodes.i32_add ],
|
807
|
+
[ Opcodes.local_set, 0 ], // result
|
808
|
+
|
809
|
+
// t = state1 << 9
|
810
|
+
[ Opcodes.global_get, 1 ], // state1
|
811
|
+
...number(9, Valtype.i32),
|
812
|
+
[ Opcodes.i32_shl ],
|
813
|
+
[ Opcodes.local_set, 1 ], // t
|
814
|
+
|
815
|
+
// state2 ^= state0
|
816
|
+
[ Opcodes.global_get, 2 ], // state2
|
817
|
+
[ Opcodes.global_get, 0 ], // state0
|
818
|
+
[ Opcodes.i32_xor ],
|
819
|
+
[ Opcodes.global_set, 2 ], // state2
|
820
|
+
|
821
|
+
// state3 ^= state1
|
822
|
+
[ Opcodes.global_get, 3 ], // state3
|
823
|
+
[ Opcodes.global_get, 1 ], // state1
|
824
|
+
[ Opcodes.i32_xor ],
|
825
|
+
[ Opcodes.global_set, 3 ], // state3
|
826
|
+
|
827
|
+
// state1 ^= state2
|
828
|
+
[ Opcodes.global_get, 1 ], // state1
|
829
|
+
[ Opcodes.global_get, 2 ], // state2
|
830
|
+
[ Opcodes.i32_xor ],
|
831
|
+
[ Opcodes.global_set, 1 ], // state1
|
832
|
+
|
833
|
+
// state0 ^= state3
|
834
|
+
[ Opcodes.global_get, 0 ], // state2
|
835
|
+
[ Opcodes.global_get, 3 ], // state0
|
836
|
+
[ Opcodes.i32_xor ],
|
837
|
+
[ Opcodes.global_set, 0 ], // state2
|
838
|
+
|
839
|
+
// state2 ^= t
|
840
|
+
[ Opcodes.global_get, 2 ], // state2
|
841
|
+
[ Opcodes.local_get, 1 ], // t
|
842
|
+
[ Opcodes.i32_xor ],
|
843
|
+
[ Opcodes.global_set, 2 ], // state2
|
844
|
+
|
845
|
+
// state3 = rotl(state3, 11)
|
846
|
+
[ Opcodes.global_get, 3 ], // state3
|
847
|
+
...number(11, Valtype.i32),
|
848
|
+
[ Opcodes.i32_rotl ],
|
849
|
+
[ Opcodes.global_set, 3 ], // state3
|
850
|
+
|
851
|
+
// result
|
852
|
+
[ Opcodes.local_get, 0 ],
|
853
|
+
]
|
854
|
+
}
|
855
|
+
})[Prefs.prng ?? 'xorshift128+'];
|
856
|
+
|
857
|
+
if (!prng) throw new Error(`unknown prng algo: ${Prefs.prng}`);
|
544
858
|
|
545
859
|
this.__Math_random = {
|
546
860
|
floatOnly: true,
|
547
861
|
params: [],
|
548
|
-
locals:
|
862
|
+
locals: prng.locals,
|
549
863
|
localNames: [ 's1', 's0' ],
|
550
|
-
globals:
|
864
|
+
globals: prng.globals,
|
551
865
|
globalNames: [ 'state0', 'state1' ],
|
552
866
|
globalInits: [ prngSeed0, prngSeed1 ],
|
553
867
|
returns: [ Valtype.f64 ],
|
554
868
|
wasm: [
|
555
|
-
|
556
|
-
[ Opcodes.global_get, 0 ], // state0
|
557
|
-
[ Opcodes.local_tee, 0 ], // s1
|
558
|
-
[ Opcodes.global_get, 1 ], // state1
|
559
|
-
[ Opcodes.local_tee, 1, ], // s0
|
560
|
-
[ Opcodes.global_set, 0 ], // state0
|
561
|
-
|
562
|
-
// s1 ^= s1 << 23
|
563
|
-
// [ Opcodes.local_get, 0 ], // s1
|
564
|
-
[ Opcodes.local_get, 0 ], // s1
|
565
|
-
[ Opcodes.i64_const, 23 ],
|
566
|
-
[ Opcodes.i64_shl ], // <<
|
567
|
-
[ Opcodes.i64_xor ], // ^
|
568
|
-
[ Opcodes.local_set, 0 ], // s1
|
569
|
-
|
570
|
-
// state1 = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26)
|
571
|
-
// s1 ^ s0
|
572
|
-
[ Opcodes.local_get, 0 ], // s1
|
573
|
-
[ Opcodes.local_get, 1 ], // s0
|
574
|
-
[ Opcodes.i64_xor ], // ^
|
575
|
-
|
576
|
-
// ^ (s1 >> 17)
|
577
|
-
[ Opcodes.local_get, 0 ], // s1
|
578
|
-
[ Opcodes.i64_const, 17 ],
|
579
|
-
[ Opcodes.i64_shr_u ], // >>
|
580
|
-
[ Opcodes.i64_xor ], // ^
|
581
|
-
|
582
|
-
// ^ (s0 >> 26)
|
583
|
-
[ Opcodes.local_get, 1 ], // s0
|
584
|
-
[ Opcodes.i64_const, 26 ],
|
585
|
-
[ Opcodes.i64_shr_u ], // >>
|
586
|
-
[ Opcodes.i64_xor ], // ^
|
587
|
-
|
588
|
-
// state1 =
|
589
|
-
[ Opcodes.global_set, 1 ],
|
869
|
+
...prng.wasm,
|
590
870
|
|
591
871
|
// you thought it was over? now we need the result as a f64 between 0-1 :)
|
592
872
|
|
593
|
-
// state1 + s0
|
594
|
-
[ Opcodes.global_get, 1 ], // state1
|
595
|
-
[ Opcodes.local_get, 1 ], // s0
|
596
|
-
[ Opcodes.i64_add ],
|
597
|
-
|
598
873
|
// should we >> 12 here?
|
599
874
|
// it feels like it but it breaks values
|
600
875
|
|
@@ -609,15 +884,72 @@ export const BuiltinFuncs = function() {
|
|
609
884
|
// ...number(1),
|
610
885
|
// [ Opcodes.f64_sub ],
|
611
886
|
|
612
|
-
...
|
613
|
-
|
887
|
+
...(prng.returns === Valtype.i64 ? [
|
888
|
+
...number((1 << 53) - 1, Valtype.i64),
|
889
|
+
[ Opcodes.i64_and ],
|
890
|
+
|
891
|
+
// double(mantissa)
|
892
|
+
[ Opcodes.f64_convert_i64_u ],
|
893
|
+
|
894
|
+
// / (1 << 53)
|
895
|
+
...number(1 << 53),
|
896
|
+
[ Opcodes.f64_div ]
|
897
|
+
] : [
|
898
|
+
...number((1 << 21) - 1, Valtype.i32),
|
899
|
+
[ Opcodes.i32_and ],
|
614
900
|
|
615
|
-
|
616
|
-
|
901
|
+
// double(mantissa)
|
902
|
+
[ Opcodes.f64_convert_i32_u ],
|
617
903
|
|
618
|
-
|
619
|
-
|
620
|
-
|
904
|
+
// / (1 << 21)
|
905
|
+
...number(1 << 21),
|
906
|
+
[ Opcodes.f64_div ]
|
907
|
+
])
|
908
|
+
]
|
909
|
+
};
|
910
|
+
|
911
|
+
// this.__Porffor_randomInt = {
|
912
|
+
// params: [],
|
913
|
+
// locals: prng.locals,
|
914
|
+
// localNames: [ 's1', 's0' ],
|
915
|
+
// globals: prng.globals,
|
916
|
+
// globalNames: [ 'state0', 'state1' ],
|
917
|
+
// globalInits: [ prngSeed0, prngSeed1 ],
|
918
|
+
// returns: [ Valtype.i32 ],
|
919
|
+
// wasm: [
|
920
|
+
// ...prng.wasm,
|
921
|
+
|
922
|
+
// ...(prng.returns === Valtype.i64 ? [
|
923
|
+
// // the lowest bits of the output generated by xorshift128+ have low quality
|
924
|
+
// ...number(56, Valtype.i64),
|
925
|
+
// [ Opcodes.i64_shr_u ],
|
926
|
+
|
927
|
+
// [ Opcodes.i32_wrap_i64 ],
|
928
|
+
// ] : []),
|
929
|
+
// ]
|
930
|
+
// };
|
931
|
+
|
932
|
+
this.__Porffor_randomByte = {
|
933
|
+
params: [],
|
934
|
+
locals: prng.locals,
|
935
|
+
localNames: [ 's1', 's0' ],
|
936
|
+
globals: prng.globals,
|
937
|
+
globalNames: [ 'state0', 'state1' ],
|
938
|
+
globalInits: [ prngSeed0, prngSeed1 ],
|
939
|
+
returns: [ Valtype.i32 ],
|
940
|
+
wasm: [
|
941
|
+
...prng.wasm,
|
942
|
+
|
943
|
+
...(prng.returns === Valtype.i64 ? [
|
944
|
+
// the lowest bits of the output generated by xorshift128+ have low quality
|
945
|
+
...number(56, Valtype.i64),
|
946
|
+
[ Opcodes.i64_shr_u ],
|
947
|
+
|
948
|
+
[ Opcodes.i32_wrap_i64 ],
|
949
|
+
] : []),
|
950
|
+
|
951
|
+
...number(0xff, Valtype.i32),
|
952
|
+
[ Opcodes.i32_and ],
|
621
953
|
]
|
622
954
|
};
|
623
955
|
|
@@ -696,7 +1028,7 @@ export const BuiltinFuncs = function() {
|
|
696
1028
|
params: [ valtypeBinary ],
|
697
1029
|
locals: [],
|
698
1030
|
returns: [ valtypeBinary ],
|
699
|
-
returnType:
|
1031
|
+
returnType: TYPES.boolean,
|
700
1032
|
wasm: [
|
701
1033
|
[ Opcodes.local_get, 0 ],
|
702
1034
|
...number(0),
|
@@ -721,7 +1053,7 @@ export const BuiltinFuncs = function() {
|
|
721
1053
|
typedParams: true,
|
722
1054
|
locals: [ Valtype.i32, Valtype.i32 ],
|
723
1055
|
returns: [ valtypeBinary ],
|
724
|
-
returnType: Prefs.bytestring ?
|
1056
|
+
returnType: Prefs.bytestring ? TYPES._bytestring : TYPES.string,
|
725
1057
|
wasm: (scope, { TYPE_NAMES, typeSwitch, makeString }) => {
|
726
1058
|
const bc = {};
|
727
1059
|
for (const x in TYPE_NAMES) {
|
@@ -732,60 +1064,35 @@ export const BuiltinFuncs = function() {
|
|
732
1064
|
}
|
733
1065
|
};
|
734
1066
|
|
735
|
-
|
736
|
-
const out = [];
|
737
|
-
|
738
|
-
for (let i = 0; i < arr.length; i++) {
|
739
|
-
out.push(...getter, ...number(arr[i], valtype), valtype === Valtype.f64 ? [ Opcodes.f64_eq ] : [ Opcodes.i32_eq ]);
|
740
|
-
if (i !== 0) out.push([ Opcodes.i32_or ]);
|
741
|
-
}
|
742
|
-
|
743
|
-
return out;
|
744
|
-
};
|
745
|
-
|
746
|
-
this.__Porffor_ptr = {
|
1067
|
+
this.__Porffor_rawType = {
|
747
1068
|
params: [ valtypeBinary, Valtype.i32 ],
|
748
1069
|
typedParams: true,
|
749
|
-
locals: [
|
1070
|
+
locals: [],
|
750
1071
|
returns: [ valtypeBinary ],
|
751
|
-
wasm:
|
752
|
-
|
753
|
-
|
754
|
-
[ Opcodes.local_get, 0 ],
|
755
|
-
[ Opcodes.else ],
|
756
|
-
...number(NaN),
|
757
|
-
[ Opcodes.end ]
|
758
|
-
]
|
759
|
-
};
|
760
|
-
|
761
|
-
this.__Porffor_i32_ptr = {
|
762
|
-
params: [ Valtype.i32, Valtype.i32 ],
|
763
|
-
typedParams: true,
|
764
|
-
locals: [ Valtype.i32, Valtype.i32 ],
|
765
|
-
returns: [ Valtype.i32 ],
|
766
|
-
wasm: (scope, { TYPES }) => [
|
767
|
-
...localIsOneOf([ [ Opcodes.local_get, 1 ] ], [ TYPES.string, TYPES._array, TYPES._bytestring ], Valtype.i32),
|
768
|
-
[ Opcodes.if, Valtype.i32 ],
|
769
|
-
[ Opcodes.local_get, 0 ],
|
770
|
-
[ Opcodes.else ],
|
771
|
-
...number(-1, Valtype.i32),
|
772
|
-
[ Opcodes.end ]
|
1072
|
+
wasm: [
|
1073
|
+
[ Opcodes.local_get, 1 ],
|
1074
|
+
Opcodes.i32_from_u
|
773
1075
|
]
|
774
1076
|
};
|
775
1077
|
|
776
|
-
|
777
|
-
|
778
|
-
params: [ Valtype.i32 ],
|
1078
|
+
this.__Porffor_clone = {
|
1079
|
+
params: [ valtypeBinary, valtypeBinary ],
|
779
1080
|
locals: [],
|
780
|
-
returns: [
|
1081
|
+
returns: [],
|
781
1082
|
wasm: [
|
1083
|
+
// dst
|
1084
|
+
[ Opcodes.local_get, 1 ],
|
1085
|
+
Opcodes.i32_to_u,
|
1086
|
+
|
1087
|
+
// src
|
782
1088
|
[ Opcodes.local_get, 0 ],
|
1089
|
+
Opcodes.i32_to_u,
|
1090
|
+
|
1091
|
+
// size = pageSize
|
1092
|
+
...number(pageSize, Valtype.i32),
|
1093
|
+
[ ...Opcodes.memory_copy, 0x00, 0x00 ],
|
783
1094
|
]
|
784
1095
|
};
|
785
1096
|
|
786
|
-
|
787
|
-
const generated = new GeneratedBuiltins.BuiltinFuncs();
|
788
|
-
for (const x in generated) {
|
789
|
-
this[x] = generated[x];
|
790
|
-
}
|
1097
|
+
GeneratedBuiltins.BuiltinFuncs.call(this);
|
791
1098
|
};
|