porffor 0.2.0-623cdf0 → 0.2.0-69d30a8

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.
Files changed (53) hide show
  1. package/.vscode/launch.json +18 -0
  2. package/LICENSE +20 -20
  3. package/README.md +121 -83
  4. package/asur/README.md +2 -0
  5. package/asur/index.js +1262 -0
  6. package/byg/index.js +237 -0
  7. package/compiler/2c.js +12 -12
  8. package/compiler/{sections.js → assemble.js} +62 -14
  9. package/compiler/builtins/annexb_string.js +72 -0
  10. package/compiler/builtins/annexb_string.ts +19 -0
  11. package/compiler/builtins/array.ts +145 -0
  12. package/compiler/builtins/base64.ts +151 -0
  13. package/compiler/builtins/crypto.ts +120 -0
  14. package/compiler/builtins/escape.ts +141 -0
  15. package/compiler/builtins/int.ts +147 -0
  16. package/compiler/builtins/number.ts +527 -0
  17. package/compiler/builtins/porffor.d.ts +42 -0
  18. package/compiler/builtins/string.ts +1055 -0
  19. package/compiler/builtins/tostring.ts +45 -0
  20. package/compiler/builtins.js +443 -273
  21. package/compiler/{codeGen.js → codegen.js} +841 -337
  22. package/compiler/embedding.js +22 -22
  23. package/compiler/encoding.js +108 -10
  24. package/compiler/generated_builtins.js +695 -0
  25. package/compiler/index.js +25 -34
  26. package/compiler/log.js +6 -3
  27. package/compiler/opt.js +50 -36
  28. package/compiler/parse.js +35 -27
  29. package/compiler/precompile.js +123 -0
  30. package/compiler/prefs.js +26 -0
  31. package/compiler/prototype.js +13 -28
  32. package/compiler/types.js +37 -0
  33. package/compiler/wasmSpec.js +27 -8
  34. package/compiler/wrap.js +46 -44
  35. package/package.json +9 -5
  36. package/porf +4 -0
  37. package/rhemyn/compile.js +5 -3
  38. package/rhemyn/parse.js +323 -320
  39. package/rhemyn/test/parse.js +58 -58
  40. package/runner/compare.js +34 -34
  41. package/runner/debug.js +122 -0
  42. package/runner/index.js +35 -9
  43. package/runner/profiler.js +102 -0
  44. package/runner/repl.js +40 -7
  45. package/runner/sizes.js +37 -37
  46. package/test262_changes_from_1afe9b87d2_to_04-09.md +270 -0
  47. package/compiler/builtins/base64.js +0 -92
  48. package/filesize.cmd +0 -2
  49. package/runner/info.js +0 -89
  50. package/runner/profile.js +0 -46
  51. package/runner/results.json +0 -1
  52. package/runner/transform.js +0 -15
  53. package/util/enum.js +0 -20
@@ -1,5 +1,8 @@
1
1
  import { Blocktype, Opcodes, Valtype, ValtypeSize } from "./wasmSpec.js";
2
2
  import { number, i32x4 } from "./embedding.js";
3
+ import Prefs from './prefs.js';
4
+ import * as GeneratedBuiltins from './generated_builtins.js';
5
+ import { TYPES } from './types.js';
3
6
 
4
7
  export const importedFuncs = [
5
8
  {
@@ -19,6 +22,18 @@ export const importedFuncs = [
19
22
  import: 't',
20
23
  params: 0,
21
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
22
37
  }
23
38
  ];
24
39
 
@@ -50,10 +65,10 @@ export const NULL = 0;
50
65
 
51
66
  export const BuiltinVars = function() {
52
67
  this.undefined = number(UNDEFINED);
53
- this.undefined.type = 'undefined';
68
+ this.undefined.type = TYPES.undefined;
54
69
 
55
70
  this.null = number(NULL);
56
- this.null.type = 'object';
71
+ this.null.type = TYPES.object;
57
72
 
58
73
  this.NaN = number(NaN);
59
74
  this.NaN.floatOnly = true;
@@ -117,6 +132,14 @@ export const BuiltinVars = function() {
117
132
 
118
133
  // stubs just so that parent objects exist
119
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
+ }
120
143
  };
121
144
 
122
145
  export const BuiltinFuncs = function() {
@@ -175,9 +198,10 @@ export const BuiltinFuncs = function() {
175
198
  params: [ valtypeBinary ],
176
199
  locals: [],
177
200
  returns: [ valtypeBinary ],
178
- returnType: 'object',
201
+ returnType: TYPES.object,
179
202
  wasm: [
180
- [ Opcodes.local_get, 0 ]
203
+ // [ Opcodes.local_get, 0 ]
204
+ ...number(1)
181
205
  ]
182
206
  };
183
207
 
@@ -187,7 +211,7 @@ export const BuiltinFuncs = function() {
187
211
  typedParams: true,
188
212
  locals: [ Valtype.i32, Valtype.i32 ],
189
213
  returns: [],
190
- wasm: (scope, { TYPES, typeSwitch }) => [
214
+ wasm: (scope, { typeSwitch }) => [
191
215
  ...typeSwitch(scope, [ [ Opcodes.local_get, 1 ] ], {
192
216
  [TYPES.number]: [
193
217
  [ Opcodes.local_get, 0 ],
@@ -239,6 +263,40 @@ export const BuiltinFuncs = function() {
239
263
 
240
264
  [ Opcodes.end ]
241
265
  ],
266
+ [TYPES._bytestring]: [
267
+ // simply print a (byte)string :))
268
+ // cache input pointer as i32
269
+ [ Opcodes.local_get, 0 ],
270
+ Opcodes.i32_to_u,
271
+ [ Opcodes.local_tee, 2 ],
272
+
273
+ // make end pointer
274
+ [ Opcodes.i32_load, Math.log2(ValtypeSize.i32) - 1, 0 ],
275
+ [ Opcodes.local_get, 2 ],
276
+ [ Opcodes.i32_add ],
277
+ [ Opcodes.local_set, 3 ],
278
+
279
+ [ Opcodes.loop, Blocktype.void ],
280
+
281
+ // print current char
282
+ [ Opcodes.local_get, 2 ],
283
+ [ Opcodes.i32_load8_u, Math.log2(ValtypeSize.i16) - 1, ValtypeSize.i32 ],
284
+ Opcodes.i32_from_u,
285
+ [ Opcodes.call, importedFuncs.printChar ],
286
+
287
+ // increment pointer
288
+ [ Opcodes.local_get, 2 ],
289
+ [ Opcodes.i32_const, 1 ],
290
+ [ Opcodes.i32_add ],
291
+ [ Opcodes.local_tee, 2 ],
292
+
293
+ // if pointer != end pointer, loop
294
+ [ Opcodes.local_get, 3 ],
295
+ [ Opcodes.i32_ne ],
296
+ [ Opcodes.br_if, 0 ],
297
+
298
+ [ Opcodes.end ]
299
+ ],
242
300
  [TYPES._array]: [
243
301
  ...printStaticStr('[ '),
244
302
 
@@ -315,7 +373,7 @@ export const BuiltinFuncs = function() {
315
373
  params: [ valtypeBinary ],
316
374
  locals: [],
317
375
  returns: [ valtypeBinary ],
318
- returnType: 'boolean',
376
+ returnType: TYPES.boolean,
319
377
  wasm: [
320
378
  [ Opcodes.local_get, 0 ],
321
379
  [ Opcodes.local_get, 0 ],
@@ -330,7 +388,7 @@ export const BuiltinFuncs = function() {
330
388
  params: [ valtypeBinary ],
331
389
  locals: [ valtypeBinary ],
332
390
  returns: [ valtypeBinary ],
333
- returnType: 'boolean',
391
+ returnType: TYPES.boolean,
334
392
  wasm: [
335
393
  [ Opcodes.local_get, 0 ],
336
394
  [ Opcodes.local_get, 0 ],
@@ -349,7 +407,7 @@ export const BuiltinFuncs = function() {
349
407
  params: [ valtypeBinary ],
350
408
  locals: [],
351
409
  returns: [ valtypeBinary ],
352
- returnType: 'boolean',
410
+ returnType: TYPES.boolean,
353
411
  wasm: [
354
412
  [ Opcodes.local_get, 0 ],
355
413
  [ Opcodes.local_get, 0 ],
@@ -364,7 +422,7 @@ export const BuiltinFuncs = function() {
364
422
  params: [ valtypeBinary ],
365
423
  locals: [],
366
424
  returns: [ valtypeBinary ],
367
- returnType: 'boolean',
425
+ returnType: TYPES.boolean,
368
426
  wasm: [
369
427
  [ Opcodes.local_get, 0 ],
370
428
  [ Opcodes.local_get, 0 ],
@@ -504,61 +562,314 @@ export const BuiltinFuncs = function() {
504
562
 
505
563
  // this is an implementation of xorshift128+ (in wasm bytecode)
506
564
  // fun fact: v8, SM, JSC also use this (you will need this fun fact to maintain your sanity reading this code)
507
- 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}`);
508
858
 
509
859
  this.__Math_random = {
510
860
  floatOnly: true,
511
861
  params: [],
512
- locals: [ Valtype.i64, Valtype.i64 ],
862
+ locals: prng.locals,
513
863
  localNames: [ 's1', 's0' ],
514
- globals: [ Valtype.i64, Valtype.i64 ],
864
+ globals: prng.globals,
515
865
  globalNames: [ 'state0', 'state1' ],
516
866
  globalInits: [ prngSeed0, prngSeed1 ],
517
867
  returns: [ Valtype.f64 ],
518
868
  wasm: [
519
- // setup: s1 = state0, s0 = state1, state0 = s0
520
- [ Opcodes.global_get, 0 ], // state0
521
- [ Opcodes.local_tee, 0 ], // s1
522
- [ Opcodes.global_get, 1 ], // state1
523
- [ Opcodes.local_tee, 1, ], // s0
524
- [ Opcodes.global_set, 0 ], // state0
525
-
526
- // s1 ^= s1 << 23
527
- // [ Opcodes.local_get, 0 ], // s1
528
- [ Opcodes.local_get, 0 ], // s1
529
- [ Opcodes.i64_const, 23 ],
530
- [ Opcodes.i64_shl ], // <<
531
- [ Opcodes.i64_xor ], // ^
532
- [ Opcodes.local_set, 0 ], // s1
533
-
534
- // state1 = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26)
535
- // s1 ^ s0
536
- [ Opcodes.local_get, 0 ], // s1
537
- [ Opcodes.local_get, 1 ], // s0
538
- [ Opcodes.i64_xor ], // ^
539
-
540
- // ^ (s1 >> 17)
541
- [ Opcodes.local_get, 0 ], // s1
542
- [ Opcodes.i64_const, 17 ],
543
- [ Opcodes.i64_shr_u ], // >>
544
- [ Opcodes.i64_xor ], // ^
545
-
546
- // ^ (s0 >> 26)
547
- [ Opcodes.local_get, 1 ], // s0
548
- [ Opcodes.i64_const, 26 ],
549
- [ Opcodes.i64_shr_u ], // >>
550
- [ Opcodes.i64_xor ], // ^
551
-
552
- // state1 =
553
- [ Opcodes.global_set, 1 ],
869
+ ...prng.wasm,
554
870
 
555
871
  // you thought it was over? now we need the result as a f64 between 0-1 :)
556
872
 
557
- // state1 + s0
558
- [ Opcodes.global_get, 1 ], // state1
559
- [ Opcodes.local_get, 1 ], // s0
560
- [ Opcodes.i64_add ],
561
-
562
873
  // should we >> 12 here?
563
874
  // it feels like it but it breaks values
564
875
 
@@ -573,15 +884,72 @@ export const BuiltinFuncs = function() {
573
884
  // ...number(1),
574
885
  // [ Opcodes.f64_sub ],
575
886
 
576
- ...number((1 << 53) - 1, Valtype.i64),
577
- [ Opcodes.i64_and ],
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 ],
900
+
901
+ // double(mantissa)
902
+ [ Opcodes.f64_convert_i32_u ],
578
903
 
579
- // double(mantissa)
580
- [ Opcodes.f64_convert_i64_u ],
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
+ ] : []),
581
950
 
582
- // / (1 << 53)
583
- ...number(1 << 53),
584
- [ Opcodes.f64_div ]
951
+ ...number(0xff, Valtype.i32),
952
+ [ Opcodes.i32_and ],
585
953
  ]
586
954
  };
587
955
 
@@ -660,7 +1028,7 @@ export const BuiltinFuncs = function() {
660
1028
  params: [ valtypeBinary ],
661
1029
  locals: [],
662
1030
  returns: [ valtypeBinary ],
663
- returnType: 'boolean',
1031
+ returnType: TYPES.boolean,
664
1032
  wasm: [
665
1033
  [ Opcodes.local_get, 0 ],
666
1034
  ...number(0),
@@ -685,7 +1053,7 @@ export const BuiltinFuncs = function() {
685
1053
  typedParams: true,
686
1054
  locals: [ Valtype.i32, Valtype.i32 ],
687
1055
  returns: [ valtypeBinary ],
688
- returnType: process.argv.includes('-bytestring') ? '_bytestring' : 'string',
1056
+ returnType: Prefs.bytestring ? TYPES._bytestring : TYPES.string,
689
1057
  wasm: (scope, { TYPE_NAMES, typeSwitch, makeString }) => {
690
1058
  const bc = {};
691
1059
  for (const x in TYPE_NAMES) {
@@ -696,233 +1064,35 @@ export const BuiltinFuncs = function() {
696
1064
  }
697
1065
  };
698
1066
 
699
- const localIsOneOf = (getter, arr, valtype = valtypeBinary) => {
700
- const out = [];
701
-
702
- for (let i = 0; i < arr.length; i++) {
703
- out.push(...getter, ...number(arr[i], valtype), valtype === Valtype.f64 ? [ Opcodes.f64_eq ] : [ Opcodes.i32_eq ]);
704
- if (i !== 0) out.push([ Opcodes.i32_or ]);
705
- }
706
-
707
- return out;
708
- };
709
-
710
- this.__Porffor_pointer = {
1067
+ this.__Porffor_rawType = {
711
1068
  params: [ valtypeBinary, Valtype.i32 ],
712
1069
  typedParams: true,
713
- locals: [ Valtype.i32, Valtype.i32 ],
714
- returns: [ valtypeBinary ],
715
- wasm: (scope, { TYPES }) => [
716
- ...localIsOneOf([ [ Opcodes.local_get, 1 ] ], [ TYPES.string, TYPES._array, TYPES._bytestring ], Valtype.i32),
717
- [ Opcodes.if, valtypeBinary ],
718
- [ Opcodes.local_get, 0 ],
719
- [ Opcodes.else ],
720
- ...number(NaN),
721
- [ Opcodes.end ]
722
- ]
723
- };
724
-
725
-
726
- this.__SIMD_i32x4_load = {
727
- params: [ Valtype.i32 ],
728
- locals: [],
729
- returns: [ Valtype.v128 ],
730
- wasm: [
731
- [ Opcodes.local_get, 0 ],
732
- [ ...Opcodes.v128_load, 0, 0 ]
733
- ]
734
- };
735
-
736
- this.__SIMD_i32x4_splat = {
737
- params: [ Valtype.i32 ],
738
- locals: [],
739
- returns: [ Valtype.v128 ],
740
- wasm: [
741
- [ Opcodes.local_get, 0 ],
742
- [ ...Opcodes.i32x4_splat ],
743
- ]
744
- };
745
-
746
- this.__SIMD_i16x8_create = {
747
- params: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
748
- locals: [],
749
- returns: [ Valtype.v128 ],
750
- wasm: [
751
- ...i32x4(0, 0, 0, 0),
752
- [ Opcodes.local_get, 0 ],
753
- [ ...Opcodes.i16x8_replace_lane, 0 ],
754
- [ Opcodes.local_get, 1 ],
755
- [ ...Opcodes.i16x8_replace_lane, 1 ],
756
- [ Opcodes.local_get, 2 ],
757
- [ ...Opcodes.i16x8_replace_lane, 2 ],
758
- [ Opcodes.local_get, 3 ],
759
- [ ...Opcodes.i16x8_replace_lane, 3 ],
760
- [ Opcodes.local_get, 4 ],
761
- [ ...Opcodes.i16x8_replace_lane, 4 ],
762
- [ Opcodes.local_get, 5 ],
763
- [ ...Opcodes.i16x8_replace_lane, 5 ],
764
- [ Opcodes.local_get, 6 ],
765
- [ ...Opcodes.i16x8_replace_lane, 6 ],
766
- [ Opcodes.local_get, 7 ],
767
- [ ...Opcodes.i16x8_replace_lane, 7 ],
768
- ]
769
- };
770
-
771
- this.__SIMD_i32x4_dot_i16x8 = {
772
- params: [ Valtype.v128, Valtype.v128 ],
773
1070
  locals: [],
774
- returns: [ Valtype.v128 ],
775
- wasm: [
776
- [ Opcodes.local_get, 0 ],
777
- [ Opcodes.local_get, 1 ],
778
- [ ...Opcodes.i32x4_dot_i16x8_s ]
779
- ]
780
- };
781
-
782
- this.__SIMD_i32x4_create = {
783
- params: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
784
- locals: [],
785
- returns: [ Valtype.v128 ],
786
- wasm: [
787
- ...i32x4(0, 0, 0, 0),
788
- [ Opcodes.local_get, 0 ],
789
- [ ...Opcodes.i32x4_replace_lane, 0 ],
790
- [ Opcodes.local_get, 1 ],
791
- [ ...Opcodes.i32x4_replace_lane, 1 ],
792
- [ Opcodes.local_get, 2 ],
793
- [ ...Opcodes.i32x4_replace_lane, 2 ],
794
- [ Opcodes.local_get, 3 ],
795
- [ ...Opcodes.i32x4_replace_lane, 3 ],
796
- ]
797
- };
798
-
799
- this.__SIMD_i32x4_add = {
800
- params: [ Valtype.v128, Valtype.v128 ],
801
- locals: [],
802
- returns: [ Valtype.v128 ],
803
- wasm: [
804
- [ Opcodes.local_get, 0 ],
805
- [ Opcodes.local_get, 1 ],
806
- [ ...Opcodes.i32x4_add ]
807
- ]
808
- };
809
-
810
- this.__SIMD_i32x4_sub = {
811
- params: [ Valtype.v128, Valtype.v128 ],
812
- locals: [],
813
- returns: [ Valtype.v128 ],
1071
+ returns: [ valtypeBinary ],
814
1072
  wasm: [
815
- [ Opcodes.local_get, 0 ],
816
1073
  [ Opcodes.local_get, 1 ],
817
- [ ...Opcodes.i32x4_sub ]
1074
+ Opcodes.i32_from_u
818
1075
  ]
819
1076
  };
820
1077
 
821
- this.__SIMD_i32x4_mul = {
822
- params: [ Valtype.v128, Valtype.v128 ],
1078
+ this.__Porffor_clone = {
1079
+ params: [ valtypeBinary, valtypeBinary ],
823
1080
  locals: [],
824
- returns: [ Valtype.v128 ],
1081
+ returns: [],
825
1082
  wasm: [
826
- [ Opcodes.local_get, 0 ],
1083
+ // dst
827
1084
  [ Opcodes.local_get, 1 ],
828
- [ ...Opcodes.i32x4_mul ]
829
- ]
830
- };
831
-
832
- this.__SIMD_i32x4_get0 = {
833
- params: [ Valtype.v128 ],
834
- locals: [],
835
- returns: [ Valtype.i32 ],
836
- wasm: [
837
- [ Opcodes.local_get, 0 ],
838
- [ ...Opcodes.i32x4_extract_lane, 0 ],
839
- ],
840
- },
841
-
842
- this.__SIMD_i32x4_get1 = {
843
- params: [ Valtype.v128 ],
844
- locals: [],
845
- returns: [ Valtype.i32 ],
846
- wasm: [
847
- [ Opcodes.local_get, 0 ],
848
- [ ...Opcodes.i32x4_extract_lane, 1 ],
849
- ],
850
- };
851
-
852
- this.__SIMD_i32x4_get2 = {
853
- params: [ Valtype.v128 ],
854
- locals: [],
855
- returns: [ Valtype.i32 ],
856
- wasm: [
857
- [ Opcodes.local_get, 0 ],
858
- [ ...Opcodes.i32x4_extract_lane, 2 ],
859
- ],
860
- };
1085
+ Opcodes.i32_to_u,
861
1086
 
862
- this.__SIMD_i32x4_get3 = {
863
- params: [ Valtype.v128 ],
864
- locals: [],
865
- returns: [ Valtype.i32 ],
866
- wasm: [
867
- [ Opcodes.local_get, 0 ],
868
- [ ...Opcodes.i32x4_extract_lane, 3 ],
869
- ],
870
- };
871
-
872
- this.__SIMD_i32x4_shuffle_000c = {
873
- params: [ Valtype.v128 ],
874
- locals: [],
875
- returns: [ Valtype.v128 ],
876
- wasm: [
1087
+ // src
877
1088
  [ Opcodes.local_get, 0 ],
878
- ...i32x4(0, 0, 0, 0),
879
- [ ...Opcodes.i8x16_shuffle, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 9, 10, 11 ], // i32x4 (a, b, c, d) -> i32x4 (0, 0, 0, c)
880
- ]
881
- };
1089
+ Opcodes.i32_to_u,
882
1090
 
883
- this.__SIMD_i32x4_shuffle_00ab = {
884
- params: [ Valtype.v128 ],
885
- locals: [],
886
- returns: [ Valtype.v128 ],
887
- wasm: [
888
- [ Opcodes.local_get, 0 ],
889
- ...i32x4(0, 0, 0, 0),
890
- [ ...Opcodes.i8x16_shuffle, 16, 16, 16, 16, 16, 16, 16, 16, 0, 1, 2, 3, 4, 5, 6, 7 ], // i32x4 (a, b, c, d) -> i32x4 (0, 0, a, b)
1091
+ // size = pageSize
1092
+ ...number(pageSize, Valtype.i32),
1093
+ [ ...Opcodes.memory_copy, 0x00, 0x00 ],
891
1094
  ]
892
1095
  };
893
- };
894
-
895
- export const BuiltinPreludes = {
896
- btoa: `var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
897
- var btoa = function (input) {
898
- // todo: throw invalid character for unicode
899
-
900
- let output = "";
901
- let chr1, chr2, chr3, enc1, enc2, enc3, enc4;
902
- let i = 0;
903
-
904
- while (i < input.length) {
905
- chr1 = input.charCodeAt(i++);
906
- chr2 = input.charCodeAt(i++);
907
- chr3 = input.charCodeAt(i++);
908
-
909
- enc1 = chr1 >> 2;
910
- enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
911
- enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
912
- enc4 = chr3 & 63;
913
-
914
- if (isNaN(chr2)) {
915
- enc3 = enc4 = 64;
916
- } else if (isNaN(chr3)) {
917
- enc4 = 64;
918
- }
919
-
920
- output += keyStr.charAt(enc1);
921
- output += keyStr.charAt(enc2);
922
- output += keyStr.charAt(enc3);
923
- output += keyStr.charAt(enc4);
924
- }
925
1096
 
926
- return output;
927
- };`
1097
+ GeneratedBuiltins.BuiltinFuncs.call(this);
928
1098
  };