porffor 0.2.0-c1d7382 → 0.2.0-c1ed50d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +64 -45
  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} +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 +734 -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 +453 -273
  21. package/compiler/{codeGen.js → codegen.js} +878 -337
  22. package/compiler/embedding.js +22 -22
  23. package/compiler/encoding.js +108 -10
  24. package/compiler/generated_builtins.js +974 -0
  25. package/compiler/index.js +27 -35
  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 +2 -0
  37. package/rhemyn/compile.js +5 -3
  38. package/rhemyn/parse.js +323 -320
  39. package/rhemyn/test/parse.js +58 -58
  40. package/runner/compare.js +34 -34
  41. package/runner/debug.js +122 -0
  42. package/runner/index.js +35 -9
  43. package/runner/profiler.js +102 -0
  44. package/runner/repl.js +40 -7
  45. package/runner/sizes.js +37 -37
  46. package/compiler/builtins/base64.js +0 -92
  47. package/filesize.cmd +0 -2
  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/tmp.c +0 -661
  53. package/util/enum.js +0 -20
@@ -1,5 +1,8 @@
1
1
  import { Blocktype, Opcodes, Valtype, ValtypeSize } from "./wasmSpec.js";
2
2
  import { number, i32x4 } from "./embedding.js";
3
+ import Prefs from './prefs.js';
4
+ import * as GeneratedBuiltins from './generated_builtins.js';
5
+ import { TYPES } from './types.js';
3
6
 
4
7
  export const importedFuncs = [
5
8
  {
@@ -19,6 +22,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,9 +208,10 @@ 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
 
@@ -187,7 +221,7 @@ export const BuiltinFuncs = function() {
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
 
@@ -315,7 +383,7 @@ export const BuiltinFuncs = function() {
315
383
  params: [ valtypeBinary ],
316
384
  locals: [],
317
385
  returns: [ valtypeBinary ],
318
- returnType: 'boolean',
386
+ returnType: TYPES.boolean,
319
387
  wasm: [
320
388
  [ Opcodes.local_get, 0 ],
321
389
  [ Opcodes.local_get, 0 ],
@@ -330,7 +398,7 @@ export const BuiltinFuncs = function() {
330
398
  params: [ valtypeBinary ],
331
399
  locals: [ valtypeBinary ],
332
400
  returns: [ valtypeBinary ],
333
- returnType: 'boolean',
401
+ returnType: TYPES.boolean,
334
402
  wasm: [
335
403
  [ Opcodes.local_get, 0 ],
336
404
  [ Opcodes.local_get, 0 ],
@@ -349,7 +417,7 @@ export const BuiltinFuncs = function() {
349
417
  params: [ valtypeBinary ],
350
418
  locals: [],
351
419
  returns: [ valtypeBinary ],
352
- returnType: 'boolean',
420
+ returnType: TYPES.boolean,
353
421
  wasm: [
354
422
  [ Opcodes.local_get, 0 ],
355
423
  [ Opcodes.local_get, 0 ],
@@ -364,7 +432,7 @@ export const BuiltinFuncs = function() {
364
432
  params: [ valtypeBinary ],
365
433
  locals: [],
366
434
  returns: [ valtypeBinary ],
367
- returnType: 'boolean',
435
+ returnType: TYPES.boolean,
368
436
  wasm: [
369
437
  [ Opcodes.local_get, 0 ],
370
438
  [ Opcodes.local_get, 0 ],
@@ -504,61 +572,314 @@ export const BuiltinFuncs = function() {
504
572
 
505
573
  // this is an implementation of xorshift128+ (in wasm bytecode)
506
574
  // 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);
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}`);
508
868
 
509
869
  this.__Math_random = {
510
870
  floatOnly: true,
511
871
  params: [],
512
- locals: [ Valtype.i64, Valtype.i64 ],
872
+ locals: prng.locals,
513
873
  localNames: [ 's1', 's0' ],
514
- globals: [ Valtype.i64, Valtype.i64 ],
874
+ globals: prng.globals,
515
875
  globalNames: [ 'state0', 'state1' ],
516
876
  globalInits: [ prngSeed0, prngSeed1 ],
517
877
  returns: [ Valtype.f64 ],
518
878
  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 ],
879
+ ...prng.wasm,
554
880
 
555
881
  // you thought it was over? now we need the result as a f64 between 0-1 :)
556
882
 
557
- // state1 + s0
558
- [ Opcodes.global_get, 1 ], // state1
559
- [ Opcodes.local_get, 1 ], // s0
560
- [ Opcodes.i64_add ],
561
-
562
883
  // should we >> 12 here?
563
884
  // it feels like it but it breaks values
564
885
 
@@ -573,15 +894,72 @@ export const BuiltinFuncs = function() {
573
894
  // ...number(1),
574
895
  // [ Opcodes.f64_sub ],
575
896
 
576
- ...number((1 << 53) - 1, Valtype.i64),
577
- [ Opcodes.i64_and ],
897
+ ...(prng.returns === Valtype.i64 ? [
898
+ ...number((1 << 53) - 1, Valtype.i64),
899
+ [ Opcodes.i64_and ],
578
900
 
579
- // double(mantissa)
580
- [ Opcodes.f64_convert_i64_u ],
901
+ // double(mantissa)
902
+ [ Opcodes.f64_convert_i64_u ],
581
903
 
582
- // / (1 << 53)
583
- ...number(1 << 53),
584
- [ Opcodes.f64_div ]
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 ],
957
+
958
+ [ Opcodes.i32_wrap_i64 ],
959
+ ] : []),
960
+
961
+ ...number(0xff, Valtype.i32),
962
+ [ Opcodes.i32_and ],
585
963
  ]
586
964
  };
587
965
 
@@ -660,7 +1038,7 @@ export const BuiltinFuncs = function() {
660
1038
  params: [ valtypeBinary ],
661
1039
  locals: [],
662
1040
  returns: [ valtypeBinary ],
663
- returnType: 'boolean',
1041
+ returnType: TYPES.boolean,
664
1042
  wasm: [
665
1043
  [ Opcodes.local_get, 0 ],
666
1044
  ...number(0),
@@ -685,7 +1063,7 @@ export const BuiltinFuncs = function() {
685
1063
  typedParams: true,
686
1064
  locals: [ Valtype.i32, Valtype.i32 ],
687
1065
  returns: [ valtypeBinary ],
688
- returnType: process.argv.includes('-bytestring') ? '_bytestring' : 'string',
1066
+ returnType: Prefs.bytestring ? TYPES._bytestring : TYPES.string,
689
1067
  wasm: (scope, { TYPE_NAMES, typeSwitch, makeString }) => {
690
1068
  const bc = {};
691
1069
  for (const x in TYPE_NAMES) {
@@ -696,233 +1074,35 @@ export const BuiltinFuncs = function() {
696
1074
  }
697
1075
  };
698
1076
 
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 = {
1077
+ this.__Porffor_rawType = {
711
1078
  params: [ valtypeBinary, Valtype.i32 ],
712
1079
  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
1080
  locals: [],
785
- returns: [ Valtype.v128 ],
786
- wasm: [
787
- ...i32x4(0, 0, 0, 0),
788
- [ Opcodes.local_get, 0 ],
789
- [ ...Opcodes.i32x4_replace_lane, 0 ],
790
- [ Opcodes.local_get, 1 ],
791
- [ ...Opcodes.i32x4_replace_lane, 1 ],
792
- [ Opcodes.local_get, 2 ],
793
- [ ...Opcodes.i32x4_replace_lane, 2 ],
794
- [ Opcodes.local_get, 3 ],
795
- [ ...Opcodes.i32x4_replace_lane, 3 ],
796
- ]
797
- };
798
-
799
- this.__SIMD_i32x4_add = {
800
- params: [ Valtype.v128, Valtype.v128 ],
801
- locals: [],
802
- returns: [ Valtype.v128 ],
803
- wasm: [
804
- [ Opcodes.local_get, 0 ],
805
- [ Opcodes.local_get, 1 ],
806
- [ ...Opcodes.i32x4_add ]
807
- ]
808
- };
809
-
810
- this.__SIMD_i32x4_sub = {
811
- params: [ Valtype.v128, Valtype.v128 ],
812
- locals: [],
813
- returns: [ Valtype.v128 ],
1081
+ returns: [ valtypeBinary ],
814
1082
  wasm: [
815
- [ Opcodes.local_get, 0 ],
816
1083
  [ Opcodes.local_get, 1 ],
817
- [ ...Opcodes.i32x4_sub ]
1084
+ Opcodes.i32_from_u
818
1085
  ]
819
1086
  };
820
1087
 
821
- this.__SIMD_i32x4_mul = {
822
- params: [ Valtype.v128, Valtype.v128 ],
1088
+ this.__Porffor_clone = {
1089
+ params: [ valtypeBinary, valtypeBinary ],
823
1090
  locals: [],
824
- returns: [ Valtype.v128 ],
1091
+ returns: [],
825
1092
  wasm: [
826
- [ Opcodes.local_get, 0 ],
1093
+ // dst
827
1094
  [ Opcodes.local_get, 1 ],
828
- [ ...Opcodes.i32x4_mul ]
829
- ]
830
- };
1095
+ Opcodes.i32_to_u,
831
1096
 
832
- this.__SIMD_i32x4_get0 = {
833
- params: [ Valtype.v128 ],
834
- locals: [],
835
- returns: [ Valtype.i32 ],
836
- wasm: [
1097
+ // src
837
1098
  [ Opcodes.local_get, 0 ],
838
- [ ...Opcodes.i32x4_extract_lane, 0 ],
839
- ],
840
- },
1099
+ Opcodes.i32_to_u,
841
1100
 
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
- };
861
-
862
- this.__SIMD_i32x4_get3 = {
863
- params: [ Valtype.v128 ],
864
- locals: [],
865
- returns: [ Valtype.i32 ],
866
- wasm: [
867
- [ Opcodes.local_get, 0 ],
868
- [ ...Opcodes.i32x4_extract_lane, 3 ],
869
- ],
870
- };
871
-
872
- this.__SIMD_i32x4_shuffle_000c = {
873
- params: [ Valtype.v128 ],
874
- locals: [],
875
- returns: [ Valtype.v128 ],
876
- wasm: [
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)
1101
+ // size = pageSize
1102
+ ...number(pageSize, Valtype.i32),
1103
+ [ ...Opcodes.memory_copy, 0x00, 0x00 ],
880
1104
  ]
881
1105
  };
882
1106
 
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
- };`
1107
+ GeneratedBuiltins.BuiltinFuncs.call(this);
928
1108
  };