porffor 0.2.0-dcc06c8 → 0.2.0-de394c3

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 (56) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +113 -62
  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 +1 -1
  7. package/compiler/{sections.js → assemble.js} +58 -11
  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 +103 -40
  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 +33 -1
  18. package/compiler/builtins/string.ts +1055 -0
  19. package/compiler/builtins/tostring.ts +45 -0
  20. package/compiler/builtins.js +454 -243
  21. package/compiler/{codeGen.js → codegen.js} +833 -290
  22. package/compiler/embedding.js +22 -22
  23. package/compiler/encoding.js +108 -10
  24. package/compiler/generated_builtins.js +1259 -0
  25. package/compiler/index.js +16 -14
  26. package/compiler/log.js +6 -3
  27. package/compiler/opt.js +23 -22
  28. package/compiler/parse.js +31 -25
  29. package/compiler/precompile.js +66 -22
  30. package/compiler/prefs.js +5 -1
  31. package/compiler/prototype.js +4 -20
  32. package/compiler/types.js +37 -0
  33. package/compiler/wasmSpec.js +28 -8
  34. package/compiler/wrap.js +51 -47
  35. package/fib.js +7 -0
  36. package/package.json +9 -5
  37. package/porf +2 -0
  38. package/rhemyn/compile.js +3 -2
  39. package/rhemyn/parse.js +323 -320
  40. package/rhemyn/test/parse.js +58 -58
  41. package/runner/compare.js +34 -34
  42. package/runner/debug.js +122 -0
  43. package/runner/index.js +48 -9
  44. package/runner/profiler.js +102 -0
  45. package/runner/repl.js +40 -7
  46. package/runner/sizes.js +37 -37
  47. package/demo.js +0 -3
  48. package/demo.ts +0 -1
  49. package/filesize.cmd +0 -2
  50. package/hello +0 -0
  51. package/runner/info.js +0 -89
  52. package/runner/profile.js +0 -46
  53. package/runner/results.json +0 -1
  54. package/runner/transform.js +0 -15
  55. package/tmp.c +0 -152
  56. package/util/enum.js +0 -20
@@ -1,6 +1,8 @@
1
1
  import { Blocktype, Opcodes, Valtype, ValtypeSize } from "./wasmSpec.js";
2
2
  import { number, i32x4 } from "./embedding.js";
3
3
  import Prefs from './prefs.js';
4
+ import * as GeneratedBuiltins from './generated_builtins.js';
5
+ import { TYPES } from './types.js';
4
6
 
5
7
  export const importedFuncs = [
6
8
  {
@@ -20,6 +22,24 @@ export const importedFuncs = [
20
22
  import: 't',
21
23
  params: 0,
22
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
23
43
  }
24
44
  ];
25
45
 
@@ -51,10 +71,10 @@ export const NULL = 0;
51
71
 
52
72
  export const BuiltinVars = function() {
53
73
  this.undefined = number(UNDEFINED);
54
- this.undefined.type = 'undefined';
74
+ this.undefined.type = TYPES.undefined;
55
75
 
56
76
  this.null = number(NULL);
57
- this.null.type = 'object';
77
+ this.null.type = TYPES.object;
58
78
 
59
79
  this.NaN = number(NaN);
60
80
  this.NaN.floatOnly = true;
@@ -118,6 +138,18 @@ export const BuiltinVars = function() {
118
138
 
119
139
  // stubs just so that parent objects exist
120
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
+ ];
121
153
  };
122
154
 
123
155
  export const BuiltinFuncs = function() {
@@ -176,19 +208,20 @@ export const BuiltinFuncs = function() {
176
208
  params: [ valtypeBinary ],
177
209
  locals: [],
178
210
  returns: [ valtypeBinary ],
179
- returnType: 'object',
211
+ returnType: TYPES.object,
180
212
  wasm: [
181
- [ Opcodes.local_get, 0 ]
213
+ // [ Opcodes.local_get, 0 ]
214
+ ...number(1)
182
215
  ]
183
216
  };
184
217
 
185
218
 
186
- this.__console_log = {
219
+ this.__Porffor_print = {
187
220
  params: [ valtypeBinary, Valtype.i32 ],
188
221
  typedParams: true,
189
222
  locals: [ Valtype.i32, Valtype.i32 ],
190
223
  returns: [],
191
- wasm: (scope, { TYPES, typeSwitch }) => [
224
+ wasm: (scope, { typeSwitch }) => [
192
225
  ...typeSwitch(scope, [ [ Opcodes.local_get, 1 ] ], {
193
226
  [TYPES.number]: [
194
227
  [ Opcodes.local_get, 0 ],
@@ -240,6 +273,40 @@ export const BuiltinFuncs = function() {
240
273
 
241
274
  [ Opcodes.end ]
242
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
+ ],
243
310
  [TYPES._array]: [
244
311
  ...printStaticStr('[ '),
245
312
 
@@ -301,10 +368,7 @@ export const BuiltinFuncs = function() {
301
368
  [ Opcodes.local_get, 0 ],
302
369
  [ Opcodes.call, importedFuncs.print ],
303
370
  ]
304
- }, Blocktype.void),
305
-
306
- ...char('\n'),
307
- [ Opcodes.call, importedFuncs.printChar ]
371
+ }, Blocktype.void)
308
372
  ]
309
373
  };
310
374
 
@@ -316,7 +380,7 @@ export const BuiltinFuncs = function() {
316
380
  params: [ valtypeBinary ],
317
381
  locals: [],
318
382
  returns: [ valtypeBinary ],
319
- returnType: 'boolean',
383
+ returnType: TYPES.boolean,
320
384
  wasm: [
321
385
  [ Opcodes.local_get, 0 ],
322
386
  [ Opcodes.local_get, 0 ],
@@ -331,7 +395,7 @@ export const BuiltinFuncs = function() {
331
395
  params: [ valtypeBinary ],
332
396
  locals: [ valtypeBinary ],
333
397
  returns: [ valtypeBinary ],
334
- returnType: 'boolean',
398
+ returnType: TYPES.boolean,
335
399
  wasm: [
336
400
  [ Opcodes.local_get, 0 ],
337
401
  [ Opcodes.local_get, 0 ],
@@ -350,7 +414,7 @@ export const BuiltinFuncs = function() {
350
414
  params: [ valtypeBinary ],
351
415
  locals: [],
352
416
  returns: [ valtypeBinary ],
353
- returnType: 'boolean',
417
+ returnType: TYPES.boolean,
354
418
  wasm: [
355
419
  [ Opcodes.local_get, 0 ],
356
420
  [ Opcodes.local_get, 0 ],
@@ -365,7 +429,7 @@ export const BuiltinFuncs = function() {
365
429
  params: [ valtypeBinary ],
366
430
  locals: [],
367
431
  returns: [ valtypeBinary ],
368
- returnType: 'boolean',
432
+ returnType: TYPES.boolean,
369
433
  wasm: [
370
434
  [ Opcodes.local_get, 0 ],
371
435
  [ Opcodes.local_get, 0 ],
@@ -505,61 +569,314 @@ export const BuiltinFuncs = function() {
505
569
 
506
570
  // this is an implementation of xorshift128+ (in wasm bytecode)
507
571
  // fun fact: v8, SM, JSC also use this (you will need this fun fact to maintain your sanity reading this code)
508
- 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}`);
509
865
 
510
866
  this.__Math_random = {
511
867
  floatOnly: true,
512
868
  params: [],
513
- locals: [ Valtype.i64, Valtype.i64 ],
869
+ locals: prng.locals,
514
870
  localNames: [ 's1', 's0' ],
515
- globals: [ Valtype.i64, Valtype.i64 ],
871
+ globals: prng.globals,
516
872
  globalNames: [ 'state0', 'state1' ],
517
873
  globalInits: [ prngSeed0, prngSeed1 ],
518
874
  returns: [ Valtype.f64 ],
519
875
  wasm: [
520
- // setup: s1 = state0, s0 = state1, state0 = s0
521
- [ Opcodes.global_get, 0 ], // state0
522
- [ Opcodes.local_tee, 0 ], // s1
523
- [ Opcodes.global_get, 1 ], // state1
524
- [ Opcodes.local_tee, 1, ], // s0
525
- [ Opcodes.global_set, 0 ], // state0
526
-
527
- // s1 ^= s1 << 23
528
- // [ Opcodes.local_get, 0 ], // s1
529
- [ Opcodes.local_get, 0 ], // s1
530
- [ Opcodes.i64_const, 23 ],
531
- [ Opcodes.i64_shl ], // <<
532
- [ Opcodes.i64_xor ], // ^
533
- [ Opcodes.local_set, 0 ], // s1
534
-
535
- // state1 = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26)
536
- // s1 ^ s0
537
- [ Opcodes.local_get, 0 ], // s1
538
- [ Opcodes.local_get, 1 ], // s0
539
- [ Opcodes.i64_xor ], // ^
540
-
541
- // ^ (s1 >> 17)
542
- [ Opcodes.local_get, 0 ], // s1
543
- [ Opcodes.i64_const, 17 ],
544
- [ Opcodes.i64_shr_u ], // >>
545
- [ Opcodes.i64_xor ], // ^
546
-
547
- // ^ (s0 >> 26)
548
- [ Opcodes.local_get, 1 ], // s0
549
- [ Opcodes.i64_const, 26 ],
550
- [ Opcodes.i64_shr_u ], // >>
551
- [ Opcodes.i64_xor ], // ^
552
-
553
- // state1 =
554
- [ Opcodes.global_set, 1 ],
876
+ ...prng.wasm,
555
877
 
556
878
  // you thought it was over? now we need the result as a f64 between 0-1 :)
557
879
 
558
- // state1 + s0
559
- [ Opcodes.global_get, 1 ], // state1
560
- [ Opcodes.local_get, 1 ], // s0
561
- [ Opcodes.i64_add ],
562
-
563
880
  // should we >> 12 here?
564
881
  // it feels like it but it breaks values
565
882
 
@@ -574,15 +891,72 @@ export const BuiltinFuncs = function() {
574
891
  // ...number(1),
575
892
  // [ Opcodes.f64_sub ],
576
893
 
577
- ...number((1 << 53) - 1, Valtype.i64),
578
- [ 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 ],
579
954
 
580
- // double(mantissa)
581
- [ Opcodes.f64_convert_i64_u ],
955
+ [ Opcodes.i32_wrap_i64 ],
956
+ ] : []),
582
957
 
583
- // / (1 << 53)
584
- ...number(1 << 53),
585
- [ Opcodes.f64_div ]
958
+ ...number(0xff, Valtype.i32),
959
+ [ Opcodes.i32_and ],
586
960
  ]
587
961
  };
588
962
 
@@ -661,7 +1035,7 @@ export const BuiltinFuncs = function() {
661
1035
  params: [ valtypeBinary ],
662
1036
  locals: [],
663
1037
  returns: [ valtypeBinary ],
664
- returnType: 'boolean',
1038
+ returnType: TYPES.boolean,
665
1039
  wasm: [
666
1040
  [ Opcodes.local_get, 0 ],
667
1041
  ...number(0),
@@ -686,7 +1060,7 @@ export const BuiltinFuncs = function() {
686
1060
  typedParams: true,
687
1061
  locals: [ Valtype.i32, Valtype.i32 ],
688
1062
  returns: [ valtypeBinary ],
689
- returnType: Prefs.bytestring ? '_bytestring' : 'string',
1063
+ returnType: Prefs.bytestring ? TYPES._bytestring : TYPES.string,
690
1064
  wasm: (scope, { TYPE_NAMES, typeSwitch, makeString }) => {
691
1065
  const bc = {};
692
1066
  for (const x in TYPE_NAMES) {
@@ -697,198 +1071,35 @@ export const BuiltinFuncs = function() {
697
1071
  }
698
1072
  };
699
1073
 
700
- const localIsOneOf = (getter, arr, valtype = valtypeBinary) => {
701
- const out = [];
702
-
703
- for (let i = 0; i < arr.length; i++) {
704
- out.push(...getter, ...number(arr[i], valtype), valtype === Valtype.f64 ? [ Opcodes.f64_eq ] : [ Opcodes.i32_eq ]);
705
- if (i !== 0) out.push([ Opcodes.i32_or ]);
706
- }
707
-
708
- return out;
709
- };
710
-
711
- this.__Porffor_pointer = {
1074
+ this.__Porffor_rawType = {
712
1075
  params: [ valtypeBinary, Valtype.i32 ],
713
1076
  typedParams: true,
714
- locals: [ Valtype.i32, Valtype.i32 ],
715
- returns: [ valtypeBinary ],
716
- wasm: (scope, { TYPES }) => [
717
- ...localIsOneOf([ [ Opcodes.local_get, 1 ] ], [ TYPES.string, TYPES._array, TYPES._bytestring ], Valtype.i32),
718
- [ Opcodes.if, valtypeBinary ],
719
- [ Opcodes.local_get, 0 ],
720
- [ Opcodes.else ],
721
- ...number(NaN),
722
- [ Opcodes.end ]
723
- ]
724
- };
725
-
726
-
727
- this.__SIMD_i32x4_load = {
728
- params: [ Valtype.i32 ],
729
- locals: [],
730
- returns: [ Valtype.v128 ],
731
- wasm: [
732
- [ Opcodes.local_get, 0 ],
733
- [ ...Opcodes.v128_load, 0, 0 ]
734
- ]
735
- };
736
-
737
- this.__SIMD_i32x4_splat = {
738
- params: [ Valtype.i32 ],
739
- locals: [],
740
- returns: [ Valtype.v128 ],
741
- wasm: [
742
- [ Opcodes.local_get, 0 ],
743
- [ ...Opcodes.i32x4_splat ],
744
- ]
745
- };
746
-
747
- this.__SIMD_i16x8_create = {
748
- params: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
749
- locals: [],
750
- returns: [ Valtype.v128 ],
751
- wasm: [
752
- ...i32x4(0, 0, 0, 0),
753
- [ Opcodes.local_get, 0 ],
754
- [ ...Opcodes.i16x8_replace_lane, 0 ],
755
- [ Opcodes.local_get, 1 ],
756
- [ ...Opcodes.i16x8_replace_lane, 1 ],
757
- [ Opcodes.local_get, 2 ],
758
- [ ...Opcodes.i16x8_replace_lane, 2 ],
759
- [ Opcodes.local_get, 3 ],
760
- [ ...Opcodes.i16x8_replace_lane, 3 ],
761
- [ Opcodes.local_get, 4 ],
762
- [ ...Opcodes.i16x8_replace_lane, 4 ],
763
- [ Opcodes.local_get, 5 ],
764
- [ ...Opcodes.i16x8_replace_lane, 5 ],
765
- [ Opcodes.local_get, 6 ],
766
- [ ...Opcodes.i16x8_replace_lane, 6 ],
767
- [ Opcodes.local_get, 7 ],
768
- [ ...Opcodes.i16x8_replace_lane, 7 ],
769
- ]
770
- };
771
-
772
- this.__SIMD_i32x4_dot_i16x8 = {
773
- params: [ Valtype.v128, Valtype.v128 ],
774
- locals: [],
775
- returns: [ Valtype.v128 ],
776
- wasm: [
777
- [ Opcodes.local_get, 0 ],
778
- [ Opcodes.local_get, 1 ],
779
- [ ...Opcodes.i32x4_dot_i16x8_s ]
780
- ]
781
- };
782
-
783
- this.__SIMD_i32x4_create = {
784
- params: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
785
- locals: [],
786
- returns: [ Valtype.v128 ],
787
- wasm: [
788
- ...i32x4(0, 0, 0, 0),
789
- [ Opcodes.local_get, 0 ],
790
- [ ...Opcodes.i32x4_replace_lane, 0 ],
791
- [ Opcodes.local_get, 1 ],
792
- [ ...Opcodes.i32x4_replace_lane, 1 ],
793
- [ Opcodes.local_get, 2 ],
794
- [ ...Opcodes.i32x4_replace_lane, 2 ],
795
- [ Opcodes.local_get, 3 ],
796
- [ ...Opcodes.i32x4_replace_lane, 3 ],
797
- ]
798
- };
799
-
800
- this.__SIMD_i32x4_add = {
801
- params: [ Valtype.v128, Valtype.v128 ],
802
1077
  locals: [],
803
- returns: [ Valtype.v128 ],
804
- wasm: [
805
- [ Opcodes.local_get, 0 ],
806
- [ Opcodes.local_get, 1 ],
807
- [ ...Opcodes.i32x4_add ]
808
- ]
809
- };
810
-
811
- this.__SIMD_i32x4_sub = {
812
- params: [ Valtype.v128, Valtype.v128 ],
813
- locals: [],
814
- returns: [ Valtype.v128 ],
1078
+ returns: [ valtypeBinary ],
815
1079
  wasm: [
816
- [ Opcodes.local_get, 0 ],
817
1080
  [ Opcodes.local_get, 1 ],
818
- [ ...Opcodes.i32x4_sub ]
1081
+ Opcodes.i32_from_u
819
1082
  ]
820
1083
  };
821
1084
 
822
- this.__SIMD_i32x4_mul = {
823
- params: [ Valtype.v128, Valtype.v128 ],
1085
+ this.__Porffor_clone = {
1086
+ params: [ valtypeBinary, valtypeBinary ],
824
1087
  locals: [],
825
- returns: [ Valtype.v128 ],
1088
+ returns: [],
826
1089
  wasm: [
827
- [ Opcodes.local_get, 0 ],
1090
+ // dst
828
1091
  [ Opcodes.local_get, 1 ],
829
- [ ...Opcodes.i32x4_mul ]
830
- ]
831
- };
832
-
833
- this.__SIMD_i32x4_get0 = {
834
- params: [ Valtype.v128 ],
835
- locals: [],
836
- returns: [ Valtype.i32 ],
837
- wasm: [
838
- [ Opcodes.local_get, 0 ],
839
- [ ...Opcodes.i32x4_extract_lane, 0 ],
840
- ],
841
- },
842
-
843
- this.__SIMD_i32x4_get1 = {
844
- params: [ Valtype.v128 ],
845
- locals: [],
846
- returns: [ Valtype.i32 ],
847
- wasm: [
848
- [ Opcodes.local_get, 0 ],
849
- [ ...Opcodes.i32x4_extract_lane, 1 ],
850
- ],
851
- };
1092
+ Opcodes.i32_to_u,
852
1093
 
853
- this.__SIMD_i32x4_get2 = {
854
- params: [ Valtype.v128 ],
855
- locals: [],
856
- returns: [ Valtype.i32 ],
857
- wasm: [
858
- [ Opcodes.local_get, 0 ],
859
- [ ...Opcodes.i32x4_extract_lane, 2 ],
860
- ],
861
- };
862
-
863
- this.__SIMD_i32x4_get3 = {
864
- params: [ Valtype.v128 ],
865
- locals: [],
866
- returns: [ Valtype.i32 ],
867
- wasm: [
1094
+ // src
868
1095
  [ Opcodes.local_get, 0 ],
869
- [ ...Opcodes.i32x4_extract_lane, 3 ],
870
- ],
871
- };
1096
+ Opcodes.i32_to_u,
872
1097
 
873
- this.__SIMD_i32x4_shuffle_000c = {
874
- params: [ Valtype.v128 ],
875
- locals: [],
876
- returns: [ Valtype.v128 ],
877
- wasm: [
878
- [ Opcodes.local_get, 0 ],
879
- ...i32x4(0, 0, 0, 0),
880
- [ ...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)
1098
+ // size = pageSize
1099
+ ...number(pageSize, Valtype.i32),
1100
+ [ ...Opcodes.memory_copy, 0x00, 0x00 ],
881
1101
  ]
882
1102
  };
883
1103
 
884
- this.__SIMD_i32x4_shuffle_00ab = {
885
- params: [ Valtype.v128 ],
886
- locals: [],
887
- returns: [ Valtype.v128 ],
888
- wasm: [
889
- [ Opcodes.local_get, 0 ],
890
- ...i32x4(0, 0, 0, 0),
891
- [ ...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)
892
- ]
893
- };
1104
+ GeneratedBuiltins.BuiltinFuncs.call(this);
894
1105
  };