porffor 0.2.0-dcc06c8 → 0.2.0-e04e26f

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 (55) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +63 -44
  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 +1128 -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 +452 -238
  21. package/compiler/{codeGen.js → codegen.js} +799 -290
  22. package/compiler/embedding.js +22 -22
  23. package/compiler/encoding.js +108 -10
  24. package/compiler/generated_builtins.js +1133 -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/package.json +9 -5
  36. package/porf +2 -0
  37. package/rhemyn/compile.js +3 -2
  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 +31 -9
  43. package/runner/profiler.js +102 -0
  44. package/runner/repl.js +40 -7
  45. package/runner/sizes.js +37 -37
  46. package/demo.js +0 -3
  47. package/demo.ts +0 -1
  48. package/filesize.cmd +0 -2
  49. package/hello +0 -0
  50. package/runner/info.js +0 -89
  51. package/runner/profile.js +0 -46
  52. package/runner/results.json +0 -1
  53. package/runner/transform.js +0 -15
  54. package/tmp.c +0 -152
  55. 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,9 +208,10 @@ 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
 
@@ -188,7 +221,7 @@ export const BuiltinFuncs = function() {
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
 
@@ -316,7 +383,7 @@ export const BuiltinFuncs = function() {
316
383
  params: [ valtypeBinary ],
317
384
  locals: [],
318
385
  returns: [ valtypeBinary ],
319
- returnType: 'boolean',
386
+ returnType: TYPES.boolean,
320
387
  wasm: [
321
388
  [ Opcodes.local_get, 0 ],
322
389
  [ Opcodes.local_get, 0 ],
@@ -331,7 +398,7 @@ export const BuiltinFuncs = function() {
331
398
  params: [ valtypeBinary ],
332
399
  locals: [ valtypeBinary ],
333
400
  returns: [ valtypeBinary ],
334
- returnType: 'boolean',
401
+ returnType: TYPES.boolean,
335
402
  wasm: [
336
403
  [ Opcodes.local_get, 0 ],
337
404
  [ Opcodes.local_get, 0 ],
@@ -350,7 +417,7 @@ export const BuiltinFuncs = function() {
350
417
  params: [ valtypeBinary ],
351
418
  locals: [],
352
419
  returns: [ valtypeBinary ],
353
- returnType: 'boolean',
420
+ returnType: TYPES.boolean,
354
421
  wasm: [
355
422
  [ Opcodes.local_get, 0 ],
356
423
  [ Opcodes.local_get, 0 ],
@@ -365,7 +432,7 @@ export const BuiltinFuncs = function() {
365
432
  params: [ valtypeBinary ],
366
433
  locals: [],
367
434
  returns: [ valtypeBinary ],
368
- returnType: 'boolean',
435
+ returnType: TYPES.boolean,
369
436
  wasm: [
370
437
  [ Opcodes.local_get, 0 ],
371
438
  [ Opcodes.local_get, 0 ],
@@ -505,61 +572,314 @@ export const BuiltinFuncs = function() {
505
572
 
506
573
  // this is an implementation of xorshift128+ (in wasm bytecode)
507
574
  // 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);
575
+ // const prngSeed0 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER), prngSeed1 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
576
+ const prngSeed0 = (Math.random() * (2 ** 30)) | 0, prngSeed1 = (Math.random() * (2 ** 30)) | 0;
577
+
578
+ const prng = ({
579
+ 'lcg32_glibc': {
580
+ globals: [ Valtype.i32 ],
581
+ locals: [],
582
+ returns: Valtype.i32,
583
+ wasm: [
584
+ // seed = (MULTIPLIER * seed + INCREMENT) % MODULUS
585
+ // MULTIPLIER * state0
586
+ [ Opcodes.global_get, 0 ],
587
+ ...number(1103515245, Valtype.i32),
588
+ [ Opcodes.i32_mul ],
589
+
590
+ // + INCREMENT
591
+ ...number(12345, Valtype.i32),
592
+ [ Opcodes.i32_add ],
593
+
594
+ // % MODULUS
595
+ ...number(2 ** 31, Valtype.i32),
596
+ [ Opcodes.i32_rem_s ],
597
+
598
+ // state0 =
599
+ [ Opcodes.global_set, 0 ],
600
+
601
+ // state0
602
+ [ Opcodes.global_get, 0 ],
603
+ ],
604
+ },
605
+ 'lcg32_minstd': {
606
+ globals: [ Valtype.i32 ],
607
+ locals: [],
608
+ returns: Valtype.i32,
609
+ wasm: [
610
+ // seed = (MULTIPLIER * seed + INCREMENT) % MODULUS
611
+ // MULTIPLIER * state0
612
+ [ Opcodes.global_get, 0 ],
613
+ ...number(48271, Valtype.i32),
614
+ [ Opcodes.i32_mul ],
615
+
616
+ // % MODULUS
617
+ ...number((2 ** 31) - 1, Valtype.i32),
618
+ [ Opcodes.i32_rem_s ],
619
+
620
+ // state0 =
621
+ [ Opcodes.global_set, 0 ],
622
+
623
+ // state0
624
+ [ Opcodes.global_get, 0 ],
625
+ ],
626
+ },
627
+ 'lcg64_musl': 0, // todo
628
+
629
+ 'xorshift32+': {
630
+ globals: [ Valtype.i32 ],
631
+ locals: [ Valtype.i32 ],
632
+ returns: Valtype.i32,
633
+ wasm: [
634
+ // setup: s1 = state0
635
+ [ Opcodes.global_get, 0 ], // state0
636
+ [ Opcodes.local_tee, 0 ], // s1
637
+
638
+ // s1 ^= s1 << 13
639
+ [ Opcodes.local_get, 0 ], // s1
640
+ [ Opcodes.i32_const, 13 ],
641
+ [ Opcodes.i32_shl ], // <<
642
+ [ Opcodes.i32_xor ], // ^
643
+ [ Opcodes.local_tee, 0 ], // s1
644
+
645
+ // s1 ^= s1 >> 17
646
+ [ Opcodes.local_get, 0 ], // s1
647
+ [ Opcodes.i32_const, 17 ],
648
+ [ Opcodes.i32_shr_s ], // >>
649
+ [ Opcodes.i32_xor ], // ^
650
+ [ Opcodes.local_tee, 0 ], // s1
651
+
652
+ // s1 ^= s1 << 5
653
+ [ Opcodes.local_get, 0 ], // s1
654
+ [ Opcodes.i32_const, 5 ],
655
+ [ Opcodes.i32_shl ], // <<
656
+ [ Opcodes.i32_xor ], // ^
657
+ [ Opcodes.local_tee, 0 ], // s1
658
+
659
+ // state0 = s1
660
+ [ Opcodes.global_set, 0 ],
661
+
662
+ // s1
663
+ [ Opcodes.local_get, 0 ],
664
+ ],
665
+ },
666
+
667
+ 'xorshift64+': {
668
+ globals: [ Valtype.i64 ],
669
+ locals: [ Valtype.i64 ],
670
+ returns: Valtype.i64,
671
+ wasm: [
672
+ // setup: s1 = state0
673
+ [ Opcodes.global_get, 0 ], // state0
674
+ [ Opcodes.local_tee, 0 ], // s1
675
+
676
+ // s1 ^= s1 >> 12
677
+ [ Opcodes.local_get, 0 ], // s1
678
+ [ Opcodes.i64_const, 12 ],
679
+ [ Opcodes.i64_shr_s ], // >>
680
+ [ Opcodes.i64_xor ], // ^
681
+ [ Opcodes.local_tee, 0 ], // s1
682
+
683
+ // s1 ^= s1 << 25
684
+ [ Opcodes.local_get, 0 ], // s1
685
+ [ Opcodes.i64_const, 25 ],
686
+ [ Opcodes.i64_shl ], // <<
687
+ [ Opcodes.i64_xor ], // ^
688
+ [ Opcodes.local_tee, 0 ], // s1
689
+
690
+ // s1 ^= s1 >> 27
691
+ [ Opcodes.local_get, 0 ], // s1
692
+ [ Opcodes.i64_const, 27 ],
693
+ [ Opcodes.i64_shr_s ], // >>
694
+ [ Opcodes.i64_xor ], // ^
695
+ [ Opcodes.local_tee, 0 ], // s1
696
+
697
+ // state0 = s1
698
+ [ Opcodes.global_set, 0 ],
699
+
700
+ // // s1 * 0x2545F4914F6CDD1D
701
+ // [ Opcodes.local_get, 0 ],
702
+ // [ Opcodes.i64_const, 0x9d, 0xba, 0xb3, 0xfb, 0x94, 0x92, 0xfd, 0xa2, 0x25 ],
703
+ // [ Opcodes.i64_mul ]
704
+
705
+ // s1
706
+ [ Opcodes.local_get, 0 ],
707
+ ],
708
+ },
709
+
710
+ 'xorshift128+': {
711
+ globals: [ Valtype.i64, Valtype.i64 ],
712
+ locals: [ Valtype.i64, Valtype.i64 ],
713
+ returns: Valtype.i64,
714
+ wasm: [
715
+ // setup: s1 = state0, s0 = state1, state0 = s0
716
+ [ Opcodes.global_get, 0 ], // state0
717
+ [ Opcodes.local_tee, 0 ], // s1
718
+ [ Opcodes.global_get, 1 ], // state1
719
+ [ Opcodes.local_tee, 1, ], // s0
720
+ [ Opcodes.global_set, 0 ], // state0
721
+
722
+ // s1 ^= s1 << 23
723
+ // [ Opcodes.local_get, 0 ], // s1
724
+ [ Opcodes.local_get, 0 ], // s1
725
+ [ Opcodes.i64_const, 23 ],
726
+ [ Opcodes.i64_shl ], // <<
727
+ [ Opcodes.i64_xor ], // ^
728
+ [ Opcodes.local_set, 0 ], // s1
729
+
730
+ // state1 = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26)
731
+ // s1 ^ s0
732
+ [ Opcodes.local_get, 0 ], // s1
733
+ [ Opcodes.local_get, 1 ], // s0
734
+ [ Opcodes.i64_xor ], // ^
735
+
736
+ // ^ (s1 >> 17)
737
+ [ Opcodes.local_get, 0 ], // s1
738
+ [ Opcodes.i64_const, 17 ],
739
+ [ Opcodes.i64_shr_u ], // >>
740
+ [ Opcodes.i64_xor ], // ^
741
+
742
+ // ^ (s0 >> 26)
743
+ [ Opcodes.local_get, 1 ], // s0
744
+ [ Opcodes.i64_const, 26 ],
745
+ [ Opcodes.i64_shr_u ], // >>
746
+ [ Opcodes.i64_xor ], // ^
747
+
748
+ // state1 =
749
+ [ Opcodes.global_set, 1 ],
750
+
751
+ // state1 + s0
752
+ [ Opcodes.global_get, 1 ], // state1
753
+ [ Opcodes.local_get, 1 ], // s0
754
+ [ Opcodes.i64_add ]
755
+ ]
756
+ },
757
+
758
+ 'xoroshiro128+': {
759
+ globals: [ Valtype.i64, Valtype.i64 ],
760
+ locals: [ Valtype.i64, Valtype.i64, Valtype.i64 ],
761
+ returns: Valtype.i64,
762
+ wasm: [
763
+ // setup: s1 = state1, s0 = state0
764
+ [ Opcodes.global_get, 1 ], // state0
765
+ [ Opcodes.local_tee, 0 ], // s1
766
+ [ Opcodes.global_get, 0 ], // state1
767
+ [ Opcodes.local_tee, 1, ], // s0
768
+
769
+ // result = s0 + s1
770
+ [ Opcodes.i64_add ],
771
+ [ Opcodes.local_set, 2 ], // result
772
+
773
+ // s1 ^= s0
774
+ [ Opcodes.local_get, 0 ], // s1
775
+ [ Opcodes.local_get, 1 ], // s0
776
+ [ Opcodes.i64_xor ],
777
+ [ Opcodes.local_set, 0 ], // s1
778
+
779
+ // state0 = rotl(s0, 24) ^ s1 ^ (s1 << 16)
780
+
781
+ // rotl(s0, 24) ^ s1
782
+ [ Opcodes.local_get, 1 ], // s0
783
+ ...number(24, Valtype.i64),
784
+ [ Opcodes.i64_rotl ],
785
+ [ Opcodes.local_get, 0 ], // s1
786
+ [ Opcodes.i64_xor ],
787
+
788
+ // ^ (s1 << 16)
789
+ [ Opcodes.local_get, 0 ], // s1
790
+ ...number(16, Valtype.i64),
791
+ [ Opcodes.i64_shl ],
792
+ [ Opcodes.i64_xor ],
793
+
794
+ // state0 =
795
+ [ Opcodes.global_set, 0 ], // state0
796
+
797
+ // state1 = rotl(s1, 37)
798
+ [ Opcodes.local_get, 0 ], // s1
799
+ ...number(37, Valtype.i64),
800
+ [ Opcodes.i64_rotl ],
801
+ [ Opcodes.global_set, 1 ], // state1
802
+
803
+ // result
804
+ [ Opcodes.local_get, 2 ],
805
+ ]
806
+ },
807
+
808
+ 'xoshiro128+': {
809
+ globals: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
810
+ locals: [ Valtype.i32, Valtype.i32 ],
811
+ returns: Valtype.i32,
812
+ wasm: [
813
+ // result = state0 + state3
814
+ [ Opcodes.global_get, 0 ], // state0
815
+ [ Opcodes.global_get, 3 ], // state0
816
+ [ Opcodes.i32_add ],
817
+ [ Opcodes.local_set, 0 ], // result
818
+
819
+ // t = state1 << 9
820
+ [ Opcodes.global_get, 1 ], // state1
821
+ ...number(9, Valtype.i32),
822
+ [ Opcodes.i32_shl ],
823
+ [ Opcodes.local_set, 1 ], // t
824
+
825
+ // state2 ^= state0
826
+ [ Opcodes.global_get, 2 ], // state2
827
+ [ Opcodes.global_get, 0 ], // state0
828
+ [ Opcodes.i32_xor ],
829
+ [ Opcodes.global_set, 2 ], // state2
830
+
831
+ // state3 ^= state1
832
+ [ Opcodes.global_get, 3 ], // state3
833
+ [ Opcodes.global_get, 1 ], // state1
834
+ [ Opcodes.i32_xor ],
835
+ [ Opcodes.global_set, 3 ], // state3
836
+
837
+ // state1 ^= state2
838
+ [ Opcodes.global_get, 1 ], // state1
839
+ [ Opcodes.global_get, 2 ], // state2
840
+ [ Opcodes.i32_xor ],
841
+ [ Opcodes.global_set, 1 ], // state1
842
+
843
+ // state0 ^= state3
844
+ [ Opcodes.global_get, 0 ], // state2
845
+ [ Opcodes.global_get, 3 ], // state0
846
+ [ Opcodes.i32_xor ],
847
+ [ Opcodes.global_set, 0 ], // state2
848
+
849
+ // state2 ^= t
850
+ [ Opcodes.global_get, 2 ], // state2
851
+ [ Opcodes.local_get, 1 ], // t
852
+ [ Opcodes.i32_xor ],
853
+ [ Opcodes.global_set, 2 ], // state2
854
+
855
+ // state3 = rotl(state3, 11)
856
+ [ Opcodes.global_get, 3 ], // state3
857
+ ...number(11, Valtype.i32),
858
+ [ Opcodes.i32_rotl ],
859
+ [ Opcodes.global_set, 3 ], // state3
860
+
861
+ // result
862
+ [ Opcodes.local_get, 0 ],
863
+ ]
864
+ }
865
+ })[Prefs.prng ?? 'xorshift128+'];
866
+
867
+ if (!prng) throw new Error(`unknown prng algo: ${Prefs.prng}`);
509
868
 
510
869
  this.__Math_random = {
511
870
  floatOnly: true,
512
871
  params: [],
513
- locals: [ Valtype.i64, Valtype.i64 ],
872
+ locals: prng.locals,
514
873
  localNames: [ 's1', 's0' ],
515
- globals: [ Valtype.i64, Valtype.i64 ],
874
+ globals: prng.globals,
516
875
  globalNames: [ 'state0', 'state1' ],
517
876
  globalInits: [ prngSeed0, prngSeed1 ],
518
877
  returns: [ Valtype.f64 ],
519
878
  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 ],
879
+ ...prng.wasm,
555
880
 
556
881
  // you thought it was over? now we need the result as a f64 between 0-1 :)
557
882
 
558
- // state1 + s0
559
- [ Opcodes.global_get, 1 ], // state1
560
- [ Opcodes.local_get, 1 ], // s0
561
- [ Opcodes.i64_add ],
562
-
563
883
  // should we >> 12 here?
564
884
  // it feels like it but it breaks values
565
885
 
@@ -574,15 +894,72 @@ export const BuiltinFuncs = function() {
574
894
  // ...number(1),
575
895
  // [ Opcodes.f64_sub ],
576
896
 
577
- ...number((1 << 53) - 1, Valtype.i64),
578
- [ Opcodes.i64_and ],
897
+ ...(prng.returns === Valtype.i64 ? [
898
+ ...number((1 << 53) - 1, Valtype.i64),
899
+ [ Opcodes.i64_and ],
900
+
901
+ // double(mantissa)
902
+ [ Opcodes.f64_convert_i64_u ],
903
+
904
+ // / (1 << 53)
905
+ ...number(1 << 53),
906
+ [ Opcodes.f64_div ]
907
+ ] : [
908
+ ...number((1 << 21) - 1, Valtype.i32),
909
+ [ Opcodes.i32_and ],
910
+
911
+ // double(mantissa)
912
+ [ Opcodes.f64_convert_i32_u ],
913
+
914
+ // / (1 << 21)
915
+ ...number(1 << 21),
916
+ [ Opcodes.f64_div ]
917
+ ])
918
+ ]
919
+ };
920
+
921
+ // this.__Porffor_randomInt = {
922
+ // params: [],
923
+ // locals: prng.locals,
924
+ // localNames: [ 's1', 's0' ],
925
+ // globals: prng.globals,
926
+ // globalNames: [ 'state0', 'state1' ],
927
+ // globalInits: [ prngSeed0, prngSeed1 ],
928
+ // returns: [ Valtype.i32 ],
929
+ // wasm: [
930
+ // ...prng.wasm,
931
+
932
+ // ...(prng.returns === Valtype.i64 ? [
933
+ // // the lowest bits of the output generated by xorshift128+ have low quality
934
+ // ...number(56, Valtype.i64),
935
+ // [ Opcodes.i64_shr_u ],
936
+
937
+ // [ Opcodes.i32_wrap_i64 ],
938
+ // ] : []),
939
+ // ]
940
+ // };
941
+
942
+ this.__Porffor_randomByte = {
943
+ params: [],
944
+ locals: prng.locals,
945
+ localNames: [ 's1', 's0' ],
946
+ globals: prng.globals,
947
+ globalNames: [ 'state0', 'state1' ],
948
+ globalInits: [ prngSeed0, prngSeed1 ],
949
+ returns: [ Valtype.i32 ],
950
+ wasm: [
951
+ ...prng.wasm,
952
+
953
+ ...(prng.returns === Valtype.i64 ? [
954
+ // the lowest bits of the output generated by xorshift128+ have low quality
955
+ ...number(56, Valtype.i64),
956
+ [ Opcodes.i64_shr_u ],
579
957
 
580
- // double(mantissa)
581
- [ Opcodes.f64_convert_i64_u ],
958
+ [ Opcodes.i32_wrap_i64 ],
959
+ ] : []),
582
960
 
583
- // / (1 << 53)
584
- ...number(1 << 53),
585
- [ Opcodes.f64_div ]
961
+ ...number(0xff, Valtype.i32),
962
+ [ Opcodes.i32_and ],
586
963
  ]
587
964
  };
588
965
 
@@ -661,7 +1038,7 @@ export const BuiltinFuncs = function() {
661
1038
  params: [ valtypeBinary ],
662
1039
  locals: [],
663
1040
  returns: [ valtypeBinary ],
664
- returnType: 'boolean',
1041
+ returnType: TYPES.boolean,
665
1042
  wasm: [
666
1043
  [ Opcodes.local_get, 0 ],
667
1044
  ...number(0),
@@ -686,7 +1063,7 @@ export const BuiltinFuncs = function() {
686
1063
  typedParams: true,
687
1064
  locals: [ Valtype.i32, Valtype.i32 ],
688
1065
  returns: [ valtypeBinary ],
689
- returnType: Prefs.bytestring ? '_bytestring' : 'string',
1066
+ returnType: Prefs.bytestring ? TYPES._bytestring : TYPES.string,
690
1067
  wasm: (scope, { TYPE_NAMES, typeSwitch, makeString }) => {
691
1068
  const bc = {};
692
1069
  for (const x in TYPE_NAMES) {
@@ -697,198 +1074,35 @@ export const BuiltinFuncs = function() {
697
1074
  }
698
1075
  };
699
1076
 
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 = {
1077
+ this.__Porffor_rawType = {
712
1078
  params: [ valtypeBinary, Valtype.i32 ],
713
1079
  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
1080
  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 ],
1081
+ returns: [ valtypeBinary ],
815
1082
  wasm: [
816
- [ Opcodes.local_get, 0 ],
817
1083
  [ Opcodes.local_get, 1 ],
818
- [ ...Opcodes.i32x4_sub ]
1084
+ Opcodes.i32_from_u
819
1085
  ]
820
1086
  };
821
1087
 
822
- this.__SIMD_i32x4_mul = {
823
- params: [ Valtype.v128, Valtype.v128 ],
1088
+ this.__Porffor_clone = {
1089
+ params: [ valtypeBinary, valtypeBinary ],
824
1090
  locals: [],
825
- returns: [ Valtype.v128 ],
1091
+ returns: [],
826
1092
  wasm: [
827
- [ Opcodes.local_get, 0 ],
1093
+ // dst
828
1094
  [ 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
- };
1095
+ Opcodes.i32_to_u,
852
1096
 
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: [
1097
+ // src
868
1098
  [ Opcodes.local_get, 0 ],
869
- [ ...Opcodes.i32x4_extract_lane, 3 ],
870
- ],
871
- };
1099
+ Opcodes.i32_to_u,
872
1100
 
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)
1101
+ // size = pageSize
1102
+ ...number(pageSize, Valtype.i32),
1103
+ [ ...Opcodes.memory_copy, 0x00, 0x00 ],
881
1104
  ]
882
1105
  };
883
1106
 
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
- };
1107
+ GeneratedBuiltins.BuiltinFuncs.call(this);
894
1108
  };