porffor 0.2.0-fde989a → 0.2.0-fdf0fc5

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 (58) hide show
  1. package/CONTRIBUTING.md +256 -0
  2. package/LICENSE +20 -20
  3. package/README.md +123 -85
  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 +1 -1
  8. package/compiler/{sections.js → assemble.js} +63 -15
  9. package/compiler/builtins/annexb_string.js +72 -0
  10. package/compiler/builtins/annexb_string.ts +18 -0
  11. package/compiler/builtins/array.ts +149 -0
  12. package/compiler/builtins/base64.ts +76 -0
  13. package/compiler/builtins/boolean.ts +20 -0
  14. package/compiler/builtins/crypto.ts +120 -0
  15. package/compiler/builtins/date.ts +2070 -0
  16. package/compiler/builtins/escape.ts +141 -0
  17. package/compiler/builtins/function.ts +7 -0
  18. package/compiler/builtins/int.ts +147 -0
  19. package/compiler/builtins/number.ts +534 -0
  20. package/compiler/builtins/object.ts +6 -0
  21. package/compiler/builtins/porffor.d.ts +59 -0
  22. package/compiler/builtins/set.ts +5 -0
  23. package/compiler/builtins/string.ts +1080 -0
  24. package/compiler/builtins.js +435 -279
  25. package/compiler/{codeGen.js → codegen.js} +1034 -404
  26. package/compiler/decompile.js +0 -1
  27. package/compiler/embedding.js +22 -22
  28. package/compiler/encoding.js +108 -10
  29. package/compiler/generated_builtins.js +1526 -0
  30. package/compiler/index.js +25 -34
  31. package/compiler/log.js +6 -3
  32. package/compiler/opt.js +50 -36
  33. package/compiler/parse.js +33 -23
  34. package/compiler/precompile.js +128 -0
  35. package/compiler/prefs.js +27 -0
  36. package/compiler/prototype.js +27 -42
  37. package/compiler/types.js +38 -0
  38. package/compiler/wasmSpec.js +28 -8
  39. package/compiler/wrap.js +51 -46
  40. package/package.json +9 -5
  41. package/porf +2 -0
  42. package/rhemyn/compile.js +46 -27
  43. package/rhemyn/parse.js +322 -320
  44. package/rhemyn/test/parse.js +58 -58
  45. package/runner/compare.js +34 -34
  46. package/runner/debug.js +122 -0
  47. package/runner/index.js +78 -11
  48. package/runner/profiler.js +102 -0
  49. package/runner/repl.js +42 -9
  50. package/runner/sizes.js +37 -37
  51. package/compiler/builtins/base64.js +0 -92
  52. package/filesize.cmd +0 -2
  53. package/runner/info.js +0 -89
  54. package/runner/profile.js +0 -46
  55. package/runner/results.json +0 -1
  56. package/runner/transform.js +0 -15
  57. package/tmp.c +0 -661
  58. 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,24 @@ export const importedFuncs = [
19
22
  import: 't',
20
23
  params: 0,
21
24
  returns: 1
25
+ },
26
+ {
27
+ name: 'timeOrigin',
28
+ import: 'u',
29
+ params: 0,
30
+ returns: 1
31
+ },
32
+ {
33
+ name: 'profile1',
34
+ import: 'y',
35
+ params: 1,
36
+ returns: 0
37
+ },
38
+ {
39
+ name: 'profile2',
40
+ import: 'z',
41
+ params: 1,
42
+ returns: 0
22
43
  }
23
44
  ];
24
45
 
@@ -50,10 +71,10 @@ export const NULL = 0;
50
71
 
51
72
  export const BuiltinVars = function() {
52
73
  this.undefined = number(UNDEFINED);
53
- this.undefined.type = 'undefined';
74
+ this.undefined.type = TYPES.undefined;
54
75
 
55
76
  this.null = number(NULL);
56
- this.null.type = 'object';
77
+ this.null.type = TYPES.object;
57
78
 
58
79
  this.NaN = number(NaN);
59
80
  this.NaN.floatOnly = true;
@@ -117,6 +138,18 @@ export const BuiltinVars = function() {
117
138
 
118
139
  // stubs just so that parent objects exist
119
140
  this.Math = number(1);
141
+
142
+ // wintercg(tm)
143
+ this.__navigator_userAgent = (scope, { makeString }) => makeString(scope, `Porffor/0.2.0`, false, '__navigator_userAgent');
144
+ this.__navigator_userAgent.type = Prefs.bytestring ? TYPES.bytestring : TYPES.string;
145
+
146
+ for (const x in TYPES) {
147
+ this['__Porffor_TYPES_' + x] = number(TYPES[x]);
148
+ }
149
+
150
+ this.__performance_timeOrigin = [
151
+ [ Opcodes.call, importedFuncs.timeOrigin ]
152
+ ];
120
153
  };
121
154
 
122
155
  export const BuiltinFuncs = function() {
@@ -175,19 +208,20 @@ export const BuiltinFuncs = function() {
175
208
  params: [ valtypeBinary ],
176
209
  locals: [],
177
210
  returns: [ valtypeBinary ],
178
- returnType: 'object',
211
+ returnType: TYPES.object,
179
212
  wasm: [
180
- [ Opcodes.local_get, 0 ]
213
+ // [ Opcodes.local_get, 0 ]
214
+ ...number(1)
181
215
  ]
182
216
  };
183
217
 
184
218
 
185
- this.__console_log = {
219
+ this.__Porffor_print = {
186
220
  params: [ valtypeBinary, Valtype.i32 ],
187
221
  typedParams: true,
188
222
  locals: [ Valtype.i32, Valtype.i32 ],
189
223
  returns: [],
190
- wasm: (scope, { TYPES, typeSwitch }) => [
224
+ wasm: (scope, { typeSwitch }) => [
191
225
  ...typeSwitch(scope, [ [ Opcodes.local_get, 1 ] ], {
192
226
  [TYPES.number]: [
193
227
  [ Opcodes.local_get, 0 ],
@@ -239,7 +273,41 @@ export const BuiltinFuncs = function() {
239
273
 
240
274
  [ Opcodes.end ]
241
275
  ],
242
- [TYPES._array]: [
276
+ [TYPES.bytestring]: [
277
+ // simply print a (byte)string :))
278
+ // cache input pointer as i32
279
+ [ Opcodes.local_get, 0 ],
280
+ Opcodes.i32_to_u,
281
+ [ Opcodes.local_tee, 2 ],
282
+
283
+ // make end pointer
284
+ [ Opcodes.i32_load, Math.log2(ValtypeSize.i32) - 1, 0 ],
285
+ [ Opcodes.local_get, 2 ],
286
+ [ Opcodes.i32_add ],
287
+ [ Opcodes.local_set, 3 ],
288
+
289
+ [ Opcodes.loop, Blocktype.void ],
290
+
291
+ // print current char
292
+ [ Opcodes.local_get, 2 ],
293
+ [ Opcodes.i32_load8_u, Math.log2(ValtypeSize.i16) - 1, ValtypeSize.i32 ],
294
+ Opcodes.i32_from_u,
295
+ [ Opcodes.call, importedFuncs.printChar ],
296
+
297
+ // increment pointer
298
+ [ Opcodes.local_get, 2 ],
299
+ [ Opcodes.i32_const, 1 ],
300
+ [ Opcodes.i32_add ],
301
+ [ Opcodes.local_tee, 2 ],
302
+
303
+ // if pointer != end pointer, loop
304
+ [ Opcodes.local_get, 3 ],
305
+ [ Opcodes.i32_ne ],
306
+ [ Opcodes.br_if, 0 ],
307
+
308
+ [ Opcodes.end ]
309
+ ],
310
+ [TYPES.array]: [
243
311
  ...printStaticStr('[ '),
244
312
 
245
313
  // cache input pointer as i32
@@ -300,10 +368,7 @@ export const BuiltinFuncs = function() {
300
368
  [ Opcodes.local_get, 0 ],
301
369
  [ Opcodes.call, importedFuncs.print ],
302
370
  ]
303
- }, Blocktype.void),
304
-
305
- ...char('\n'),
306
- [ Opcodes.call, importedFuncs.printChar ]
371
+ }, Blocktype.void)
307
372
  ]
308
373
  };
309
374
 
@@ -315,7 +380,7 @@ export const BuiltinFuncs = function() {
315
380
  params: [ valtypeBinary ],
316
381
  locals: [],
317
382
  returns: [ valtypeBinary ],
318
- returnType: 'boolean',
383
+ returnType: TYPES.boolean,
319
384
  wasm: [
320
385
  [ Opcodes.local_get, 0 ],
321
386
  [ Opcodes.local_get, 0 ],
@@ -330,7 +395,7 @@ export const BuiltinFuncs = function() {
330
395
  params: [ valtypeBinary ],
331
396
  locals: [ valtypeBinary ],
332
397
  returns: [ valtypeBinary ],
333
- returnType: 'boolean',
398
+ returnType: TYPES.boolean,
334
399
  wasm: [
335
400
  [ Opcodes.local_get, 0 ],
336
401
  [ Opcodes.local_get, 0 ],
@@ -349,7 +414,7 @@ export const BuiltinFuncs = function() {
349
414
  params: [ valtypeBinary ],
350
415
  locals: [],
351
416
  returns: [ valtypeBinary ],
352
- returnType: 'boolean',
417
+ returnType: TYPES.boolean,
353
418
  wasm: [
354
419
  [ Opcodes.local_get, 0 ],
355
420
  [ Opcodes.local_get, 0 ],
@@ -364,7 +429,7 @@ export const BuiltinFuncs = function() {
364
429
  params: [ valtypeBinary ],
365
430
  locals: [],
366
431
  returns: [ valtypeBinary ],
367
- returnType: 'boolean',
432
+ returnType: TYPES.boolean,
368
433
  wasm: [
369
434
  [ Opcodes.local_get, 0 ],
370
435
  [ Opcodes.local_get, 0 ],
@@ -504,61 +569,314 @@ export const BuiltinFuncs = function() {
504
569
 
505
570
  // this is an implementation of xorshift128+ (in wasm bytecode)
506
571
  // 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);
572
+ // const prngSeed0 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER), prngSeed1 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
573
+ const prngSeed0 = (Math.random() * (2 ** 30)) | 0, prngSeed1 = (Math.random() * (2 ** 30)) | 0;
574
+
575
+ const prng = ({
576
+ 'lcg32_glibc': {
577
+ globals: [ Valtype.i32 ],
578
+ locals: [],
579
+ returns: Valtype.i32,
580
+ wasm: [
581
+ // seed = (MULTIPLIER * seed + INCREMENT) % MODULUS
582
+ // MULTIPLIER * state0
583
+ [ Opcodes.global_get, 0 ],
584
+ ...number(1103515245, Valtype.i32),
585
+ [ Opcodes.i32_mul ],
586
+
587
+ // + INCREMENT
588
+ ...number(12345, Valtype.i32),
589
+ [ Opcodes.i32_add ],
590
+
591
+ // % MODULUS
592
+ ...number(2 ** 31, Valtype.i32),
593
+ [ Opcodes.i32_rem_s ],
594
+
595
+ // state0 =
596
+ [ Opcodes.global_set, 0 ],
597
+
598
+ // state0
599
+ [ Opcodes.global_get, 0 ],
600
+ ],
601
+ },
602
+ 'lcg32_minstd': {
603
+ globals: [ Valtype.i32 ],
604
+ locals: [],
605
+ returns: Valtype.i32,
606
+ wasm: [
607
+ // seed = (MULTIPLIER * seed + INCREMENT) % MODULUS
608
+ // MULTIPLIER * state0
609
+ [ Opcodes.global_get, 0 ],
610
+ ...number(48271, Valtype.i32),
611
+ [ Opcodes.i32_mul ],
612
+
613
+ // % MODULUS
614
+ ...number((2 ** 31) - 1, Valtype.i32),
615
+ [ Opcodes.i32_rem_s ],
616
+
617
+ // state0 =
618
+ [ Opcodes.global_set, 0 ],
619
+
620
+ // state0
621
+ [ Opcodes.global_get, 0 ],
622
+ ],
623
+ },
624
+ 'lcg64_musl': 0, // todo
625
+
626
+ 'xorshift32+': {
627
+ globals: [ Valtype.i32 ],
628
+ locals: [ Valtype.i32 ],
629
+ returns: Valtype.i32,
630
+ wasm: [
631
+ // setup: s1 = state0
632
+ [ Opcodes.global_get, 0 ], // state0
633
+ [ Opcodes.local_tee, 0 ], // s1
634
+
635
+ // s1 ^= s1 << 13
636
+ [ Opcodes.local_get, 0 ], // s1
637
+ [ Opcodes.i32_const, 13 ],
638
+ [ Opcodes.i32_shl ], // <<
639
+ [ Opcodes.i32_xor ], // ^
640
+ [ Opcodes.local_tee, 0 ], // s1
641
+
642
+ // s1 ^= s1 >> 17
643
+ [ Opcodes.local_get, 0 ], // s1
644
+ [ Opcodes.i32_const, 17 ],
645
+ [ Opcodes.i32_shr_s ], // >>
646
+ [ Opcodes.i32_xor ], // ^
647
+ [ Opcodes.local_tee, 0 ], // s1
648
+
649
+ // s1 ^= s1 << 5
650
+ [ Opcodes.local_get, 0 ], // s1
651
+ [ Opcodes.i32_const, 5 ],
652
+ [ Opcodes.i32_shl ], // <<
653
+ [ Opcodes.i32_xor ], // ^
654
+ [ Opcodes.local_tee, 0 ], // s1
655
+
656
+ // state0 = s1
657
+ [ Opcodes.global_set, 0 ],
658
+
659
+ // s1
660
+ [ Opcodes.local_get, 0 ],
661
+ ],
662
+ },
663
+
664
+ 'xorshift64+': {
665
+ globals: [ Valtype.i64 ],
666
+ locals: [ Valtype.i64 ],
667
+ returns: Valtype.i64,
668
+ wasm: [
669
+ // setup: s1 = state0
670
+ [ Opcodes.global_get, 0 ], // state0
671
+ [ Opcodes.local_tee, 0 ], // s1
672
+
673
+ // s1 ^= s1 >> 12
674
+ [ Opcodes.local_get, 0 ], // s1
675
+ [ Opcodes.i64_const, 12 ],
676
+ [ Opcodes.i64_shr_s ], // >>
677
+ [ Opcodes.i64_xor ], // ^
678
+ [ Opcodes.local_tee, 0 ], // s1
679
+
680
+ // s1 ^= s1 << 25
681
+ [ Opcodes.local_get, 0 ], // s1
682
+ [ Opcodes.i64_const, 25 ],
683
+ [ Opcodes.i64_shl ], // <<
684
+ [ Opcodes.i64_xor ], // ^
685
+ [ Opcodes.local_tee, 0 ], // s1
686
+
687
+ // s1 ^= s1 >> 27
688
+ [ Opcodes.local_get, 0 ], // s1
689
+ [ Opcodes.i64_const, 27 ],
690
+ [ Opcodes.i64_shr_s ], // >>
691
+ [ Opcodes.i64_xor ], // ^
692
+ [ Opcodes.local_tee, 0 ], // s1
693
+
694
+ // state0 = s1
695
+ [ Opcodes.global_set, 0 ],
696
+
697
+ // // s1 * 0x2545F4914F6CDD1D
698
+ // [ Opcodes.local_get, 0 ],
699
+ // [ Opcodes.i64_const, 0x9d, 0xba, 0xb3, 0xfb, 0x94, 0x92, 0xfd, 0xa2, 0x25 ],
700
+ // [ Opcodes.i64_mul ]
701
+
702
+ // s1
703
+ [ Opcodes.local_get, 0 ],
704
+ ],
705
+ },
706
+
707
+ 'xorshift128+': {
708
+ globals: [ Valtype.i64, Valtype.i64 ],
709
+ locals: [ Valtype.i64, Valtype.i64 ],
710
+ returns: Valtype.i64,
711
+ wasm: [
712
+ // setup: s1 = state0, s0 = state1, state0 = s0
713
+ [ Opcodes.global_get, 0 ], // state0
714
+ [ Opcodes.local_tee, 0 ], // s1
715
+ [ Opcodes.global_get, 1 ], // state1
716
+ [ Opcodes.local_tee, 1, ], // s0
717
+ [ Opcodes.global_set, 0 ], // state0
718
+
719
+ // s1 ^= s1 << 23
720
+ // [ Opcodes.local_get, 0 ], // s1
721
+ [ Opcodes.local_get, 0 ], // s1
722
+ [ Opcodes.i64_const, 23 ],
723
+ [ Opcodes.i64_shl ], // <<
724
+ [ Opcodes.i64_xor ], // ^
725
+ [ Opcodes.local_set, 0 ], // s1
726
+
727
+ // state1 = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26)
728
+ // s1 ^ s0
729
+ [ Opcodes.local_get, 0 ], // s1
730
+ [ Opcodes.local_get, 1 ], // s0
731
+ [ Opcodes.i64_xor ], // ^
732
+
733
+ // ^ (s1 >> 17)
734
+ [ Opcodes.local_get, 0 ], // s1
735
+ [ Opcodes.i64_const, 17 ],
736
+ [ Opcodes.i64_shr_u ], // >>
737
+ [ Opcodes.i64_xor ], // ^
738
+
739
+ // ^ (s0 >> 26)
740
+ [ Opcodes.local_get, 1 ], // s0
741
+ [ Opcodes.i64_const, 26 ],
742
+ [ Opcodes.i64_shr_u ], // >>
743
+ [ Opcodes.i64_xor ], // ^
744
+
745
+ // state1 =
746
+ [ Opcodes.global_set, 1 ],
747
+
748
+ // state1 + s0
749
+ [ Opcodes.global_get, 1 ], // state1
750
+ [ Opcodes.local_get, 1 ], // s0
751
+ [ Opcodes.i64_add ]
752
+ ]
753
+ },
754
+
755
+ 'xoroshiro128+': {
756
+ globals: [ Valtype.i64, Valtype.i64 ],
757
+ locals: [ Valtype.i64, Valtype.i64, Valtype.i64 ],
758
+ returns: Valtype.i64,
759
+ wasm: [
760
+ // setup: s1 = state1, s0 = state0
761
+ [ Opcodes.global_get, 1 ], // state0
762
+ [ Opcodes.local_tee, 0 ], // s1
763
+ [ Opcodes.global_get, 0 ], // state1
764
+ [ Opcodes.local_tee, 1, ], // s0
765
+
766
+ // result = s0 + s1
767
+ [ Opcodes.i64_add ],
768
+ [ Opcodes.local_set, 2 ], // result
769
+
770
+ // s1 ^= s0
771
+ [ Opcodes.local_get, 0 ], // s1
772
+ [ Opcodes.local_get, 1 ], // s0
773
+ [ Opcodes.i64_xor ],
774
+ [ Opcodes.local_set, 0 ], // s1
775
+
776
+ // state0 = rotl(s0, 24) ^ s1 ^ (s1 << 16)
777
+
778
+ // rotl(s0, 24) ^ s1
779
+ [ Opcodes.local_get, 1 ], // s0
780
+ ...number(24, Valtype.i64),
781
+ [ Opcodes.i64_rotl ],
782
+ [ Opcodes.local_get, 0 ], // s1
783
+ [ Opcodes.i64_xor ],
784
+
785
+ // ^ (s1 << 16)
786
+ [ Opcodes.local_get, 0 ], // s1
787
+ ...number(16, Valtype.i64),
788
+ [ Opcodes.i64_shl ],
789
+ [ Opcodes.i64_xor ],
790
+
791
+ // state0 =
792
+ [ Opcodes.global_set, 0 ], // state0
793
+
794
+ // state1 = rotl(s1, 37)
795
+ [ Opcodes.local_get, 0 ], // s1
796
+ ...number(37, Valtype.i64),
797
+ [ Opcodes.i64_rotl ],
798
+ [ Opcodes.global_set, 1 ], // state1
799
+
800
+ // result
801
+ [ Opcodes.local_get, 2 ],
802
+ ]
803
+ },
804
+
805
+ 'xoshiro128+': {
806
+ globals: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
807
+ locals: [ Valtype.i32, Valtype.i32 ],
808
+ returns: Valtype.i32,
809
+ wasm: [
810
+ // result = state0 + state3
811
+ [ Opcodes.global_get, 0 ], // state0
812
+ [ Opcodes.global_get, 3 ], // state0
813
+ [ Opcodes.i32_add ],
814
+ [ Opcodes.local_set, 0 ], // result
815
+
816
+ // t = state1 << 9
817
+ [ Opcodes.global_get, 1 ], // state1
818
+ ...number(9, Valtype.i32),
819
+ [ Opcodes.i32_shl ],
820
+ [ Opcodes.local_set, 1 ], // t
821
+
822
+ // state2 ^= state0
823
+ [ Opcodes.global_get, 2 ], // state2
824
+ [ Opcodes.global_get, 0 ], // state0
825
+ [ Opcodes.i32_xor ],
826
+ [ Opcodes.global_set, 2 ], // state2
827
+
828
+ // state3 ^= state1
829
+ [ Opcodes.global_get, 3 ], // state3
830
+ [ Opcodes.global_get, 1 ], // state1
831
+ [ Opcodes.i32_xor ],
832
+ [ Opcodes.global_set, 3 ], // state3
833
+
834
+ // state1 ^= state2
835
+ [ Opcodes.global_get, 1 ], // state1
836
+ [ Opcodes.global_get, 2 ], // state2
837
+ [ Opcodes.i32_xor ],
838
+ [ Opcodes.global_set, 1 ], // state1
839
+
840
+ // state0 ^= state3
841
+ [ Opcodes.global_get, 0 ], // state2
842
+ [ Opcodes.global_get, 3 ], // state0
843
+ [ Opcodes.i32_xor ],
844
+ [ Opcodes.global_set, 0 ], // state2
845
+
846
+ // state2 ^= t
847
+ [ Opcodes.global_get, 2 ], // state2
848
+ [ Opcodes.local_get, 1 ], // t
849
+ [ Opcodes.i32_xor ],
850
+ [ Opcodes.global_set, 2 ], // state2
851
+
852
+ // state3 = rotl(state3, 11)
853
+ [ Opcodes.global_get, 3 ], // state3
854
+ ...number(11, Valtype.i32),
855
+ [ Opcodes.i32_rotl ],
856
+ [ Opcodes.global_set, 3 ], // state3
857
+
858
+ // result
859
+ [ Opcodes.local_get, 0 ],
860
+ ]
861
+ }
862
+ })[Prefs.prng ?? 'xorshift128+'];
863
+
864
+ if (!prng) throw new Error(`unknown prng algo: ${Prefs.prng}`);
508
865
 
509
866
  this.__Math_random = {
510
867
  floatOnly: true,
511
868
  params: [],
512
- locals: [ Valtype.i64, Valtype.i64 ],
869
+ locals: prng.locals,
513
870
  localNames: [ 's1', 's0' ],
514
- globals: [ Valtype.i64, Valtype.i64 ],
871
+ globals: prng.globals,
515
872
  globalNames: [ 'state0', 'state1' ],
516
873
  globalInits: [ prngSeed0, prngSeed1 ],
517
874
  returns: [ Valtype.f64 ],
518
875
  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 ],
876
+ ...prng.wasm,
554
877
 
555
878
  // you thought it was over? now we need the result as a f64 between 0-1 :)
556
879
 
557
- // state1 + s0
558
- [ Opcodes.global_get, 1 ], // state1
559
- [ Opcodes.local_get, 1 ], // s0
560
- [ Opcodes.i64_add ],
561
-
562
880
  // should we >> 12 here?
563
881
  // it feels like it but it breaks values
564
882
 
@@ -573,15 +891,51 @@ export const BuiltinFuncs = function() {
573
891
  // ...number(1),
574
892
  // [ Opcodes.f64_sub ],
575
893
 
576
- ...number((1 << 53) - 1, Valtype.i64),
577
- [ Opcodes.i64_and ],
894
+ ...(prng.returns === Valtype.i64 ? [
895
+ ...number((1 << 53) - 1, Valtype.i64),
896
+ [ Opcodes.i64_and ],
897
+
898
+ // double(mantissa)
899
+ [ Opcodes.f64_convert_i64_u ],
900
+
901
+ // / (1 << 53)
902
+ ...number(1 << 53),
903
+ [ Opcodes.f64_div ]
904
+ ] : [
905
+ ...number((1 << 21) - 1, Valtype.i32),
906
+ [ Opcodes.i32_and ],
578
907
 
579
- // double(mantissa)
580
- [ Opcodes.f64_convert_i64_u ],
908
+ // double(mantissa)
909
+ [ Opcodes.f64_convert_i32_u ],
581
910
 
582
- // / (1 << 53)
583
- ...number(1 << 53),
584
- [ Opcodes.f64_div ]
911
+ // / (1 << 21)
912
+ ...number(1 << 21),
913
+ [ Opcodes.f64_div ]
914
+ ])
915
+ ]
916
+ };
917
+
918
+ this.__Porffor_randomByte = {
919
+ params: [],
920
+ locals: prng.locals,
921
+ localNames: [ 's1', 's0' ],
922
+ globals: prng.globals,
923
+ globalNames: [ 'state0', 'state1' ],
924
+ globalInits: [ prngSeed0, prngSeed1 ],
925
+ returns: [ Valtype.i32 ],
926
+ wasm: [
927
+ ...prng.wasm,
928
+
929
+ ...(prng.returns === Valtype.i64 ? [
930
+ // the lowest bits of the output generated by xorshift128+ have low quality
931
+ ...number(56, Valtype.i64),
932
+ [ Opcodes.i64_shr_u ],
933
+
934
+ [ Opcodes.i32_wrap_i64 ],
935
+ ] : []),
936
+
937
+ ...number(0xff, Valtype.i32),
938
+ [ Opcodes.i32_and ],
585
939
  ]
586
940
  };
587
941
 
@@ -660,7 +1014,7 @@ export const BuiltinFuncs = function() {
660
1014
  params: [ valtypeBinary ],
661
1015
  locals: [],
662
1016
  returns: [ valtypeBinary ],
663
- returnType: 'boolean',
1017
+ returnType: TYPES.boolean,
664
1018
  wasm: [
665
1019
  [ Opcodes.local_get, 0 ],
666
1020
  ...number(0),
@@ -685,7 +1039,7 @@ export const BuiltinFuncs = function() {
685
1039
  typedParams: true,
686
1040
  locals: [ Valtype.i32, Valtype.i32 ],
687
1041
  returns: [ valtypeBinary ],
688
- returnType: process.argv.includes('-bytestring') ? '_bytestring' : 'string',
1042
+ returnType: Prefs.bytestring ? TYPES.bytestring : TYPES.string,
689
1043
  wasm: (scope, { TYPE_NAMES, typeSwitch, makeString }) => {
690
1044
  const bc = {};
691
1045
  for (const x in TYPE_NAMES) {
@@ -696,233 +1050,35 @@ export const BuiltinFuncs = function() {
696
1050
  }
697
1051
  };
698
1052
 
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 = {
1053
+ this.__Porffor_rawType = {
711
1054
  params: [ valtypeBinary, Valtype.i32 ],
712
1055
  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
- 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
1056
  locals: [],
813
- returns: [ Valtype.v128 ],
1057
+ returns: [ valtypeBinary ],
814
1058
  wasm: [
815
- [ Opcodes.local_get, 0 ],
816
1059
  [ Opcodes.local_get, 1 ],
817
- [ ...Opcodes.i32x4_sub ]
1060
+ Opcodes.i32_from_u
818
1061
  ]
819
1062
  };
820
1063
 
821
- this.__SIMD_i32x4_mul = {
822
- params: [ Valtype.v128, Valtype.v128 ],
1064
+ this.__Porffor_clone = {
1065
+ params: [ valtypeBinary, valtypeBinary ],
823
1066
  locals: [],
824
- returns: [ Valtype.v128 ],
1067
+ returns: [],
825
1068
  wasm: [
826
- [ Opcodes.local_get, 0 ],
1069
+ // dst
827
1070
  [ 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
- };
1071
+ Opcodes.i32_to_u,
861
1072
 
862
- this.__SIMD_i32x4_get3 = {
863
- params: [ Valtype.v128 ],
864
- locals: [],
865
- returns: [ Valtype.i32 ],
866
- wasm: [
1073
+ // src
867
1074
  [ Opcodes.local_get, 0 ],
868
- [ ...Opcodes.i32x4_extract_lane, 3 ],
869
- ],
870
- };
1075
+ Opcodes.i32_to_u,
871
1076
 
872
- this.__SIMD_i32x4_shuffle_000c = {
873
- params: [ Valtype.v128 ],
874
- locals: [],
875
- returns: [ Valtype.v128 ],
876
- wasm: [
877
- [ 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)
1077
+ // size = pageSize
1078
+ ...number(pageSize, Valtype.i32),
1079
+ [ ...Opcodes.memory_copy, 0x00, 0x00 ],
880
1080
  ]
881
1081
  };
882
1082
 
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)
891
- ]
892
- };
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
-
926
- return output;
927
- };`
1083
+ GeneratedBuiltins.BuiltinFuncs.call(this);
928
1084
  };