@fluffylabs/anan-as 1.2.0-ef04361 → 1.3.0-1ebcf8f

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 (85) hide show
  1. package/dist/bin/index.js +138 -5
  2. package/dist/bin/src/fuzz.js +2 -2
  3. package/dist/bin/src/test-json.js +2 -6
  4. package/dist/bin/src/trace-parse.js +1 -0
  5. package/dist/bin/src/trace-replay.js +14 -9
  6. package/dist/bin/src/tracer.js +16 -13
  7. package/dist/bin/src/utils.js +2 -2
  8. package/dist/build/compiler-inline.js +1 -1
  9. package/dist/build/compiler.d.ts +17 -13
  10. package/dist/build/compiler.js +13 -21
  11. package/dist/build/compiler.wasm +0 -0
  12. package/dist/build/debug-inline.js +1 -1
  13. package/dist/build/debug-raw-inline.js +1 -1
  14. package/dist/build/debug-raw.d.ts +34 -32
  15. package/dist/build/debug-raw.js +62 -69
  16. package/dist/build/debug-raw.wasm +0 -0
  17. package/dist/build/debug.d.ts +34 -32
  18. package/dist/build/debug.js +63 -70
  19. package/dist/build/debug.wasm +0 -0
  20. package/dist/build/js/assembly/api-debugger.d.ts +4 -4
  21. package/dist/build/js/assembly/api-debugger.js +6 -6
  22. package/dist/build/js/assembly/api-internal.d.ts +1 -1
  23. package/dist/build/js/assembly/api-internal.js +2 -3
  24. package/dist/build/js/assembly/api-types.d.ts +4 -4
  25. package/dist/build/js/assembly/api-types.js +3 -4
  26. package/dist/build/js/assembly/api-utils.d.ts +14 -6
  27. package/dist/build/js/assembly/api-utils.js +28 -13
  28. package/dist/build/js/assembly/arguments.d.ts +4 -4
  29. package/dist/build/js/assembly/arguments.js +10 -10
  30. package/dist/build/js/assembly/gas.d.ts +8 -13
  31. package/dist/build/js/assembly/gas.js +17 -7
  32. package/dist/build/js/assembly/instructions/bit.js +22 -22
  33. package/dist/build/js/assembly/instructions/branch.js +56 -56
  34. package/dist/build/js/assembly/instructions/jump.js +10 -10
  35. package/dist/build/js/assembly/instructions/load.js +41 -41
  36. package/dist/build/js/assembly/instructions/logic.js +20 -20
  37. package/dist/build/js/assembly/instructions/math.js +105 -105
  38. package/dist/build/js/assembly/instructions/misc.js +10 -10
  39. package/dist/build/js/assembly/instructions/mov.js +16 -16
  40. package/dist/build/js/assembly/instructions/outcome.d.ts +7 -7
  41. package/dist/build/js/assembly/instructions/outcome.js +63 -38
  42. package/dist/build/js/assembly/instructions/rot.js +18 -18
  43. package/dist/build/js/assembly/instructions/set.js +18 -18
  44. package/dist/build/js/assembly/instructions/shift.js +59 -59
  45. package/dist/build/js/assembly/instructions/store.js +29 -29
  46. package/dist/build/js/assembly/instructions/utils.d.ts +6 -4
  47. package/dist/build/js/assembly/instructions/utils.js +32 -16
  48. package/dist/build/js/assembly/instructions.d.ts +2 -3
  49. package/dist/build/js/assembly/instructions.js +4 -4
  50. package/dist/build/js/assembly/interpreter.d.ts +0 -1
  51. package/dist/build/js/assembly/interpreter.js +30 -38
  52. package/dist/build/js/assembly/math.d.ts +6 -8
  53. package/dist/build/js/assembly/math.js +21 -13
  54. package/dist/build/js/assembly/memory-page.d.ts +2 -4
  55. package/dist/build/js/assembly/memory-page.js +13 -7
  56. package/dist/build/js/assembly/memory.d.ts +1 -0
  57. package/dist/build/js/assembly/memory.js +119 -23
  58. package/dist/build/js/assembly/portable.js +1 -0
  59. package/dist/build/js/assembly/program-build.js +4 -4
  60. package/dist/build/js/assembly/program.d.ts +15 -8
  61. package/dist/build/js/assembly/program.js +95 -39
  62. package/dist/build/js/assembly/spi.d.ts +1 -1
  63. package/dist/build/js/assembly/spi.js +2 -2
  64. package/dist/build/js/portable/bootstrap.js +1 -0
  65. package/dist/build/js/portable-bundle.js +829 -641
  66. package/dist/build/release-inline.js +1 -1
  67. package/dist/build/release-mini-inline.js +1 -1
  68. package/dist/build/release-mini.d.ts +34 -32
  69. package/dist/build/release-mini.js +63 -70
  70. package/dist/build/release-mini.wasm +0 -0
  71. package/dist/build/release-stub-inline.js +1 -1
  72. package/dist/build/release-stub.d.ts +34 -32
  73. package/dist/build/release-stub.js +63 -70
  74. package/dist/build/release-stub.wasm +0 -0
  75. package/dist/build/release.d.ts +34 -32
  76. package/dist/build/release.js +63 -70
  77. package/dist/build/release.wasm +0 -0
  78. package/dist/build/test-inline.js +1 -1
  79. package/dist/build/test.wasm +0 -0
  80. package/dist/test/test-gas-cost.js +2 -3
  81. package/dist/test/test-trace-format.js +166 -0
  82. package/dist/test/test-w3f-common.js +1 -2
  83. package/package.json +14 -10
  84. package/dist/build/js/assembly/gas-costs.d.ts +0 -6
  85. package/dist/build/js/assembly/gas-costs.js +0 -39
@@ -11,7 +11,7 @@ var __decorate = function(decorators, target, key, desc) {
11
11
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
12
12
  return c > 3 && r && Object.defineProperty(target, key, r), r;
13
13
  };
14
- var inline = (_target = 0, _propertyKey = 0, descriptor = 0) => descriptor;
14
+ var inline2 = (_target = 0, _propertyKey = 0, descriptor = 0) => descriptor;
15
15
  var portable = class _portable {
16
16
  // @ts-ignore: @inline is an AS-only decorator
17
17
  static installPolyfills() {
@@ -28,6 +28,7 @@ var portable = class _portable {
28
28
  arr.fill(0);
29
29
  return arr;
30
30
  };
31
+ g2.StaticArray.fromArray = (x) => x;
31
32
  g2.ASC_TARGET = 0;
32
33
  g2.i8 = (value) => {
33
34
  const n = typeof value === "bigint" ? Number(value) : value;
@@ -106,7 +107,7 @@ var portable = class _portable {
106
107
  };
107
108
  }
108
109
  g2.unchecked = (v) => v;
109
- g2.inline = inline;
110
+ g2.inline = inline2;
110
111
  g2.changetype = (v) => v;
111
112
  }
112
113
  // @ts-ignore: @inline is an AS-only decorator
@@ -288,71 +289,71 @@ var portable = class _portable {
288
289
  }
289
290
  };
290
291
  __decorate([
291
- inline
292
+ inline2
292
293
  ], portable, "installPolyfills", null);
293
294
  __decorate([
294
- inline
295
+ inline2
295
296
  // @ts-ignore: parameter type differs between AS and JS
296
297
  ], portable, "asArray", null);
297
298
  __decorate([
298
- inline
299
+ inline2
299
300
  ], portable, "arrayAt", null);
300
301
  __decorate([
301
- inline
302
+ inline2
302
303
  ], portable, "staticArrayAt", null);
303
304
  __decorate([
304
- inline
305
+ inline2
305
306
  ], portable, "asU32", null);
306
307
  __decorate([
307
- inline
308
+ inline2
308
309
  ], portable, "uint8ArrayView", null);
309
310
  __decorate([
310
- inline
311
+ inline2
311
312
  ], portable, "bswap_u16", null);
312
313
  __decorate([
313
- inline
314
+ inline2
314
315
  ], portable, "bswap_u32", null);
315
316
  __decorate([
316
- inline
317
+ inline2
317
318
  ], portable, "bswap_u64", null);
318
319
  __decorate([
319
- inline
320
+ inline2
320
321
  ], portable, "popcnt_u32", null);
321
322
  __decorate([
322
- inline
323
+ inline2
323
324
  ], portable, "popcnt_u64", null);
324
325
  __decorate([
325
- inline
326
+ inline2
326
327
  ], portable, "clz_u32", null);
327
328
  __decorate([
328
- inline
329
+ inline2
329
330
  ], portable, "clz_u64", null);
330
331
  __decorate([
331
- inline
332
+ inline2
332
333
  ], portable, "ctz_u32", null);
333
334
  __decorate([
334
- inline
335
+ inline2
335
336
  ], portable, "ctz_u64", null);
336
337
  __decorate([
337
- inline
338
+ inline2
338
339
  ], portable, "rotr_u32", null);
339
340
  __decorate([
340
- inline
341
+ inline2
341
342
  ], portable, "rotr_u64", null);
342
343
  __decorate([
343
- inline
344
+ inline2
344
345
  ], portable, "rotl_u32", null);
345
346
  __decorate([
346
- inline
347
+ inline2
347
348
  ], portable, "rotl_u64", null);
348
349
  __decorate([
349
- inline
350
+ inline2
350
351
  ], portable, "u64_add", null);
351
352
  __decorate([
352
- inline
353
+ inline2
353
354
  ], portable, "u64_sub", null);
354
355
  __decorate([
355
- inline
356
+ inline2
356
357
  ], portable, "u64_mul", null);
357
358
  portable.installPolyfills();
358
359
 
@@ -375,7 +376,8 @@ if (typeof globalScope.ASC_TARGET === "undefined") {
375
376
  }, defaultComparator = function(a, b) {
376
377
  if (a == b) {
377
378
  if (a != 0) return 0;
378
- a = 1 / a, b = 1 / b;
379
+ a = 1 / a;
380
+ b = 1 / b;
379
381
  } else {
380
382
  let nanA = a != a, nanB = b != b;
381
383
  if (nanA | nanB) return nanA - nanB;
@@ -621,9 +623,9 @@ if (typeof globalScope.ASC_TARGET === "undefined") {
621
623
  }
622
624
  if (!String.prototype.replaceAll) {
623
625
  Object.defineProperty(String.prototype, "replaceAll", {
624
- value: function replaceAll(search, replacment) {
625
- let res = this.split(search).join(replacment);
626
- if (!search.length) res = replacment + res + replacment;
626
+ value: function replaceAll(search, replacement) {
627
+ let res = this.split(search).join(replacement);
628
+ if (!search.length) res = replacement + res + replacement;
627
629
  return res;
628
630
  },
629
631
  configurable: true
@@ -739,12 +741,28 @@ if (typeof globalScope.ASC_TARGET === "undefined") {
739
741
  }
740
742
 
741
743
  // dist/build/js/assembly/math.js
742
- function minI32(a, b) {
743
- return a < b ? a : b;
744
- }
745
- function minU32(a, b) {
746
- return a < b ? a : b;
747
- }
744
+ var __decorate2 = function(decorators, target, key, desc) {
745
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
746
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
747
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
748
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
749
+ };
750
+ var IntMath = class {
751
+ /** Integer minimum of two i32 values. */
752
+ static minI32(a, b) {
753
+ return a < b ? a : b;
754
+ }
755
+ /** Unsigned integer minimum of two u32 values. */
756
+ static minU32(a, b) {
757
+ return a < b ? a : b;
758
+ }
759
+ };
760
+ __decorate2([
761
+ inline
762
+ ], IntMath, "minI32", null);
763
+ __decorate2([
764
+ inline
765
+ ], IntMath, "minU32", null);
748
766
 
749
767
  // dist/build/js/assembly/arguments.js
750
768
  var Arguments;
@@ -763,8 +781,8 @@ var Arguments;
763
781
  Arguments2[Arguments2["TwoRegTwoImm"] = 11] = "TwoRegTwoImm";
764
782
  Arguments2[Arguments2["ThreeReg"] = 12] = "ThreeReg";
765
783
  })(Arguments || (Arguments = {}));
766
- var RELEVANT_ARGS = [0, 1, 2, 1, 2, 3, 3, 3, 2, 3, 3, 4, 3];
767
- var REQUIRED_BYTES = [0, 0, 1, 0, 1, 9, 1, 1, 1, 1, 1, 2, 2];
784
+ var RELEVANT_ARGS = StaticArray.fromArray([0, 1, 2, 1, 2, 3, 3, 3, 2, 3, 3, 4, 3]);
785
+ var REQUIRED_BYTES = StaticArray.fromArray([0, 0, 1, 0, 1, 9, 1, 1, 1, 1, 1, 2, 2]);
768
786
  var Args = class {
769
787
  constructor() {
770
788
  this.a = 0;
@@ -781,13 +799,13 @@ var Args = class {
781
799
  }
782
800
  };
783
801
  function twoImm(args, code, offset, end) {
784
- const low = lowNibble(portable.arrayAt(code, offset));
785
- const split = minI32(4, low) + 1;
802
+ const low = lowNibble(portable.staticArrayAt(code, offset));
803
+ const split = IntMath.minI32(4, low) + 1;
786
804
  const first = decodeI32(code, offset + 1, offset + split);
787
805
  const second = decodeI32(code, offset + split, end);
788
806
  return args.fill(first, second, 0, 0);
789
807
  }
790
- var DECODERS = [
808
+ var DECODERS = StaticArray.fromArray([
791
809
  // DECODERS[Arguments.Zero] =
792
810
  (args, _d, _o, _l) => {
793
811
  return args.fill(0, 0, 0, 0);
@@ -817,7 +835,7 @@ var DECODERS = [
817
835
  (args, data, o, lim) => {
818
836
  const h = higNibble(data[o]);
819
837
  const l = lowNibble(data[o]);
820
- const split = minI32(4, h) + 1;
838
+ const split = IntMath.minI32(4, h) + 1;
821
839
  const immA = decodeI32(data, o + 1, o + split);
822
840
  const immB = decodeI32(data, o + split, lim);
823
841
  return args.fill(l, immA, immB, 0);
@@ -826,7 +844,7 @@ var DECODERS = [
826
844
  (args, data, o, lim) => {
827
845
  const h = higNibble(data[o]);
828
846
  const l = lowNibble(data[o]);
829
- const split = minI32(4, h) + 1;
847
+ const split = IntMath.minI32(4, h) + 1;
830
848
  const immA = decodeI32(data, o + 1, o + split);
831
849
  const offs = decodeI32(data, o + split, lim);
832
850
  return args.fill(l, immA, offs, 0);
@@ -861,7 +879,7 @@ var DECODERS = [
861
879
  const b = lowNibble(data[o + 1]);
862
880
  return args.fill(hig, low, b, 0);
863
881
  }
864
- ];
882
+ ]);
865
883
  function lowNibble(byte) {
866
884
  return byte & 15;
867
885
  }
@@ -878,7 +896,7 @@ function decodeI32(input, start, end) {
878
896
  for (let i = 0; i < len; i++) {
879
897
  num |= u32(input[start + i]) << i * 8;
880
898
  }
881
- const msb = portable.arrayAt(input, start + len - 1) & 128;
899
+ const msb = portable.staticArrayAt(input, start + len - 1) & 128;
882
900
  if (len < 4 && msb > 0) {
883
901
  num |= 4294967295 << len * 8;
884
902
  }
@@ -893,35 +911,45 @@ function decodeU32(data, offset) {
893
911
  }
894
912
 
895
913
  // dist/build/js/assembly/gas.js
914
+ var __decorate3 = function(decorators, target, key, desc) {
915
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
916
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
917
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
918
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
919
+ };
896
920
  function gasCounter(gas) {
897
- return new GasCounterU64(gas);
921
+ return new GasCounter(gas);
898
922
  }
899
- var GasCounterU64 = class {
923
+ var GasCounter = class {
900
924
  constructor(gas) {
901
925
  this.gas = gas;
902
926
  }
903
927
  set(g2) {
904
- this.gas = i64(g2);
928
+ this.gas = g2;
905
929
  }
906
930
  get() {
907
931
  return this.gas;
908
932
  }
909
933
  sub(g2) {
910
- this.gas = this.gas - i64(g2);
911
- if (this.gas < i64(0)) {
912
- this.gas = i64(0);
934
+ const cost = u64(g2);
935
+ if (cost > this.gas) {
936
+ this.gas = u64(0);
913
937
  return true;
914
938
  }
939
+ this.gas = this.gas - cost;
915
940
  return false;
916
941
  }
917
942
  };
943
+ __decorate3([
944
+ inline
945
+ ], GasCounter.prototype, "sub", null);
918
946
 
919
947
  // dist/build/js/assembly/instructions.js
920
948
  var Instruction = class {
921
949
  constructor() {
922
950
  this.name = "";
923
951
  this.kind = Arguments.Zero;
924
- this.gas = i64(0);
952
+ this.gas = u32(0);
925
953
  this.isTerminating = false;
926
954
  }
927
955
  };
@@ -929,13 +957,13 @@ function instruction(name, kind, gas, isTerminating = false) {
929
957
  const i = new Instruction();
930
958
  i.name = name;
931
959
  i.kind = kind;
932
- i.gas = i64(gas);
960
+ i.gas = u32(gas);
933
961
  i.isTerminating = isTerminating;
934
962
  return i;
935
963
  }
936
964
  var MISSING_INSTRUCTION = instruction("INVALID", Arguments.Zero, 1, false);
937
965
  var SBRK = instruction("SBRK", Arguments.TwoReg, 1);
938
- var INSTRUCTIONS = [
966
+ var INSTRUCTIONS = StaticArray.fromArray([
939
967
  /* 000 */
940
968
  instruction("TRAP", Arguments.Zero, 1, true),
941
969
  /* 001 */
@@ -1306,9 +1334,15 @@ var INSTRUCTIONS = [
1306
1334
  instruction("MIN", Arguments.ThreeReg, 1),
1307
1335
  /* 230 */
1308
1336
  instruction("MIN_U", Arguments.ThreeReg, 1)
1309
- ];
1337
+ ]);
1310
1338
 
1311
1339
  // dist/build/js/assembly/instructions/outcome.js
1340
+ var __decorate4 = function(decorators, target, key, desc) {
1341
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1342
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1343
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1344
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1345
+ };
1312
1346
  var Result;
1313
1347
  (function(Result2) {
1314
1348
  Result2[Result2["PANIC"] = 0] = "PANIC";
@@ -1323,7 +1357,7 @@ var Outcome;
1323
1357
  Outcome2[Outcome2["DynamicJump"] = 2] = "DynamicJump";
1324
1358
  Outcome2[Outcome2["Result"] = 3] = "Result";
1325
1359
  })(Outcome || (Outcome = {}));
1326
- var OutcomeData = class {
1360
+ var OutcomeData = class _OutcomeData {
1327
1361
  constructor() {
1328
1362
  this.outcome = Outcome.Ok;
1329
1363
  this.staticJump = 0;
@@ -1331,44 +1365,63 @@ var OutcomeData = class {
1331
1365
  this.result = Result.PANIC;
1332
1366
  this.exitCode = 0;
1333
1367
  }
1334
- };
1335
- function status(r, result) {
1336
- r.outcome = Outcome.Result;
1337
- r.result = result;
1338
- return r;
1339
- }
1340
- function staticJump(r, offset) {
1341
- r.outcome = Outcome.StaticJump;
1342
- r.staticJump = offset;
1343
- return r;
1344
- }
1345
- function dJump(r, address) {
1346
- r.outcome = Outcome.DynamicJump;
1347
- r.dJump = address;
1348
- return r;
1349
- }
1350
- function ok(r) {
1351
- r.outcome = Outcome.Ok;
1352
- r.dJump = 0;
1353
- return r;
1354
- }
1355
- function panic(r) {
1356
- return status(r, Result.PANIC);
1357
- }
1358
- function hostCall(r, id) {
1359
- r.outcome = Outcome.Result;
1360
- r.result = Result.HOST;
1361
- r.exitCode = id;
1362
- return r;
1363
- }
1364
- function okOrFault(r, pageFault) {
1365
- if (pageFault.isFault) {
1368
+ static status(r, result) {
1366
1369
  r.outcome = Outcome.Result;
1367
- r.result = pageFault.isAccess ? Result.FAULT_ACCESS : Result.FAULT;
1368
- r.exitCode = pageFault.fault;
1370
+ r.result = result;
1371
+ return r;
1369
1372
  }
1370
- return r;
1371
- }
1373
+ static staticJump(r, offset) {
1374
+ r.outcome = Outcome.StaticJump;
1375
+ r.staticJump = offset;
1376
+ return r;
1377
+ }
1378
+ static dJump(r, address) {
1379
+ r.outcome = Outcome.DynamicJump;
1380
+ r.dJump = address;
1381
+ return r;
1382
+ }
1383
+ static ok(r) {
1384
+ return r;
1385
+ }
1386
+ static panic(r) {
1387
+ return _OutcomeData.status(r, Result.PANIC);
1388
+ }
1389
+ static hostCall(r, id) {
1390
+ r.outcome = Outcome.Result;
1391
+ r.result = Result.HOST;
1392
+ r.exitCode = id;
1393
+ return r;
1394
+ }
1395
+ static okOrFault(r, pageFault) {
1396
+ if (pageFault.isFault) {
1397
+ r.outcome = Outcome.Result;
1398
+ r.result = pageFault.isAccess ? Result.FAULT_ACCESS : Result.FAULT;
1399
+ r.exitCode = pageFault.fault;
1400
+ }
1401
+ return r;
1402
+ }
1403
+ };
1404
+ __decorate4([
1405
+ inline
1406
+ ], OutcomeData, "status", null);
1407
+ __decorate4([
1408
+ inline
1409
+ ], OutcomeData, "staticJump", null);
1410
+ __decorate4([
1411
+ inline
1412
+ ], OutcomeData, "dJump", null);
1413
+ __decorate4([
1414
+ inline
1415
+ ], OutcomeData, "ok", null);
1416
+ __decorate4([
1417
+ inline
1418
+ ], OutcomeData, "panic", null);
1419
+ __decorate4([
1420
+ inline
1421
+ ], OutcomeData, "hostCall", null);
1422
+ __decorate4([
1423
+ inline
1424
+ ], OutcomeData, "okOrFault", null);
1372
1425
 
1373
1426
  // dist/build/js/assembly/registers.js
1374
1427
  var NO_OF_REGISTERS = 13;
@@ -1382,6 +1435,12 @@ function newRegisters() {
1382
1435
  }
1383
1436
 
1384
1437
  // dist/build/js/assembly/instructions/utils.js
1438
+ var __decorate5 = function(decorators, target, key, desc) {
1439
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1440
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1441
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1442
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1443
+ };
1385
1444
  function mulUpperUnsigned(a, b) {
1386
1445
  const aHigh = a >> u64(32);
1387
1446
  const aLow = a & u64(4294967295);
@@ -1422,189 +1481,208 @@ function mulUpperSignedUnsigned(a, b) {
1422
1481
  }
1423
1482
  return mulUpperUnsigned(a, b);
1424
1483
  }
1425
- function u8SignExtend(v) {
1426
- return u64(i64(i32(i16(i8(v)))));
1427
- }
1428
- function u16SignExtend(v) {
1429
- return u64(i64(i32(i16(v))));
1430
- }
1431
- function u32SignExtend(v) {
1432
- return u64(i64(i32(v)));
1433
- }
1434
- function reg(v) {
1435
- return v >= u64(NO_OF_REGISTERS) ? NO_OF_REGISTERS - 1 : u32(v);
1436
- }
1484
+ var Inst = class {
1485
+ static u8SignExtend(v) {
1486
+ return u64(i64(i32(i16(i8(v)))));
1487
+ }
1488
+ static u16SignExtend(v) {
1489
+ return u64(i64(i32(i16(v))));
1490
+ }
1491
+ static u32SignExtend(v) {
1492
+ return u64(i64(i32(v)));
1493
+ }
1494
+ static reg(v) {
1495
+ return v >= u64(NO_OF_REGISTERS) ? NO_OF_REGISTERS - 1 : u32(v);
1496
+ }
1497
+ };
1498
+ __decorate5([
1499
+ inline
1500
+ ], Inst, "u8SignExtend", null);
1501
+ __decorate5([
1502
+ inline
1503
+ ], Inst, "u16SignExtend", null);
1504
+ __decorate5([
1505
+ inline
1506
+ ], Inst, "u32SignExtend", null);
1507
+ __decorate5([
1508
+ inline
1509
+ ], Inst, "reg", null);
1437
1510
 
1438
1511
  // dist/build/js/assembly/instructions/bit.js
1439
1512
  var count_set_bits_64 = (r, args, regs) => {
1440
- regs[reg(args.b)] = portable.popcnt_u64(regs[reg(args.a)]);
1441
- return ok(r);
1513
+ regs[Inst.reg(args.b)] = portable.popcnt_u64(regs[Inst.reg(args.a)]);
1514
+ return OutcomeData.ok(r);
1442
1515
  };
1443
1516
  var count_set_bits_32 = (r, args, regs) => {
1444
- regs[reg(args.b)] = u64(portable.popcnt_u32(u32(regs[reg(args.a)])));
1445
- return ok(r);
1517
+ regs[Inst.reg(args.b)] = u64(portable.popcnt_u32(u32(regs[Inst.reg(args.a)])));
1518
+ return OutcomeData.ok(r);
1446
1519
  };
1447
1520
  var leading_zero_bits_64 = (r, args, regs) => {
1448
- regs[reg(args.b)] = portable.clz_u64(regs[reg(args.a)]);
1449
- return ok(r);
1521
+ regs[Inst.reg(args.b)] = portable.clz_u64(regs[Inst.reg(args.a)]);
1522
+ return OutcomeData.ok(r);
1450
1523
  };
1451
1524
  var leading_zero_bits_32 = (r, args, regs) => {
1452
- regs[reg(args.b)] = u64(portable.clz_u32(u32(regs[reg(args.a)])));
1453
- return ok(r);
1525
+ regs[Inst.reg(args.b)] = u64(portable.clz_u32(u32(regs[Inst.reg(args.a)])));
1526
+ return OutcomeData.ok(r);
1454
1527
  };
1455
1528
  var trailing_zero_bits_64 = (r, args, regs) => {
1456
- regs[reg(args.b)] = portable.ctz_u64(regs[reg(args.a)]);
1457
- return ok(r);
1529
+ regs[Inst.reg(args.b)] = portable.ctz_u64(regs[Inst.reg(args.a)]);
1530
+ return OutcomeData.ok(r);
1458
1531
  };
1459
1532
  var trailing_zero_bits_32 = (r, args, regs) => {
1460
- regs[reg(args.b)] = u64(portable.ctz_u32(u32(regs[reg(args.a)])));
1461
- return ok(r);
1533
+ regs[Inst.reg(args.b)] = u64(portable.ctz_u32(u32(regs[Inst.reg(args.a)])));
1534
+ return OutcomeData.ok(r);
1462
1535
  };
1463
1536
  var sign_extend_8 = (r, args, regs) => {
1464
- regs[reg(args.b)] = u8SignExtend(u8(regs[reg(args.a)]));
1465
- return ok(r);
1537
+ regs[Inst.reg(args.b)] = Inst.u8SignExtend(u8(regs[Inst.reg(args.a)]));
1538
+ return OutcomeData.ok(r);
1466
1539
  };
1467
1540
  var sign_extend_16 = (r, args, regs) => {
1468
- regs[reg(args.b)] = u16SignExtend(u16(regs[reg(args.a)]));
1469
- return ok(r);
1541
+ regs[Inst.reg(args.b)] = Inst.u16SignExtend(u16(regs[Inst.reg(args.a)]));
1542
+ return OutcomeData.ok(r);
1470
1543
  };
1471
1544
  var zero_extend_16 = (r, args, regs) => {
1472
- regs[reg(args.b)] = u64(u16(regs[reg(args.a)]));
1473
- return ok(r);
1545
+ regs[Inst.reg(args.b)] = u64(u16(regs[Inst.reg(args.a)]));
1546
+ return OutcomeData.ok(r);
1474
1547
  };
1475
1548
  var reverse_bytes = (r, args, regs) => {
1476
- regs[reg(args.b)] = portable.bswap_u64(regs[reg(args.a)]);
1477
- return ok(r);
1549
+ regs[Inst.reg(args.b)] = portable.bswap_u64(regs[Inst.reg(args.a)]);
1550
+ return OutcomeData.ok(r);
1478
1551
  };
1479
1552
 
1480
1553
  // dist/build/js/assembly/instructions/branch.js
1481
1554
  var branch_eq_imm = (r, args, registers) => {
1482
- const b = u64(u32SignExtend(args.b));
1483
- if (registers[reg(args.a)] === b) {
1484
- return staticJump(r, args.c);
1555
+ const b = u64(Inst.u32SignExtend(args.b));
1556
+ if (registers[Inst.reg(args.a)] === b) {
1557
+ return OutcomeData.staticJump(r, args.c);
1485
1558
  }
1486
- return ok(r);
1559
+ return OutcomeData.ok(r);
1487
1560
  };
1488
1561
  var branch_ne_imm = (r, args, registers) => {
1489
- const b = u64(u32SignExtend(args.b));
1490
- if (registers[reg(args.a)] !== b) {
1491
- return staticJump(r, args.c);
1562
+ const b = u64(Inst.u32SignExtend(args.b));
1563
+ if (registers[Inst.reg(args.a)] !== b) {
1564
+ return OutcomeData.staticJump(r, args.c);
1492
1565
  }
1493
- return ok(r);
1566
+ return OutcomeData.ok(r);
1494
1567
  };
1495
1568
  var branch_lt_u_imm = (r, args, registers) => {
1496
- const b = u64(u32SignExtend(args.b));
1497
- if (registers[reg(args.a)] < b) {
1498
- return staticJump(r, args.c);
1569
+ const b = u64(Inst.u32SignExtend(args.b));
1570
+ if (registers[Inst.reg(args.a)] < b) {
1571
+ return OutcomeData.staticJump(r, args.c);
1499
1572
  }
1500
- return ok(r);
1573
+ return OutcomeData.ok(r);
1501
1574
  };
1502
1575
  var branch_le_u_imm = (r, args, registers) => {
1503
- const b = u64(u32SignExtend(args.b));
1504
- if (registers[reg(args.a)] <= b) {
1505
- return staticJump(r, args.c);
1576
+ const b = u64(Inst.u32SignExtend(args.b));
1577
+ if (registers[Inst.reg(args.a)] <= b) {
1578
+ return OutcomeData.staticJump(r, args.c);
1506
1579
  }
1507
- return ok(r);
1580
+ return OutcomeData.ok(r);
1508
1581
  };
1509
1582
  var branch_ge_u_imm = (r, args, registers) => {
1510
- const b = u64(u32SignExtend(args.b));
1511
- if (registers[reg(args.a)] >= b) {
1512
- return staticJump(r, args.c);
1583
+ const b = u64(Inst.u32SignExtend(args.b));
1584
+ if (registers[Inst.reg(args.a)] >= b) {
1585
+ return OutcomeData.staticJump(r, args.c);
1513
1586
  }
1514
- return ok(r);
1587
+ return OutcomeData.ok(r);
1515
1588
  };
1516
1589
  var branch_gt_u_imm = (r, args, registers) => {
1517
- const b = u64(u32SignExtend(args.b));
1518
- if (registers[reg(args.a)] > b) {
1519
- return staticJump(r, args.c);
1590
+ const b = u64(Inst.u32SignExtend(args.b));
1591
+ if (registers[Inst.reg(args.a)] > b) {
1592
+ return OutcomeData.staticJump(r, args.c);
1520
1593
  }
1521
- return ok(r);
1594
+ return OutcomeData.ok(r);
1522
1595
  };
1523
1596
  var branch_lt_s_imm = (r, args, registers) => {
1524
- if (i64(registers[reg(args.a)]) < i64(u32SignExtend(args.b))) {
1525
- return staticJump(r, args.c);
1597
+ if (i64(registers[Inst.reg(args.a)]) < i64(Inst.u32SignExtend(args.b))) {
1598
+ return OutcomeData.staticJump(r, args.c);
1526
1599
  }
1527
- return ok(r);
1600
+ return OutcomeData.ok(r);
1528
1601
  };
1529
1602
  var branch_le_s_imm = (r, args, registers) => {
1530
- if (i64(registers[reg(args.a)]) <= i64(u32SignExtend(args.b))) {
1531
- return staticJump(r, args.c);
1603
+ if (i64(registers[Inst.reg(args.a)]) <= i64(Inst.u32SignExtend(args.b))) {
1604
+ return OutcomeData.staticJump(r, args.c);
1532
1605
  }
1533
- return ok(r);
1606
+ return OutcomeData.ok(r);
1534
1607
  };
1535
1608
  var branch_ge_s_imm = (r, args, registers) => {
1536
- if (i64(registers[reg(args.a)]) >= i64(u32SignExtend(args.b))) {
1537
- return staticJump(r, args.c);
1609
+ if (i64(registers[Inst.reg(args.a)]) >= i64(Inst.u32SignExtend(args.b))) {
1610
+ return OutcomeData.staticJump(r, args.c);
1538
1611
  }
1539
- return ok(r);
1612
+ return OutcomeData.ok(r);
1540
1613
  };
1541
1614
  var branch_gt_s_imm = (r, args, registers) => {
1542
- if (i64(registers[reg(args.a)]) > i64(u32SignExtend(args.b))) {
1543
- return staticJump(r, args.c);
1615
+ if (i64(registers[Inst.reg(args.a)]) > i64(Inst.u32SignExtend(args.b))) {
1616
+ return OutcomeData.staticJump(r, args.c);
1544
1617
  }
1545
- return ok(r);
1618
+ return OutcomeData.ok(r);
1546
1619
  };
1547
1620
  var branch_eq = (r, args, registers) => {
1548
- if (registers[reg(args.a)] === registers[reg(args.b)]) {
1549
- return staticJump(r, args.c);
1621
+ if (registers[Inst.reg(args.a)] === registers[Inst.reg(args.b)]) {
1622
+ return OutcomeData.staticJump(r, args.c);
1550
1623
  }
1551
- return ok(r);
1624
+ return OutcomeData.ok(r);
1552
1625
  };
1553
1626
  var branch_ne = (r, args, registers) => {
1554
- if (registers[reg(args.a)] !== registers[reg(args.b)]) {
1555
- return staticJump(r, args.c);
1627
+ if (registers[Inst.reg(args.a)] !== registers[Inst.reg(args.b)]) {
1628
+ return OutcomeData.staticJump(r, args.c);
1556
1629
  }
1557
- return ok(r);
1630
+ return OutcomeData.ok(r);
1558
1631
  };
1559
1632
  var branch_lt_u = (r, args, registers) => {
1560
- if (registers[reg(args.b)] < registers[reg(args.a)]) {
1561
- return staticJump(r, args.c);
1633
+ if (registers[Inst.reg(args.b)] < registers[Inst.reg(args.a)]) {
1634
+ return OutcomeData.staticJump(r, args.c);
1562
1635
  }
1563
- return ok(r);
1636
+ return OutcomeData.ok(r);
1564
1637
  };
1565
1638
  var branch_lt_s = (r, args, registers) => {
1566
- if (i64(registers[reg(args.b)]) < i64(registers[reg(args.a)])) {
1567
- return staticJump(r, args.c);
1639
+ if (i64(registers[Inst.reg(args.b)]) < i64(registers[Inst.reg(args.a)])) {
1640
+ return OutcomeData.staticJump(r, args.c);
1568
1641
  }
1569
- return ok(r);
1642
+ return OutcomeData.ok(r);
1570
1643
  };
1571
1644
  var branch_ge_u = (r, args, registers) => {
1572
- if (registers[reg(args.b)] >= registers[reg(args.a)]) {
1573
- return staticJump(r, args.c);
1645
+ if (registers[Inst.reg(args.b)] >= registers[Inst.reg(args.a)]) {
1646
+ return OutcomeData.staticJump(r, args.c);
1574
1647
  }
1575
- return ok(r);
1648
+ return OutcomeData.ok(r);
1576
1649
  };
1577
1650
  var branch_ge_s = (r, args, registers) => {
1578
- if (i64(registers[reg(args.b)]) >= i64(registers[reg(args.a)])) {
1579
- return staticJump(r, args.c);
1651
+ if (i64(registers[Inst.reg(args.b)]) >= i64(registers[Inst.reg(args.a)])) {
1652
+ return OutcomeData.staticJump(r, args.c);
1580
1653
  }
1581
- return ok(r);
1654
+ return OutcomeData.ok(r);
1582
1655
  };
1583
1656
 
1584
1657
  // dist/build/js/assembly/instructions/jump.js
1585
- var jump = (r, args) => staticJump(r, args.a);
1658
+ var jump = (r, args) => OutcomeData.staticJump(r, args.a);
1586
1659
  var jump_ind = (r, args, registers) => {
1587
- const address = u32(portable.u64_add(registers[reg(args.a)], u32SignExtend(args.b)));
1588
- return dJump(r, address);
1660
+ const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.b)));
1661
+ return OutcomeData.dJump(r, address);
1589
1662
  };
1590
1663
  var load_imm_jump = (r, args, registers) => {
1591
- registers[reg(args.a)] = u32SignExtend(args.b);
1592
- return staticJump(r, args.c);
1664
+ registers[Inst.reg(args.a)] = Inst.u32SignExtend(args.b);
1665
+ return OutcomeData.staticJump(r, args.c);
1593
1666
  };
1594
1667
  var load_imm_jump_ind = (r, args, registers) => {
1595
- const address = u32(portable.u64_add(registers[reg(args.a)], u32SignExtend(args.d)));
1596
- registers[reg(args.b)] = u32SignExtend(args.c);
1597
- return dJump(r, address);
1668
+ const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.d)));
1669
+ registers[Inst.reg(args.b)] = Inst.u32SignExtend(args.c);
1670
+ return OutcomeData.dJump(r, address);
1598
1671
  };
1599
1672
 
1600
1673
  // dist/build/js/assembly/memory-page.js
1674
+ var __decorate6 = function(decorators, target, key, desc) {
1675
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1676
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1677
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1678
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1679
+ };
1601
1680
  var PAGE_SIZE = 2 ** 12;
1602
1681
  var PAGE_SIZE_SHIFT = 12;
1603
1682
  var SEGMENT_SIZE = 2 ** 16;
1604
1683
  var SEGMENT_SIZE_SHIFT = 16;
1605
1684
  var RESERVED_MEMORY = 2 ** 16;
1606
1685
  var RESERVED_PAGES = RESERVED_MEMORY / PAGE_SIZE;
1607
- var ALLOCATE_EAGERLY = 2 ** 21;
1608
1686
  var Access;
1609
1687
  (function(Access2) {
1610
1688
  Access2[Access2["None"] = 0] = "None";
@@ -1620,18 +1698,21 @@ var Page = class {
1620
1698
  return this.access === Access.Write || this.access === access;
1621
1699
  }
1622
1700
  };
1701
+ __decorate6([
1702
+ inline
1703
+ ], Page.prototype, "can", null);
1623
1704
  var RawPage = class {
1624
1705
  constructor(id, page) {
1625
1706
  this.id = id;
1626
1707
  this.page = page;
1627
1708
  }
1628
1709
  get data() {
1629
- if (this.page === null) {
1630
- this.page = new Uint8Array(PAGE_SIZE).fill(0);
1631
- }
1632
1710
  return this.page;
1633
1711
  }
1634
1712
  };
1713
+ __decorate6([
1714
+ inline
1715
+ ], RawPage.prototype, "data", null);
1635
1716
  var Arena = class {
1636
1717
  constructor(pageCount) {
1637
1718
  this.arenaBytes = PAGE_SIZE * pageCount;
@@ -1650,7 +1731,7 @@ var Arena = class {
1650
1731
  if (allocatedMemory === this.arenaBytes) {
1651
1732
  console.log("Warning: Run out of pages! Allocating.");
1652
1733
  }
1653
- const data = allocatedMemory < ALLOCATE_EAGERLY ? new Uint8Array(PAGE_SIZE) : null;
1734
+ const data = new Uint8Array(PAGE_SIZE);
1654
1735
  this.extraPageIndex += 1;
1655
1736
  return new RawPage(this.extraPageIndex, data);
1656
1737
  }
@@ -1660,6 +1741,12 @@ var Arena = class {
1660
1741
  };
1661
1742
 
1662
1743
  // dist/build/js/assembly/memory.js
1744
+ var __decorate7 = function(decorators, target, key, desc) {
1745
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1746
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1747
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1748
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1749
+ };
1663
1750
  var MaybePageFault = class {
1664
1751
  constructor() {
1665
1752
  this.isFault = false;
@@ -1668,7 +1755,7 @@ var MaybePageFault = class {
1668
1755
  }
1669
1756
  };
1670
1757
  var EMPTY_UINT8ARRAY = new Uint8Array(0);
1671
- var EMPTY_PAGE = new Page(Access.None, new RawPage(-1, null));
1758
+ var EMPTY_PAGE = new Page(Access.None, new RawPage(-1, EMPTY_UINT8ARRAY));
1672
1759
  var Chunks = class {
1673
1760
  constructor() {
1674
1761
  this.firstPageData = EMPTY_UINT8ARRAY;
@@ -1685,6 +1772,44 @@ var PageResult = class {
1685
1772
  };
1686
1773
  var MEMORY_SIZE = 4294967296;
1687
1774
  var MAX_MEMORY_ADDRESS = 4294967295;
1775
+ var PAGE_CACHE_SHIFT = 8;
1776
+ var PAGE_CACHE_SIZE = 1 << PAGE_CACHE_SHIFT;
1777
+ var PAGE_CACHE_MASK = PAGE_CACHE_SIZE - 1;
1778
+ var PageCache = class {
1779
+ constructor() {
1780
+ this.tags = new StaticArray(PAGE_CACHE_SIZE);
1781
+ this.entries = new StaticArray(PAGE_CACHE_SIZE);
1782
+ const empty = EMPTY_PAGE;
1783
+ for (let i = 0; i < PAGE_CACHE_SIZE; i++) {
1784
+ this.tags[i] = 4294967295;
1785
+ this.entries[i] = empty;
1786
+ }
1787
+ }
1788
+ lookup(pageIdx) {
1789
+ const slot = pageIdx & PAGE_CACHE_MASK;
1790
+ if (unchecked(this.tags[slot]) === pageIdx) {
1791
+ return unchecked(this.entries[slot]);
1792
+ }
1793
+ return null;
1794
+ }
1795
+ insert(pageIdx, page) {
1796
+ const slot = pageIdx & PAGE_CACHE_MASK;
1797
+ unchecked(this.tags[slot] = pageIdx);
1798
+ unchecked(this.entries[slot] = page);
1799
+ }
1800
+ clear() {
1801
+ for (let i = 0; i < PAGE_CACHE_SIZE; i++) {
1802
+ this.tags[i] = 4294967295;
1803
+ this.entries[i] = EMPTY_PAGE;
1804
+ }
1805
+ }
1806
+ };
1807
+ __decorate7([
1808
+ inline
1809
+ ], PageCache.prototype, "lookup", null);
1810
+ __decorate7([
1811
+ inline
1812
+ ], PageCache.prototype, "insert", null);
1688
1813
  var MemoryBuilder = class {
1689
1814
  constructor(preAllocatePages = 0) {
1690
1815
  this.pages = /* @__PURE__ */ new Map();
@@ -1736,18 +1861,30 @@ var Memory = class {
1736
1861
  this.sbrkAddress = sbrkAddress;
1737
1862
  this.pageResult = new PageResult();
1738
1863
  this.chunksResult = new Chunks();
1864
+ this.cache = new PageCache();
1739
1865
  const sbrkPage = u32(sbrkAddress >> PAGE_SIZE_SHIFT);
1740
1866
  if (sbrkPage < RESERVED_PAGES) {
1741
1867
  throw new Error("sbrk within reserved memory is not allowed!");
1742
1868
  }
1743
1869
  this.lastAllocatedPage = pages.has(sbrkPage) ? sbrkPage : sbrkPage - 1;
1744
1870
  this.maxHeapPointer = u64(maxHeapPointer);
1871
+ const keys = pages.keys();
1872
+ for (let i = 0; i < keys.length; i++) {
1873
+ const key = keys[i];
1874
+ this.cache.insert(key, pages.get(key));
1875
+ }
1745
1876
  }
1746
1877
  pageDump(index) {
1878
+ const cached = this.cache.lookup(index);
1879
+ if (cached !== null) {
1880
+ return cached.raw.data;
1881
+ }
1747
1882
  if (!this.pages.has(index)) {
1748
1883
  return null;
1749
1884
  }
1750
- return this.pages.get(index).raw.data;
1885
+ const page = this.pages.get(index);
1886
+ this.cache.insert(index, page);
1887
+ return page.raw.data;
1751
1888
  }
1752
1889
  /**
1753
1890
  * Returns the WASM linear memory pointer (byte offset) for the backing buffer of the page at `pageIndex`.
@@ -1772,10 +1909,14 @@ var Memory = class {
1772
1909
  * ```
1773
1910
  */
1774
1911
  getPagePointer(pageIndex) {
1775
- if (!this.pages.has(pageIndex)) {
1776
- return 0;
1912
+ let page = this.cache.lookup(pageIndex);
1913
+ if (page === null) {
1914
+ if (!this.pages.has(pageIndex)) {
1915
+ return 0;
1916
+ }
1917
+ page = this.pages.get(pageIndex);
1918
+ this.cache.insert(pageIndex, page);
1777
1919
  }
1778
- const page = this.pages.get(pageIndex);
1779
1920
  if (!page.can(Access.Read)) {
1780
1921
  return 0;
1781
1922
  }
@@ -1787,6 +1928,7 @@ var Memory = class {
1787
1928
  this.arena.release(pages[i].raw);
1788
1929
  }
1789
1930
  this.pages.clear();
1931
+ this.cache.clear();
1790
1932
  }
1791
1933
  sbrk(faultRes4, amount) {
1792
1934
  const freeMemoryStart = u64(this.sbrkAddress);
@@ -1802,13 +1944,17 @@ var Memory = class {
1802
1944
  this.sbrkAddress = u32(newSbrk);
1803
1945
  const pageIdx = i32(portable.u64_sub(newSbrk, u64(1)) >> u64(PAGE_SIZE_SHIFT));
1804
1946
  if (pageIdx === this.lastAllocatedPage) {
1947
+ faultRes4.isFault = false;
1805
1948
  return freeMemoryStart;
1806
1949
  }
1807
1950
  for (let i = this.lastAllocatedPage + 1; i <= pageIdx; i++) {
1808
- const page = this.arena.acquire();
1809
- this.pages.set(i, new Page(Access.Write, page));
1951
+ const rawPage = this.arena.acquire();
1952
+ const page = new Page(Access.Write, rawPage);
1953
+ this.pages.set(i, page);
1954
+ this.cache.insert(i, page);
1810
1955
  }
1811
1956
  this.lastAllocatedPage = pageIdx;
1957
+ faultRes4.isFault = false;
1812
1958
  return freeMemoryStart;
1813
1959
  }
1814
1960
  getU8(faultRes4, address) {
@@ -1824,13 +1970,13 @@ var Memory = class {
1824
1970
  return portable.bswap_u64(this.getBytesReversed(faultRes4, Access.Read, address, 8));
1825
1971
  }
1826
1972
  getI8(faultRes4, address) {
1827
- return u8SignExtend(u8(this.getU8(faultRes4, address)));
1973
+ return Inst.u8SignExtend(u8(this.getU8(faultRes4, address)));
1828
1974
  }
1829
1975
  getI16(faultRes4, address) {
1830
- return u16SignExtend(u16(this.getU16(faultRes4, address)));
1976
+ return Inst.u16SignExtend(u16(this.getU16(faultRes4, address)));
1831
1977
  }
1832
1978
  getI32(faultRes4, address) {
1833
- return u32SignExtend(u32(this.getU32(faultRes4, address)));
1979
+ return Inst.u32SignExtend(u32(this.getU32(faultRes4, address)));
1834
1980
  }
1835
1981
  setU8(faultRes4, address, value) {
1836
1982
  this.setBytes(faultRes4, address, value, 1);
@@ -1916,17 +2062,31 @@ var Memory = class {
1916
2062
  }
1917
2063
  getPage(faultRes4, pageData, access, address) {
1918
2064
  const pageIdx = u32(address >> PAGE_SIZE_SHIFT);
1919
- const relAddress = address % PAGE_SIZE;
1920
- const pageStart = pageIdx << PAGE_SIZE_SHIFT;
2065
+ const relAddress = address & PAGE_SIZE - 1;
2066
+ const cached = this.cache.lookup(pageIdx);
2067
+ if (cached !== null) {
2068
+ if (!cached.can(access)) {
2069
+ fault(faultRes4, pageIdx << PAGE_SIZE_SHIFT);
2070
+ faultRes4.isAccess = true;
2071
+ pageData.page = EMPTY_PAGE;
2072
+ pageData.relativeAddress = relAddress;
2073
+ return;
2074
+ }
2075
+ faultRes4.isFault = false;
2076
+ pageData.page = cached;
2077
+ pageData.relativeAddress = relAddress;
2078
+ return;
2079
+ }
1921
2080
  if (!this.pages.has(pageIdx)) {
1922
- fault(faultRes4, pageStart);
2081
+ fault(faultRes4, pageIdx << PAGE_SIZE_SHIFT);
1923
2082
  pageData.page = EMPTY_PAGE;
1924
2083
  pageData.relativeAddress = relAddress;
1925
2084
  return;
1926
2085
  }
1927
2086
  const page = this.pages.get(pageIdx);
2087
+ this.cache.insert(pageIdx, page);
1928
2088
  if (!page.can(access)) {
1929
- fault(faultRes4, pageStart);
2089
+ fault(faultRes4, pageIdx << PAGE_SIZE_SHIFT);
1930
2090
  faultRes4.isAccess = true;
1931
2091
  pageData.page = EMPTY_PAGE;
1932
2092
  pageData.relativeAddress = relAddress;
@@ -1962,11 +2122,15 @@ var Memory = class {
1962
2122
  }
1963
2123
  const secondPageIdx = u32((address + u32(bytes)) % MEMORY_SIZE) >> PAGE_SIZE_SHIFT;
1964
2124
  const secondPageStart = secondPageIdx << PAGE_SIZE_SHIFT;
1965
- if (!this.pages.has(secondPageIdx)) {
1966
- fault(faultRes4, secondPageStart);
1967
- return;
2125
+ let secondPage = this.cache.lookup(secondPageIdx);
2126
+ if (secondPage === null) {
2127
+ if (!this.pages.has(secondPageIdx)) {
2128
+ fault(faultRes4, secondPageStart);
2129
+ return;
2130
+ }
2131
+ secondPage = this.pages.get(secondPageIdx);
2132
+ this.cache.insert(secondPageIdx, secondPage);
1968
2133
  }
1969
- const secondPage = this.pages.get(secondPageIdx);
1970
2134
  if (!secondPage.can(access)) {
1971
2135
  fault(faultRes4, secondPageStart);
1972
2136
  faultRes4.isAccess = true;
@@ -1986,7 +2150,7 @@ var Memory = class {
1986
2150
  return;
1987
2151
  }
1988
2152
  let bytesLeft = u64(value);
1989
- const firstPageEnd = minU32(PAGE_SIZE, r.firstPageOffset + bytes);
2153
+ const firstPageEnd = IntMath.minU32(PAGE_SIZE, r.firstPageOffset + bytes);
1990
2154
  for (let i = r.firstPageOffset; i < firstPageEnd; i++) {
1991
2155
  r.firstPageData[i] = u8(bytesLeft);
1992
2156
  bytesLeft >>= u64(8);
@@ -2002,7 +2166,7 @@ var Memory = class {
2002
2166
  return u64(0);
2003
2167
  }
2004
2168
  let r = u64(0);
2005
- const firstPageEnd = minU32(PAGE_SIZE, this.chunksResult.firstPageOffset + bytes);
2169
+ const firstPageEnd = IntMath.minU32(PAGE_SIZE, this.chunksResult.firstPageOffset + bytes);
2006
2170
  for (let i = this.chunksResult.firstPageOffset; i < firstPageEnd; i++) {
2007
2171
  r = r << u64(8) | u64(this.chunksResult.firstPageData[i]);
2008
2172
  }
@@ -2021,419 +2185,419 @@ function fault(r, address) {
2021
2185
  // dist/build/js/assembly/instructions/load.js
2022
2186
  var faultRes = new MaybePageFault();
2023
2187
  var load_imm_64 = (r, args, registers) => {
2024
- registers[reg(args.a)] = portable.u64_add(u64(args.b), u64(args.c) << u64(32));
2025
- return ok(r);
2188
+ registers[Inst.reg(args.a)] = portable.u64_add(u64(args.b), u64(args.c) << u64(32));
2189
+ return OutcomeData.ok(r);
2026
2190
  };
2027
2191
  var load_imm = (r, args, registers) => {
2028
- registers[reg(args.a)] = u32SignExtend(args.b);
2029
- return ok(r);
2192
+ registers[Inst.reg(args.a)] = Inst.u32SignExtend(args.b);
2193
+ return OutcomeData.ok(r);
2030
2194
  };
2031
2195
  var load_u8 = (r, args, registers, memory) => {
2032
2196
  const result = memory.getU8(faultRes, args.b);
2033
2197
  if (!faultRes.isFault) {
2034
- registers[reg(args.a)] = result;
2198
+ registers[Inst.reg(args.a)] = result;
2035
2199
  }
2036
- return okOrFault(r, faultRes);
2200
+ return OutcomeData.okOrFault(r, faultRes);
2037
2201
  };
2038
2202
  var load_i8 = (r, args, registers, memory) => {
2039
2203
  const result = memory.getI8(faultRes, args.b);
2040
2204
  if (!faultRes.isFault) {
2041
- registers[reg(args.a)] = result;
2205
+ registers[Inst.reg(args.a)] = result;
2042
2206
  }
2043
- return okOrFault(r, faultRes);
2207
+ return OutcomeData.okOrFault(r, faultRes);
2044
2208
  };
2045
2209
  var load_u16 = (r, args, registers, memory) => {
2046
2210
  const result = memory.getU16(faultRes, args.b);
2047
2211
  if (!faultRes.isFault) {
2048
- registers[reg(args.a)] = result;
2212
+ registers[Inst.reg(args.a)] = result;
2049
2213
  }
2050
- return okOrFault(r, faultRes);
2214
+ return OutcomeData.okOrFault(r, faultRes);
2051
2215
  };
2052
2216
  var load_i16 = (r, args, registers, memory) => {
2053
2217
  const result = memory.getI16(faultRes, args.b);
2054
2218
  if (!faultRes.isFault) {
2055
- registers[reg(args.a)] = result;
2219
+ registers[Inst.reg(args.a)] = result;
2056
2220
  }
2057
- return okOrFault(r, faultRes);
2221
+ return OutcomeData.okOrFault(r, faultRes);
2058
2222
  };
2059
2223
  var load_u32 = (r, args, registers, memory) => {
2060
2224
  const result = memory.getU32(faultRes, args.b);
2061
2225
  if (!faultRes.isFault) {
2062
- registers[reg(args.a)] = result;
2226
+ registers[Inst.reg(args.a)] = result;
2063
2227
  }
2064
- return okOrFault(r, faultRes);
2228
+ return OutcomeData.okOrFault(r, faultRes);
2065
2229
  };
2066
2230
  var load_i32 = (r, args, registers, memory) => {
2067
2231
  const result = memory.getI32(faultRes, args.b);
2068
2232
  if (!faultRes.isFault) {
2069
- registers[reg(args.a)] = result;
2233
+ registers[Inst.reg(args.a)] = result;
2070
2234
  }
2071
- return okOrFault(r, faultRes);
2235
+ return OutcomeData.okOrFault(r, faultRes);
2072
2236
  };
2073
2237
  var load_u64 = (r, args, registers, memory) => {
2074
2238
  const result = memory.getU64(faultRes, args.b);
2075
2239
  if (!faultRes.isFault) {
2076
- registers[reg(args.a)] = result;
2240
+ registers[Inst.reg(args.a)] = result;
2077
2241
  }
2078
- return okOrFault(r, faultRes);
2242
+ return OutcomeData.okOrFault(r, faultRes);
2079
2243
  };
2080
2244
  var load_ind_u8 = (r, args, registers, memory) => {
2081
- const address = u32(portable.u64_add(registers[reg(args.a)], u32SignExtend(args.c)));
2245
+ const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
2082
2246
  const result = memory.getU8(faultRes, address);
2083
2247
  if (!faultRes.isFault) {
2084
- registers[reg(args.b)] = result;
2248
+ registers[Inst.reg(args.b)] = result;
2085
2249
  }
2086
- return okOrFault(r, faultRes);
2250
+ return OutcomeData.okOrFault(r, faultRes);
2087
2251
  };
2088
2252
  var load_ind_i8 = (r, args, registers, memory) => {
2089
- const address = u32(portable.u64_add(registers[reg(args.a)], u32SignExtend(args.c)));
2253
+ const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
2090
2254
  const result = memory.getI8(faultRes, address);
2091
2255
  if (!faultRes.isFault) {
2092
- registers[reg(args.b)] = result;
2256
+ registers[Inst.reg(args.b)] = result;
2093
2257
  }
2094
- return okOrFault(r, faultRes);
2258
+ return OutcomeData.okOrFault(r, faultRes);
2095
2259
  };
2096
2260
  var load_ind_u16 = (r, args, registers, memory) => {
2097
- const address = u32(portable.u64_add(registers[reg(args.a)], u32SignExtend(args.c)));
2261
+ const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
2098
2262
  const result = memory.getU16(faultRes, address);
2099
2263
  if (!faultRes.isFault) {
2100
- registers[reg(args.b)] = result;
2264
+ registers[Inst.reg(args.b)] = result;
2101
2265
  }
2102
- return okOrFault(r, faultRes);
2266
+ return OutcomeData.okOrFault(r, faultRes);
2103
2267
  };
2104
2268
  var load_ind_i16 = (r, args, registers, memory) => {
2105
- const address = u32(portable.u64_add(registers[reg(args.a)], u32SignExtend(args.c)));
2269
+ const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
2106
2270
  const result = memory.getI16(faultRes, address);
2107
2271
  if (!faultRes.isFault) {
2108
- registers[reg(args.b)] = result;
2272
+ registers[Inst.reg(args.b)] = result;
2109
2273
  }
2110
- return okOrFault(r, faultRes);
2274
+ return OutcomeData.okOrFault(r, faultRes);
2111
2275
  };
2112
2276
  var load_ind_u32 = (r, args, registers, memory) => {
2113
- const address = u32(portable.u64_add(registers[reg(args.a)], u32SignExtend(args.c)));
2277
+ const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
2114
2278
  const result = memory.getU32(faultRes, address);
2115
2279
  if (!faultRes.isFault) {
2116
- registers[reg(args.b)] = result;
2280
+ registers[Inst.reg(args.b)] = result;
2117
2281
  }
2118
- return okOrFault(r, faultRes);
2282
+ return OutcomeData.okOrFault(r, faultRes);
2119
2283
  };
2120
2284
  var load_ind_i32 = (r, args, registers, memory) => {
2121
- const address = u32(portable.u64_add(registers[reg(args.a)], u32SignExtend(args.c)));
2285
+ const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
2122
2286
  const result = memory.getI32(faultRes, address);
2123
2287
  if (!faultRes.isFault) {
2124
- registers[reg(args.b)] = result;
2288
+ registers[Inst.reg(args.b)] = result;
2125
2289
  }
2126
- return okOrFault(r, faultRes);
2290
+ return OutcomeData.okOrFault(r, faultRes);
2127
2291
  };
2128
2292
  var load_ind_u64 = (r, args, registers, memory) => {
2129
- const address = u32(portable.u64_add(registers[reg(args.a)], u32SignExtend(args.c)));
2293
+ const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
2130
2294
  const result = memory.getU64(faultRes, u32(address));
2131
2295
  if (!faultRes.isFault) {
2132
- registers[reg(args.b)] = result;
2296
+ registers[Inst.reg(args.b)] = result;
2133
2297
  }
2134
- return okOrFault(r, faultRes);
2298
+ return OutcomeData.okOrFault(r, faultRes);
2135
2299
  };
2136
2300
 
2137
2301
  // dist/build/js/assembly/instructions/logic.js
2138
2302
  var and_imm = (r, args, registers) => {
2139
- registers[reg(args.b)] = registers[reg(args.a)] & u32SignExtend(args.c);
2140
- return ok(r);
2303
+ registers[Inst.reg(args.b)] = registers[Inst.reg(args.a)] & Inst.u32SignExtend(args.c);
2304
+ return OutcomeData.ok(r);
2141
2305
  };
2142
2306
  var xor_imm = (r, args, registers) => {
2143
- registers[reg(args.b)] = registers[reg(args.a)] ^ u32SignExtend(args.c);
2144
- return ok(r);
2307
+ registers[Inst.reg(args.b)] = registers[Inst.reg(args.a)] ^ Inst.u32SignExtend(args.c);
2308
+ return OutcomeData.ok(r);
2145
2309
  };
2146
2310
  var or_imm = (r, args, registers) => {
2147
- registers[reg(args.b)] = registers[reg(args.a)] | u32SignExtend(args.c);
2148
- return ok(r);
2311
+ registers[Inst.reg(args.b)] = registers[Inst.reg(args.a)] | Inst.u32SignExtend(args.c);
2312
+ return OutcomeData.ok(r);
2149
2313
  };
2150
2314
  var and = (r, args, registers) => {
2151
- registers[reg(args.c)] = registers[reg(args.b)] & registers[reg(args.a)];
2152
- return ok(r);
2315
+ registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] & registers[Inst.reg(args.a)];
2316
+ return OutcomeData.ok(r);
2153
2317
  };
2154
2318
  var xor = (r, args, registers) => {
2155
- registers[reg(args.c)] = registers[reg(args.b)] ^ registers[reg(args.a)];
2156
- return ok(r);
2319
+ registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] ^ registers[Inst.reg(args.a)];
2320
+ return OutcomeData.ok(r);
2157
2321
  };
2158
2322
  var or = (r, args, registers) => {
2159
- registers[reg(args.c)] = registers[reg(args.b)] | registers[reg(args.a)];
2160
- return ok(r);
2323
+ registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] | registers[Inst.reg(args.a)];
2324
+ return OutcomeData.ok(r);
2161
2325
  };
2162
2326
  var and_inv = (r, args, registers) => {
2163
- registers[reg(args.c)] = registers[reg(args.b)] & ~registers[reg(args.a)];
2164
- return ok(r);
2327
+ registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] & ~registers[Inst.reg(args.a)];
2328
+ return OutcomeData.ok(r);
2165
2329
  };
2166
2330
  var or_inv = (r, args, registers) => {
2167
- registers[reg(args.c)] = u64(registers[reg(args.b)] | ~registers[reg(args.a)]);
2168
- return ok(r);
2331
+ registers[Inst.reg(args.c)] = u64(registers[Inst.reg(args.b)] | ~registers[Inst.reg(args.a)]);
2332
+ return OutcomeData.ok(r);
2169
2333
  };
2170
2334
  var xnor = (r, args, registers) => {
2171
- registers[reg(args.c)] = u64(~(registers[reg(args.b)] ^ registers[reg(args.a)]));
2172
- return ok(r);
2335
+ registers[Inst.reg(args.c)] = u64(~(registers[Inst.reg(args.b)] ^ registers[Inst.reg(args.a)]));
2336
+ return OutcomeData.ok(r);
2173
2337
  };
2174
2338
 
2175
2339
  // dist/build/js/assembly/instructions/math.js
2176
2340
  var add_imm_32 = (r, args, registers) => {
2177
- const a = registers[reg(args.a)];
2178
- const c = u32SignExtend(args.c);
2179
- registers[reg(args.b)] = u32SignExtend(u32(portable.u64_add(a, c)));
2180
- return ok(r);
2341
+ const a = registers[Inst.reg(args.a)];
2342
+ const c = Inst.u32SignExtend(args.c);
2343
+ registers[Inst.reg(args.b)] = Inst.u32SignExtend(u32(portable.u64_add(a, c)));
2344
+ return OutcomeData.ok(r);
2181
2345
  };
2182
2346
  var mul_imm_32 = (r, args, registers) => {
2183
- registers[reg(args.b)] = u32SignExtend(u32(portable.u64_mul(registers[reg(args.a)], u64(args.c))));
2184
- return ok(r);
2347
+ registers[Inst.reg(args.b)] = Inst.u32SignExtend(u32(portable.u64_mul(registers[Inst.reg(args.a)], u64(args.c))));
2348
+ return OutcomeData.ok(r);
2185
2349
  };
2186
2350
  var neg_add_imm_32 = (r, args, registers) => {
2187
- const sum = portable.u64_sub(u64(args.c) | u64(4294967296), registers[reg(args.a)]);
2188
- registers[reg(args.b)] = u32SignExtend(u32(sum));
2189
- return ok(r);
2351
+ const sum = portable.u64_sub(u64(args.c) | u64(4294967296), registers[Inst.reg(args.a)]);
2352
+ registers[Inst.reg(args.b)] = Inst.u32SignExtend(u32(sum));
2353
+ return OutcomeData.ok(r);
2190
2354
  };
2191
2355
  var add_imm = (r, args, registers) => {
2192
- const sum = portable.u64_add(registers[reg(args.a)], u32SignExtend(args.c));
2193
- registers[reg(args.b)] = sum;
2194
- return ok(r);
2356
+ const sum = portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c));
2357
+ registers[Inst.reg(args.b)] = sum;
2358
+ return OutcomeData.ok(r);
2195
2359
  };
2196
2360
  var mul_imm = (r, args, registers) => {
2197
- registers[reg(args.b)] = portable.u64_mul(registers[reg(args.a)], u32SignExtend(args.c));
2198
- return ok(r);
2361
+ registers[Inst.reg(args.b)] = portable.u64_mul(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c));
2362
+ return OutcomeData.ok(r);
2199
2363
  };
2200
2364
  var neg_add_imm = (r, args, registers) => {
2201
- const sum = portable.u64_sub(u32SignExtend(args.c), registers[reg(args.a)]);
2202
- registers[reg(args.b)] = sum;
2203
- return ok(r);
2365
+ const sum = portable.u64_sub(Inst.u32SignExtend(args.c), registers[Inst.reg(args.a)]);
2366
+ registers[Inst.reg(args.b)] = sum;
2367
+ return OutcomeData.ok(r);
2204
2368
  };
2205
2369
  var add_32 = (r, args, registers) => {
2206
- const a = u32(registers[reg(args.a)]);
2207
- const b = u32(registers[reg(args.b)]);
2208
- registers[reg(args.c)] = u32SignExtend(a + b);
2209
- return ok(r);
2370
+ const a = u32(registers[Inst.reg(args.a)]);
2371
+ const b = u32(registers[Inst.reg(args.b)]);
2372
+ registers[Inst.reg(args.c)] = Inst.u32SignExtend(a + b);
2373
+ return OutcomeData.ok(r);
2210
2374
  };
2211
2375
  var sub_32 = (r, args, registers) => {
2212
- const a = registers[reg(args.b)];
2213
- const b = u64(4294967296 - u32(registers[reg(args.a)]));
2214
- registers[reg(args.c)] = u32SignExtend(u32(portable.u64_add(a, b)));
2215
- return ok(r);
2376
+ const a = registers[Inst.reg(args.b)];
2377
+ const b = u64(4294967296 - u32(registers[Inst.reg(args.a)]));
2378
+ registers[Inst.reg(args.c)] = Inst.u32SignExtend(u32(portable.u64_add(a, b)));
2379
+ return OutcomeData.ok(r);
2216
2380
  };
2217
2381
  var mul_32 = (r, args, registers) => {
2218
- registers[reg(args.c)] = u32SignExtend(u32(portable.u64_mul(registers[reg(args.a)], registers[reg(args.b)])));
2219
- return ok(r);
2382
+ registers[Inst.reg(args.c)] = Inst.u32SignExtend(u32(portable.u64_mul(registers[Inst.reg(args.a)], registers[Inst.reg(args.b)])));
2383
+ return OutcomeData.ok(r);
2220
2384
  };
2221
2385
  var div_u_32 = (r, args, registers) => {
2222
- const a = u32(registers[reg(args.a)]);
2386
+ const a = u32(registers[Inst.reg(args.a)]);
2223
2387
  if (a === 0) {
2224
- registers[reg(args.c)] = u64.MAX_VALUE;
2388
+ registers[Inst.reg(args.c)] = u64.MAX_VALUE;
2225
2389
  } else {
2226
- const b = u32(registers[reg(args.b)]);
2227
- registers[reg(args.c)] = u32SignExtend(b / a);
2390
+ const b = u32(registers[Inst.reg(args.b)]);
2391
+ registers[Inst.reg(args.c)] = Inst.u32SignExtend(b / a);
2228
2392
  }
2229
- return ok(r);
2393
+ return OutcomeData.ok(r);
2230
2394
  };
2231
2395
  var div_s_32 = (r, args, registers) => {
2232
- const b = i64(u32SignExtend(u32(registers[reg(args.b)])));
2233
- const a = i64(u32SignExtend(u32(registers[reg(args.a)])));
2396
+ const b = i64(Inst.u32SignExtend(u32(registers[Inst.reg(args.b)])));
2397
+ const a = i64(Inst.u32SignExtend(u32(registers[Inst.reg(args.a)])));
2234
2398
  if (a === i64(0)) {
2235
- registers[reg(args.c)] = u64.MAX_VALUE;
2399
+ registers[Inst.reg(args.c)] = u64.MAX_VALUE;
2236
2400
  } else if (a === i64(-1) && b === i64(i32.MIN_VALUE)) {
2237
- registers[reg(args.c)] = u64(b);
2401
+ registers[Inst.reg(args.c)] = u64(b);
2238
2402
  } else {
2239
- registers[reg(args.c)] = u64(b / a);
2403
+ registers[Inst.reg(args.c)] = u64(b / a);
2240
2404
  }
2241
- return ok(r);
2405
+ return OutcomeData.ok(r);
2242
2406
  };
2243
2407
  var rem_u_32 = (r, args, registers) => {
2244
- const a = u32(registers[reg(args.a)]);
2245
- const b = u32(registers[reg(args.b)]);
2408
+ const a = u32(registers[Inst.reg(args.a)]);
2409
+ const b = u32(registers[Inst.reg(args.b)]);
2246
2410
  if (a === 0) {
2247
- registers[reg(args.c)] = u32SignExtend(b);
2411
+ registers[Inst.reg(args.c)] = Inst.u32SignExtend(b);
2248
2412
  } else {
2249
- registers[reg(args.c)] = u32SignExtend(b % a);
2413
+ registers[Inst.reg(args.c)] = Inst.u32SignExtend(b % a);
2250
2414
  }
2251
- return ok(r);
2415
+ return OutcomeData.ok(r);
2252
2416
  };
2253
2417
  var rem_s_32 = (r, args, registers) => {
2254
- const b = i32(registers[reg(args.b)]);
2255
- const a = i32(registers[reg(args.a)]);
2418
+ const b = i32(registers[Inst.reg(args.b)]);
2419
+ const a = i32(registers[Inst.reg(args.a)]);
2256
2420
  if (a === 0) {
2257
- registers[reg(args.c)] = u64(i64(b));
2421
+ registers[Inst.reg(args.c)] = u64(i64(b));
2258
2422
  } else if (a === -1 && b === i32.MIN_VALUE) {
2259
- registers[reg(args.c)] = u64(0);
2423
+ registers[Inst.reg(args.c)] = u64(0);
2260
2424
  } else {
2261
- registers[reg(args.c)] = u64(i64(b) % i64(a));
2425
+ registers[Inst.reg(args.c)] = u64(i64(b) % i64(a));
2262
2426
  }
2263
- return ok(r);
2427
+ return OutcomeData.ok(r);
2264
2428
  };
2265
2429
  var add_64 = (r, args, registers) => {
2266
- const a = registers[reg(args.a)];
2267
- const b = registers[reg(args.b)];
2268
- registers[reg(args.c)] = portable.u64_add(a, b);
2269
- return ok(r);
2430
+ const a = registers[Inst.reg(args.a)];
2431
+ const b = registers[Inst.reg(args.b)];
2432
+ registers[Inst.reg(args.c)] = portable.u64_add(a, b);
2433
+ return OutcomeData.ok(r);
2270
2434
  };
2271
2435
  var sub = (r, args, registers) => {
2272
- const a = registers[reg(args.a)];
2273
- const b = registers[reg(args.b)];
2274
- registers[reg(args.c)] = portable.u64_sub(b, a);
2275
- return ok(r);
2436
+ const a = registers[Inst.reg(args.a)];
2437
+ const b = registers[Inst.reg(args.b)];
2438
+ registers[Inst.reg(args.c)] = portable.u64_sub(b, a);
2439
+ return OutcomeData.ok(r);
2276
2440
  };
2277
2441
  var mul = (r, args, registers) => {
2278
- const a = registers[reg(args.a)];
2279
- const b = registers[reg(args.b)];
2280
- registers[reg(args.c)] = portable.u64_mul(a, b);
2281
- return ok(r);
2442
+ const a = registers[Inst.reg(args.a)];
2443
+ const b = registers[Inst.reg(args.b)];
2444
+ registers[Inst.reg(args.c)] = portable.u64_mul(a, b);
2445
+ return OutcomeData.ok(r);
2282
2446
  };
2283
2447
  var div_u = (r, args, registers) => {
2284
- if (registers[reg(args.a)] === u64(0)) {
2285
- registers[reg(args.c)] = u64.MAX_VALUE;
2448
+ if (registers[Inst.reg(args.a)] === u64(0)) {
2449
+ registers[Inst.reg(args.c)] = u64.MAX_VALUE;
2286
2450
  } else {
2287
- registers[reg(args.c)] = registers[reg(args.b)] / registers[reg(args.a)];
2451
+ registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] / registers[Inst.reg(args.a)];
2288
2452
  }
2289
- return ok(r);
2453
+ return OutcomeData.ok(r);
2290
2454
  };
2291
2455
  var div_s = (r, args, registers) => {
2292
- const b = i64(registers[reg(args.b)]);
2293
- const a = i64(registers[reg(args.a)]);
2456
+ const b = i64(registers[Inst.reg(args.b)]);
2457
+ const a = i64(registers[Inst.reg(args.a)]);
2294
2458
  if (a === i64(0)) {
2295
- registers[reg(args.c)] = u64.MAX_VALUE;
2459
+ registers[Inst.reg(args.c)] = u64.MAX_VALUE;
2296
2460
  } else if (a === i64(-1) && b === i64.MIN_VALUE) {
2297
- registers[reg(args.c)] = u64(b);
2461
+ registers[Inst.reg(args.c)] = u64(b);
2298
2462
  } else {
2299
- registers[reg(args.c)] = u64(b / a);
2463
+ registers[Inst.reg(args.c)] = u64(b / a);
2300
2464
  }
2301
- return ok(r);
2465
+ return OutcomeData.ok(r);
2302
2466
  };
2303
2467
  var rem_u = (r, args, registers) => {
2304
- if (registers[reg(args.a)] === u64(0)) {
2305
- registers[reg(args.c)] = registers[reg(args.b)];
2468
+ if (registers[Inst.reg(args.a)] === u64(0)) {
2469
+ registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)];
2306
2470
  } else {
2307
- registers[reg(args.c)] = registers[reg(args.b)] % registers[reg(args.a)];
2471
+ registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] % registers[Inst.reg(args.a)];
2308
2472
  }
2309
- return ok(r);
2473
+ return OutcomeData.ok(r);
2310
2474
  };
2311
2475
  var rem_s = (r, args, registers) => {
2312
- const b = i64(registers[reg(args.b)]);
2313
- const a = i64(registers[reg(args.a)]);
2476
+ const b = i64(registers[Inst.reg(args.b)]);
2477
+ const a = i64(registers[Inst.reg(args.a)]);
2314
2478
  if (a === i64(0)) {
2315
- registers[reg(args.c)] = u64(b);
2479
+ registers[Inst.reg(args.c)] = u64(b);
2316
2480
  } else if (a === i64(-1) && b === i64.MIN_VALUE) {
2317
- registers[reg(args.c)] = u64(0);
2481
+ registers[Inst.reg(args.c)] = u64(0);
2318
2482
  } else {
2319
- registers[reg(args.c)] = u64(b % a);
2483
+ registers[Inst.reg(args.c)] = u64(b % a);
2320
2484
  }
2321
- return ok(r);
2485
+ return OutcomeData.ok(r);
2322
2486
  };
2323
2487
  var mul_upper_s_s = (r, args, registers) => {
2324
- registers[reg(args.c)] = mulUpperSigned(i64(registers[reg(args.b)]), i64(registers[reg(args.a)]));
2325
- return ok(r);
2488
+ registers[Inst.reg(args.c)] = mulUpperSigned(i64(registers[Inst.reg(args.b)]), i64(registers[Inst.reg(args.a)]));
2489
+ return OutcomeData.ok(r);
2326
2490
  };
2327
2491
  var mul_upper_u_u = (r, args, registers) => {
2328
- registers[reg(args.c)] = mulUpperUnsigned(registers[reg(args.b)], registers[reg(args.a)]);
2329
- return ok(r);
2492
+ registers[Inst.reg(args.c)] = mulUpperUnsigned(registers[Inst.reg(args.b)], registers[Inst.reg(args.a)]);
2493
+ return OutcomeData.ok(r);
2330
2494
  };
2331
2495
  var mul_upper_s_u = (r, args, registers) => {
2332
- registers[reg(args.c)] = mulUpperSignedUnsigned(i64(registers[reg(args.b)]), registers[reg(args.a)]);
2333
- return ok(r);
2496
+ registers[Inst.reg(args.c)] = mulUpperSignedUnsigned(i64(registers[Inst.reg(args.b)]), registers[Inst.reg(args.a)]);
2497
+ return OutcomeData.ok(r);
2334
2498
  };
2335
2499
  var max = (r, args, registers) => {
2336
- const a = i64(registers[reg(args.a)]);
2337
- const b = i64(registers[reg(args.b)]);
2338
- registers[reg(args.c)] = u64(a < b ? b : a);
2339
- return ok(r);
2500
+ const a = i64(registers[Inst.reg(args.a)]);
2501
+ const b = i64(registers[Inst.reg(args.b)]);
2502
+ registers[Inst.reg(args.c)] = u64(a < b ? b : a);
2503
+ return OutcomeData.ok(r);
2340
2504
  };
2341
2505
  var max_u = (r, args, registers) => {
2342
- const a = registers[reg(args.a)];
2343
- const b = registers[reg(args.b)];
2344
- registers[reg(args.c)] = a < b ? b : a;
2345
- return ok(r);
2506
+ const a = registers[Inst.reg(args.a)];
2507
+ const b = registers[Inst.reg(args.b)];
2508
+ registers[Inst.reg(args.c)] = a < b ? b : a;
2509
+ return OutcomeData.ok(r);
2346
2510
  };
2347
2511
  var min = (r, args, registers) => {
2348
- const a = i64(registers[reg(args.a)]);
2349
- const b = i64(registers[reg(args.b)]);
2350
- registers[reg(args.c)] = u64(a > b ? b : a);
2351
- return ok(r);
2512
+ const a = i64(registers[Inst.reg(args.a)]);
2513
+ const b = i64(registers[Inst.reg(args.b)]);
2514
+ registers[Inst.reg(args.c)] = u64(a > b ? b : a);
2515
+ return OutcomeData.ok(r);
2352
2516
  };
2353
2517
  var min_u = (r, args, registers) => {
2354
- const a = registers[reg(args.a)];
2355
- const b = registers[reg(args.b)];
2356
- registers[reg(args.c)] = a > b ? b : a;
2357
- return ok(r);
2518
+ const a = registers[Inst.reg(args.a)];
2519
+ const b = registers[Inst.reg(args.b)];
2520
+ registers[Inst.reg(args.c)] = a > b ? b : a;
2521
+ return OutcomeData.ok(r);
2358
2522
  };
2359
2523
 
2360
2524
  // dist/build/js/assembly/instructions/misc.js
2361
2525
  var faultRes2 = new MaybePageFault();
2362
- var INVALID = (r) => panic(r);
2363
- var trap = (r) => panic(r);
2364
- var fallthrough = (r) => ok(r);
2365
- var ecalli = (r, args) => hostCall(r, args.a);
2526
+ var INVALID = (r) => OutcomeData.panic(r);
2527
+ var trap = (r) => OutcomeData.panic(r);
2528
+ var fallthrough = (r) => OutcomeData.ok(r);
2529
+ var ecalli = (r, args) => OutcomeData.hostCall(r, args.a);
2366
2530
  var sbrk = (r, args, registers, memory) => {
2367
- const res = memory.sbrk(faultRes2, u32(registers[reg(args.a)]));
2531
+ const res = memory.sbrk(faultRes2, u32(registers[Inst.reg(args.a)]));
2368
2532
  if (faultRes2.isFault) {
2369
- return okOrFault(r, faultRes2);
2533
+ return OutcomeData.okOrFault(r, faultRes2);
2370
2534
  }
2371
- registers[reg(args.b)] = res;
2372
- return ok(r);
2535
+ registers[Inst.reg(args.b)] = res;
2536
+ return OutcomeData.ok(r);
2373
2537
  };
2374
2538
 
2375
2539
  // dist/build/js/assembly/instructions/mov.js
2376
2540
  var move_reg = (r, args, registers) => {
2377
- registers[reg(args.b)] = registers[reg(args.a)];
2378
- return ok(r);
2541
+ registers[Inst.reg(args.b)] = registers[Inst.reg(args.a)];
2542
+ return OutcomeData.ok(r);
2379
2543
  };
2380
2544
  var cmov_iz_imm = (r, args, registers) => {
2381
- if (registers[reg(args.a)] === u64(0)) {
2382
- registers[reg(args.b)] = u32SignExtend(args.c);
2545
+ if (registers[Inst.reg(args.a)] === u64(0)) {
2546
+ registers[Inst.reg(args.b)] = Inst.u32SignExtend(args.c);
2383
2547
  }
2384
- return ok(r);
2548
+ return OutcomeData.ok(r);
2385
2549
  };
2386
2550
  var cmov_nz_imm = (r, args, registers) => {
2387
- if (registers[reg(args.a)] !== u64(0)) {
2388
- registers[reg(args.b)] = u32SignExtend(args.c);
2551
+ if (registers[Inst.reg(args.a)] !== u64(0)) {
2552
+ registers[Inst.reg(args.b)] = Inst.u32SignExtend(args.c);
2389
2553
  }
2390
- return ok(r);
2554
+ return OutcomeData.ok(r);
2391
2555
  };
2392
2556
  var cmov_iz = (r, args, registers) => {
2393
- if (registers[reg(args.a)] === u64(0)) {
2394
- registers[reg(args.c)] = registers[reg(args.b)];
2557
+ if (registers[Inst.reg(args.a)] === u64(0)) {
2558
+ registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)];
2395
2559
  }
2396
- return ok(r);
2560
+ return OutcomeData.ok(r);
2397
2561
  };
2398
2562
  var cmov_nz = (r, args, registers) => {
2399
- if (registers[reg(args.a)] !== u64(0)) {
2400
- registers[reg(args.c)] = registers[reg(args.b)];
2563
+ if (registers[Inst.reg(args.a)] !== u64(0)) {
2564
+ registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)];
2401
2565
  }
2402
- return ok(r);
2566
+ return OutcomeData.ok(r);
2403
2567
  };
2404
2568
 
2405
2569
  // dist/build/js/assembly/instructions/rot.js
2406
2570
  var rot_r_64_imm = (r, args, regs) => {
2407
- regs[reg(args.b)] = math.rot_r(regs[reg(args.a)], u32SignExtend(args.c));
2408
- return ok(r);
2571
+ regs[Inst.reg(args.b)] = math.rot_r(regs[Inst.reg(args.a)], Inst.u32SignExtend(args.c));
2572
+ return OutcomeData.ok(r);
2409
2573
  };
2410
2574
  var rot_r_64_imm_alt = (r, args, regs) => {
2411
- regs[reg(args.b)] = math.rot_r(u32SignExtend(args.c), regs[reg(args.a)]);
2412
- return ok(r);
2575
+ regs[Inst.reg(args.b)] = math.rot_r(Inst.u32SignExtend(args.c), regs[Inst.reg(args.a)]);
2576
+ return OutcomeData.ok(r);
2413
2577
  };
2414
2578
  var rot_r_32_imm = (r, args, regs) => {
2415
- regs[reg(args.b)] = u32SignExtend(math.rot_r_32(u32(regs[reg(args.a)]), u32(args.c)));
2416
- return ok(r);
2579
+ regs[Inst.reg(args.b)] = Inst.u32SignExtend(math.rot_r_32(u32(regs[Inst.reg(args.a)]), u32(args.c)));
2580
+ return OutcomeData.ok(r);
2417
2581
  };
2418
2582
  var rot_r_32_imm_alt = (r, args, regs) => {
2419
- regs[reg(args.b)] = u32SignExtend(math.rot_r_32(u32(args.c), u32(regs[reg(args.a)])));
2420
- return ok(r);
2583
+ regs[Inst.reg(args.b)] = Inst.u32SignExtend(math.rot_r_32(u32(args.c), u32(regs[Inst.reg(args.a)])));
2584
+ return OutcomeData.ok(r);
2421
2585
  };
2422
2586
  var rot_l_64 = (r, args, regs) => {
2423
- regs[reg(args.c)] = math.rot_l(regs[reg(args.b)], regs[reg(args.a)]);
2424
- return ok(r);
2587
+ regs[Inst.reg(args.c)] = math.rot_l(regs[Inst.reg(args.b)], regs[Inst.reg(args.a)]);
2588
+ return OutcomeData.ok(r);
2425
2589
  };
2426
2590
  var rot_l_32 = (r, args, regs) => {
2427
- regs[reg(args.c)] = u32SignExtend(math.rot_l_32(u32(regs[reg(args.b)]), u32(regs[reg(args.a)])));
2428
- return ok(r);
2591
+ regs[Inst.reg(args.c)] = Inst.u32SignExtend(math.rot_l_32(u32(regs[Inst.reg(args.b)]), u32(regs[Inst.reg(args.a)])));
2592
+ return OutcomeData.ok(r);
2429
2593
  };
2430
2594
  var rot_r_64 = (r, args, regs) => {
2431
- regs[reg(args.c)] = math.rot_r(regs[reg(args.b)], regs[reg(args.a)]);
2432
- return ok(r);
2595
+ regs[Inst.reg(args.c)] = math.rot_r(regs[Inst.reg(args.b)], regs[Inst.reg(args.a)]);
2596
+ return OutcomeData.ok(r);
2433
2597
  };
2434
2598
  var rot_r_32 = (r, args, regs) => {
2435
- regs[reg(args.c)] = u32SignExtend(math.rot_r_32(u32(regs[reg(args.b)]), u32(regs[reg(args.a)])));
2436
- return ok(r);
2599
+ regs[Inst.reg(args.c)] = Inst.u32SignExtend(math.rot_r_32(u32(regs[Inst.reg(args.b)]), u32(regs[Inst.reg(args.a)])));
2600
+ return OutcomeData.ok(r);
2437
2601
  };
2438
2602
  var math;
2439
2603
  (function(math2) {
@@ -2457,32 +2621,32 @@ var math;
2457
2621
 
2458
2622
  // dist/build/js/assembly/instructions/set.js
2459
2623
  var set_lt_u_imm = (r, args, registers) => {
2460
- const cond = registers[reg(args.a)] < u64(u32SignExtend(args.c));
2461
- registers[reg(args.b)] = cond ? u64(1) : u64(0);
2462
- return ok(r);
2624
+ const cond = registers[Inst.reg(args.a)] < u64(Inst.u32SignExtend(args.c));
2625
+ registers[Inst.reg(args.b)] = cond ? u64(1) : u64(0);
2626
+ return OutcomeData.ok(r);
2463
2627
  };
2464
2628
  var set_lt_s_imm = (r, args, registers) => {
2465
- const cond = i64(registers[reg(args.a)]) < i64(u32SignExtend(args.c));
2466
- registers[reg(args.b)] = cond ? u64(1) : u64(0);
2467
- return ok(r);
2629
+ const cond = i64(registers[Inst.reg(args.a)]) < i64(Inst.u32SignExtend(args.c));
2630
+ registers[Inst.reg(args.b)] = cond ? u64(1) : u64(0);
2631
+ return OutcomeData.ok(r);
2468
2632
  };
2469
2633
  var set_gt_u_imm = (r, args, registers) => {
2470
- const cond = registers[reg(args.a)] > u64(u32SignExtend(args.c));
2471
- registers[reg(args.b)] = cond ? u64(1) : u64(0);
2472
- return ok(r);
2634
+ const cond = registers[Inst.reg(args.a)] > u64(Inst.u32SignExtend(args.c));
2635
+ registers[Inst.reg(args.b)] = cond ? u64(1) : u64(0);
2636
+ return OutcomeData.ok(r);
2473
2637
  };
2474
2638
  var set_gt_s_imm = (r, args, registers) => {
2475
- const cond = i64(registers[reg(args.a)]) > i64(u32SignExtend(args.c));
2476
- registers[reg(args.b)] = cond ? u64(1) : u64(0);
2477
- return ok(r);
2639
+ const cond = i64(registers[Inst.reg(args.a)]) > i64(Inst.u32SignExtend(args.c));
2640
+ registers[Inst.reg(args.b)] = cond ? u64(1) : u64(0);
2641
+ return OutcomeData.ok(r);
2478
2642
  };
2479
2643
  var set_lt_u = (r, args, registers) => {
2480
- registers[reg(args.c)] = registers[reg(args.b)] < registers[reg(args.a)] ? u64(1) : u64(0);
2481
- return ok(r);
2644
+ registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] < registers[Inst.reg(args.a)] ? u64(1) : u64(0);
2645
+ return OutcomeData.ok(r);
2482
2646
  };
2483
2647
  var set_lt_s = (r, args, registers) => {
2484
- registers[reg(args.c)] = i64(registers[reg(args.b)]) < i64(registers[reg(args.a)]) ? u64(1) : u64(0);
2485
- return ok(r);
2648
+ registers[Inst.reg(args.c)] = i64(registers[Inst.reg(args.b)]) < i64(registers[Inst.reg(args.a)]) ? u64(1) : u64(0);
2649
+ return OutcomeData.ok(r);
2486
2650
  };
2487
2651
 
2488
2652
  // dist/build/js/assembly/instructions/shift.js
@@ -2490,184 +2654,184 @@ var MAX_SHIFT_64 = 64;
2490
2654
  var MAX_SHIFT_32 = 32;
2491
2655
  var shlo_l_imm_32 = (r, args, registers) => {
2492
2656
  const shift = u32(args.c % MAX_SHIFT_32);
2493
- const value = u32(registers[reg(args.a)]);
2494
- registers[reg(args.b)] = u32SignExtend(value << shift);
2495
- return ok(r);
2657
+ const value = u32(registers[Inst.reg(args.a)]);
2658
+ registers[Inst.reg(args.b)] = Inst.u32SignExtend(value << shift);
2659
+ return OutcomeData.ok(r);
2496
2660
  };
2497
2661
  var shlo_r_imm_32 = (r, args, registers) => {
2498
2662
  const shift = u32(args.c % MAX_SHIFT_32);
2499
- const value = u32(registers[reg(args.a)]);
2500
- registers[reg(args.b)] = u32SignExtend(value >>> shift);
2501
- return ok(r);
2663
+ const value = u32(registers[Inst.reg(args.a)]);
2664
+ registers[Inst.reg(args.b)] = Inst.u32SignExtend(value >>> shift);
2665
+ return OutcomeData.ok(r);
2502
2666
  };
2503
2667
  var shar_r_imm_32 = (r, args, registers) => {
2504
2668
  const shift = u32(args.c % MAX_SHIFT_32);
2505
- const value = u32SignExtend(u32(registers[reg(args.a)]));
2506
- registers[reg(args.b)] = u64(i64(value) >> i64(shift));
2507
- return ok(r);
2669
+ const value = Inst.u32SignExtend(u32(registers[Inst.reg(args.a)]));
2670
+ registers[Inst.reg(args.b)] = u64(i64(value) >> i64(shift));
2671
+ return OutcomeData.ok(r);
2508
2672
  };
2509
2673
  var shlo_l_imm_alt_32 = (r, args, registers) => {
2510
- const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_32));
2511
- registers[reg(args.b)] = u32SignExtend(args.c << shift);
2512
- return ok(r);
2674
+ const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_32));
2675
+ registers[Inst.reg(args.b)] = Inst.u32SignExtend(args.c << shift);
2676
+ return OutcomeData.ok(r);
2513
2677
  };
2514
2678
  var shlo_r_imm_alt_32 = (r, args, registers) => {
2515
- const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_32));
2516
- registers[reg(args.b)] = u32SignExtend(args.c >>> shift);
2517
- return ok(r);
2679
+ const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_32));
2680
+ registers[Inst.reg(args.b)] = Inst.u32SignExtend(args.c >>> shift);
2681
+ return OutcomeData.ok(r);
2518
2682
  };
2519
2683
  var shar_r_imm_alt_32 = (r, args, registers) => {
2520
- const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_32));
2521
- const imm = u32SignExtend(args.c);
2522
- registers[reg(args.b)] = u32SignExtend(u32(i64(imm) >> i64(shift)));
2523
- return ok(r);
2684
+ const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_32));
2685
+ const imm = Inst.u32SignExtend(args.c);
2686
+ registers[Inst.reg(args.b)] = Inst.u32SignExtend(u32(i64(imm) >> i64(shift)));
2687
+ return OutcomeData.ok(r);
2524
2688
  };
2525
2689
  var shlo_l_imm = (r, args, registers) => {
2526
2690
  const shift = u32(args.c % MAX_SHIFT_64);
2527
- registers[reg(args.b)] = u64(registers[reg(args.a)] << u64(shift));
2528
- return ok(r);
2691
+ registers[Inst.reg(args.b)] = u64(registers[Inst.reg(args.a)] << u64(shift));
2692
+ return OutcomeData.ok(r);
2529
2693
  };
2530
2694
  var shlo_r_imm = (r, args, registers) => {
2531
2695
  const shift = u32(args.c % MAX_SHIFT_64);
2532
- registers[reg(args.b)] = registers[reg(args.a)] >> u64(shift);
2533
- return ok(r);
2696
+ registers[Inst.reg(args.b)] = registers[Inst.reg(args.a)] >> u64(shift);
2697
+ return OutcomeData.ok(r);
2534
2698
  };
2535
2699
  var shar_r_imm = (r, args, registers) => {
2536
2700
  const shift = u32(args.c % MAX_SHIFT_64);
2537
- const value = i64(registers[reg(args.a)]);
2538
- registers[reg(args.b)] = u64(value >> i64(shift));
2539
- return ok(r);
2701
+ const value = i64(registers[Inst.reg(args.a)]);
2702
+ registers[Inst.reg(args.b)] = u64(value >> i64(shift));
2703
+ return OutcomeData.ok(r);
2540
2704
  };
2541
2705
  var shlo_l_imm_alt = (r, args, registers) => {
2542
- const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_64));
2543
- registers[reg(args.b)] = u64(u32SignExtend(args.c) << i64(shift));
2544
- return ok(r);
2706
+ const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_64));
2707
+ registers[Inst.reg(args.b)] = u64(Inst.u32SignExtend(args.c) << i64(shift));
2708
+ return OutcomeData.ok(r);
2545
2709
  };
2546
2710
  var shlo_r_imm_alt = (r, args, registers) => {
2547
- const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_64));
2548
- registers[reg(args.b)] = u64(u32SignExtend(args.c)) >> u64(shift);
2549
- return ok(r);
2711
+ const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_64));
2712
+ registers[Inst.reg(args.b)] = u64(Inst.u32SignExtend(args.c)) >> u64(shift);
2713
+ return OutcomeData.ok(r);
2550
2714
  };
2551
2715
  var shar_r_imm_alt = (r, args, registers) => {
2552
- const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_64));
2553
- const value = u32SignExtend(args.c);
2554
- registers[reg(args.b)] = u32SignExtend(u32(value >> i64(shift)));
2555
- return ok(r);
2716
+ const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_64));
2717
+ const value = Inst.u32SignExtend(args.c);
2718
+ registers[Inst.reg(args.b)] = Inst.u32SignExtend(u32(value >> i64(shift)));
2719
+ return OutcomeData.ok(r);
2556
2720
  };
2557
2721
  var shlo_l_32 = (r, args, registers) => {
2558
- const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_32));
2559
- const value = u32(registers[reg(args.b)]);
2560
- registers[reg(args.c)] = u32SignExtend(value << shift);
2561
- return ok(r);
2722
+ const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_32));
2723
+ const value = u32(registers[Inst.reg(args.b)]);
2724
+ registers[Inst.reg(args.c)] = Inst.u32SignExtend(value << shift);
2725
+ return OutcomeData.ok(r);
2562
2726
  };
2563
2727
  var shlo_r_32 = (r, args, registers) => {
2564
- const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_32));
2565
- const value = u32(registers[reg(args.b)]);
2566
- registers[reg(args.c)] = u32SignExtend(value >>> shift);
2567
- return ok(r);
2728
+ const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_32));
2729
+ const value = u32(registers[Inst.reg(args.b)]);
2730
+ registers[Inst.reg(args.c)] = Inst.u32SignExtend(value >>> shift);
2731
+ return OutcomeData.ok(r);
2568
2732
  };
2569
2733
  var shar_r_32 = (r, args, registers) => {
2570
- const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_32));
2571
- const regValue = u32SignExtend(u32(registers[reg(args.b)]));
2572
- registers[reg(args.c)] = u32SignExtend(u32(i64(regValue) >> i64(shift)));
2573
- return ok(r);
2734
+ const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_32));
2735
+ const regValue = Inst.u32SignExtend(u32(registers[Inst.reg(args.b)]));
2736
+ registers[Inst.reg(args.c)] = Inst.u32SignExtend(u32(i64(regValue) >> i64(shift)));
2737
+ return OutcomeData.ok(r);
2574
2738
  };
2575
2739
  var shlo_l = (r, args, registers) => {
2576
- const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_64));
2577
- registers[reg(args.c)] = u64(registers[reg(args.b)] << u64(shift));
2578
- return ok(r);
2740
+ const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_64));
2741
+ registers[Inst.reg(args.c)] = u64(registers[Inst.reg(args.b)] << u64(shift));
2742
+ return OutcomeData.ok(r);
2579
2743
  };
2580
2744
  var shlo_r = (r, args, registers) => {
2581
- const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_64));
2582
- registers[reg(args.c)] = registers[reg(args.b)] >> u64(shift);
2583
- return ok(r);
2745
+ const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_64));
2746
+ registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] >> u64(shift);
2747
+ return OutcomeData.ok(r);
2584
2748
  };
2585
2749
  var shar_r = (r, args, registers) => {
2586
- const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_64));
2587
- registers[reg(args.c)] = u64(i64(registers[reg(args.b)]) >> i64(shift));
2588
- return ok(r);
2750
+ const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_64));
2751
+ registers[Inst.reg(args.c)] = u64(i64(registers[Inst.reg(args.b)]) >> i64(shift));
2752
+ return OutcomeData.ok(r);
2589
2753
  };
2590
2754
 
2591
2755
  // dist/build/js/assembly/instructions/store.js
2592
2756
  var faultRes3 = new MaybePageFault();
2593
2757
  function effectiveAddress(registers, baseReg, offset) {
2594
- return u32(portable.u64_add(registers[reg(u64(baseReg))], u32SignExtend(offset)));
2758
+ return u32(portable.u64_add(registers[Inst.reg(u64(baseReg))], Inst.u32SignExtend(offset)));
2595
2759
  }
2596
2760
  var store_imm_u8 = (r, args, _registers, memory) => {
2597
2761
  const address = args.a;
2598
2762
  memory.setU8(faultRes3, address, args.b & 255);
2599
- return okOrFault(r, faultRes3);
2763
+ return OutcomeData.okOrFault(r, faultRes3);
2600
2764
  };
2601
2765
  var store_imm_u16 = (r, args, _registers, memory) => {
2602
2766
  const address = args.a;
2603
2767
  memory.setU16(faultRes3, address, args.b & 65535);
2604
- return okOrFault(r, faultRes3);
2768
+ return OutcomeData.okOrFault(r, faultRes3);
2605
2769
  };
2606
2770
  var store_imm_u32 = (r, args, _registers, memory) => {
2607
2771
  const address = args.a;
2608
2772
  memory.setU32(faultRes3, address, args.b);
2609
- return okOrFault(r, faultRes3);
2773
+ return OutcomeData.okOrFault(r, faultRes3);
2610
2774
  };
2611
2775
  var store_imm_u64 = (r, args, _registers, memory) => {
2612
2776
  const address = args.a;
2613
- memory.setU64(faultRes3, address, u32SignExtend(args.b));
2614
- return okOrFault(r, faultRes3);
2777
+ memory.setU64(faultRes3, address, Inst.u32SignExtend(args.b));
2778
+ return OutcomeData.okOrFault(r, faultRes3);
2615
2779
  };
2616
2780
  var store_u8 = (r, args, registers, memory) => {
2617
- memory.setU8(faultRes3, args.b, registers[reg(args.a)] & u64(255));
2618
- return okOrFault(r, faultRes3);
2781
+ memory.setU8(faultRes3, args.b, registers[Inst.reg(args.a)] & u64(255));
2782
+ return OutcomeData.okOrFault(r, faultRes3);
2619
2783
  };
2620
2784
  var store_u16 = (r, args, registers, memory) => {
2621
- memory.setU16(faultRes3, args.b, registers[reg(args.a)] & u64(65535));
2622
- return okOrFault(r, faultRes3);
2785
+ memory.setU16(faultRes3, args.b, registers[Inst.reg(args.a)] & u64(65535));
2786
+ return OutcomeData.okOrFault(r, faultRes3);
2623
2787
  };
2624
2788
  var store_u32 = (r, args, registers, memory) => {
2625
- memory.setU32(faultRes3, args.b, u32(registers[reg(args.a)]));
2626
- return okOrFault(r, faultRes3);
2789
+ memory.setU32(faultRes3, args.b, u32(registers[Inst.reg(args.a)]));
2790
+ return OutcomeData.okOrFault(r, faultRes3);
2627
2791
  };
2628
2792
  var store_u64 = (r, args, registers, memory) => {
2629
- memory.setU64(faultRes3, args.b, registers[reg(args.a)]);
2630
- return okOrFault(r, faultRes3);
2793
+ memory.setU64(faultRes3, args.b, registers[Inst.reg(args.a)]);
2794
+ return OutcomeData.okOrFault(r, faultRes3);
2631
2795
  };
2632
2796
  var store_imm_ind_u8 = (r, args, registers, memory) => {
2633
2797
  const address = effectiveAddress(registers, args.a, args.b);
2634
2798
  memory.setU8(faultRes3, address, args.c & 255);
2635
- return okOrFault(r, faultRes3);
2799
+ return OutcomeData.okOrFault(r, faultRes3);
2636
2800
  };
2637
2801
  var store_imm_ind_u16 = (r, args, registers, memory) => {
2638
2802
  const address = effectiveAddress(registers, args.a, args.b);
2639
2803
  memory.setU16(faultRes3, address, args.c & 65535);
2640
- return okOrFault(r, faultRes3);
2804
+ return OutcomeData.okOrFault(r, faultRes3);
2641
2805
  };
2642
2806
  var store_imm_ind_u32 = (r, args, registers, memory) => {
2643
2807
  const address = effectiveAddress(registers, args.a, args.b);
2644
2808
  memory.setU32(faultRes3, address, args.c);
2645
- return okOrFault(r, faultRes3);
2809
+ return OutcomeData.okOrFault(r, faultRes3);
2646
2810
  };
2647
2811
  var store_imm_ind_u64 = (r, args, registers, memory) => {
2648
2812
  const address = effectiveAddress(registers, args.a, args.b);
2649
- memory.setU64(faultRes3, address, u32SignExtend(args.c));
2650
- return okOrFault(r, faultRes3);
2813
+ memory.setU64(faultRes3, address, Inst.u32SignExtend(args.c));
2814
+ return OutcomeData.okOrFault(r, faultRes3);
2651
2815
  };
2652
2816
  var store_ind_u8 = (r, args, registers, memory) => {
2653
2817
  const address = effectiveAddress(registers, args.a, args.c);
2654
- memory.setU8(faultRes3, address, registers[reg(args.b)] & u64(255));
2655
- return okOrFault(r, faultRes3);
2818
+ memory.setU8(faultRes3, address, registers[Inst.reg(args.b)] & u64(255));
2819
+ return OutcomeData.okOrFault(r, faultRes3);
2656
2820
  };
2657
2821
  var store_ind_u16 = (r, args, registers, memory) => {
2658
2822
  const address = effectiveAddress(registers, args.a, args.c);
2659
- memory.setU16(faultRes3, address, registers[reg(args.b)] & u64(65535));
2660
- return okOrFault(r, faultRes3);
2823
+ memory.setU16(faultRes3, address, registers[Inst.reg(args.b)] & u64(65535));
2824
+ return OutcomeData.okOrFault(r, faultRes3);
2661
2825
  };
2662
2826
  var store_ind_u32 = (r, args, registers, memory) => {
2663
2827
  const address = effectiveAddress(registers, args.a, args.c);
2664
- memory.setU32(faultRes3, address, u32(registers[reg(args.b)]));
2665
- return okOrFault(r, faultRes3);
2828
+ memory.setU32(faultRes3, address, u32(registers[Inst.reg(args.b)]));
2829
+ return OutcomeData.okOrFault(r, faultRes3);
2666
2830
  };
2667
2831
  var store_ind_u64 = (r, args, registers, memory) => {
2668
2832
  const address = effectiveAddress(registers, args.a, args.c);
2669
- memory.setU64(faultRes3, address, registers[reg(args.b)]);
2670
- return okOrFault(r, faultRes3);
2833
+ memory.setU64(faultRes3, address, registers[Inst.reg(args.b)]);
2834
+ return OutcomeData.okOrFault(r, faultRes3);
2671
2835
  };
2672
2836
 
2673
2837
  // dist/build/js/assembly/instructions-exe.js
@@ -3064,13 +3228,13 @@ function liftBytes(data) {
3064
3228
  return p;
3065
3229
  }
3066
3230
  function lowerBytes(data) {
3067
- const r = new Array(data.length);
3231
+ const r = new StaticArray(data.length);
3068
3232
  for (let i = 0; i < data.length; i++) {
3069
3233
  r[i] = data[i];
3070
3234
  }
3071
3235
  return r;
3072
3236
  }
3073
- function deblob(program) {
3237
+ function deblob(program, useBlockGas) {
3074
3238
  const decoder = new Decoder(program);
3075
3239
  const jumpTableLength = decoder.varU32();
3076
3240
  const jumpTableItemLength = decoder.u8();
@@ -3082,7 +3246,8 @@ function deblob(program) {
3082
3246
  const mask = new Mask(rawMask, codeLength);
3083
3247
  const jumpTable = new JumpTable(jumpTableItemLength, rawJumpTable);
3084
3248
  const basicBlocks = new BasicBlocks(rawCode, mask);
3085
- return new Program(rawCode, mask, jumpTable, basicBlocks);
3249
+ const gasCosts = new GasCosts(rawCode, mask, basicBlocks, useBlockGas);
3250
+ return new Program(rawCode, mask, jumpTable, basicBlocks, gasCosts);
3086
3251
  }
3087
3252
  var Mask = class {
3088
3253
  constructor(packedMask, codeLength) {
@@ -3129,6 +3294,51 @@ var Mask = class {
3129
3294
  return `${v}]`;
3130
3295
  }
3131
3296
  };
3297
+ var GasCosts = class {
3298
+ constructor(code, mask, blocks, useBlockGasCost) {
3299
+ const len = code.length;
3300
+ const costs = new StaticArray(len);
3301
+ for (let n = 0; n < len; n += 1) {
3302
+ const isInstructionInMask = mask.isInstruction(n);
3303
+ if (!isInstructionInMask) {
3304
+ costs[n] = code[n];
3305
+ continue;
3306
+ }
3307
+ const skipArgs = mask.skipBytesToNextInstruction(n);
3308
+ const iData = code[n] >= INSTRUCTIONS.length ? MISSING_INSTRUCTION : INSTRUCTIONS[code[n]];
3309
+ costs[n] = code[n] | iData.gas << 8;
3310
+ n += skipArgs;
3311
+ }
3312
+ if (useBlockGasCost) {
3313
+ let previousStart = 0;
3314
+ let previousSum = 0;
3315
+ for (let n = 0; n < len; n += 1) {
3316
+ const currentGas = costs[n] >> 8;
3317
+ costs[n] = code[n];
3318
+ if (blocks.isStart(n)) {
3319
+ costs[previousStart] = code[previousStart] | previousSum << 8;
3320
+ previousSum = currentGas;
3321
+ previousStart = n;
3322
+ } else {
3323
+ previousSum += currentGas;
3324
+ }
3325
+ n += mask.skipBytesToNextInstruction(n);
3326
+ }
3327
+ costs[previousStart] = code[previousStart] | previousSum << 8;
3328
+ }
3329
+ this.codeAndGas = costs;
3330
+ }
3331
+ toString() {
3332
+ let v = "GasCosts[";
3333
+ for (let i = 0; i < this.codeAndGas.length; i += 1) {
3334
+ const gas = this.codeAndGas[i] >> 8;
3335
+ if (gas !== 0) {
3336
+ v += `${i} -> ${gas}, `;
3337
+ }
3338
+ }
3339
+ return `${v}]`;
3340
+ }
3341
+ };
3132
3342
  var BasicBlock;
3133
3343
  (function(BasicBlock2) {
3134
3344
  BasicBlock2[BasicBlock2["NONE"] = 0] = "NONE";
@@ -3206,25 +3416,30 @@ var JumpTable = class {
3206
3416
  }
3207
3417
  };
3208
3418
  var Program = class {
3209
- constructor(code, mask, jumpTable, basicBlocks) {
3419
+ constructor(code, mask, jumpTable, basicBlocks, gasCosts) {
3210
3420
  this.code = code;
3211
3421
  this.mask = mask;
3212
3422
  this.jumpTable = jumpTable;
3213
3423
  this.basicBlocks = basicBlocks;
3424
+ this.gasCosts = gasCosts;
3214
3425
  }
3215
3426
  toString() {
3216
- return `Program { code: ${this.code}, mask: ${this.mask}, jumpTable: ${this.jumpTable}, basicBlocks: ${this.basicBlocks} }`;
3427
+ return `Program { code: ${this.code}, mask: ${this.mask}, jumpTable: ${this.jumpTable}, basicBlocks: ${this.basicBlocks}, gasCosts: ${this.gasCosts} }`;
3217
3428
  }
3218
3429
  };
3430
+ var EXTENDED_BUF = new StaticArray(16);
3219
3431
  function decodeArguments(args, kind, code, offset, lim) {
3220
3432
  if (code.length < offset + REQUIRED_BYTES[kind]) {
3221
- const extended = new Array(REQUIRED_BYTES[kind]);
3433
+ const reqBytes = unchecked(REQUIRED_BYTES[kind]);
3434
+ for (let i = 0; i < reqBytes; i++) {
3435
+ EXTENDED_BUF[i] = 0;
3436
+ }
3222
3437
  for (let i = offset; i < code.length; i++) {
3223
- extended[i - offset] = code[i];
3438
+ EXTENDED_BUF[i - offset] = unchecked(code[i]);
3224
3439
  }
3225
- return DECODERS[kind](args, extended, 0, lim);
3440
+ return unchecked(DECODERS[kind])(args, EXTENDED_BUF, 0, lim);
3226
3441
  }
3227
- return DECODERS[kind](args, code, offset, offset + lim);
3442
+ return unchecked(DECODERS[kind])(args, code, offset, offset + lim);
3228
3443
  }
3229
3444
  var ResolvedArguments = class {
3230
3445
  constructor() {
@@ -3246,57 +3461,57 @@ function resolveArguments(argsRes, kind, code, offset, lim, registers) {
3246
3461
  case Arguments.Zero:
3247
3462
  return resolved;
3248
3463
  case Arguments.OneImm:
3249
- resolved.a = u32SignExtend(args.a);
3464
+ resolved.a = Inst.u32SignExtend(args.a);
3250
3465
  return resolved;
3251
3466
  case Arguments.TwoImm:
3252
- resolved.a = u32SignExtend(args.a);
3253
- resolved.b = u32SignExtend(args.b);
3467
+ resolved.a = Inst.u32SignExtend(args.a);
3468
+ resolved.b = Inst.u32SignExtend(args.b);
3254
3469
  return resolved;
3255
3470
  case Arguments.OneOff:
3256
- resolved.a = u32SignExtend(args.a);
3471
+ resolved.a = Inst.u32SignExtend(args.a);
3257
3472
  return resolved;
3258
3473
  case Arguments.OneRegOneImm:
3259
- resolved.a = registers[reg(u64(args.a))];
3260
- resolved.b = u32SignExtend(args.b);
3474
+ resolved.a = registers[Inst.reg(u64(args.a))];
3475
+ resolved.b = Inst.u32SignExtend(args.b);
3261
3476
  return resolved;
3262
3477
  case Arguments.OneRegOneExtImm:
3263
- resolved.a = registers[reg(u64(args.a))];
3478
+ resolved.a = registers[Inst.reg(u64(args.a))];
3264
3479
  resolved.b = portable.u64_add(u64(args.a) << u64(32), u64(args.b));
3265
3480
  return resolved;
3266
3481
  case Arguments.OneRegTwoImm:
3267
- resolved.a = registers[reg(u64(args.a))];
3268
- resolved.b = u32SignExtend(args.b);
3269
- resolved.c = u32SignExtend(args.c);
3482
+ resolved.a = registers[Inst.reg(u64(args.a))];
3483
+ resolved.b = Inst.u32SignExtend(args.b);
3484
+ resolved.c = Inst.u32SignExtend(args.c);
3270
3485
  return resolved;
3271
3486
  case Arguments.OneRegOneImmOneOff:
3272
- resolved.a = registers[reg(u64(args.a))];
3273
- resolved.b = u32SignExtend(args.b);
3274
- resolved.c = u32SignExtend(args.c);
3487
+ resolved.a = registers[Inst.reg(u64(args.a))];
3488
+ resolved.b = Inst.u32SignExtend(args.b);
3489
+ resolved.c = Inst.u32SignExtend(args.c);
3275
3490
  return resolved;
3276
3491
  case Arguments.TwoReg:
3277
- resolved.a = registers[reg(u64(args.a))];
3278
- resolved.b = registers[reg(u64(args.b))];
3492
+ resolved.a = registers[Inst.reg(u64(args.a))];
3493
+ resolved.b = registers[Inst.reg(u64(args.b))];
3279
3494
  return resolved;
3280
3495
  case Arguments.TwoRegOneImm:
3281
- resolved.a = registers[reg(u64(args.a))];
3282
- resolved.b = registers[reg(u64(args.b))];
3283
- resolved.c = u32SignExtend(args.c);
3496
+ resolved.a = registers[Inst.reg(u64(args.a))];
3497
+ resolved.b = registers[Inst.reg(u64(args.b))];
3498
+ resolved.c = Inst.u32SignExtend(args.c);
3284
3499
  return resolved;
3285
3500
  case Arguments.TwoRegOneOff:
3286
- resolved.a = registers[reg(u64(args.a))];
3287
- resolved.b = registers[reg(u64(args.b))];
3288
- resolved.c = u32SignExtend(args.c);
3501
+ resolved.a = registers[Inst.reg(u64(args.a))];
3502
+ resolved.b = registers[Inst.reg(u64(args.b))];
3503
+ resolved.c = Inst.u32SignExtend(args.c);
3289
3504
  return resolved;
3290
3505
  case Arguments.TwoRegTwoImm:
3291
- resolved.a = registers[reg(u64(args.a))];
3292
- resolved.b = registers[reg(u64(args.b))];
3293
- resolved.c = u32SignExtend(args.c);
3294
- resolved.d = u32SignExtend(args.d);
3506
+ resolved.a = registers[Inst.reg(u64(args.a))];
3507
+ resolved.b = registers[Inst.reg(u64(args.b))];
3508
+ resolved.c = Inst.u32SignExtend(args.c);
3509
+ resolved.d = Inst.u32SignExtend(args.d);
3295
3510
  return resolved;
3296
3511
  case Arguments.ThreeReg:
3297
- resolved.a = registers[reg(u64(args.a))];
3298
- resolved.b = registers[reg(u64(args.b))];
3299
- resolved.c = registers[reg(u64(args.c))];
3512
+ resolved.a = registers[Inst.reg(u64(args.a))];
3513
+ resolved.b = registers[Inst.reg(u64(args.b))];
3514
+ resolved.c = registers[Inst.reg(u64(args.c))];
3300
3515
  return resolved;
3301
3516
  default:
3302
3517
  throw new Error(`Unhandled arguments kind: ${kind}`);
@@ -3345,7 +3560,6 @@ var Interpreter = class {
3345
3560
  this.status = Status.OK;
3346
3561
  this.exitCode = 0;
3347
3562
  this.nextPc = 0;
3348
- this.useSbrkGas = false;
3349
3563
  }
3350
3564
  nextSteps(nSteps2 = 1) {
3351
3565
  if (this.status === Status.HOST) {
@@ -3361,9 +3575,11 @@ var Interpreter = class {
3361
3575
  this.nextPc = -1;
3362
3576
  return true;
3363
3577
  }
3364
- const program = this.program;
3365
- const code = program.code;
3366
- const mask = program.mask;
3578
+ const code = this.program.code;
3579
+ const mask = this.program.mask;
3580
+ const gasCosts = this.program.gasCosts.codeAndGas;
3581
+ const basicBlocks = this.program.basicBlocks;
3582
+ const jumpTable = this.program.jumpTable;
3367
3583
  const argsRes = this.argsRes;
3368
3584
  const outcomeRes = this.outcomeRes;
3369
3585
  for (let i = 0; i < nSteps2; i++) {
@@ -3379,9 +3595,11 @@ var Interpreter = class {
3379
3595
  }
3380
3596
  return false;
3381
3597
  }
3382
- const instruction2 = code[pc];
3383
- const iData = instruction2 < INSTRUCTIONS.length ? INSTRUCTIONS[instruction2] : MISSING_INSTRUCTION;
3384
- if (this.gas.sub(iData.gas)) {
3598
+ const codeAndGas = portable.staticArrayAt(gasCosts, pc);
3599
+ const instruction2 = codeAndGas & 255;
3600
+ const gasCost = codeAndGas >> 8;
3601
+ const iData = instruction2 < INSTRUCTIONS.length ? unchecked(INSTRUCTIONS[instruction2]) : MISSING_INSTRUCTION;
3602
+ if (gasCost > 0 && this.gas.sub(gasCost)) {
3385
3603
  this.status = Status.OOG;
3386
3604
  return false;
3387
3605
  }
@@ -3391,19 +3609,24 @@ var Interpreter = class {
3391
3609
  }
3392
3610
  const skipBytes2 = mask.skipBytesToNextInstruction(pc);
3393
3611
  const args = decodeArguments(argsRes, iData.kind, code, pc + 1, skipBytes2);
3394
- if (iData === SBRK && this.useSbrkGas) {
3395
- const alloc = u64(u32(this.registers[reg(u64(args.a))]));
3396
- const gas = portable.u64_mul(portable.u64_sub(portable.u64_add(alloc, u64(PAGE_SIZE)), u64(1)) >> u64(PAGE_SIZE_SHIFT), u64(16));
3397
- if (this.gas.sub(gas)) {
3398
- this.status = Status.OOG;
3399
- return false;
3400
- }
3401
- }
3402
- const exe = RUN[instruction2];
3612
+ const exe = unchecked(RUN[instruction2]);
3403
3613
  const outcome = exe(outcomeRes, args, this.registers, this.memory);
3614
+ if (outcome.outcome === Outcome.Ok) {
3615
+ this.pc += 1 + skipBytes2;
3616
+ continue;
3617
+ }
3404
3618
  switch (outcome.outcome) {
3619
+ case Outcome.StaticJump: {
3620
+ const branchResult = branch(this.branchRes, basicBlocks, pc, outcome.staticJump);
3621
+ if (!branchResult.isOkay) {
3622
+ this.status = Status.PANIC;
3623
+ return false;
3624
+ }
3625
+ this.pc = branchResult.newPc;
3626
+ continue;
3627
+ }
3405
3628
  case Outcome.DynamicJump: {
3406
- const res = dJump2(this.djumpRes, program.jumpTable, outcome.dJump);
3629
+ const res = dJump(this.djumpRes, jumpTable, outcome.dJump);
3407
3630
  if (res.status === DjumpStatus.HALT) {
3408
3631
  this.status = Status.HALT;
3409
3632
  return false;
@@ -3412,16 +3635,7 @@ var Interpreter = class {
3412
3635
  this.status = Status.PANIC;
3413
3636
  return false;
3414
3637
  }
3415
- const branchResult = branch(this.branchRes, program.basicBlocks, res.newPc, 0);
3416
- if (!branchResult.isOkay) {
3417
- this.status = Status.PANIC;
3418
- return false;
3419
- }
3420
- this.pc = branchResult.newPc;
3421
- continue;
3422
- }
3423
- case Outcome.StaticJump: {
3424
- const branchResult = branch(this.branchRes, program.basicBlocks, pc, outcome.staticJump);
3638
+ const branchResult = branch(this.branchRes, basicBlocks, res.newPc, 0);
3425
3639
  if (!branchResult.isOkay) {
3426
3640
  this.status = Status.PANIC;
3427
3641
  return false;
@@ -3456,10 +3670,6 @@ var Interpreter = class {
3456
3670
  }
3457
3671
  throw new Error("Unknown result");
3458
3672
  }
3459
- case Outcome.Ok: {
3460
- this.pc += 1 + skipBytes2;
3461
- continue;
3462
- }
3463
3673
  }
3464
3674
  }
3465
3675
  return true;
@@ -3478,7 +3688,7 @@ function branch(r, basicBlocks, pc, offset) {
3478
3688
  }
3479
3689
  var EXIT = 4294901760;
3480
3690
  var JUMP_ALIGMENT_FACTOR = 2;
3481
- function dJump2(r, jumpTable, address) {
3691
+ function dJump(r, jumpTable, address) {
3482
3692
  if (address === EXIT) {
3483
3693
  r.status = DjumpStatus.HALT;
3484
3694
  return r;
@@ -3519,7 +3729,6 @@ var InitialChunk = class {
3519
3729
  };
3520
3730
  var VmRunOptions = class {
3521
3731
  constructor() {
3522
- this.useSbrkGas = false;
3523
3732
  this.logs = false;
3524
3733
  this.dumpMemory = false;
3525
3734
  }
@@ -3530,7 +3739,7 @@ var VmInput = class {
3530
3739
  this.memory = memory;
3531
3740
  this.registers = registers;
3532
3741
  this.pc = 0;
3533
- this.gas = i64(0);
3742
+ this.gas = u64(0);
3534
3743
  }
3535
3744
  };
3536
3745
  var VmPause = class {
@@ -3539,7 +3748,7 @@ var VmPause = class {
3539
3748
  this.exitCode = 0;
3540
3749
  this.pc = 0;
3541
3750
  this.nextPc = 0;
3542
- this.gas = i64(0);
3751
+ this.gas = u64(0);
3543
3752
  this.registers = [];
3544
3753
  }
3545
3754
  };
@@ -3548,7 +3757,7 @@ var VmOutput = class {
3548
3757
  this.status = Status.OK;
3549
3758
  this.exitCode = 0;
3550
3759
  this.pc = 0;
3551
- this.gas = i64(0);
3760
+ this.gas = u64(0);
3552
3761
  this.result = [];
3553
3762
  this.registers = [];
3554
3763
  this.memory = [];
@@ -3606,15 +3815,14 @@ function buildMemory(builder, pages, chunks) {
3606
3815
  }
3607
3816
  return builder.build(sbrkIndex);
3608
3817
  }
3609
- function vmInit(input, useSbrkGas = false) {
3818
+ function vmInit(input) {
3610
3819
  const int = new Interpreter(input.program, input.registers, input.memory);
3611
- int.useSbrkGas = useSbrkGas;
3612
3820
  int.nextPc = input.pc;
3613
3821
  int.gas.set(input.gas);
3614
3822
  return int;
3615
3823
  }
3616
3824
  function vmRunOnce(input, options) {
3617
- const int = vmInit(input, options.useSbrkGas);
3825
+ const int = vmInit(input);
3618
3826
  vmExecute(int, options.logs);
3619
3827
  return vmDestroy(int, options.dumpMemory);
3620
3828
  }
@@ -3730,7 +3938,7 @@ function getOutputChunks(memory) {
3730
3938
  var MAX_ARGS_LEN = 2 ** 24;
3731
3939
  var ARGS_SEGMENT_START = 2 ** 32 - SEGMENT_SIZE - MAX_ARGS_LEN;
3732
3940
  var STACK_SEGMENT_END = ARGS_SEGMENT_START - SEGMENT_SIZE;
3733
- function decodeSpi(data, args, preallocateMemoryPages = 0) {
3941
+ function decodeSpi(data, args, preallocateMemoryPages = 0, useBlockGas = false) {
3734
3942
  const argsLength = args.length;
3735
3943
  if (argsLength > MAX_ARGS_LEN) {
3736
3944
  throw new Error(`Arguments length is too big. Got: ${argsLength}, max: ${MAX_ARGS_LEN}`);
@@ -3745,7 +3953,7 @@ function decodeSpi(data, args, preallocateMemoryPages = 0) {
3745
3953
  const codeLength = decoder.u32();
3746
3954
  const code = decoder.bytes(codeLength);
3747
3955
  decoder.finish();
3748
- const program = deblob(code);
3956
+ const program = deblob(code, useBlockGas);
3749
3957
  const builder = new MemoryBuilder(preallocateMemoryPages);
3750
3958
  const heapStart = 2 * SEGMENT_SIZE + alignToSegmentSize(roLength);
3751
3959
  const heapZerosStart = heapStart + alignToPageSize(rwLength);
@@ -3795,9 +4003,9 @@ var StandardProgram = class {
3795
4003
 
3796
4004
  // dist/build/js/assembly/api-debugger.js
3797
4005
  var interpreter = null;
3798
- function resetJAM(program, pc, initialGas, args, hasMetadata = false) {
4006
+ function resetJAM(program, pc, initialGas, args, hasMetadata = false, useBlockGas = false) {
3799
4007
  const code = hasMetadata ? extractCodeAndMetadata(liftBytes(program)).code : liftBytes(program);
3800
- const p = decodeSpi(code, liftBytes(args), 128);
4008
+ const p = decodeSpi(code, liftBytes(args), 128, useBlockGas);
3801
4009
  const int = new Interpreter(p.program, p.registers, p.memory);
3802
4010
  int.nextPc = pc;
3803
4011
  int.gas.set(initialGas);
@@ -3806,9 +4014,9 @@ function resetJAM(program, pc, initialGas, args, hasMetadata = false) {
3806
4014
  }
3807
4015
  interpreter = int;
3808
4016
  }
3809
- function resetGeneric(program, flatRegisters, initialGas, hasMetadata = false) {
4017
+ function resetGeneric(program, flatRegisters, initialGas, hasMetadata = false, useBlockGas = false) {
3810
4018
  const code = hasMetadata ? extractCodeAndMetadata(liftBytes(program)).code : liftBytes(program);
3811
- const p = deblob(code);
4019
+ const p = deblob(code, useBlockGas);
3812
4020
  const registers = newRegisters();
3813
4021
  fillRegisters(registers, flatRegisters);
3814
4022
  const int = new Interpreter(p, registers);
@@ -3818,9 +4026,9 @@ function resetGeneric(program, flatRegisters, initialGas, hasMetadata = false) {
3818
4026
  }
3819
4027
  interpreter = int;
3820
4028
  }
3821
- function resetGenericWithMemory(program, flatRegisters, pageMap, chunks, initialGas, hasMetadata = false) {
4029
+ function resetGenericWithMemory(program, flatRegisters, pageMap, chunks, initialGas, hasMetadata = false, useBlockGas = false) {
3822
4030
  const code = hasMetadata ? extractCodeAndMetadata(liftBytes(program)).code : liftBytes(program);
3823
- const p = deblob(code);
4031
+ const p = deblob(code, useBlockGas);
3824
4032
  const registers = newRegisters();
3825
4033
  fillRegisters(registers, flatRegisters);
3826
4034
  const builder = new MemoryBuilder();
@@ -3994,42 +4202,6 @@ function readChunks(chunks) {
3994
4202
  return res;
3995
4203
  }
3996
4204
 
3997
- // dist/build/js/assembly/gas-costs.js
3998
- var BlockGasCost = class {
3999
- constructor() {
4000
- this.pc = 0;
4001
- this.gas = u64(0);
4002
- }
4003
- };
4004
- function computeGasCosts(p) {
4005
- const len = p.code.length;
4006
- const blocks = /* @__PURE__ */ new Map();
4007
- let currentBlock = null;
4008
- for (let i = 0; i < len; i++) {
4009
- if (!p.mask.isInstruction(i)) {
4010
- throw new Error("We should iterate only over instructions!");
4011
- }
4012
- const instruction2 = p.code[i];
4013
- const iData = instruction2 >= INSTRUCTIONS.length ? MISSING_INSTRUCTION : INSTRUCTIONS[instruction2];
4014
- if (p.basicBlocks.isStart(i)) {
4015
- if (currentBlock !== null) {
4016
- blocks.set(currentBlock.pc, currentBlock);
4017
- }
4018
- currentBlock = new BlockGasCost();
4019
- currentBlock.pc = i;
4020
- }
4021
- if (currentBlock !== null) {
4022
- currentBlock.gas = portable.u64_add(currentBlock.gas, iData.gas);
4023
- }
4024
- const skipBytes2 = p.mask.skipBytesToNextInstruction(i);
4025
- i += skipBytes2;
4026
- }
4027
- if (currentBlock !== null) {
4028
- blocks.set(currentBlock.pc, currentBlock);
4029
- }
4030
- return blocks;
4031
- }
4032
-
4033
4205
  // dist/build/js/assembly/api-utils.js
4034
4206
  var InputKind;
4035
4207
  (function(InputKind2) {
@@ -4041,12 +4213,29 @@ var HasMetadata;
4041
4213
  HasMetadata2[HasMetadata2["Yes"] = 0] = "Yes";
4042
4214
  HasMetadata2[HasMetadata2["No"] = 1] = "No";
4043
4215
  })(HasMetadata || (HasMetadata = {}));
4044
- function getGasCosts(input, kind, withMetadata) {
4045
- const program = prepareProgram(kind, withMetadata, input, [], [], [], [], 0);
4046
- return portable.asArray(computeGasCosts(program.program).values());
4216
+ var BlockGasCost = class {
4217
+ constructor() {
4218
+ this.pc = 0;
4219
+ this.gas = 0;
4220
+ }
4221
+ };
4222
+ function getBlockGasCosts(input, kind, withMetadata) {
4223
+ const program = prepareProgram(kind, withMetadata, input, [], [], [], [], 0, true);
4224
+ const blockCosts = [];
4225
+ const costs = program.program.gasCosts.codeAndGas;
4226
+ for (let n = 0; n < costs.length; n += 1) {
4227
+ const gas = costs[n] >> 8;
4228
+ if (gas !== 0) {
4229
+ const x = new BlockGasCost();
4230
+ x.pc = n;
4231
+ x.gas = costs[n];
4232
+ blockCosts.push(x);
4233
+ }
4234
+ }
4235
+ return blockCosts;
4047
4236
  }
4048
4237
  function disassemble(input, kind, withMetadata) {
4049
- const program = prepareProgram(kind, withMetadata, input, [], [], [], [], 0);
4238
+ const program = prepareProgram(kind, withMetadata, input, [], [], [], [], 0, false);
4050
4239
  let output = "";
4051
4240
  if (withMetadata === HasMetadata.Yes) {
4052
4241
  output = "Metadata: \n";
@@ -4057,7 +4246,7 @@ function disassemble(input, kind, withMetadata) {
4057
4246
  output += getAssembly(program.program);
4058
4247
  return output;
4059
4248
  }
4060
- function prepareProgram(kind, hasMetadata, program, initialRegisters, initialPageMap, initialMemory, args, preallocateMemoryPages) {
4249
+ function prepareProgram(kind, hasMetadata, program, initialRegisters, initialPageMap, initialMemory, args, preallocateMemoryPages, useBlockGas) {
4061
4250
  let code = liftBytes(program);
4062
4251
  let metadata = new Uint8Array(0);
4063
4252
  if (hasMetadata === HasMetadata.Yes) {
@@ -4066,7 +4255,7 @@ function prepareProgram(kind, hasMetadata, program, initialRegisters, initialPag
4066
4255
  metadata = data.metadata;
4067
4256
  }
4068
4257
  if (kind === InputKind.Generic) {
4069
- const program2 = deblob(code);
4258
+ const program2 = deblob(code, useBlockGas);
4070
4259
  const builder = new MemoryBuilder(preallocateMemoryPages);
4071
4260
  const memory = buildMemory(builder, initialPageMap, initialMemory);
4072
4261
  const registers = newRegisters();
@@ -4085,22 +4274,21 @@ function prepareProgram(kind, hasMetadata, program, initialRegisters, initialPag
4085
4274
  }
4086
4275
  throw new Error(`Unknown kind: ${kind}`);
4087
4276
  }
4088
- function runProgram(program, initialGas = 0, programCounter = 0, logs = false, useSbrkGas = false, dumpMemory = false) {
4277
+ function runProgram(program, initialGas = 0, programCounter = 0, logs = false, dumpMemory = false) {
4089
4278
  const vmInput = new VmInput(program.program, program.memory, program.registers);
4090
4279
  vmInput.gas = i64(initialGas);
4091
4280
  vmInput.pc = programCounter;
4092
4281
  const vmOptions = new VmRunOptions();
4093
4282
  vmOptions.logs = logs;
4094
- vmOptions.useSbrkGas = useSbrkGas;
4095
4283
  vmOptions.dumpMemory = dumpMemory;
4096
4284
  return vmRunOnce(vmInput, vmOptions);
4097
4285
  }
4098
4286
  var nextPvmId = 0;
4099
4287
  var pvms = /* @__PURE__ */ new Map();
4100
- function pvmStart(program, useSbrkGas = false) {
4288
+ function pvmStart(program) {
4101
4289
  const vmInput = new VmInput(program.program, program.memory, program.registers);
4102
4290
  nextPvmId += 1;
4103
- pvms.set(nextPvmId, vmInit(vmInput, useSbrkGas));
4291
+ pvms.set(nextPvmId, vmInit(vmInput));
4104
4292
  return nextPvmId;
4105
4293
  }
4106
4294
  function pvmDestroy(pvmId) {
@@ -4229,9 +4417,9 @@ function skipBytes(kind, data) {
4229
4417
  case Arguments.TwoReg:
4230
4418
  return 1;
4231
4419
  case Arguments.TwoRegOneImm:
4232
- return 1 + minI32(4, data.length);
4420
+ return 1 + IntMath.minI32(4, data.length);
4233
4421
  case Arguments.TwoRegOneOff:
4234
- return 1 + minI32(4, data.length);
4422
+ return 1 + IntMath.minI32(4, data.length);
4235
4423
  case Arguments.TwoRegTwoImm: {
4236
4424
  const low = lowNibble(data[1]);
4237
4425
  const split = low + 1;
@@ -4271,15 +4459,15 @@ function immBytes(dataLength, required) {
4271
4459
  if (dataLength < required) {
4272
4460
  return 0;
4273
4461
  }
4274
- return minI32(4, dataLength - required);
4462
+ return IntMath.minI32(4, dataLength - required);
4275
4463
  }
4276
4464
  export {
4277
4465
  HasMetadata,
4278
4466
  InputKind,
4279
4467
  disassemble,
4280
4468
  getAssembly,
4469
+ getBlockGasCosts,
4281
4470
  getExitArg,
4282
- getGasCosts,
4283
4471
  getGasLeft,
4284
4472
  getMemory,
4285
4473
  getPageDump,