@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
|
@@ -20,11 +20,11 @@ export declare class OutcomeData {
|
|
|
20
20
|
dJump: u32;
|
|
21
21
|
result: Result;
|
|
22
22
|
exitCode: u32;
|
|
23
|
+
static status(r: OutcomeData, result: Result): OutcomeData;
|
|
24
|
+
static staticJump(r: OutcomeData, offset: i32): OutcomeData;
|
|
25
|
+
static dJump(r: OutcomeData, address: u32): OutcomeData;
|
|
26
|
+
static ok(r: OutcomeData): OutcomeData;
|
|
27
|
+
static panic(r: OutcomeData): OutcomeData;
|
|
28
|
+
static hostCall(r: OutcomeData, id: u32): OutcomeData;
|
|
29
|
+
static okOrFault(r: OutcomeData, pageFault: MaybePageFault): OutcomeData;
|
|
23
30
|
}
|
|
24
|
-
export declare function status(r: OutcomeData, result: Result): OutcomeData;
|
|
25
|
-
export declare function staticJump(r: OutcomeData, offset: i32): OutcomeData;
|
|
26
|
-
export declare function dJump(r: OutcomeData, address: u32): OutcomeData;
|
|
27
|
-
export declare function ok(r: OutcomeData): OutcomeData;
|
|
28
|
-
export declare function panic(r: OutcomeData): OutcomeData;
|
|
29
|
-
export declare function hostCall(r: OutcomeData, id: u32): OutcomeData;
|
|
30
|
-
export declare function okOrFault(r: OutcomeData, pageFault: MaybePageFault): OutcomeData;
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
1
7
|
export var Result;
|
|
2
8
|
(function (Result) {
|
|
3
9
|
Result[Result["PANIC"] = 0] = "PANIC";
|
|
@@ -12,7 +18,6 @@ export var Outcome;
|
|
|
12
18
|
Outcome[Outcome["DynamicJump"] = 2] = "DynamicJump";
|
|
13
19
|
Outcome[Outcome["Result"] = 3] = "Result";
|
|
14
20
|
})(Outcome || (Outcome = {}));
|
|
15
|
-
// @unmanaged
|
|
16
21
|
export class OutcomeData {
|
|
17
22
|
constructor() {
|
|
18
23
|
this.outcome = Outcome.Ok;
|
|
@@ -21,43 +26,63 @@ export class OutcomeData {
|
|
|
21
26
|
this.result = Result.PANIC;
|
|
22
27
|
this.exitCode = 0;
|
|
23
28
|
}
|
|
24
|
-
|
|
25
|
-
export function status(r, result) {
|
|
26
|
-
r.outcome = Outcome.Result;
|
|
27
|
-
r.result = result;
|
|
28
|
-
return r;
|
|
29
|
-
}
|
|
30
|
-
export function staticJump(r, offset) {
|
|
31
|
-
r.outcome = Outcome.StaticJump;
|
|
32
|
-
r.staticJump = offset;
|
|
33
|
-
return r;
|
|
34
|
-
}
|
|
35
|
-
export function dJump(r, address) {
|
|
36
|
-
r.outcome = Outcome.DynamicJump;
|
|
37
|
-
r.dJump = address;
|
|
38
|
-
return r;
|
|
39
|
-
}
|
|
40
|
-
export function ok(r) {
|
|
41
|
-
r.outcome = Outcome.Ok;
|
|
42
|
-
r.dJump = 0;
|
|
43
|
-
return r;
|
|
44
|
-
}
|
|
45
|
-
export function panic(r) {
|
|
46
|
-
return status(r, Result.PANIC);
|
|
47
|
-
}
|
|
48
|
-
export function hostCall(r, id) {
|
|
49
|
-
r.outcome = Outcome.Result;
|
|
50
|
-
r.result = Result.HOST;
|
|
51
|
-
r.exitCode = id;
|
|
52
|
-
return r;
|
|
53
|
-
}
|
|
54
|
-
export function okOrFault(r, pageFault) {
|
|
55
|
-
if (pageFault.isFault) {
|
|
29
|
+
static status(r, result) {
|
|
56
30
|
r.outcome = Outcome.Result;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
31
|
+
r.result = result;
|
|
32
|
+
return r;
|
|
33
|
+
}
|
|
34
|
+
static staticJump(r, offset) {
|
|
35
|
+
r.outcome = Outcome.StaticJump;
|
|
36
|
+
r.staticJump = offset;
|
|
37
|
+
return r;
|
|
38
|
+
}
|
|
39
|
+
static dJump(r, address) {
|
|
40
|
+
r.outcome = Outcome.DynamicJump;
|
|
41
|
+
r.dJump = address;
|
|
42
|
+
return r;
|
|
43
|
+
}
|
|
44
|
+
static ok(r) {
|
|
45
|
+
// outcome is already pre-set to Ok by the interpreter loop
|
|
46
|
+
return r;
|
|
47
|
+
}
|
|
48
|
+
static panic(r) {
|
|
49
|
+
return OutcomeData.status(r, Result.PANIC);
|
|
50
|
+
}
|
|
51
|
+
static hostCall(r, id) {
|
|
52
|
+
r.outcome = Outcome.Result;
|
|
53
|
+
r.result = Result.HOST;
|
|
54
|
+
r.exitCode = id;
|
|
55
|
+
return r;
|
|
56
|
+
}
|
|
57
|
+
static okOrFault(r, pageFault) {
|
|
58
|
+
if (pageFault.isFault) {
|
|
59
|
+
r.outcome = Outcome.Result;
|
|
60
|
+
// not accessible memory does not result in `FAULT`, but rather goes straight to TRAP
|
|
61
|
+
// yet in gas calculations we still subtract 1, unlike TRAP, but like FAULT.
|
|
62
|
+
r.result = pageFault.isAccess ? Result.FAULT_ACCESS : Result.FAULT;
|
|
63
|
+
r.exitCode = pageFault.fault;
|
|
64
|
+
}
|
|
65
|
+
return r;
|
|
61
66
|
}
|
|
62
|
-
return r;
|
|
63
67
|
}
|
|
68
|
+
__decorate([
|
|
69
|
+
inline
|
|
70
|
+
], OutcomeData, "status", null);
|
|
71
|
+
__decorate([
|
|
72
|
+
inline
|
|
73
|
+
], OutcomeData, "staticJump", null);
|
|
74
|
+
__decorate([
|
|
75
|
+
inline
|
|
76
|
+
], OutcomeData, "dJump", null);
|
|
77
|
+
__decorate([
|
|
78
|
+
inline
|
|
79
|
+
], OutcomeData, "ok", null);
|
|
80
|
+
__decorate([
|
|
81
|
+
inline
|
|
82
|
+
], OutcomeData, "panic", null);
|
|
83
|
+
__decorate([
|
|
84
|
+
inline
|
|
85
|
+
], OutcomeData, "hostCall", null);
|
|
86
|
+
__decorate([
|
|
87
|
+
inline
|
|
88
|
+
], OutcomeData, "okOrFault", null);
|
|
@@ -1,45 +1,45 @@
|
|
|
1
1
|
import { portable } from "../portable";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { OutcomeData } from "./outcome";
|
|
3
|
+
import { Inst } from "./utils";
|
|
4
4
|
// ROT_R_64_IMM
|
|
5
5
|
export const rot_r_64_imm = (r, args, regs) => {
|
|
6
|
-
regs[reg(args.b)] = math.rot_r(regs[reg(args.a)], u32SignExtend(args.c));
|
|
7
|
-
return ok(r);
|
|
6
|
+
regs[Inst.reg(args.b)] = math.rot_r(regs[Inst.reg(args.a)], Inst.u32SignExtend(args.c));
|
|
7
|
+
return OutcomeData.ok(r);
|
|
8
8
|
};
|
|
9
9
|
// ROT_R_64_IMM_ALT
|
|
10
10
|
export const rot_r_64_imm_alt = (r, args, regs) => {
|
|
11
|
-
regs[reg(args.b)] = math.rot_r(u32SignExtend(args.c), regs[reg(args.a)]);
|
|
12
|
-
return ok(r);
|
|
11
|
+
regs[Inst.reg(args.b)] = math.rot_r(Inst.u32SignExtend(args.c), regs[Inst.reg(args.a)]);
|
|
12
|
+
return OutcomeData.ok(r);
|
|
13
13
|
};
|
|
14
14
|
// ROT_R_32_IMM
|
|
15
15
|
export const rot_r_32_imm = (r, args, regs) => {
|
|
16
|
-
regs[reg(args.b)] = u32SignExtend(math.rot_r_32(u32(regs[reg(args.a)]), u32(args.c)));
|
|
17
|
-
return ok(r);
|
|
16
|
+
regs[Inst.reg(args.b)] = Inst.u32SignExtend(math.rot_r_32(u32(regs[Inst.reg(args.a)]), u32(args.c)));
|
|
17
|
+
return OutcomeData.ok(r);
|
|
18
18
|
};
|
|
19
19
|
// ROT_R_32_IMM_ALT
|
|
20
20
|
export const rot_r_32_imm_alt = (r, args, regs) => {
|
|
21
|
-
regs[reg(args.b)] = u32SignExtend(math.rot_r_32(u32(args.c), u32(regs[reg(args.a)])));
|
|
22
|
-
return ok(r);
|
|
21
|
+
regs[Inst.reg(args.b)] = Inst.u32SignExtend(math.rot_r_32(u32(args.c), u32(regs[Inst.reg(args.a)])));
|
|
22
|
+
return OutcomeData.ok(r);
|
|
23
23
|
};
|
|
24
24
|
// ROT_L_64
|
|
25
25
|
export const rot_l_64 = (r, args, regs) => {
|
|
26
|
-
regs[reg(args.c)] = math.rot_l(regs[reg(args.b)], regs[reg(args.a)]);
|
|
27
|
-
return ok(r);
|
|
26
|
+
regs[Inst.reg(args.c)] = math.rot_l(regs[Inst.reg(args.b)], regs[Inst.reg(args.a)]);
|
|
27
|
+
return OutcomeData.ok(r);
|
|
28
28
|
};
|
|
29
29
|
// ROT_L_32
|
|
30
30
|
export const rot_l_32 = (r, args, regs) => {
|
|
31
|
-
regs[reg(args.c)] = u32SignExtend(math.rot_l_32(u32(regs[reg(args.b)]), u32(regs[reg(args.a)])));
|
|
32
|
-
return ok(r);
|
|
31
|
+
regs[Inst.reg(args.c)] = Inst.u32SignExtend(math.rot_l_32(u32(regs[Inst.reg(args.b)]), u32(regs[Inst.reg(args.a)])));
|
|
32
|
+
return OutcomeData.ok(r);
|
|
33
33
|
};
|
|
34
34
|
// ROT_R_64
|
|
35
35
|
export const rot_r_64 = (r, args, regs) => {
|
|
36
|
-
regs[reg(args.c)] = math.rot_r(regs[reg(args.b)], regs[reg(args.a)]);
|
|
37
|
-
return ok(r);
|
|
36
|
+
regs[Inst.reg(args.c)] = math.rot_r(regs[Inst.reg(args.b)], regs[Inst.reg(args.a)]);
|
|
37
|
+
return OutcomeData.ok(r);
|
|
38
38
|
};
|
|
39
39
|
// ROT_R_32
|
|
40
40
|
export const rot_r_32 = (r, args, regs) => {
|
|
41
|
-
regs[reg(args.c)] = u32SignExtend(math.rot_r_32(u32(regs[reg(args.b)]), u32(regs[reg(args.a)])));
|
|
42
|
-
return ok(r);
|
|
41
|
+
regs[Inst.reg(args.c)] = Inst.u32SignExtend(math.rot_r_32(u32(regs[Inst.reg(args.b)]), u32(regs[Inst.reg(args.a)])));
|
|
42
|
+
return OutcomeData.ok(r);
|
|
43
43
|
};
|
|
44
44
|
export var math;
|
|
45
45
|
(function (math) {
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { OutcomeData } from "./outcome";
|
|
2
|
+
import { Inst } from "./utils";
|
|
3
3
|
// SET_LT_U_IMM
|
|
4
4
|
export const set_lt_u_imm = (r, args, registers) => {
|
|
5
|
-
const cond = registers[reg(args.a)] < u64(u32SignExtend(args.c));
|
|
6
|
-
registers[reg(args.b)] = cond ? u64(1) : u64(0);
|
|
7
|
-
return ok(r);
|
|
5
|
+
const cond = registers[Inst.reg(args.a)] < u64(Inst.u32SignExtend(args.c));
|
|
6
|
+
registers[Inst.reg(args.b)] = cond ? u64(1) : u64(0);
|
|
7
|
+
return OutcomeData.ok(r);
|
|
8
8
|
};
|
|
9
9
|
// SET_LT_S_IMM
|
|
10
10
|
export const set_lt_s_imm = (r, args, registers) => {
|
|
11
|
-
const cond = i64(registers[reg(args.a)]) < i64(u32SignExtend(args.c));
|
|
12
|
-
registers[reg(args.b)] = cond ? u64(1) : u64(0);
|
|
13
|
-
return ok(r);
|
|
11
|
+
const cond = i64(registers[Inst.reg(args.a)]) < i64(Inst.u32SignExtend(args.c));
|
|
12
|
+
registers[Inst.reg(args.b)] = cond ? u64(1) : u64(0);
|
|
13
|
+
return OutcomeData.ok(r);
|
|
14
14
|
};
|
|
15
15
|
// SET_GT_U_IMM
|
|
16
16
|
export const set_gt_u_imm = (r, args, registers) => {
|
|
17
|
-
const cond = registers[reg(args.a)] > u64(u32SignExtend(args.c));
|
|
18
|
-
registers[reg(args.b)] = cond ? u64(1) : u64(0);
|
|
19
|
-
return ok(r);
|
|
17
|
+
const cond = registers[Inst.reg(args.a)] > u64(Inst.u32SignExtend(args.c));
|
|
18
|
+
registers[Inst.reg(args.b)] = cond ? u64(1) : u64(0);
|
|
19
|
+
return OutcomeData.ok(r);
|
|
20
20
|
};
|
|
21
21
|
// SET_GT_S_IMM
|
|
22
22
|
export const set_gt_s_imm = (r, args, registers) => {
|
|
23
|
-
const cond = i64(registers[reg(args.a)]) > i64(u32SignExtend(args.c));
|
|
24
|
-
registers[reg(args.b)] = cond ? u64(1) : u64(0);
|
|
25
|
-
return ok(r);
|
|
23
|
+
const cond = i64(registers[Inst.reg(args.a)]) > i64(Inst.u32SignExtend(args.c));
|
|
24
|
+
registers[Inst.reg(args.b)] = cond ? u64(1) : u64(0);
|
|
25
|
+
return OutcomeData.ok(r);
|
|
26
26
|
};
|
|
27
27
|
// SET_LT_U
|
|
28
28
|
export const set_lt_u = (r, args, registers) => {
|
|
29
|
-
registers[reg(args.c)] = registers[reg(args.b)] < registers[reg(args.a)] ? u64(1) : u64(0);
|
|
30
|
-
return ok(r);
|
|
29
|
+
registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] < registers[Inst.reg(args.a)] ? u64(1) : u64(0);
|
|
30
|
+
return OutcomeData.ok(r);
|
|
31
31
|
};
|
|
32
32
|
// SET_LT_S
|
|
33
33
|
export const set_lt_s = (r, args, registers) => {
|
|
34
|
-
registers[reg(args.c)] = i64(registers[reg(args.b)]) < i64(registers[reg(args.a)]) ? u64(1) : u64(0);
|
|
35
|
-
return ok(r);
|
|
34
|
+
registers[Inst.reg(args.c)] = i64(registers[Inst.reg(args.b)]) < i64(registers[Inst.reg(args.a)]) ? u64(1) : u64(0);
|
|
35
|
+
return OutcomeData.ok(r);
|
|
36
36
|
};
|
|
@@ -1,121 +1,121 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { OutcomeData } from "./outcome";
|
|
2
|
+
import { Inst } from "./utils";
|
|
3
3
|
const MAX_SHIFT_64 = 64;
|
|
4
4
|
const MAX_SHIFT_32 = 32;
|
|
5
5
|
// SHLO_L_IMM_32
|
|
6
6
|
export const shlo_l_imm_32 = (r, args, registers) => {
|
|
7
7
|
const shift = u32(args.c % MAX_SHIFT_32);
|
|
8
|
-
const value = u32(registers[reg(args.a)]);
|
|
9
|
-
registers[reg(args.b)] = u32SignExtend(value << shift);
|
|
10
|
-
return ok(r);
|
|
8
|
+
const value = u32(registers[Inst.reg(args.a)]);
|
|
9
|
+
registers[Inst.reg(args.b)] = Inst.u32SignExtend(value << shift);
|
|
10
|
+
return OutcomeData.ok(r);
|
|
11
11
|
};
|
|
12
12
|
// SHLO_R_IMM_32
|
|
13
13
|
export const shlo_r_imm_32 = (r, args, registers) => {
|
|
14
14
|
const shift = u32(args.c % MAX_SHIFT_32);
|
|
15
|
-
const value = u32(registers[reg(args.a)]);
|
|
16
|
-
registers[reg(args.b)] = u32SignExtend(value >>> shift);
|
|
17
|
-
return ok(r);
|
|
15
|
+
const value = u32(registers[Inst.reg(args.a)]);
|
|
16
|
+
registers[Inst.reg(args.b)] = Inst.u32SignExtend(value >>> shift);
|
|
17
|
+
return OutcomeData.ok(r);
|
|
18
18
|
};
|
|
19
19
|
// SHAR_R_IMM_32
|
|
20
20
|
export const shar_r_imm_32 = (r, args, registers) => {
|
|
21
21
|
const shift = u32(args.c % MAX_SHIFT_32);
|
|
22
|
-
const value = u32SignExtend(u32(registers[reg(args.a)]));
|
|
23
|
-
registers[reg(args.b)] = u64(i64(value) >> i64(shift));
|
|
24
|
-
return ok(r);
|
|
22
|
+
const value = Inst.u32SignExtend(u32(registers[Inst.reg(args.a)]));
|
|
23
|
+
registers[Inst.reg(args.b)] = u64(i64(value) >> i64(shift));
|
|
24
|
+
return OutcomeData.ok(r);
|
|
25
25
|
};
|
|
26
26
|
// SHLO_L_IMM_ALT_32
|
|
27
27
|
export const shlo_l_imm_alt_32 = (r, args, registers) => {
|
|
28
|
-
const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_32));
|
|
29
|
-
registers[reg(args.b)] = u32SignExtend(args.c << shift);
|
|
30
|
-
return ok(r);
|
|
28
|
+
const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_32));
|
|
29
|
+
registers[Inst.reg(args.b)] = Inst.u32SignExtend(args.c << shift);
|
|
30
|
+
return OutcomeData.ok(r);
|
|
31
31
|
};
|
|
32
32
|
// SHLO_R_IMM_ALT_32
|
|
33
33
|
export const shlo_r_imm_alt_32 = (r, args, registers) => {
|
|
34
|
-
const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_32));
|
|
35
|
-
registers[reg(args.b)] = u32SignExtend(args.c >>> shift);
|
|
36
|
-
return ok(r);
|
|
34
|
+
const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_32));
|
|
35
|
+
registers[Inst.reg(args.b)] = Inst.u32SignExtend(args.c >>> shift);
|
|
36
|
+
return OutcomeData.ok(r);
|
|
37
37
|
};
|
|
38
38
|
// SHAR_R_IMM_ALT_32
|
|
39
39
|
export const shar_r_imm_alt_32 = (r, args, registers) => {
|
|
40
|
-
const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_32));
|
|
41
|
-
const imm = u32SignExtend(args.c);
|
|
42
|
-
registers[reg(args.b)] = u32SignExtend(u32(i64(imm) >> i64(shift)));
|
|
43
|
-
return ok(r);
|
|
40
|
+
const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_32));
|
|
41
|
+
const imm = Inst.u32SignExtend(args.c);
|
|
42
|
+
registers[Inst.reg(args.b)] = Inst.u32SignExtend(u32(i64(imm) >> i64(shift)));
|
|
43
|
+
return OutcomeData.ok(r);
|
|
44
44
|
};
|
|
45
45
|
// SHLO_L_IMM
|
|
46
46
|
export const shlo_l_imm = (r, args, registers) => {
|
|
47
47
|
const shift = u32(args.c % MAX_SHIFT_64);
|
|
48
|
-
registers[reg(args.b)] = u64(registers[reg(args.a)] << u64(shift));
|
|
49
|
-
return ok(r);
|
|
48
|
+
registers[Inst.reg(args.b)] = u64(registers[Inst.reg(args.a)] << u64(shift));
|
|
49
|
+
return OutcomeData.ok(r);
|
|
50
50
|
};
|
|
51
51
|
// SHLO_R_IMM
|
|
52
52
|
export const shlo_r_imm = (r, args, registers) => {
|
|
53
53
|
const shift = u32(args.c % MAX_SHIFT_64);
|
|
54
|
-
registers[reg(args.b)] = registers[reg(args.a)] >> u64(shift);
|
|
55
|
-
return ok(r);
|
|
54
|
+
registers[Inst.reg(args.b)] = registers[Inst.reg(args.a)] >> u64(shift);
|
|
55
|
+
return OutcomeData.ok(r);
|
|
56
56
|
};
|
|
57
57
|
// SHAR_R_IMM
|
|
58
58
|
export const shar_r_imm = (r, args, registers) => {
|
|
59
59
|
const shift = u32(args.c % MAX_SHIFT_64);
|
|
60
|
-
const value = i64(registers[reg(args.a)]);
|
|
61
|
-
registers[reg(args.b)] = u64(value >> i64(shift));
|
|
62
|
-
return ok(r);
|
|
60
|
+
const value = i64(registers[Inst.reg(args.a)]);
|
|
61
|
+
registers[Inst.reg(args.b)] = u64(value >> i64(shift));
|
|
62
|
+
return OutcomeData.ok(r);
|
|
63
63
|
};
|
|
64
64
|
// SHLO_L_IMM_ALT
|
|
65
65
|
export const shlo_l_imm_alt = (r, args, registers) => {
|
|
66
|
-
const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_64));
|
|
67
|
-
registers[reg(args.b)] = u64(u32SignExtend(args.c) << i64(shift));
|
|
68
|
-
return ok(r);
|
|
66
|
+
const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_64));
|
|
67
|
+
registers[Inst.reg(args.b)] = u64(Inst.u32SignExtend(args.c) << i64(shift));
|
|
68
|
+
return OutcomeData.ok(r);
|
|
69
69
|
};
|
|
70
70
|
// SHLO_R_IMM_ALT
|
|
71
71
|
export const shlo_r_imm_alt = (r, args, registers) => {
|
|
72
|
-
const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_64));
|
|
73
|
-
registers[reg(args.b)] = u64(u32SignExtend(args.c)) >> u64(shift);
|
|
74
|
-
return ok(r);
|
|
72
|
+
const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_64));
|
|
73
|
+
registers[Inst.reg(args.b)] = u64(Inst.u32SignExtend(args.c)) >> u64(shift);
|
|
74
|
+
return OutcomeData.ok(r);
|
|
75
75
|
};
|
|
76
76
|
// SHAR_R_IMM_ALT
|
|
77
77
|
export const shar_r_imm_alt = (r, args, registers) => {
|
|
78
|
-
const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_64));
|
|
79
|
-
const value = u32SignExtend(args.c);
|
|
80
|
-
registers[reg(args.b)] = u32SignExtend(u32(value >> i64(shift)));
|
|
81
|
-
return ok(r);
|
|
78
|
+
const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_64));
|
|
79
|
+
const value = Inst.u32SignExtend(args.c);
|
|
80
|
+
registers[Inst.reg(args.b)] = Inst.u32SignExtend(u32(value >> i64(shift)));
|
|
81
|
+
return OutcomeData.ok(r);
|
|
82
82
|
};
|
|
83
83
|
// SHLO_L_32
|
|
84
84
|
export const shlo_l_32 = (r, args, registers) => {
|
|
85
|
-
const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_32));
|
|
86
|
-
const value = u32(registers[reg(args.b)]);
|
|
87
|
-
registers[reg(args.c)] = u32SignExtend(value << shift);
|
|
88
|
-
return ok(r);
|
|
85
|
+
const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_32));
|
|
86
|
+
const value = u32(registers[Inst.reg(args.b)]);
|
|
87
|
+
registers[Inst.reg(args.c)] = Inst.u32SignExtend(value << shift);
|
|
88
|
+
return OutcomeData.ok(r);
|
|
89
89
|
};
|
|
90
90
|
// SHLO_R_32
|
|
91
91
|
export const shlo_r_32 = (r, args, registers) => {
|
|
92
|
-
const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_32));
|
|
93
|
-
const value = u32(registers[reg(args.b)]);
|
|
94
|
-
registers[reg(args.c)] = u32SignExtend(value >>> shift);
|
|
95
|
-
return ok(r);
|
|
92
|
+
const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_32));
|
|
93
|
+
const value = u32(registers[Inst.reg(args.b)]);
|
|
94
|
+
registers[Inst.reg(args.c)] = Inst.u32SignExtend(value >>> shift);
|
|
95
|
+
return OutcomeData.ok(r);
|
|
96
96
|
};
|
|
97
97
|
// SHAR_R_32
|
|
98
98
|
export const shar_r_32 = (r, args, registers) => {
|
|
99
|
-
const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_32));
|
|
100
|
-
const regValue = u32SignExtend(u32(registers[reg(args.b)]));
|
|
101
|
-
registers[reg(args.c)] = u32SignExtend(u32(i64(regValue) >> i64(shift)));
|
|
102
|
-
return ok(r);
|
|
99
|
+
const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_32));
|
|
100
|
+
const regValue = Inst.u32SignExtend(u32(registers[Inst.reg(args.b)]));
|
|
101
|
+
registers[Inst.reg(args.c)] = Inst.u32SignExtend(u32(i64(regValue) >> i64(shift)));
|
|
102
|
+
return OutcomeData.ok(r);
|
|
103
103
|
};
|
|
104
104
|
// SHLO_L
|
|
105
105
|
export const shlo_l = (r, args, registers) => {
|
|
106
|
-
const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_64));
|
|
107
|
-
registers[reg(args.c)] = u64(registers[reg(args.b)] << u64(shift));
|
|
108
|
-
return ok(r);
|
|
106
|
+
const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_64));
|
|
107
|
+
registers[Inst.reg(args.c)] = u64(registers[Inst.reg(args.b)] << u64(shift));
|
|
108
|
+
return OutcomeData.ok(r);
|
|
109
109
|
};
|
|
110
110
|
// SHLO_R
|
|
111
111
|
export const shlo_r = (r, args, registers) => {
|
|
112
|
-
const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_64));
|
|
113
|
-
registers[reg(args.c)] = registers[reg(args.b)] >> u64(shift);
|
|
114
|
-
return ok(r);
|
|
112
|
+
const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_64));
|
|
113
|
+
registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] >> u64(shift);
|
|
114
|
+
return OutcomeData.ok(r);
|
|
115
115
|
};
|
|
116
116
|
// SHAR_R
|
|
117
117
|
export const shar_r = (r, args, registers) => {
|
|
118
|
-
const shift = u32(registers[reg(args.a)] % u64(MAX_SHIFT_64));
|
|
119
|
-
registers[reg(args.c)] = u64(i64(registers[reg(args.b)]) >> i64(shift));
|
|
120
|
-
return ok(r);
|
|
118
|
+
const shift = u32(registers[Inst.reg(args.a)] % u64(MAX_SHIFT_64));
|
|
119
|
+
registers[Inst.reg(args.c)] = u64(i64(registers[Inst.reg(args.b)]) >> i64(shift));
|
|
120
|
+
return OutcomeData.ok(r);
|
|
121
121
|
};
|
|
@@ -1,101 +1,101 @@
|
|
|
1
1
|
import { MaybePageFault } from "../memory";
|
|
2
2
|
import { portable } from "../portable";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { OutcomeData } from "./outcome";
|
|
4
|
+
import { Inst } from "./utils";
|
|
5
5
|
const faultRes = new MaybePageFault();
|
|
6
6
|
// Helper function to compute effective address from base register and signed 32-bit offset
|
|
7
7
|
function effectiveAddress(registers, baseReg, offset) {
|
|
8
|
-
return u32(portable.u64_add(registers[reg(u64(baseReg))], u32SignExtend(offset)));
|
|
8
|
+
return u32(portable.u64_add(registers[Inst.reg(u64(baseReg))], Inst.u32SignExtend(offset)));
|
|
9
9
|
}
|
|
10
10
|
// STORE_IMM_U8
|
|
11
11
|
export const store_imm_u8 = (r, args, _registers, memory) => {
|
|
12
12
|
const address = args.a;
|
|
13
13
|
memory.setU8(faultRes, address, (args.b & 0xff));
|
|
14
|
-
return okOrFault(r, faultRes);
|
|
14
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
15
15
|
};
|
|
16
16
|
// STORE_IMM_U16
|
|
17
17
|
export const store_imm_u16 = (r, args, _registers, memory) => {
|
|
18
18
|
const address = args.a;
|
|
19
19
|
memory.setU16(faultRes, address, (args.b & 65535));
|
|
20
|
-
return okOrFault(r, faultRes);
|
|
20
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
21
21
|
};
|
|
22
22
|
// STORE_IMM_U32
|
|
23
23
|
export const store_imm_u32 = (r, args, _registers, memory) => {
|
|
24
24
|
const address = args.a;
|
|
25
25
|
memory.setU32(faultRes, address, args.b);
|
|
26
|
-
return okOrFault(r, faultRes);
|
|
26
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
27
27
|
};
|
|
28
28
|
// STORE_IMM_U64
|
|
29
29
|
export const store_imm_u64 = (r, args, _registers, memory) => {
|
|
30
30
|
const address = args.a;
|
|
31
|
-
memory.setU64(faultRes, address, u32SignExtend(args.b));
|
|
32
|
-
return okOrFault(r, faultRes);
|
|
31
|
+
memory.setU64(faultRes, address, Inst.u32SignExtend(args.b));
|
|
32
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
33
33
|
};
|
|
34
34
|
// STORE_U8
|
|
35
35
|
export const store_u8 = (r, args, registers, memory) => {
|
|
36
|
-
memory.setU8(faultRes, args.b, (registers[reg(args.a)] & u64(0xff)));
|
|
37
|
-
return okOrFault(r, faultRes);
|
|
36
|
+
memory.setU8(faultRes, args.b, (registers[Inst.reg(args.a)] & u64(0xff)));
|
|
37
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
38
38
|
};
|
|
39
39
|
// STORE_U16
|
|
40
40
|
export const store_u16 = (r, args, registers, memory) => {
|
|
41
|
-
memory.setU16(faultRes, args.b, (registers[reg(args.a)] & u64(65535)));
|
|
42
|
-
return okOrFault(r, faultRes);
|
|
41
|
+
memory.setU16(faultRes, args.b, (registers[Inst.reg(args.a)] & u64(65535)));
|
|
42
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
43
43
|
};
|
|
44
44
|
// STORE_U32
|
|
45
45
|
export const store_u32 = (r, args, registers, memory) => {
|
|
46
|
-
memory.setU32(faultRes, args.b, u32(registers[reg(args.a)]));
|
|
47
|
-
return okOrFault(r, faultRes);
|
|
46
|
+
memory.setU32(faultRes, args.b, u32(registers[Inst.reg(args.a)]));
|
|
47
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
48
48
|
};
|
|
49
49
|
// STORE_U64
|
|
50
50
|
export const store_u64 = (r, args, registers, memory) => {
|
|
51
|
-
memory.setU64(faultRes, args.b, registers[reg(args.a)]);
|
|
52
|
-
return okOrFault(r, faultRes);
|
|
51
|
+
memory.setU64(faultRes, args.b, registers[Inst.reg(args.a)]);
|
|
52
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
53
53
|
};
|
|
54
54
|
// STORE_IMM_IND_U8
|
|
55
55
|
export const store_imm_ind_u8 = (r, args, registers, memory) => {
|
|
56
56
|
const address = effectiveAddress(registers, args.a, args.b);
|
|
57
57
|
memory.setU8(faultRes, address, (args.c & 0xff));
|
|
58
|
-
return okOrFault(r, faultRes);
|
|
58
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
59
59
|
};
|
|
60
60
|
// STORE_IMM_IND_U16
|
|
61
61
|
export const store_imm_ind_u16 = (r, args, registers, memory) => {
|
|
62
62
|
const address = effectiveAddress(registers, args.a, args.b);
|
|
63
63
|
memory.setU16(faultRes, address, (args.c & 65535));
|
|
64
|
-
return okOrFault(r, faultRes);
|
|
64
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
65
65
|
};
|
|
66
66
|
// STORE_IMM_IND_U32
|
|
67
67
|
export const store_imm_ind_u32 = (r, args, registers, memory) => {
|
|
68
68
|
const address = effectiveAddress(registers, args.a, args.b);
|
|
69
69
|
memory.setU32(faultRes, address, args.c);
|
|
70
|
-
return okOrFault(r, faultRes);
|
|
70
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
71
71
|
};
|
|
72
72
|
// STORE_IMM_IND_U64
|
|
73
73
|
export const store_imm_ind_u64 = (r, args, registers, memory) => {
|
|
74
74
|
const address = effectiveAddress(registers, args.a, args.b);
|
|
75
|
-
memory.setU64(faultRes, address, u32SignExtend(args.c));
|
|
76
|
-
return okOrFault(r, faultRes);
|
|
75
|
+
memory.setU64(faultRes, address, Inst.u32SignExtend(args.c));
|
|
76
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
77
77
|
};
|
|
78
78
|
// STORE_IND_U8
|
|
79
79
|
export const store_ind_u8 = (r, args, registers, memory) => {
|
|
80
80
|
const address = effectiveAddress(registers, args.a, args.c);
|
|
81
|
-
memory.setU8(faultRes, address, (registers[reg(args.b)] & u64(0xff)));
|
|
82
|
-
return okOrFault(r, faultRes);
|
|
81
|
+
memory.setU8(faultRes, address, (registers[Inst.reg(args.b)] & u64(0xff)));
|
|
82
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
83
83
|
};
|
|
84
84
|
// STORE_IND_U16
|
|
85
85
|
export const store_ind_u16 = (r, args, registers, memory) => {
|
|
86
86
|
const address = effectiveAddress(registers, args.a, args.c);
|
|
87
|
-
memory.setU16(faultRes, address, (registers[reg(args.b)] & u64(65535)));
|
|
88
|
-
return okOrFault(r, faultRes);
|
|
87
|
+
memory.setU16(faultRes, address, (registers[Inst.reg(args.b)] & u64(65535)));
|
|
88
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
89
89
|
};
|
|
90
90
|
// STORE_IND_U32
|
|
91
91
|
export const store_ind_u32 = (r, args, registers, memory) => {
|
|
92
92
|
const address = effectiveAddress(registers, args.a, args.c);
|
|
93
|
-
memory.setU32(faultRes, address, u32(registers[reg(args.b)]));
|
|
94
|
-
return okOrFault(r, faultRes);
|
|
93
|
+
memory.setU32(faultRes, address, u32(registers[Inst.reg(args.b)]));
|
|
94
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
95
95
|
};
|
|
96
96
|
// STORE_IND_U64
|
|
97
97
|
export const store_ind_u64 = (r, args, registers, memory) => {
|
|
98
98
|
const address = effectiveAddress(registers, args.a, args.c);
|
|
99
|
-
memory.setU64(faultRes, address, registers[reg(args.b)]);
|
|
100
|
-
return okOrFault(r, faultRes);
|
|
99
|
+
memory.setU64(faultRes, address, registers[Inst.reg(args.b)]);
|
|
100
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
101
101
|
};
|
|
@@ -17,7 +17,9 @@ export declare function mulUpperUnsigned(a: u64, b: u64): u64;
|
|
|
17
17
|
*/
|
|
18
18
|
export declare function mulUpperSigned(a: i64, b: i64): u64;
|
|
19
19
|
export declare function mulUpperSignedUnsigned(a: i64, b: u64): u64;
|
|
20
|
-
export declare
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
export declare class Inst {
|
|
21
|
+
static u8SignExtend(v: u8): i64;
|
|
22
|
+
static u16SignExtend(v: u16): i64;
|
|
23
|
+
static u32SignExtend(v: u32): i64;
|
|
24
|
+
static reg(v: u64): u32;
|
|
25
|
+
}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
1
7
|
import { portable } from "../portable";
|
|
2
8
|
import { NO_OF_REGISTERS } from "../registers";
|
|
3
9
|
/**
|
|
@@ -56,20 +62,30 @@ export function mulUpperSignedUnsigned(a, b) {
|
|
|
56
62
|
}
|
|
57
63
|
return mulUpperUnsigned(a, b);
|
|
58
64
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
export function reg(v) {
|
|
74
|
-
return v >= u64(NO_OF_REGISTERS) ? NO_OF_REGISTERS - 1 : u32(v);
|
|
65
|
+
export class Inst {
|
|
66
|
+
static u8SignExtend(v) {
|
|
67
|
+
// u64 wrap ensures unsigned representation in JS BigInt (no-op in AS)
|
|
68
|
+
return u64(i64(i32(i16(i8(v)))));
|
|
69
|
+
}
|
|
70
|
+
static u16SignExtend(v) {
|
|
71
|
+
return u64(i64(i32(i16(v))));
|
|
72
|
+
}
|
|
73
|
+
static u32SignExtend(v) {
|
|
74
|
+
return u64(i64(i32(v)));
|
|
75
|
+
}
|
|
76
|
+
static reg(v) {
|
|
77
|
+
return v >= u64(NO_OF_REGISTERS) ? NO_OF_REGISTERS - 1 : u32(v);
|
|
78
|
+
}
|
|
75
79
|
}
|
|
80
|
+
__decorate([
|
|
81
|
+
inline
|
|
82
|
+
], Inst, "u8SignExtend", null);
|
|
83
|
+
__decorate([
|
|
84
|
+
inline
|
|
85
|
+
], Inst, "u16SignExtend", null);
|
|
86
|
+
__decorate([
|
|
87
|
+
inline
|
|
88
|
+
], Inst, "u32SignExtend", null);
|
|
89
|
+
__decorate([
|
|
90
|
+
inline
|
|
91
|
+
], Inst, "reg", null);
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { Arguments } from "./arguments";
|
|
2
|
-
import { Gas } from "./gas";
|
|
3
2
|
export declare class Instruction {
|
|
4
3
|
name: string;
|
|
5
4
|
kind: Arguments;
|
|
6
|
-
gas:
|
|
5
|
+
gas: u32;
|
|
7
6
|
isTerminating: boolean;
|
|
8
7
|
}
|
|
9
8
|
export declare const MISSING_INSTRUCTION: Instruction;
|
|
10
9
|
export declare const SBRK: Instruction;
|
|
11
|
-
export declare const INSTRUCTIONS: Instruction
|
|
10
|
+
export declare const INSTRUCTIONS: StaticArray<Instruction>;
|