porffor 0.2.0-dfa0583 → 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 (51) 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 +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 +42 -0
  18. package/compiler/builtins/string.ts +1055 -0
  19. package/compiler/builtins/tostring.ts +45 -0
  20. package/compiler/builtins.js +468 -264
  21. package/compiler/{codeGen.js → codegen.js} +899 -347
  22. package/compiler/embedding.js +22 -22
  23. package/compiler/encoding.js +108 -10
  24. package/compiler/generated_builtins.js +1136 -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/runner/info.js +0 -89
  48. package/runner/profile.js +0 -46
  49. package/runner/results.json +0 -1
  50. package/runner/transform.js +0 -15
  51. 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() {
@@ -170,33 +203,15 @@ export const BuiltinFuncs = function() {
170
203
  ]
171
204
  };
172
205
 
173
- // todo: return false for NaN
174
- this.Boolean = {
175
- params: [ valtypeBinary ],
176
- locals: [],
177
- returns: [ valtypeBinary ],
178
- returnType: 'boolean',
179
- wasm: [
180
- [ Opcodes.local_get, 0 ],
181
- ...(valtype === 'f64' ? [
182
- ...number(0),
183
- [ Opcodes.f64_ne ]
184
- ] : [
185
- ...Opcodes.eqz,
186
- [ Opcodes.i32_eqz ]
187
- ]),
188
- Opcodes.i32_from
189
- ]
190
- };
191
-
192
206
  // just return given (default 0) for (new) Object() as we somewhat supports object just not constructor
193
207
  this.Object = {
194
208
  params: [ valtypeBinary ],
195
209
  locals: [],
196
210
  returns: [ valtypeBinary ],
197
- returnType: 'object',
211
+ returnType: TYPES.object,
198
212
  wasm: [
199
- [ Opcodes.local_get, 0 ]
213
+ // [ Opcodes.local_get, 0 ]
214
+ ...number(1)
200
215
  ]
201
216
  };
202
217
 
@@ -206,7 +221,7 @@ export const BuiltinFuncs = function() {
206
221
  typedParams: true,
207
222
  locals: [ Valtype.i32, Valtype.i32 ],
208
223
  returns: [],
209
- wasm: (scope, { TYPES, typeSwitch }) => [
224
+ wasm: (scope, { typeSwitch }) => [
210
225
  ...typeSwitch(scope, [ [ Opcodes.local_get, 1 ] ], {
211
226
  [TYPES.number]: [
212
227
  [ Opcodes.local_get, 0 ],
@@ -258,6 +273,40 @@ export const BuiltinFuncs = function() {
258
273
 
259
274
  [ Opcodes.end ]
260
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
+ ],
261
310
  [TYPES._array]: [
262
311
  ...printStaticStr('[ '),
263
312
 
@@ -334,7 +383,7 @@ export const BuiltinFuncs = function() {
334
383
  params: [ valtypeBinary ],
335
384
  locals: [],
336
385
  returns: [ valtypeBinary ],
337
- returnType: 'boolean',
386
+ returnType: TYPES.boolean,
338
387
  wasm: [
339
388
  [ Opcodes.local_get, 0 ],
340
389
  [ Opcodes.local_get, 0 ],
@@ -349,7 +398,7 @@ export const BuiltinFuncs = function() {
349
398
  params: [ valtypeBinary ],
350
399
  locals: [ valtypeBinary ],
351
400
  returns: [ valtypeBinary ],
352
- returnType: 'boolean',
401
+ returnType: TYPES.boolean,
353
402
  wasm: [
354
403
  [ Opcodes.local_get, 0 ],
355
404
  [ Opcodes.local_get, 0 ],
@@ -368,7 +417,7 @@ export const BuiltinFuncs = function() {
368
417
  params: [ valtypeBinary ],
369
418
  locals: [],
370
419
  returns: [ valtypeBinary ],
371
- returnType: 'boolean',
420
+ returnType: TYPES.boolean,
372
421
  wasm: [
373
422
  [ Opcodes.local_get, 0 ],
374
423
  [ Opcodes.local_get, 0 ],
@@ -383,7 +432,7 @@ export const BuiltinFuncs = function() {
383
432
  params: [ valtypeBinary ],
384
433
  locals: [],
385
434
  returns: [ valtypeBinary ],
386
- returnType: 'boolean',
435
+ returnType: TYPES.boolean,
387
436
  wasm: [
388
437
  [ Opcodes.local_get, 0 ],
389
438
  [ Opcodes.local_get, 0 ],
@@ -523,61 +572,314 @@ export const BuiltinFuncs = function() {
523
572
 
524
573
  // this is an implementation of xorshift128+ (in wasm bytecode)
525
574
  // fun fact: v8, SM, JSC also use this (you will need this fun fact to maintain your sanity reading this code)
526
- 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}`);
527
868
 
528
869
  this.__Math_random = {
529
870
  floatOnly: true,
530
871
  params: [],
531
- locals: [ Valtype.i64, Valtype.i64 ],
872
+ locals: prng.locals,
532
873
  localNames: [ 's1', 's0' ],
533
- globals: [ Valtype.i64, Valtype.i64 ],
874
+ globals: prng.globals,
534
875
  globalNames: [ 'state0', 'state1' ],
535
876
  globalInits: [ prngSeed0, prngSeed1 ],
536
877
  returns: [ Valtype.f64 ],
537
878
  wasm: [
538
- // setup: s1 = state0, s0 = state1, state0 = s0
539
- [ Opcodes.global_get, 0 ], // state0
540
- [ Opcodes.local_tee, 0 ], // s1
541
- [ Opcodes.global_get, 1 ], // state1
542
- [ Opcodes.local_tee, 1, ], // s0
543
- [ Opcodes.global_set, 0 ], // state0
544
-
545
- // s1 ^= s1 << 23
546
- // [ Opcodes.local_get, 0 ], // s1
547
- [ Opcodes.local_get, 0 ], // s1
548
- [ Opcodes.i64_const, 23 ],
549
- [ Opcodes.i64_shl ], // <<
550
- [ Opcodes.i64_xor ], // ^
551
- [ Opcodes.local_set, 0 ], // s1
552
-
553
- // state1 = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26)
554
- // s1 ^ s0
555
- [ Opcodes.local_get, 0 ], // s1
556
- [ Opcodes.local_get, 1 ], // s0
557
- [ Opcodes.i64_xor ], // ^
558
-
559
- // ^ (s1 >> 17)
560
- [ Opcodes.local_get, 0 ], // s1
561
- [ Opcodes.i64_const, 17 ],
562
- [ Opcodes.i64_shr_u ], // >>
563
- [ Opcodes.i64_xor ], // ^
564
-
565
- // ^ (s0 >> 26)
566
- [ Opcodes.local_get, 1 ], // s0
567
- [ Opcodes.i64_const, 26 ],
568
- [ Opcodes.i64_shr_u ], // >>
569
- [ Opcodes.i64_xor ], // ^
570
-
571
- // state1 =
572
- [ Opcodes.global_set, 1 ],
879
+ ...prng.wasm,
573
880
 
574
881
  // you thought it was over? now we need the result as a f64 between 0-1 :)
575
882
 
576
- // state1 + s0
577
- [ Opcodes.global_get, 1 ], // state1
578
- [ Opcodes.local_get, 1 ], // s0
579
- [ Opcodes.i64_add ],
580
-
581
883
  // should we >> 12 here?
582
884
  // it feels like it but it breaks values
583
885
 
@@ -592,15 +894,72 @@ export const BuiltinFuncs = function() {
592
894
  // ...number(1),
593
895
  // [ Opcodes.f64_sub ],
594
896
 
595
- ...number((1 << 53) - 1, Valtype.i64),
596
- [ 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 ],
597
957
 
598
- // double(mantissa)
599
- [ Opcodes.f64_convert_i64_u ],
958
+ [ Opcodes.i32_wrap_i64 ],
959
+ ] : []),
600
960
 
601
- // / (1 << 53)
602
- ...number(1 << 53),
603
- [ Opcodes.f64_div ]
961
+ ...number(0xff, Valtype.i32),
962
+ [ Opcodes.i32_and ],
604
963
  ]
605
964
  };
606
965
 
@@ -679,7 +1038,7 @@ export const BuiltinFuncs = function() {
679
1038
  params: [ valtypeBinary ],
680
1039
  locals: [],
681
1040
  returns: [ valtypeBinary ],
682
- returnType: 'boolean',
1041
+ returnType: TYPES.boolean,
683
1042
  wasm: [
684
1043
  [ Opcodes.local_get, 0 ],
685
1044
  ...number(0),
@@ -699,206 +1058,51 @@ export const BuiltinFuncs = function() {
699
1058
  };
700
1059
 
701
1060
 
702
- this.__SIMD_i32x4_load = {
703
- params: [ Valtype.i32 ],
704
- locals: [],
705
- returns: [ Valtype.v128 ],
706
- wasm: [
707
- [ Opcodes.local_get, 0 ],
708
- [ ...Opcodes.v128_load, 0, 0 ]
709
- ]
710
- };
711
-
712
- this.__SIMD_i32x4_splat = {
713
- params: [ Valtype.i32 ],
714
- locals: [],
715
- returns: [ Valtype.v128 ],
716
- wasm: [
717
- [ Opcodes.local_get, 0 ],
718
- [ ...Opcodes.i32x4_splat ],
719
- ]
720
- };
721
-
722
- this.__SIMD_i16x8_create = {
723
- params: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
724
- locals: [],
725
- returns: [ Valtype.v128 ],
726
- wasm: [
727
- ...i32x4(0, 0, 0, 0),
728
- [ Opcodes.local_get, 0 ],
729
- [ ...Opcodes.i16x8_replace_lane, 0 ],
730
- [ Opcodes.local_get, 1 ],
731
- [ ...Opcodes.i16x8_replace_lane, 1 ],
732
- [ Opcodes.local_get, 2 ],
733
- [ ...Opcodes.i16x8_replace_lane, 2 ],
734
- [ Opcodes.local_get, 3 ],
735
- [ ...Opcodes.i16x8_replace_lane, 3 ],
736
- [ Opcodes.local_get, 4 ],
737
- [ ...Opcodes.i16x8_replace_lane, 4 ],
738
- [ Opcodes.local_get, 5 ],
739
- [ ...Opcodes.i16x8_replace_lane, 5 ],
740
- [ Opcodes.local_get, 6 ],
741
- [ ...Opcodes.i16x8_replace_lane, 6 ],
742
- [ Opcodes.local_get, 7 ],
743
- [ ...Opcodes.i16x8_replace_lane, 7 ],
744
- ]
745
- };
746
-
747
- this.__SIMD_i32x4_dot_i16x8 = {
748
- params: [ Valtype.v128, Valtype.v128 ],
749
- locals: [],
750
- returns: [ Valtype.v128 ],
751
- wasm: [
752
- [ Opcodes.local_get, 0 ],
753
- [ Opcodes.local_get, 1 ],
754
- [ ...Opcodes.i32x4_dot_i16x8_s ]
755
- ]
756
- };
757
-
758
- this.__SIMD_i32x4_create = {
759
- params: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
760
- locals: [],
761
- returns: [ Valtype.v128 ],
762
- wasm: [
763
- ...i32x4(0, 0, 0, 0),
764
- [ Opcodes.local_get, 0 ],
765
- [ ...Opcodes.i32x4_replace_lane, 0 ],
766
- [ Opcodes.local_get, 1 ],
767
- [ ...Opcodes.i32x4_replace_lane, 1 ],
768
- [ Opcodes.local_get, 2 ],
769
- [ ...Opcodes.i32x4_replace_lane, 2 ],
770
- [ Opcodes.local_get, 3 ],
771
- [ ...Opcodes.i32x4_replace_lane, 3 ],
772
- ]
773
- };
774
-
775
- this.__SIMD_i32x4_add = {
776
- params: [ Valtype.v128, Valtype.v128 ],
777
- locals: [],
778
- returns: [ Valtype.v128 ],
779
- wasm: [
780
- [ Opcodes.local_get, 0 ],
781
- [ Opcodes.local_get, 1 ],
782
- [ ...Opcodes.i32x4_add ]
783
- ]
1061
+ this.__Porffor_type = {
1062
+ params: [ valtypeBinary, Valtype.i32 ],
1063
+ typedParams: true,
1064
+ locals: [ Valtype.i32, Valtype.i32 ],
1065
+ returns: [ valtypeBinary ],
1066
+ returnType: Prefs.bytestring ? TYPES._bytestring : TYPES.string,
1067
+ wasm: (scope, { TYPE_NAMES, typeSwitch, makeString }) => {
1068
+ const bc = {};
1069
+ for (const x in TYPE_NAMES) {
1070
+ bc[x] = makeString(scope, TYPE_NAMES[x], false, '#Porffor_type_result');
1071
+ }
1072
+
1073
+ return typeSwitch(scope, [ [ Opcodes.local_get, 1 ] ], bc);
1074
+ }
784
1075
  };
785
1076
 
786
- this.__SIMD_i32x4_sub = {
787
- params: [ Valtype.v128, Valtype.v128 ],
1077
+ this.__Porffor_rawType = {
1078
+ params: [ valtypeBinary, Valtype.i32 ],
1079
+ typedParams: true,
788
1080
  locals: [],
789
- returns: [ Valtype.v128 ],
1081
+ returns: [ valtypeBinary ],
790
1082
  wasm: [
791
- [ Opcodes.local_get, 0 ],
792
1083
  [ Opcodes.local_get, 1 ],
793
- [ ...Opcodes.i32x4_sub ]
1084
+ Opcodes.i32_from_u
794
1085
  ]
795
1086
  };
796
1087
 
797
- this.__SIMD_i32x4_mul = {
798
- params: [ Valtype.v128, Valtype.v128 ],
1088
+ this.__Porffor_clone = {
1089
+ params: [ valtypeBinary, valtypeBinary ],
799
1090
  locals: [],
800
- returns: [ Valtype.v128 ],
1091
+ returns: [],
801
1092
  wasm: [
802
- [ Opcodes.local_get, 0 ],
1093
+ // dst
803
1094
  [ Opcodes.local_get, 1 ],
804
- [ ...Opcodes.i32x4_mul ]
805
- ]
806
- };
807
-
808
- this.__SIMD_i32x4_get0 = {
809
- params: [ Valtype.v128 ],
810
- locals: [],
811
- returns: [ Valtype.i32 ],
812
- wasm: [
813
- [ Opcodes.local_get, 0 ],
814
- [ ...Opcodes.i32x4_extract_lane, 0 ],
815
- ],
816
- },
817
-
818
- this.__SIMD_i32x4_get1 = {
819
- params: [ Valtype.v128 ],
820
- locals: [],
821
- returns: [ Valtype.i32 ],
822
- wasm: [
823
- [ Opcodes.local_get, 0 ],
824
- [ ...Opcodes.i32x4_extract_lane, 1 ],
825
- ],
826
- };
827
-
828
- this.__SIMD_i32x4_get2 = {
829
- params: [ Valtype.v128 ],
830
- locals: [],
831
- returns: [ Valtype.i32 ],
832
- wasm: [
833
- [ Opcodes.local_get, 0 ],
834
- [ ...Opcodes.i32x4_extract_lane, 2 ],
835
- ],
836
- };
1095
+ Opcodes.i32_to_u,
837
1096
 
838
- this.__SIMD_i32x4_get3 = {
839
- params: [ Valtype.v128 ],
840
- locals: [],
841
- returns: [ Valtype.i32 ],
842
- wasm: [
1097
+ // src
843
1098
  [ Opcodes.local_get, 0 ],
844
- [ ...Opcodes.i32x4_extract_lane, 3 ],
845
- ],
846
- };
1099
+ Opcodes.i32_to_u,
847
1100
 
848
- this.__SIMD_i32x4_shuffle_000c = {
849
- params: [ Valtype.v128 ],
850
- locals: [],
851
- returns: [ Valtype.v128 ],
852
- wasm: [
853
- [ Opcodes.local_get, 0 ],
854
- ...i32x4(0, 0, 0, 0),
855
- [ ...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 ],
856
1104
  ]
857
1105
  };
858
1106
 
859
- this.__SIMD_i32x4_shuffle_00ab = {
860
- params: [ Valtype.v128 ],
861
- locals: [],
862
- returns: [ Valtype.v128 ],
863
- wasm: [
864
- [ Opcodes.local_get, 0 ],
865
- ...i32x4(0, 0, 0, 0),
866
- [ ...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)
867
- ]
868
- };
869
- };
870
-
871
- export const BuiltinPreludes = {
872
- btoa: `var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
873
- var btoa = function (input) {
874
- // todo: throw invalid character for unicode
875
-
876
- let output = "";
877
- let chr1, chr2, chr3, enc1, enc2, enc3, enc4;
878
- let i = 0;
879
-
880
- while (i < input.length) {
881
- chr1 = input.charCodeAt(i++);
882
- chr2 = input.charCodeAt(i++);
883
- chr3 = input.charCodeAt(i++);
884
-
885
- enc1 = chr1 >> 2;
886
- enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
887
- enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
888
- enc4 = chr3 & 63;
889
-
890
- if (isNaN(chr2)) {
891
- enc3 = enc4 = 64;
892
- } else if (isNaN(chr3)) {
893
- enc4 = 64;
894
- }
895
-
896
- output += keyStr.charAt(enc1);
897
- output += keyStr.charAt(enc2);
898
- output += keyStr.charAt(enc3);
899
- output += keyStr.charAt(enc4);
900
- }
901
-
902
- return output;
903
- };`
1107
+ GeneratedBuiltins.BuiltinFuncs.call(this);
904
1108
  };