porffor 0.2.0-6aff0fa → 0.2.0-767de65
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 +54 -41
- package/asur/index.js +624 -340
- 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 +3 -5
- 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 +27 -8
- package/compiler/builtins/string.ts +1055 -0
- package/compiler/builtins/tostring.ts +45 -0
- package/compiler/builtins.js +405 -108
- package/compiler/{codeGen.js → codegen.js} +654 -246
- package/compiler/embedding.js +22 -22
- package/compiler/encoding.js +108 -10
- package/compiler/generated_builtins.js +682 -2
- package/compiler/index.js +16 -14
- package/compiler/log.js +2 -2
- 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 +13 -1
- package/compiler/wrap.js +36 -42
- package/empty.js +0 -0
- package/hello.js +2 -0
- 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 +26 -10
- package/runner/profiler.js +45 -26
- package/runner/repl.js +40 -7
- package/runner/sizes.js +37 -37
- package/test262_changes_from_1afe9b87d2_to_04-09.md +270 -0
- package/runner/info.js +0 -89
- package/runner/transform.js +0 -15
- 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
|
{
|
@@ -23,12 +24,18 @@ export const importedFuncs = [
|
|
23
24
|
returns: 1
|
24
25
|
},
|
25
26
|
{
|
26
|
-
name: '
|
27
|
+
name: 'profile1',
|
28
|
+
import: 'y',
|
29
|
+
params: 1,
|
30
|
+
returns: 0
|
31
|
+
},
|
32
|
+
{
|
33
|
+
name: 'profile2',
|
27
34
|
import: 'z',
|
28
35
|
params: 1,
|
29
36
|
returns: 0
|
30
37
|
}
|
31
|
-
]
|
38
|
+
];
|
32
39
|
|
33
40
|
for (let i = 0; i < importedFuncs.length; i++) {
|
34
41
|
const f = importedFuncs[i];
|
@@ -58,10 +65,10 @@ export const NULL = 0;
|
|
58
65
|
|
59
66
|
export const BuiltinVars = function() {
|
60
67
|
this.undefined = number(UNDEFINED);
|
61
|
-
this.undefined.type =
|
68
|
+
this.undefined.type = TYPES.undefined;
|
62
69
|
|
63
70
|
this.null = number(NULL);
|
64
|
-
this.null.type =
|
71
|
+
this.null.type = TYPES.object;
|
65
72
|
|
66
73
|
this.NaN = number(NaN);
|
67
74
|
this.NaN.floatOnly = true;
|
@@ -128,7 +135,11 @@ export const BuiltinVars = function() {
|
|
128
135
|
|
129
136
|
// wintercg(tm)
|
130
137
|
this.__navigator_userAgent = (scope, { makeString }) => makeString(scope, `Porffor/0.2.0`, false, '__navigator_userAgent');
|
131
|
-
this.__navigator_userAgent.type = Prefs.bytestring ?
|
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
|
+
}
|
132
143
|
};
|
133
144
|
|
134
145
|
export const BuiltinFuncs = function() {
|
@@ -187,9 +198,10 @@ export const BuiltinFuncs = function() {
|
|
187
198
|
params: [ valtypeBinary ],
|
188
199
|
locals: [],
|
189
200
|
returns: [ valtypeBinary ],
|
190
|
-
returnType:
|
201
|
+
returnType: TYPES.object,
|
191
202
|
wasm: [
|
192
|
-
[ Opcodes.local_get, 0 ]
|
203
|
+
// [ Opcodes.local_get, 0 ]
|
204
|
+
...number(1)
|
193
205
|
]
|
194
206
|
};
|
195
207
|
|
@@ -199,7 +211,7 @@ export const BuiltinFuncs = function() {
|
|
199
211
|
typedParams: true,
|
200
212
|
locals: [ Valtype.i32, Valtype.i32 ],
|
201
213
|
returns: [],
|
202
|
-
wasm: (scope, {
|
214
|
+
wasm: (scope, { typeSwitch }) => [
|
203
215
|
...typeSwitch(scope, [ [ Opcodes.local_get, 1 ] ], {
|
204
216
|
[TYPES.number]: [
|
205
217
|
[ Opcodes.local_get, 0 ],
|
@@ -361,7 +373,7 @@ export const BuiltinFuncs = function() {
|
|
361
373
|
params: [ valtypeBinary ],
|
362
374
|
locals: [],
|
363
375
|
returns: [ valtypeBinary ],
|
364
|
-
returnType:
|
376
|
+
returnType: TYPES.boolean,
|
365
377
|
wasm: [
|
366
378
|
[ Opcodes.local_get, 0 ],
|
367
379
|
[ Opcodes.local_get, 0 ],
|
@@ -376,7 +388,7 @@ export const BuiltinFuncs = function() {
|
|
376
388
|
params: [ valtypeBinary ],
|
377
389
|
locals: [ valtypeBinary ],
|
378
390
|
returns: [ valtypeBinary ],
|
379
|
-
returnType:
|
391
|
+
returnType: TYPES.boolean,
|
380
392
|
wasm: [
|
381
393
|
[ Opcodes.local_get, 0 ],
|
382
394
|
[ Opcodes.local_get, 0 ],
|
@@ -395,7 +407,7 @@ export const BuiltinFuncs = function() {
|
|
395
407
|
params: [ valtypeBinary ],
|
396
408
|
locals: [],
|
397
409
|
returns: [ valtypeBinary ],
|
398
|
-
returnType:
|
410
|
+
returnType: TYPES.boolean,
|
399
411
|
wasm: [
|
400
412
|
[ Opcodes.local_get, 0 ],
|
401
413
|
[ Opcodes.local_get, 0 ],
|
@@ -410,7 +422,7 @@ export const BuiltinFuncs = function() {
|
|
410
422
|
params: [ valtypeBinary ],
|
411
423
|
locals: [],
|
412
424
|
returns: [ valtypeBinary ],
|
413
|
-
returnType:
|
425
|
+
returnType: TYPES.boolean,
|
414
426
|
wasm: [
|
415
427
|
[ Opcodes.local_get, 0 ],
|
416
428
|
[ Opcodes.local_get, 0 ],
|
@@ -550,61 +562,314 @@ export const BuiltinFuncs = function() {
|
|
550
562
|
|
551
563
|
// this is an implementation of xorshift128+ (in wasm bytecode)
|
552
564
|
// fun fact: v8, SM, JSC also use this (you will need this fun fact to maintain your sanity reading this code)
|
553
|
-
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}`);
|
554
858
|
|
555
859
|
this.__Math_random = {
|
556
860
|
floatOnly: true,
|
557
861
|
params: [],
|
558
|
-
locals:
|
862
|
+
locals: prng.locals,
|
559
863
|
localNames: [ 's1', 's0' ],
|
560
|
-
globals:
|
864
|
+
globals: prng.globals,
|
561
865
|
globalNames: [ 'state0', 'state1' ],
|
562
866
|
globalInits: [ prngSeed0, prngSeed1 ],
|
563
867
|
returns: [ Valtype.f64 ],
|
564
868
|
wasm: [
|
565
|
-
|
566
|
-
[ Opcodes.global_get, 0 ], // state0
|
567
|
-
[ Opcodes.local_tee, 0 ], // s1
|
568
|
-
[ Opcodes.global_get, 1 ], // state1
|
569
|
-
[ Opcodes.local_tee, 1, ], // s0
|
570
|
-
[ Opcodes.global_set, 0 ], // state0
|
571
|
-
|
572
|
-
// s1 ^= s1 << 23
|
573
|
-
// [ Opcodes.local_get, 0 ], // s1
|
574
|
-
[ Opcodes.local_get, 0 ], // s1
|
575
|
-
[ Opcodes.i64_const, 23 ],
|
576
|
-
[ Opcodes.i64_shl ], // <<
|
577
|
-
[ Opcodes.i64_xor ], // ^
|
578
|
-
[ Opcodes.local_set, 0 ], // s1
|
579
|
-
|
580
|
-
// state1 = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26)
|
581
|
-
// s1 ^ s0
|
582
|
-
[ Opcodes.local_get, 0 ], // s1
|
583
|
-
[ Opcodes.local_get, 1 ], // s0
|
584
|
-
[ Opcodes.i64_xor ], // ^
|
585
|
-
|
586
|
-
// ^ (s1 >> 17)
|
587
|
-
[ Opcodes.local_get, 0 ], // s1
|
588
|
-
[ Opcodes.i64_const, 17 ],
|
589
|
-
[ Opcodes.i64_shr_u ], // >>
|
590
|
-
[ Opcodes.i64_xor ], // ^
|
591
|
-
|
592
|
-
// ^ (s0 >> 26)
|
593
|
-
[ Opcodes.local_get, 1 ], // s0
|
594
|
-
[ Opcodes.i64_const, 26 ],
|
595
|
-
[ Opcodes.i64_shr_u ], // >>
|
596
|
-
[ Opcodes.i64_xor ], // ^
|
597
|
-
|
598
|
-
// state1 =
|
599
|
-
[ Opcodes.global_set, 1 ],
|
869
|
+
...prng.wasm,
|
600
870
|
|
601
871
|
// you thought it was over? now we need the result as a f64 between 0-1 :)
|
602
872
|
|
603
|
-
// state1 + s0
|
604
|
-
[ Opcodes.global_get, 1 ], // state1
|
605
|
-
[ Opcodes.local_get, 1 ], // s0
|
606
|
-
[ Opcodes.i64_add ],
|
607
|
-
|
608
873
|
// should we >> 12 here?
|
609
874
|
// it feels like it but it breaks values
|
610
875
|
|
@@ -619,15 +884,72 @@ export const BuiltinFuncs = function() {
|
|
619
884
|
// ...number(1),
|
620
885
|
// [ Opcodes.f64_sub ],
|
621
886
|
|
622
|
-
...
|
623
|
-
|
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 ],
|
624
893
|
|
625
|
-
|
626
|
-
|
894
|
+
// / (1 << 53)
|
895
|
+
...number(1 << 53),
|
896
|
+
[ Opcodes.f64_div ]
|
897
|
+
] : [
|
898
|
+
...number((1 << 21) - 1, Valtype.i32),
|
899
|
+
[ Opcodes.i32_and ],
|
627
900
|
|
628
|
-
|
629
|
-
|
630
|
-
|
901
|
+
// double(mantissa)
|
902
|
+
[ Opcodes.f64_convert_i32_u ],
|
903
|
+
|
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 ],
|
631
953
|
]
|
632
954
|
};
|
633
955
|
|
@@ -706,7 +1028,7 @@ export const BuiltinFuncs = function() {
|
|
706
1028
|
params: [ valtypeBinary ],
|
707
1029
|
locals: [],
|
708
1030
|
returns: [ valtypeBinary ],
|
709
|
-
returnType:
|
1031
|
+
returnType: TYPES.boolean,
|
710
1032
|
wasm: [
|
711
1033
|
[ Opcodes.local_get, 0 ],
|
712
1034
|
...number(0),
|
@@ -731,7 +1053,7 @@ export const BuiltinFuncs = function() {
|
|
731
1053
|
typedParams: true,
|
732
1054
|
locals: [ Valtype.i32, Valtype.i32 ],
|
733
1055
|
returns: [ valtypeBinary ],
|
734
|
-
returnType: Prefs.bytestring ?
|
1056
|
+
returnType: Prefs.bytestring ? TYPES._bytestring : TYPES.string,
|
735
1057
|
wasm: (scope, { TYPE_NAMES, typeSwitch, makeString }) => {
|
736
1058
|
const bc = {};
|
737
1059
|
for (const x in TYPE_NAMES) {
|
@@ -742,60 +1064,35 @@ export const BuiltinFuncs = function() {
|
|
742
1064
|
}
|
743
1065
|
};
|
744
1066
|
|
745
|
-
|
746
|
-
const out = [];
|
747
|
-
|
748
|
-
for (let i = 0; i < arr.length; i++) {
|
749
|
-
out.push(...getter, ...number(arr[i], valtype), valtype === Valtype.f64 ? [ Opcodes.f64_eq ] : [ Opcodes.i32_eq ]);
|
750
|
-
if (i !== 0) out.push([ Opcodes.i32_or ]);
|
751
|
-
}
|
752
|
-
|
753
|
-
return out;
|
754
|
-
};
|
755
|
-
|
756
|
-
this.__Porffor_ptr = {
|
1067
|
+
this.__Porffor_rawType = {
|
757
1068
|
params: [ valtypeBinary, Valtype.i32 ],
|
758
1069
|
typedParams: true,
|
759
|
-
locals: [
|
1070
|
+
locals: [],
|
760
1071
|
returns: [ valtypeBinary ],
|
761
|
-
wasm:
|
762
|
-
|
763
|
-
|
764
|
-
[ Opcodes.local_get, 0 ],
|
765
|
-
[ Opcodes.else ],
|
766
|
-
...number(NaN),
|
767
|
-
[ Opcodes.end ]
|
768
|
-
]
|
769
|
-
};
|
770
|
-
|
771
|
-
this.__Porffor_i32_ptr = {
|
772
|
-
params: [ Valtype.i32, Valtype.i32 ],
|
773
|
-
typedParams: true,
|
774
|
-
locals: [ Valtype.i32, Valtype.i32 ],
|
775
|
-
returns: [ Valtype.i32 ],
|
776
|
-
wasm: (scope, { TYPES }) => [
|
777
|
-
...localIsOneOf([ [ Opcodes.local_get, 1 ] ], [ TYPES.string, TYPES._array, TYPES._bytestring ], Valtype.i32),
|
778
|
-
[ Opcodes.if, Valtype.i32 ],
|
779
|
-
[ Opcodes.local_get, 0 ],
|
780
|
-
[ Opcodes.else ],
|
781
|
-
...number(-1, Valtype.i32),
|
782
|
-
[ Opcodes.end ]
|
1072
|
+
wasm: [
|
1073
|
+
[ Opcodes.local_get, 1 ],
|
1074
|
+
Opcodes.i32_from_u
|
783
1075
|
]
|
784
1076
|
};
|
785
1077
|
|
786
|
-
|
787
|
-
|
788
|
-
params: [ Valtype.i32 ],
|
1078
|
+
this.__Porffor_clone = {
|
1079
|
+
params: [ valtypeBinary, valtypeBinary ],
|
789
1080
|
locals: [],
|
790
|
-
returns: [
|
1081
|
+
returns: [],
|
791
1082
|
wasm: [
|
1083
|
+
// dst
|
1084
|
+
[ Opcodes.local_get, 1 ],
|
1085
|
+
Opcodes.i32_to_u,
|
1086
|
+
|
1087
|
+
// src
|
792
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 ],
|
793
1094
|
]
|
794
1095
|
};
|
795
1096
|
|
796
|
-
|
797
|
-
const generated = new GeneratedBuiltins.BuiltinFuncs();
|
798
|
-
for (const x in generated) {
|
799
|
-
this[x] = generated[x];
|
800
|
-
}
|
1097
|
+
GeneratedBuiltins.BuiltinFuncs.call(this);
|
801
1098
|
};
|