porffor 0.2.0-1afe9b8 → 0.2.0-219912f

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 (52) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +123 -84
  3. package/asur/README.md +2 -0
  4. package/asur/index.js +1262 -0
  5. package/byg/index.js +237 -0
  6. package/compiler/2c.js +317 -72
  7. package/compiler/{sections.js → assemble.js} +63 -15
  8. package/compiler/builtins/annexb_string.js +72 -0
  9. package/compiler/builtins/annexb_string.ts +19 -0
  10. package/compiler/builtins/array.ts +145 -0
  11. package/compiler/builtins/base64.ts +151 -0
  12. package/compiler/builtins/crypto.ts +120 -0
  13. package/compiler/builtins/date.ts +1370 -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 +457 -254
  21. package/compiler/{codeGen.js → codegen.js} +929 -340
  22. package/compiler/embedding.js +22 -22
  23. package/compiler/encoding.js +108 -10
  24. package/compiler/generated_builtins.js +1262 -0
  25. package/compiler/index.js +36 -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 +28 -8
  34. package/compiler/wrap.js +51 -46
  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 +49 -10
  43. package/runner/profiler.js +102 -0
  44. package/runner/repl.js +40 -7
  45. package/runner/sizes.js +37 -37
  46. package/compiler/builtins/base64.js +0 -92
  47. package/r.js +0 -4
  48. package/runner/info.js +0 -89
  49. package/runner/profile.js +0 -46
  50. package/runner/results.json +0 -1
  51. package/runner/transform.js +0 -15
  52. 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,6 +273,40 @@ export const BuiltinFuncs = function() {
239
273
 
240
274
  [ Opcodes.end ]
241
275
  ],
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
+ ],
242
310
  [TYPES._array]: [
243
311
  ...printStaticStr('[ '),
244
312
 
@@ -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,72 @@ 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 ],
907
+
908
+ // double(mantissa)
909
+ [ Opcodes.f64_convert_i32_u ],
910
+
911
+ // / (1 << 21)
912
+ ...number(1 << 21),
913
+ [ Opcodes.f64_div ]
914
+ ])
915
+ ]
916
+ };
917
+
918
+ // this.__Porffor_randomInt = {
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
+ // };
938
+
939
+ this.__Porffor_randomByte = {
940
+ params: [],
941
+ locals: prng.locals,
942
+ localNames: [ 's1', 's0' ],
943
+ globals: prng.globals,
944
+ globalNames: [ 'state0', 'state1' ],
945
+ globalInits: [ prngSeed0, prngSeed1 ],
946
+ returns: [ Valtype.i32 ],
947
+ wasm: [
948
+ ...prng.wasm,
949
+
950
+ ...(prng.returns === Valtype.i64 ? [
951
+ // the lowest bits of the output generated by xorshift128+ have low quality
952
+ ...number(56, Valtype.i64),
953
+ [ Opcodes.i64_shr_u ],
578
954
 
579
- // double(mantissa)
580
- [ Opcodes.f64_convert_i64_u ],
955
+ [ Opcodes.i32_wrap_i64 ],
956
+ ] : []),
581
957
 
582
- // / (1 << 53)
583
- ...number(1 << 53),
584
- [ Opcodes.f64_div ]
958
+ ...number(0xff, Valtype.i32),
959
+ [ Opcodes.i32_and ],
585
960
  ]
586
961
  };
587
962
 
@@ -660,7 +1035,7 @@ export const BuiltinFuncs = function() {
660
1035
  params: [ valtypeBinary ],
661
1036
  locals: [],
662
1037
  returns: [ valtypeBinary ],
663
- returnType: 'boolean',
1038
+ returnType: TYPES.boolean,
664
1039
  wasm: [
665
1040
  [ Opcodes.local_get, 0 ],
666
1041
  ...number(0),
@@ -685,7 +1060,7 @@ export const BuiltinFuncs = function() {
685
1060
  typedParams: true,
686
1061
  locals: [ Valtype.i32, Valtype.i32 ],
687
1062
  returns: [ valtypeBinary ],
688
- returnType: process.argv.includes('-bytestring') ? '_bytestring' : 'string',
1063
+ returnType: Prefs.bytestring ? TYPES._bytestring : TYPES.string,
689
1064
  wasm: (scope, { TYPE_NAMES, typeSwitch, makeString }) => {
690
1065
  const bc = {};
691
1066
  for (const x in TYPE_NAMES) {
@@ -696,207 +1071,35 @@ export const BuiltinFuncs = function() {
696
1071
  }
697
1072
  };
698
1073
 
699
-
700
- this.__SIMD_i32x4_load = {
701
- params: [ Valtype.i32 ],
702
- locals: [],
703
- returns: [ Valtype.v128 ],
704
- wasm: [
705
- [ Opcodes.local_get, 0 ],
706
- [ ...Opcodes.v128_load, 0, 0 ]
707
- ]
708
- };
709
-
710
- this.__SIMD_i32x4_splat = {
711
- params: [ Valtype.i32 ],
712
- locals: [],
713
- returns: [ Valtype.v128 ],
714
- wasm: [
715
- [ Opcodes.local_get, 0 ],
716
- [ ...Opcodes.i32x4_splat ],
717
- ]
718
- };
719
-
720
- this.__SIMD_i16x8_create = {
721
- params: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
722
- locals: [],
723
- returns: [ Valtype.v128 ],
724
- wasm: [
725
- ...i32x4(0, 0, 0, 0),
726
- [ Opcodes.local_get, 0 ],
727
- [ ...Opcodes.i16x8_replace_lane, 0 ],
728
- [ Opcodes.local_get, 1 ],
729
- [ ...Opcodes.i16x8_replace_lane, 1 ],
730
- [ Opcodes.local_get, 2 ],
731
- [ ...Opcodes.i16x8_replace_lane, 2 ],
732
- [ Opcodes.local_get, 3 ],
733
- [ ...Opcodes.i16x8_replace_lane, 3 ],
734
- [ Opcodes.local_get, 4 ],
735
- [ ...Opcodes.i16x8_replace_lane, 4 ],
736
- [ Opcodes.local_get, 5 ],
737
- [ ...Opcodes.i16x8_replace_lane, 5 ],
738
- [ Opcodes.local_get, 6 ],
739
- [ ...Opcodes.i16x8_replace_lane, 6 ],
740
- [ Opcodes.local_get, 7 ],
741
- [ ...Opcodes.i16x8_replace_lane, 7 ],
742
- ]
743
- };
744
-
745
- this.__SIMD_i32x4_dot_i16x8 = {
746
- params: [ Valtype.v128, Valtype.v128 ],
747
- locals: [],
748
- returns: [ Valtype.v128 ],
749
- wasm: [
750
- [ Opcodes.local_get, 0 ],
751
- [ Opcodes.local_get, 1 ],
752
- [ ...Opcodes.i32x4_dot_i16x8_s ]
753
- ]
754
- };
755
-
756
- this.__SIMD_i32x4_create = {
757
- params: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
758
- locals: [],
759
- returns: [ Valtype.v128 ],
760
- wasm: [
761
- ...i32x4(0, 0, 0, 0),
762
- [ Opcodes.local_get, 0 ],
763
- [ ...Opcodes.i32x4_replace_lane, 0 ],
764
- [ Opcodes.local_get, 1 ],
765
- [ ...Opcodes.i32x4_replace_lane, 1 ],
766
- [ Opcodes.local_get, 2 ],
767
- [ ...Opcodes.i32x4_replace_lane, 2 ],
768
- [ Opcodes.local_get, 3 ],
769
- [ ...Opcodes.i32x4_replace_lane, 3 ],
770
- ]
771
- };
772
-
773
- this.__SIMD_i32x4_add = {
774
- params: [ Valtype.v128, Valtype.v128 ],
775
- locals: [],
776
- returns: [ Valtype.v128 ],
777
- wasm: [
778
- [ Opcodes.local_get, 0 ],
779
- [ Opcodes.local_get, 1 ],
780
- [ ...Opcodes.i32x4_add ]
781
- ]
782
- };
783
-
784
- this.__SIMD_i32x4_sub = {
785
- params: [ Valtype.v128, Valtype.v128 ],
1074
+ this.__Porffor_rawType = {
1075
+ params: [ valtypeBinary, Valtype.i32 ],
1076
+ typedParams: true,
786
1077
  locals: [],
787
- returns: [ Valtype.v128 ],
1078
+ returns: [ valtypeBinary ],
788
1079
  wasm: [
789
- [ Opcodes.local_get, 0 ],
790
1080
  [ Opcodes.local_get, 1 ],
791
- [ ...Opcodes.i32x4_sub ]
1081
+ Opcodes.i32_from_u
792
1082
  ]
793
1083
  };
794
1084
 
795
- this.__SIMD_i32x4_mul = {
796
- params: [ Valtype.v128, Valtype.v128 ],
1085
+ this.__Porffor_clone = {
1086
+ params: [ valtypeBinary, valtypeBinary ],
797
1087
  locals: [],
798
- returns: [ Valtype.v128 ],
1088
+ returns: [],
799
1089
  wasm: [
800
- [ Opcodes.local_get, 0 ],
1090
+ // dst
801
1091
  [ Opcodes.local_get, 1 ],
802
- [ ...Opcodes.i32x4_mul ]
803
- ]
804
- };
805
-
806
- this.__SIMD_i32x4_get0 = {
807
- params: [ Valtype.v128 ],
808
- locals: [],
809
- returns: [ Valtype.i32 ],
810
- wasm: [
811
- [ Opcodes.local_get, 0 ],
812
- [ ...Opcodes.i32x4_extract_lane, 0 ],
813
- ],
814
- },
815
-
816
- this.__SIMD_i32x4_get1 = {
817
- params: [ Valtype.v128 ],
818
- locals: [],
819
- returns: [ Valtype.i32 ],
820
- wasm: [
821
- [ Opcodes.local_get, 0 ],
822
- [ ...Opcodes.i32x4_extract_lane, 1 ],
823
- ],
824
- };
825
-
826
- this.__SIMD_i32x4_get2 = {
827
- params: [ Valtype.v128 ],
828
- locals: [],
829
- returns: [ Valtype.i32 ],
830
- wasm: [
831
- [ Opcodes.local_get, 0 ],
832
- [ ...Opcodes.i32x4_extract_lane, 2 ],
833
- ],
834
- };
1092
+ Opcodes.i32_to_u,
835
1093
 
836
- this.__SIMD_i32x4_get3 = {
837
- params: [ Valtype.v128 ],
838
- locals: [],
839
- returns: [ Valtype.i32 ],
840
- wasm: [
841
- [ Opcodes.local_get, 0 ],
842
- [ ...Opcodes.i32x4_extract_lane, 3 ],
843
- ],
844
- };
845
-
846
- this.__SIMD_i32x4_shuffle_000c = {
847
- params: [ Valtype.v128 ],
848
- locals: [],
849
- returns: [ Valtype.v128 ],
850
- wasm: [
1094
+ // src
851
1095
  [ Opcodes.local_get, 0 ],
852
- ...i32x4(0, 0, 0, 0),
853
- [ ...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)
854
- ]
855
- };
1096
+ Opcodes.i32_to_u,
856
1097
 
857
- this.__SIMD_i32x4_shuffle_00ab = {
858
- params: [ Valtype.v128 ],
859
- locals: [],
860
- returns: [ Valtype.v128 ],
861
- wasm: [
862
- [ Opcodes.local_get, 0 ],
863
- ...i32x4(0, 0, 0, 0),
864
- [ ...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)
1098
+ // size = pageSize
1099
+ ...number(pageSize, Valtype.i32),
1100
+ [ ...Opcodes.memory_copy, 0x00, 0x00 ],
865
1101
  ]
866
1102
  };
867
- };
868
-
869
- export const BuiltinPreludes = {
870
- btoa: `var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
871
- var btoa = function (input) {
872
- // todo: throw invalid character for unicode
873
-
874
- let output = "";
875
- let chr1, chr2, chr3, enc1, enc2, enc3, enc4;
876
- let i = 0;
877
-
878
- while (i < input.length) {
879
- chr1 = input.charCodeAt(i++);
880
- chr2 = input.charCodeAt(i++);
881
- chr3 = input.charCodeAt(i++);
882
-
883
- enc1 = chr1 >> 2;
884
- enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
885
- enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
886
- enc4 = chr3 & 63;
887
-
888
- if (isNaN(chr2)) {
889
- enc3 = enc4 = 64;
890
- } else if (isNaN(chr3)) {
891
- enc4 = 64;
892
- }
893
-
894
- output += keyStr.charAt(enc1);
895
- output += keyStr.charAt(enc2);
896
- output += keyStr.charAt(enc3);
897
- output += keyStr.charAt(enc4);
898
- }
899
1103
 
900
- return output;
901
- };`
1104
+ GeneratedBuiltins.BuiltinFuncs.call(this);
902
1105
  };