@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.
- package/dist/bin/index.js +138 -5
- package/dist/bin/src/fuzz.js +2 -2
- package/dist/bin/src/test-json.js +2 -6
- package/dist/bin/src/trace-parse.js +1 -0
- package/dist/bin/src/trace-replay.js +14 -9
- package/dist/bin/src/tracer.js +16 -13
- package/dist/bin/src/utils.js +2 -2
- package/dist/build/compiler-inline.js +1 -1
- package/dist/build/compiler.d.ts +17 -13
- package/dist/build/compiler.js +13 -21
- package/dist/build/compiler.wasm +0 -0
- package/dist/build/debug-inline.js +1 -1
- package/dist/build/debug-raw-inline.js +1 -1
- package/dist/build/debug-raw.d.ts +34 -32
- package/dist/build/debug-raw.js +62 -69
- package/dist/build/debug-raw.wasm +0 -0
- package/dist/build/debug.d.ts +34 -32
- package/dist/build/debug.js +63 -70
- package/dist/build/debug.wasm +0 -0
- package/dist/build/js/assembly/api-debugger.d.ts +4 -4
- package/dist/build/js/assembly/api-debugger.js +6 -6
- package/dist/build/js/assembly/api-internal.d.ts +1 -1
- package/dist/build/js/assembly/api-internal.js +2 -3
- package/dist/build/js/assembly/api-types.d.ts +4 -4
- package/dist/build/js/assembly/api-types.js +3 -4
- package/dist/build/js/assembly/api-utils.d.ts +14 -6
- package/dist/build/js/assembly/api-utils.js +28 -13
- package/dist/build/js/assembly/arguments.d.ts +4 -4
- package/dist/build/js/assembly/arguments.js +10 -10
- package/dist/build/js/assembly/gas.d.ts +8 -13
- package/dist/build/js/assembly/gas.js +17 -7
- package/dist/build/js/assembly/instructions/bit.js +22 -22
- package/dist/build/js/assembly/instructions/branch.js +56 -56
- package/dist/build/js/assembly/instructions/jump.js +10 -10
- package/dist/build/js/assembly/instructions/load.js +41 -41
- package/dist/build/js/assembly/instructions/logic.js +20 -20
- package/dist/build/js/assembly/instructions/math.js +105 -105
- package/dist/build/js/assembly/instructions/misc.js +10 -10
- package/dist/build/js/assembly/instructions/mov.js +16 -16
- package/dist/build/js/assembly/instructions/outcome.d.ts +7 -7
- package/dist/build/js/assembly/instructions/outcome.js +63 -38
- package/dist/build/js/assembly/instructions/rot.js +18 -18
- package/dist/build/js/assembly/instructions/set.js +18 -18
- package/dist/build/js/assembly/instructions/shift.js +59 -59
- package/dist/build/js/assembly/instructions/store.js +29 -29
- package/dist/build/js/assembly/instructions/utils.d.ts +6 -4
- package/dist/build/js/assembly/instructions/utils.js +32 -16
- package/dist/build/js/assembly/instructions.d.ts +2 -3
- package/dist/build/js/assembly/instructions.js +4 -4
- package/dist/build/js/assembly/interpreter.d.ts +0 -1
- package/dist/build/js/assembly/interpreter.js +30 -38
- package/dist/build/js/assembly/math.d.ts +6 -8
- package/dist/build/js/assembly/math.js +21 -13
- package/dist/build/js/assembly/memory-page.d.ts +2 -4
- package/dist/build/js/assembly/memory-page.js +13 -7
- package/dist/build/js/assembly/memory.d.ts +1 -0
- package/dist/build/js/assembly/memory.js +119 -23
- package/dist/build/js/assembly/portable.js +1 -0
- package/dist/build/js/assembly/program-build.js +4 -4
- package/dist/build/js/assembly/program.d.ts +15 -8
- package/dist/build/js/assembly/program.js +95 -39
- package/dist/build/js/assembly/spi.d.ts +1 -1
- package/dist/build/js/assembly/spi.js +2 -2
- package/dist/build/js/portable/bootstrap.js +1 -0
- package/dist/build/js/portable-bundle.js +829 -641
- package/dist/build/release-inline.js +1 -1
- package/dist/build/release-mini-inline.js +1 -1
- package/dist/build/release-mini.d.ts +34 -32
- package/dist/build/release-mini.js +63 -70
- package/dist/build/release-mini.wasm +0 -0
- package/dist/build/release-stub-inline.js +1 -1
- package/dist/build/release-stub.d.ts +34 -32
- package/dist/build/release-stub.js +63 -70
- package/dist/build/release-stub.wasm +0 -0
- package/dist/build/release.d.ts +34 -32
- package/dist/build/release.js +63 -70
- package/dist/build/release.wasm +0 -0
- package/dist/build/test-inline.js +1 -1
- package/dist/build/test.wasm +0 -0
- package/dist/test/test-gas-cost.js +2 -3
- package/dist/test/test-trace-format.js +166 -0
- package/dist/test/test-w3f-common.js +1 -2
- package/package.json +14 -10
- package/dist/build/js/assembly/gas-costs.d.ts +0 -6
- 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
|
|
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 =
|
|
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
|
-
|
|
292
|
+
inline2
|
|
292
293
|
], portable, "installPolyfills", null);
|
|
293
294
|
__decorate([
|
|
294
|
-
|
|
295
|
+
inline2
|
|
295
296
|
// @ts-ignore: parameter type differs between AS and JS
|
|
296
297
|
], portable, "asArray", null);
|
|
297
298
|
__decorate([
|
|
298
|
-
|
|
299
|
+
inline2
|
|
299
300
|
], portable, "arrayAt", null);
|
|
300
301
|
__decorate([
|
|
301
|
-
|
|
302
|
+
inline2
|
|
302
303
|
], portable, "staticArrayAt", null);
|
|
303
304
|
__decorate([
|
|
304
|
-
|
|
305
|
+
inline2
|
|
305
306
|
], portable, "asU32", null);
|
|
306
307
|
__decorate([
|
|
307
|
-
|
|
308
|
+
inline2
|
|
308
309
|
], portable, "uint8ArrayView", null);
|
|
309
310
|
__decorate([
|
|
310
|
-
|
|
311
|
+
inline2
|
|
311
312
|
], portable, "bswap_u16", null);
|
|
312
313
|
__decorate([
|
|
313
|
-
|
|
314
|
+
inline2
|
|
314
315
|
], portable, "bswap_u32", null);
|
|
315
316
|
__decorate([
|
|
316
|
-
|
|
317
|
+
inline2
|
|
317
318
|
], portable, "bswap_u64", null);
|
|
318
319
|
__decorate([
|
|
319
|
-
|
|
320
|
+
inline2
|
|
320
321
|
], portable, "popcnt_u32", null);
|
|
321
322
|
__decorate([
|
|
322
|
-
|
|
323
|
+
inline2
|
|
323
324
|
], portable, "popcnt_u64", null);
|
|
324
325
|
__decorate([
|
|
325
|
-
|
|
326
|
+
inline2
|
|
326
327
|
], portable, "clz_u32", null);
|
|
327
328
|
__decorate([
|
|
328
|
-
|
|
329
|
+
inline2
|
|
329
330
|
], portable, "clz_u64", null);
|
|
330
331
|
__decorate([
|
|
331
|
-
|
|
332
|
+
inline2
|
|
332
333
|
], portable, "ctz_u32", null);
|
|
333
334
|
__decorate([
|
|
334
|
-
|
|
335
|
+
inline2
|
|
335
336
|
], portable, "ctz_u64", null);
|
|
336
337
|
__decorate([
|
|
337
|
-
|
|
338
|
+
inline2
|
|
338
339
|
], portable, "rotr_u32", null);
|
|
339
340
|
__decorate([
|
|
340
|
-
|
|
341
|
+
inline2
|
|
341
342
|
], portable, "rotr_u64", null);
|
|
342
343
|
__decorate([
|
|
343
|
-
|
|
344
|
+
inline2
|
|
344
345
|
], portable, "rotl_u32", null);
|
|
345
346
|
__decorate([
|
|
346
|
-
|
|
347
|
+
inline2
|
|
347
348
|
], portable, "rotl_u64", null);
|
|
348
349
|
__decorate([
|
|
349
|
-
|
|
350
|
+
inline2
|
|
350
351
|
], portable, "u64_add", null);
|
|
351
352
|
__decorate([
|
|
352
|
-
|
|
353
|
+
inline2
|
|
353
354
|
], portable, "u64_sub", null);
|
|
354
355
|
__decorate([
|
|
355
|
-
|
|
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
|
|
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,
|
|
625
|
-
let res = this.split(search).join(
|
|
626
|
-
if (!search.length) res =
|
|
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
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
return
|
|
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.
|
|
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.
|
|
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
|
|
921
|
+
return new GasCounter(gas);
|
|
898
922
|
}
|
|
899
|
-
var
|
|
923
|
+
var GasCounter = class {
|
|
900
924
|
constructor(gas) {
|
|
901
925
|
this.gas = gas;
|
|
902
926
|
}
|
|
903
927
|
set(g2) {
|
|
904
|
-
this.gas =
|
|
928
|
+
this.gas = g2;
|
|
905
929
|
}
|
|
906
930
|
get() {
|
|
907
931
|
return this.gas;
|
|
908
932
|
}
|
|
909
933
|
sub(g2) {
|
|
910
|
-
|
|
911
|
-
if (this.gas
|
|
912
|
-
this.gas =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
1368
|
-
r
|
|
1370
|
+
r.result = result;
|
|
1371
|
+
return r;
|
|
1369
1372
|
}
|
|
1370
|
-
|
|
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
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
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 =
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
1776
|
-
|
|
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
|
|
1809
|
-
|
|
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
|
|
1920
|
-
const
|
|
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,
|
|
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,
|
|
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
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
3438
|
+
EXTENDED_BUF[i - offset] = unchecked(code[i]);
|
|
3224
3439
|
}
|
|
3225
|
-
return DECODERS[kind](args,
|
|
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
|
|
3365
|
-
const
|
|
3366
|
-
const
|
|
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
|
|
3383
|
-
const
|
|
3384
|
-
|
|
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
|
-
|
|
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 =
|
|
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,
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
-
|
|
4045
|
-
|
|
4046
|
-
|
|
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,
|
|
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
|
|
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
|
|
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,
|