@fluffylabs/anan-as 1.2.0 → 1.3.0-5cbd3aa
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 +50 -112
- package/dist/build/debug-raw.js +78 -139
- package/dist/build/debug-raw.wasm +0 -0
- package/dist/build/debug.d.ts +50 -112
- package/dist/build/debug.js +81 -147
- package/dist/build/debug.wasm +0 -0
- package/dist/build/js/assembly/api-debugger.d.ts +55 -0
- package/dist/build/js/assembly/api-debugger.js +245 -0
- package/dist/build/js/assembly/api-internal.d.ts +13 -0
- package/dist/build/js/assembly/api-internal.js +191 -0
- package/dist/build/js/assembly/api-types.d.ts +45 -0
- package/dist/build/js/assembly/api-types.js +52 -0
- package/dist/build/js/assembly/api-utils.d.ts +79 -0
- package/dist/build/js/assembly/api-utils.js +221 -0
- package/dist/build/js/assembly/arguments.d.ts +44 -0
- package/dist/build/js/assembly/arguments.js +164 -0
- package/dist/build/js/assembly/codec.d.ts +24 -0
- package/dist/build/js/assembly/codec.js +139 -0
- package/dist/build/js/assembly/gas.d.ts +11 -0
- package/dist/build/js/assembly/gas.js +33 -0
- package/dist/build/js/assembly/index-shared.d.ts +4 -0
- package/dist/build/js/assembly/index-shared.js +4 -0
- package/dist/build/js/assembly/instructions/bit.d.ts +11 -0
- package/dist/build/js/assembly/instructions/bit.js +53 -0
- package/dist/build/js/assembly/instructions/branch.d.ts +17 -0
- package/dist/build/js/assembly/instructions/branch.js +120 -0
- package/dist/build/js/assembly/instructions/jump.d.ts +5 -0
- package/dist/build/js/assembly/instructions/jump.js +21 -0
- package/dist/build/js/assembly/instructions/load.d.ts +17 -0
- package/dist/build/js/assembly/instructions/load.js +134 -0
- package/dist/build/js/assembly/instructions/logic.d.ts +10 -0
- package/dist/build/js/assembly/instructions/logic.js +47 -0
- package/dist/build/js/assembly/instructions/math.d.ts +28 -0
- package/dist/build/js/assembly/instructions/math.js +225 -0
- package/dist/build/js/assembly/instructions/misc.d.ts +6 -0
- package/dist/build/js/assembly/instructions/misc.js +22 -0
- package/dist/build/js/assembly/instructions/mov.d.ts +6 -0
- package/dist/build/js/assembly/instructions/mov.js +35 -0
- package/dist/build/js/assembly/instructions/outcome.d.ts +30 -0
- package/dist/build/js/assembly/instructions/outcome.js +88 -0
- package/dist/build/js/assembly/instructions/rot.d.ts +15 -0
- package/dist/build/js/assembly/instructions/rot.js +66 -0
- package/dist/build/js/assembly/instructions/set.d.ts +7 -0
- package/dist/build/js/assembly/instructions/set.js +36 -0
- package/dist/build/js/assembly/instructions/shift.d.ts +19 -0
- package/dist/build/js/assembly/instructions/shift.js +121 -0
- package/dist/build/js/assembly/instructions/store.d.ts +17 -0
- package/dist/build/js/assembly/instructions/store.js +101 -0
- package/dist/build/js/assembly/instructions/utils.d.ts +25 -0
- package/dist/build/js/assembly/instructions/utils.js +91 -0
- package/dist/build/js/assembly/instructions-exe.d.ts +2 -0
- package/dist/build/js/assembly/instructions-exe.js +245 -0
- package/dist/build/js/assembly/instructions.d.ts +10 -0
- package/dist/build/js/assembly/instructions.js +252 -0
- package/dist/build/js/assembly/interpreter.d.ts +28 -0
- package/dist/build/js/assembly/interpreter.js +221 -0
- package/dist/build/js/assembly/math.d.ts +6 -0
- package/dist/build/js/assembly/math.js +22 -0
- package/dist/build/js/assembly/memory-page.d.ts +36 -0
- package/dist/build/js/assembly/memory-page.js +74 -0
- package/dist/build/js/assembly/memory.d.ts +83 -0
- package/dist/build/js/assembly/memory.js +482 -0
- package/dist/build/js/assembly/portable.d.ts +24 -0
- package/dist/build/js/assembly/portable.js +363 -0
- package/dist/build/js/assembly/program-build.d.ts +2 -0
- package/dist/build/js/assembly/program-build.js +104 -0
- package/dist/build/js/assembly/program.d.ts +85 -0
- package/dist/build/js/assembly/program.js +340 -0
- package/dist/build/js/assembly/registers.d.ts +6 -0
- package/dist/build/js/assembly/registers.js +9 -0
- package/dist/build/js/assembly/spi.d.ts +92 -0
- package/dist/build/js/assembly/spi.js +152 -0
- package/dist/build/js/portable/bootstrap.d.ts +1 -0
- package/dist/build/js/portable/bootstrap.js +6 -0
- package/dist/build/js/portable/index.d.ts +4 -0
- package/dist/build/js/portable/index.js +6 -0
- package/dist/build/js/portable-bundle.js +4497 -0
- package/dist/build/release-inline.js +1 -1
- package/dist/build/release-mini-inline.js +1 -1
- package/dist/build/release-mini.d.ts +50 -112
- package/dist/build/release-mini.js +81 -147
- package/dist/build/release-mini.wasm +0 -0
- package/dist/build/release-stub-inline.js +1 -1
- package/dist/build/release-stub.d.ts +50 -112
- package/dist/build/release-stub.js +81 -147
- package/dist/build/release-stub.wasm +0 -0
- package/dist/build/release.d.ts +50 -112
- package/dist/build/release.js +81 -147
- 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 +125 -0
- package/dist/test/test-w3f-portable.js +5 -0
- package/dist/test/test-w3f.js +3 -120
- package/package.json +22 -11
|
@@ -0,0 +1,4497 @@
|
|
|
1
|
+
// dist/build/js/portable/bootstrap.js
|
|
2
|
+
var g = globalThis;
|
|
3
|
+
if (g.ASC_TARGET === void 0) {
|
|
4
|
+
g.ASC_TARGET = 0;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
// dist/build/js/assembly/portable.js
|
|
8
|
+
var __decorate = function(decorators, target, key, desc) {
|
|
9
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
10
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
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
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
13
|
+
};
|
|
14
|
+
var inline2 = (_target = 0, _propertyKey = 0, descriptor = 0) => descriptor;
|
|
15
|
+
var portable = class _portable {
|
|
16
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
17
|
+
static installPolyfills() {
|
|
18
|
+
if (ASC_TARGET !== 0) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const g2 = globalThis;
|
|
22
|
+
if (g2.__ananPortablePolyfillsInstalled) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
g2.__ananPortablePolyfillsInstalled = true;
|
|
26
|
+
g2.StaticArray = function StaticArray2(length) {
|
|
27
|
+
const arr = new Array(length);
|
|
28
|
+
arr.fill(0);
|
|
29
|
+
return arr;
|
|
30
|
+
};
|
|
31
|
+
g2.StaticArray.fromArray = (x) => x;
|
|
32
|
+
g2.ASC_TARGET = 0;
|
|
33
|
+
g2.i8 = (value) => {
|
|
34
|
+
const n = typeof value === "bigint" ? Number(value) : value;
|
|
35
|
+
return n << 24 >> 24;
|
|
36
|
+
};
|
|
37
|
+
g2.i16 = (value) => {
|
|
38
|
+
const n = typeof value === "bigint" ? Number(value) : value;
|
|
39
|
+
return n << 16 >> 16;
|
|
40
|
+
};
|
|
41
|
+
const i32Fn = (value) => {
|
|
42
|
+
if (typeof value === "bigint") {
|
|
43
|
+
return Number(BigInt.asIntN(32, value));
|
|
44
|
+
}
|
|
45
|
+
return value | 0;
|
|
46
|
+
};
|
|
47
|
+
i32Fn.MIN_VALUE = -2147483648;
|
|
48
|
+
i32Fn.MAX_VALUE = 2147483647;
|
|
49
|
+
g2.i32 = i32Fn;
|
|
50
|
+
const i64Fn = (value) => {
|
|
51
|
+
return BigInt.asIntN(64, BigInt(value));
|
|
52
|
+
};
|
|
53
|
+
i64Fn.MAX_VALUE = BigInt("9223372036854775807");
|
|
54
|
+
i64Fn.MIN_VALUE = BigInt("-9223372036854775808");
|
|
55
|
+
g2.i64 = i64Fn;
|
|
56
|
+
g2.u8 = (v) => {
|
|
57
|
+
if (typeof v === "bigint") {
|
|
58
|
+
return Number(v & BigInt(255)) >>> 0;
|
|
59
|
+
}
|
|
60
|
+
return (v & 255) >>> 0;
|
|
61
|
+
};
|
|
62
|
+
g2.u16 = (v) => {
|
|
63
|
+
if (typeof v === "bigint") {
|
|
64
|
+
return Number(v & BigInt(65535)) >>> 0;
|
|
65
|
+
}
|
|
66
|
+
return (v & 65535) >>> 0;
|
|
67
|
+
};
|
|
68
|
+
g2.u32 = (v) => {
|
|
69
|
+
if (typeof v === "bigint") {
|
|
70
|
+
return Number(v & BigInt(4294967295)) >>> 0;
|
|
71
|
+
}
|
|
72
|
+
return (v & 4294967295) >>> 0;
|
|
73
|
+
};
|
|
74
|
+
const u64Fn = (value) => {
|
|
75
|
+
return BigInt.asUintN(64, BigInt(value));
|
|
76
|
+
};
|
|
77
|
+
u64Fn.MAX_VALUE = BigInt("18446744073709551615");
|
|
78
|
+
u64Fn.MIN_VALUE = BigInt(0);
|
|
79
|
+
g2.u64 = u64Fn;
|
|
80
|
+
g2.f32 = (v) => Math.fround(v);
|
|
81
|
+
g2.f64 = (v) => +v;
|
|
82
|
+
g2.bool = (v) => !!v;
|
|
83
|
+
const dataViewProto = DataView.prototype;
|
|
84
|
+
if (!dataViewProto.setUint64) {
|
|
85
|
+
dataViewProto.setUint64 = function(byteOffset, value, littleEndian) {
|
|
86
|
+
const high = Number(value >> BigInt(32) & BigInt(4294967295));
|
|
87
|
+
const low = Number(value & BigInt(4294967295));
|
|
88
|
+
if (littleEndian) {
|
|
89
|
+
this.setUint32(byteOffset, low, true);
|
|
90
|
+
this.setUint32(byteOffset + 4, high, true);
|
|
91
|
+
} else {
|
|
92
|
+
this.setUint32(byteOffset, high, false);
|
|
93
|
+
this.setUint32(byteOffset + 4, low, false);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (!dataViewProto.getUint64) {
|
|
98
|
+
dataViewProto.getUint64 = function(byteOffset, littleEndian) {
|
|
99
|
+
if (littleEndian) {
|
|
100
|
+
const low2 = BigInt(this.getUint32(byteOffset, true));
|
|
101
|
+
const high2 = BigInt(this.getUint32(byteOffset + 4, true));
|
|
102
|
+
return high2 << BigInt(32) | low2;
|
|
103
|
+
}
|
|
104
|
+
const high = BigInt(this.getUint32(byteOffset, false));
|
|
105
|
+
const low = BigInt(this.getUint32(byteOffset + 4, false));
|
|
106
|
+
return high << BigInt(32) | low;
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
g2.unchecked = (v) => v;
|
|
110
|
+
g2.inline = inline2;
|
|
111
|
+
g2.changetype = (v) => v;
|
|
112
|
+
}
|
|
113
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
114
|
+
// @ts-ignore: parameter type differs between AS and JS
|
|
115
|
+
static asArray(v) {
|
|
116
|
+
if (ASC_TARGET === 0) {
|
|
117
|
+
return Array.from(v);
|
|
118
|
+
}
|
|
119
|
+
return v;
|
|
120
|
+
}
|
|
121
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
122
|
+
static arrayAt(v, i) {
|
|
123
|
+
if (ASC_TARGET === 0) {
|
|
124
|
+
return v[i];
|
|
125
|
+
}
|
|
126
|
+
return unchecked(v[i]);
|
|
127
|
+
}
|
|
128
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
129
|
+
static staticArrayAt(v, i) {
|
|
130
|
+
if (ASC_TARGET === 0) {
|
|
131
|
+
return v[i];
|
|
132
|
+
}
|
|
133
|
+
return unchecked(v[i]);
|
|
134
|
+
}
|
|
135
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
136
|
+
static asU32(v) {
|
|
137
|
+
if (ASC_TARGET === 0) {
|
|
138
|
+
return v >>> 0;
|
|
139
|
+
}
|
|
140
|
+
return v;
|
|
141
|
+
}
|
|
142
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
143
|
+
static uint8ArrayView(data, offset, length) {
|
|
144
|
+
if (ASC_TARGET === 0) {
|
|
145
|
+
return new Uint8Array(data, offset, length);
|
|
146
|
+
}
|
|
147
|
+
return Uint8Array.wrap(data, offset, length);
|
|
148
|
+
}
|
|
149
|
+
// --- bswap ---
|
|
150
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
151
|
+
static bswap_u16(v) {
|
|
152
|
+
if (ASC_TARGET === 0) {
|
|
153
|
+
return u16((v & 255) << 8 | v >> 8 & 255);
|
|
154
|
+
}
|
|
155
|
+
return bswap(v);
|
|
156
|
+
}
|
|
157
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
158
|
+
static bswap_u32(v) {
|
|
159
|
+
if (ASC_TARGET === 0) {
|
|
160
|
+
return u32((v & 255) << 24 | (v & 65280) << 8 | v >> 8 & 65280 | v >> 24 & 255);
|
|
161
|
+
}
|
|
162
|
+
return bswap(v);
|
|
163
|
+
}
|
|
164
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
165
|
+
static bswap_u64(v) {
|
|
166
|
+
if (ASC_TARGET === 0) {
|
|
167
|
+
const lo = u32(v);
|
|
168
|
+
const hi = u32(v >> u64(32));
|
|
169
|
+
const sLo = _portable.bswap_u32(lo);
|
|
170
|
+
const sHi = _portable.bswap_u32(hi);
|
|
171
|
+
return u64(u64(sLo) << u64(32) | u64(sHi));
|
|
172
|
+
}
|
|
173
|
+
return bswap(v);
|
|
174
|
+
}
|
|
175
|
+
// --- popcnt ---
|
|
176
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
177
|
+
static popcnt_u32(v) {
|
|
178
|
+
if (ASC_TARGET === 0) {
|
|
179
|
+
v = v - (v >>> 1 & 1431655765);
|
|
180
|
+
v = (v & 858993459) + (v >>> 2 & 858993459);
|
|
181
|
+
return (v + (v >>> 4) & 252645135) * 16843009 >>> 24;
|
|
182
|
+
}
|
|
183
|
+
return popcnt(v);
|
|
184
|
+
}
|
|
185
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
186
|
+
static popcnt_u64(v) {
|
|
187
|
+
if (ASC_TARGET === 0) {
|
|
188
|
+
const lo = _portable.popcnt_u32(u32(v));
|
|
189
|
+
const hi = _portable.popcnt_u32(u32(v >> u64(32)));
|
|
190
|
+
return u64(lo + hi);
|
|
191
|
+
}
|
|
192
|
+
return popcnt(v);
|
|
193
|
+
}
|
|
194
|
+
// --- clz ---
|
|
195
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
196
|
+
static clz_u32(v) {
|
|
197
|
+
if (ASC_TARGET === 0) {
|
|
198
|
+
return Math.clz32(v);
|
|
199
|
+
}
|
|
200
|
+
return clz(v);
|
|
201
|
+
}
|
|
202
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
203
|
+
static clz_u64(v) {
|
|
204
|
+
if (ASC_TARGET === 0) {
|
|
205
|
+
const hi = u32(v >> u64(32));
|
|
206
|
+
if (hi !== 0) {
|
|
207
|
+
return u64(_portable.clz_u32(hi));
|
|
208
|
+
}
|
|
209
|
+
return u64(32 + _portable.clz_u32(u32(v)));
|
|
210
|
+
}
|
|
211
|
+
return clz(v);
|
|
212
|
+
}
|
|
213
|
+
// --- ctz ---
|
|
214
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
215
|
+
static ctz_u32(v) {
|
|
216
|
+
if (ASC_TARGET === 0) {
|
|
217
|
+
if (v === 0)
|
|
218
|
+
return 32;
|
|
219
|
+
return 31 - Math.clz32(v & -v);
|
|
220
|
+
}
|
|
221
|
+
return ctz(v);
|
|
222
|
+
}
|
|
223
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
224
|
+
static ctz_u64(v) {
|
|
225
|
+
if (ASC_TARGET === 0) {
|
|
226
|
+
const lo = u32(v);
|
|
227
|
+
if (lo !== 0) {
|
|
228
|
+
return u64(_portable.ctz_u32(lo));
|
|
229
|
+
}
|
|
230
|
+
return u64(32 + _portable.ctz_u32(u32(v >> u64(32))));
|
|
231
|
+
}
|
|
232
|
+
return ctz(v);
|
|
233
|
+
}
|
|
234
|
+
// --- rotr ---
|
|
235
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
236
|
+
static rotr_u32(v, shift) {
|
|
237
|
+
if (ASC_TARGET === 0) {
|
|
238
|
+
shift &= 31;
|
|
239
|
+
return u32(v >>> shift | v << 32 - shift);
|
|
240
|
+
}
|
|
241
|
+
return rotr(v, shift);
|
|
242
|
+
}
|
|
243
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
244
|
+
static rotr_u64(v, shift) {
|
|
245
|
+
if (ASC_TARGET === 0) {
|
|
246
|
+
shift &= u64(63);
|
|
247
|
+
return u64(v >> shift | v << u64(64) - shift);
|
|
248
|
+
}
|
|
249
|
+
return rotr(v, shift);
|
|
250
|
+
}
|
|
251
|
+
// --- rotl ---
|
|
252
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
253
|
+
static rotl_u32(v, shift) {
|
|
254
|
+
if (ASC_TARGET === 0) {
|
|
255
|
+
shift &= 31;
|
|
256
|
+
return u32(v << shift | v >>> 32 - shift);
|
|
257
|
+
}
|
|
258
|
+
return rotl(v, shift);
|
|
259
|
+
}
|
|
260
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
261
|
+
static rotl_u64(v, shift) {
|
|
262
|
+
if (ASC_TARGET === 0) {
|
|
263
|
+
shift &= u64(63);
|
|
264
|
+
return u64(v << shift | v >> u64(64) - shift);
|
|
265
|
+
}
|
|
266
|
+
return rotl(v, shift);
|
|
267
|
+
}
|
|
268
|
+
// --- u64 wrapping arithmetic ---
|
|
269
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
270
|
+
static u64_add(a, b) {
|
|
271
|
+
if (ASC_TARGET === 0) {
|
|
272
|
+
return BigInt.asUintN(64, BigInt(a) + BigInt(b));
|
|
273
|
+
}
|
|
274
|
+
return a + b;
|
|
275
|
+
}
|
|
276
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
277
|
+
static u64_sub(a, b) {
|
|
278
|
+
if (ASC_TARGET === 0) {
|
|
279
|
+
return BigInt.asUintN(64, BigInt(a) - BigInt(b));
|
|
280
|
+
}
|
|
281
|
+
return a - b;
|
|
282
|
+
}
|
|
283
|
+
// @ts-ignore: @inline is an AS-only decorator
|
|
284
|
+
static u64_mul(a, b) {
|
|
285
|
+
if (ASC_TARGET === 0) {
|
|
286
|
+
return BigInt.asUintN(64, BigInt(a) * BigInt(b));
|
|
287
|
+
}
|
|
288
|
+
return a * b;
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
__decorate([
|
|
292
|
+
inline2
|
|
293
|
+
], portable, "installPolyfills", null);
|
|
294
|
+
__decorate([
|
|
295
|
+
inline2
|
|
296
|
+
// @ts-ignore: parameter type differs between AS and JS
|
|
297
|
+
], portable, "asArray", null);
|
|
298
|
+
__decorate([
|
|
299
|
+
inline2
|
|
300
|
+
], portable, "arrayAt", null);
|
|
301
|
+
__decorate([
|
|
302
|
+
inline2
|
|
303
|
+
], portable, "staticArrayAt", null);
|
|
304
|
+
__decorate([
|
|
305
|
+
inline2
|
|
306
|
+
], portable, "asU32", null);
|
|
307
|
+
__decorate([
|
|
308
|
+
inline2
|
|
309
|
+
], portable, "uint8ArrayView", null);
|
|
310
|
+
__decorate([
|
|
311
|
+
inline2
|
|
312
|
+
], portable, "bswap_u16", null);
|
|
313
|
+
__decorate([
|
|
314
|
+
inline2
|
|
315
|
+
], portable, "bswap_u32", null);
|
|
316
|
+
__decorate([
|
|
317
|
+
inline2
|
|
318
|
+
], portable, "bswap_u64", null);
|
|
319
|
+
__decorate([
|
|
320
|
+
inline2
|
|
321
|
+
], portable, "popcnt_u32", null);
|
|
322
|
+
__decorate([
|
|
323
|
+
inline2
|
|
324
|
+
], portable, "popcnt_u64", null);
|
|
325
|
+
__decorate([
|
|
326
|
+
inline2
|
|
327
|
+
], portable, "clz_u32", null);
|
|
328
|
+
__decorate([
|
|
329
|
+
inline2
|
|
330
|
+
], portable, "clz_u64", null);
|
|
331
|
+
__decorate([
|
|
332
|
+
inline2
|
|
333
|
+
], portable, "ctz_u32", null);
|
|
334
|
+
__decorate([
|
|
335
|
+
inline2
|
|
336
|
+
], portable, "ctz_u64", null);
|
|
337
|
+
__decorate([
|
|
338
|
+
inline2
|
|
339
|
+
], portable, "rotr_u32", null);
|
|
340
|
+
__decorate([
|
|
341
|
+
inline2
|
|
342
|
+
], portable, "rotr_u64", null);
|
|
343
|
+
__decorate([
|
|
344
|
+
inline2
|
|
345
|
+
], portable, "rotl_u32", null);
|
|
346
|
+
__decorate([
|
|
347
|
+
inline2
|
|
348
|
+
], portable, "rotl_u64", null);
|
|
349
|
+
__decorate([
|
|
350
|
+
inline2
|
|
351
|
+
], portable, "u64_add", null);
|
|
352
|
+
__decorate([
|
|
353
|
+
inline2
|
|
354
|
+
], portable, "u64_sub", null);
|
|
355
|
+
__decorate([
|
|
356
|
+
inline2
|
|
357
|
+
], portable, "u64_mul", null);
|
|
358
|
+
portable.installPolyfills();
|
|
359
|
+
|
|
360
|
+
// node_modules/assemblyscript/std/portable/index.js
|
|
361
|
+
var globalScope = typeof window !== "undefined" && window || typeof global !== "undefined" && global || self;
|
|
362
|
+
if (typeof globalScope.ASC_TARGET === "undefined") {
|
|
363
|
+
let UnreachableError = function() {
|
|
364
|
+
if (Error.captureStackTrace) {
|
|
365
|
+
Error.captureStackTrace(this, UnreachableError);
|
|
366
|
+
} else {
|
|
367
|
+
this.stack = this.name + ": " + this.message + "\n" + new Error().stack;
|
|
368
|
+
}
|
|
369
|
+
}, AssertionError = function(message) {
|
|
370
|
+
this.message = message || "assertion failed";
|
|
371
|
+
if (Error.captureStackTrace) {
|
|
372
|
+
Error.captureStackTrace(this, AssertionError);
|
|
373
|
+
} else {
|
|
374
|
+
this.stack = this.name + ": " + this.message + "\n" + new Error().stack;
|
|
375
|
+
}
|
|
376
|
+
}, defaultComparator = function(a, b) {
|
|
377
|
+
if (a == b) {
|
|
378
|
+
if (a != 0) return 0;
|
|
379
|
+
a = 1 / a;
|
|
380
|
+
b = 1 / b;
|
|
381
|
+
} else {
|
|
382
|
+
let nanA = a != a, nanB = b != b;
|
|
383
|
+
if (nanA | nanB) return nanA - nanB;
|
|
384
|
+
if (a == null) a = String(a);
|
|
385
|
+
if (b == null) b = String(b);
|
|
386
|
+
}
|
|
387
|
+
return a > b ? 1 : -1;
|
|
388
|
+
};
|
|
389
|
+
globalScope.ASC_TARGET = 0;
|
|
390
|
+
globalScope.ASC_RUNTIME = 0;
|
|
391
|
+
globalScope.ASC_NO_ASSERT = false;
|
|
392
|
+
globalScope.ASC_MEMORY_BASE = 0;
|
|
393
|
+
globalScope.ASC_OPTIMIZE_LEVEL = 3;
|
|
394
|
+
globalScope.ASC_SHRINK_LEVEL = 0;
|
|
395
|
+
globalScope.ASC_FEATURE_MUTABLE_GLOBAL = false;
|
|
396
|
+
globalScope.ASC_FEATURE_SIGN_EXTENSION = false;
|
|
397
|
+
globalScope.ASC_FEATURE_BULK_MEMORY = false;
|
|
398
|
+
globalScope.ASC_FEATURE_SIMD = false;
|
|
399
|
+
globalScope.ASC_FEATURE_THREADS = false;
|
|
400
|
+
let F64 = new Float64Array(1);
|
|
401
|
+
let U64 = new Uint32Array(F64.buffer);
|
|
402
|
+
Object.defineProperties(
|
|
403
|
+
globalScope["i8"] = function i82(value) {
|
|
404
|
+
return value << 24 >> 24;
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"MIN_VALUE": { value: -128 },
|
|
408
|
+
"MAX_VALUE": { value: 127 },
|
|
409
|
+
parse(str, radix) {
|
|
410
|
+
return parseInt(str, radix) << 24 >> 24;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
);
|
|
414
|
+
Object.defineProperties(
|
|
415
|
+
globalScope["i16"] = function i162(value) {
|
|
416
|
+
return value << 16 >> 16;
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
"MIN_VALUE": { value: -32768 },
|
|
420
|
+
"MAX_VALUE": { value: 32767 },
|
|
421
|
+
parse(str, radix) {
|
|
422
|
+
return parseInt(str, radix) << 16 >> 16;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
);
|
|
426
|
+
Object.defineProperties(
|
|
427
|
+
globalScope["i32"] = globalScope["isize"] = function i322(value) {
|
|
428
|
+
return value | 0;
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
"MIN_VALUE": { value: -2147483648 },
|
|
432
|
+
"MAX_VALUE": { value: 2147483647 },
|
|
433
|
+
parse(str, radix) {
|
|
434
|
+
return parseInt(str, radix) | 0;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
);
|
|
438
|
+
Object.defineProperties(
|
|
439
|
+
globalScope["u8"] = function u82(value) {
|
|
440
|
+
return value & 255;
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
"MIN_VALUE": { value: 0 },
|
|
444
|
+
"MAX_VALUE": { value: 255 },
|
|
445
|
+
parse(str, radix) {
|
|
446
|
+
return parseInt(str, radix) & 255;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
);
|
|
450
|
+
Object.defineProperties(
|
|
451
|
+
globalScope["u16"] = function u162(value) {
|
|
452
|
+
return value & 65535;
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
"MIN_VALUE": { value: 0 },
|
|
456
|
+
"MAX_VALUE": { value: 65535 },
|
|
457
|
+
parse(str, radix) {
|
|
458
|
+
return parseInt(str, radix) & 65535;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
);
|
|
462
|
+
Object.defineProperties(
|
|
463
|
+
globalScope["u32"] = globalScope["usize"] = function u322(value) {
|
|
464
|
+
return value >>> 0;
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
"MIN_VALUE": { value: 0 },
|
|
468
|
+
"MAX_VALUE": { value: 4294967295 },
|
|
469
|
+
parse(str, radix) {
|
|
470
|
+
return parseInt(str, radix) >>> 0;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
);
|
|
474
|
+
Object.defineProperties(
|
|
475
|
+
globalScope["bool"] = function bool(value) {
|
|
476
|
+
return !!value;
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
"MIN_VALUE": { value: false },
|
|
480
|
+
"MAX_VALUE": { value: true },
|
|
481
|
+
parse(str) {
|
|
482
|
+
return str.trim() === "true";
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
);
|
|
486
|
+
Object.defineProperties(
|
|
487
|
+
globalScope["f32"] = function f32(value) {
|
|
488
|
+
return Math.fround(value);
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
"EPSILON": { value: 11920928955078125e-23 },
|
|
492
|
+
"MIN_VALUE": { value: 1401298464324817e-60 },
|
|
493
|
+
"MAX_VALUE": { value: 34028234663852886e22 },
|
|
494
|
+
"MIN_NORMAL_VALUE": { value: 11754943508222875e-54 },
|
|
495
|
+
"MIN_SAFE_INTEGER": { value: -16777215 },
|
|
496
|
+
"MAX_SAFE_INTEGER": { value: 16777215 },
|
|
497
|
+
"POSITIVE_INFINITY": { value: Infinity },
|
|
498
|
+
"NEGATIVE_INFINITY": { value: -Infinity },
|
|
499
|
+
"NaN": { value: NaN },
|
|
500
|
+
parse(str) {
|
|
501
|
+
return Math.fround(parseFloat(str));
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
);
|
|
505
|
+
Object.defineProperties(
|
|
506
|
+
globalScope["f64"] = function f64(value) {
|
|
507
|
+
return +value;
|
|
508
|
+
},
|
|
509
|
+
{
|
|
510
|
+
"EPSILON": { value: 2220446049250313e-31 },
|
|
511
|
+
"MIN_VALUE": { value: 5e-324 },
|
|
512
|
+
"MAX_VALUE": { value: 17976931348623157e292 },
|
|
513
|
+
"MIN_NORMAL_VALUE": { value: 22250738585072014e-324 },
|
|
514
|
+
"MIN_SAFE_INTEGER": { value: -9007199254740991 },
|
|
515
|
+
"MAX_SAFE_INTEGER": { value: 9007199254740991 },
|
|
516
|
+
"POSITIVE_INFINITY": { value: Infinity },
|
|
517
|
+
"NEGATIVE_INFINITY": { value: -Infinity },
|
|
518
|
+
"NaN": { value: NaN },
|
|
519
|
+
parse(str) {
|
|
520
|
+
return parseFloat(str);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
);
|
|
524
|
+
globalScope["clz"] = Math.clz32;
|
|
525
|
+
globalScope["ctz"] = function ctz2(value) {
|
|
526
|
+
return 32 - Math.clz32(~value & value - 1);
|
|
527
|
+
};
|
|
528
|
+
globalScope["popcnt"] = function popcnt2(value) {
|
|
529
|
+
value -= value >>> 1 & 1431655765;
|
|
530
|
+
value = (value & 858993459) + (value >>> 2 & 858993459);
|
|
531
|
+
return (value + (value >>> 4) & 252645135) * 16843009 >>> 24;
|
|
532
|
+
};
|
|
533
|
+
globalScope["rotl"] = function rotl2(value, shift) {
|
|
534
|
+
shift &= 31;
|
|
535
|
+
return value << shift | value >>> 32 - shift;
|
|
536
|
+
};
|
|
537
|
+
globalScope["rotr"] = function rotr2(value, shift) {
|
|
538
|
+
shift &= 31;
|
|
539
|
+
return value >>> shift | value << 32 - shift;
|
|
540
|
+
};
|
|
541
|
+
globalScope["abs"] = Math.abs;
|
|
542
|
+
globalScope["max"] = Math.max;
|
|
543
|
+
globalScope["min"] = Math.min;
|
|
544
|
+
globalScope["ceil"] = Math.ceil;
|
|
545
|
+
globalScope["floor"] = Math.floor;
|
|
546
|
+
globalScope["nearest"] = function nearest(value) {
|
|
547
|
+
const INV_EPS64 = 4503599627370496;
|
|
548
|
+
const y = Math.abs(value);
|
|
549
|
+
return y < INV_EPS64 ? (y + INV_EPS64 - INV_EPS64) * Math.sign(value) : value;
|
|
550
|
+
};
|
|
551
|
+
globalScope["select"] = function select(ifTrue, ifFalse, condition) {
|
|
552
|
+
return condition ? ifTrue : ifFalse;
|
|
553
|
+
};
|
|
554
|
+
globalScope["sqrt"] = Math.sqrt;
|
|
555
|
+
globalScope["trunc"] = Math.trunc;
|
|
556
|
+
globalScope["copysign"] = function copysign(x, y) {
|
|
557
|
+
return y ? Math.abs(x) * Math.sign(y) : (F64[0] = y, U64[1] >>> 31 ? -1 : 1);
|
|
558
|
+
};
|
|
559
|
+
globalScope["bswap"] = function bswap2(value) {
|
|
560
|
+
let a = value >> 8 & 16711935;
|
|
561
|
+
let b = (value & 16711935) << 8;
|
|
562
|
+
value = a | b;
|
|
563
|
+
a = value >> 16 & 65535;
|
|
564
|
+
b = (value & 65535) << 16;
|
|
565
|
+
return a | b;
|
|
566
|
+
};
|
|
567
|
+
UnreachableError.prototype = Object.create(Error.prototype);
|
|
568
|
+
UnreachableError.prototype.name = "UnreachableError";
|
|
569
|
+
UnreachableError.prototype.message = "unreachable";
|
|
570
|
+
globalScope["unreachable"] = function unreachable() {
|
|
571
|
+
throw new UnreachableError();
|
|
572
|
+
};
|
|
573
|
+
AssertionError.prototype = Object.create(Error.prototype);
|
|
574
|
+
AssertionError.prototype.name = "AssertionError";
|
|
575
|
+
globalScope["assert"] = function assert(isTrueish, message) {
|
|
576
|
+
if (isTrueish) return isTrueish;
|
|
577
|
+
throw new AssertionError(message);
|
|
578
|
+
};
|
|
579
|
+
globalScope["changetype"] = function changetype(value) {
|
|
580
|
+
return value;
|
|
581
|
+
};
|
|
582
|
+
String["fromCharCodes"] = function fromCharCodes(arr) {
|
|
583
|
+
const CHUNKSIZE = 1 << 13;
|
|
584
|
+
const len = arr.length;
|
|
585
|
+
if (len <= CHUNKSIZE) {
|
|
586
|
+
return String.fromCharCode.apply(String, arr);
|
|
587
|
+
}
|
|
588
|
+
let index = 0;
|
|
589
|
+
let parts = "";
|
|
590
|
+
while (index < len) {
|
|
591
|
+
parts += String.fromCharCode.apply(
|
|
592
|
+
String,
|
|
593
|
+
arr.slice(index, Math.min(index + CHUNKSIZE, len))
|
|
594
|
+
);
|
|
595
|
+
index += CHUNKSIZE;
|
|
596
|
+
}
|
|
597
|
+
return parts;
|
|
598
|
+
};
|
|
599
|
+
String["fromCodePoints"] = function fromCodePoints(arr) {
|
|
600
|
+
const CHUNKSIZE = 1 << 13;
|
|
601
|
+
const len = arr.length;
|
|
602
|
+
if (len <= CHUNKSIZE) {
|
|
603
|
+
return String.fromCodePoint.apply(String, arr);
|
|
604
|
+
}
|
|
605
|
+
let index = 0;
|
|
606
|
+
let parts = "";
|
|
607
|
+
while (index < len) {
|
|
608
|
+
parts += String.fromCodePoint.apply(
|
|
609
|
+
String,
|
|
610
|
+
arr.slice(index, Math.min(index + CHUNKSIZE, len))
|
|
611
|
+
);
|
|
612
|
+
index += CHUNKSIZE;
|
|
613
|
+
}
|
|
614
|
+
return parts;
|
|
615
|
+
};
|
|
616
|
+
if (!String.prototype.at) {
|
|
617
|
+
Object.defineProperty(String.prototype, "at", {
|
|
618
|
+
value: function at(index) {
|
|
619
|
+
return this.charAt(index >= 0 ? index : index + this.length);
|
|
620
|
+
},
|
|
621
|
+
configurable: true
|
|
622
|
+
});
|
|
623
|
+
}
|
|
624
|
+
if (!String.prototype.replaceAll) {
|
|
625
|
+
Object.defineProperty(String.prototype, "replaceAll", {
|
|
626
|
+
value: function replaceAll(search, replacement) {
|
|
627
|
+
let res = this.split(search).join(replacement);
|
|
628
|
+
if (!search.length) res = replacement + res + replacement;
|
|
629
|
+
return res;
|
|
630
|
+
},
|
|
631
|
+
configurable: true
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
const arraySort = Array.prototype.sort;
|
|
635
|
+
Array.prototype.sort = function sort(comparator) {
|
|
636
|
+
return arraySort.call(this, comparator || defaultComparator);
|
|
637
|
+
};
|
|
638
|
+
[
|
|
639
|
+
Array,
|
|
640
|
+
Uint8ClampedArray,
|
|
641
|
+
Uint8Array,
|
|
642
|
+
Int8Array,
|
|
643
|
+
Uint16Array,
|
|
644
|
+
Int16Array,
|
|
645
|
+
Uint32Array,
|
|
646
|
+
Int32Array,
|
|
647
|
+
Float32Array,
|
|
648
|
+
Float64Array
|
|
649
|
+
].forEach((Ctr) => {
|
|
650
|
+
if (!Ctr.prototype.at) {
|
|
651
|
+
Object.defineProperty(Ctr.prototype, "at", {
|
|
652
|
+
value: function at(index) {
|
|
653
|
+
return this[index >= 0 ? index : index + this.length];
|
|
654
|
+
},
|
|
655
|
+
configurable: true
|
|
656
|
+
});
|
|
657
|
+
}
|
|
658
|
+
if (!Ctr.prototype.findLastIndex) {
|
|
659
|
+
Object.defineProperty(Ctr.prototype, "findLastIndex", {
|
|
660
|
+
value: function findLastIndex(fn) {
|
|
661
|
+
for (let i = this.length - 1; i >= 0; --i) {
|
|
662
|
+
if (fn(this[i], i, this)) return i;
|
|
663
|
+
}
|
|
664
|
+
return -1;
|
|
665
|
+
},
|
|
666
|
+
configurable: true
|
|
667
|
+
});
|
|
668
|
+
}
|
|
669
|
+
if (Ctr != Array) {
|
|
670
|
+
Object.defineProperty(Ctr, "wrap", {
|
|
671
|
+
value: function wrap(buffer, byteOffset, length) {
|
|
672
|
+
return new Ctr(buffer, byteOffset, length);
|
|
673
|
+
},
|
|
674
|
+
configurable: true
|
|
675
|
+
});
|
|
676
|
+
}
|
|
677
|
+
});
|
|
678
|
+
globalScope["isInteger"] = Number.isInteger;
|
|
679
|
+
globalScope["isFloat"] = function isFloat(arg) {
|
|
680
|
+
return typeof arg === "number";
|
|
681
|
+
};
|
|
682
|
+
globalScope["isNullable"] = function isNullable(arg) {
|
|
683
|
+
return true;
|
|
684
|
+
};
|
|
685
|
+
globalScope["isReference"] = function isReference(arg) {
|
|
686
|
+
return typeof arg === "object" || typeof arg === "string";
|
|
687
|
+
};
|
|
688
|
+
globalScope["isFunction"] = function isFunction(arg) {
|
|
689
|
+
return typeof arg === "function";
|
|
690
|
+
};
|
|
691
|
+
globalScope["isString"] = function isString(arg) {
|
|
692
|
+
return typeof arg === "string" || arg instanceof String;
|
|
693
|
+
};
|
|
694
|
+
globalScope["isArray"] = Array.isArray;
|
|
695
|
+
globalScope["isArrayLike"] = function isArrayLike(expr) {
|
|
696
|
+
return expr && typeof expr === "object" && typeof expr.length === "number" && expr.length >= 0 && Math.trunc(expr.length) === expr.length;
|
|
697
|
+
};
|
|
698
|
+
globalScope["isDefined"] = function isDefined(expr) {
|
|
699
|
+
return typeof expr !== "undefined";
|
|
700
|
+
};
|
|
701
|
+
globalScope["isConstant"] = function isConstant(expr) {
|
|
702
|
+
return false;
|
|
703
|
+
};
|
|
704
|
+
globalScope["unchecked"] = function unchecked2(expr) {
|
|
705
|
+
return expr;
|
|
706
|
+
};
|
|
707
|
+
globalScope["fmod"] = function fmod(x, y) {
|
|
708
|
+
return x % y;
|
|
709
|
+
};
|
|
710
|
+
globalScope["fmodf"] = function fmodf(x, y) {
|
|
711
|
+
return Math.fround(x % y);
|
|
712
|
+
};
|
|
713
|
+
globalScope["JSMath"] = Math;
|
|
714
|
+
Object.defineProperties(globalScope["JSMath"], {
|
|
715
|
+
sincos_sin: { value: 0, writable: true },
|
|
716
|
+
sincos_cos: { value: 0, writable: true },
|
|
717
|
+
signbit: {
|
|
718
|
+
value: function signbit(x) {
|
|
719
|
+
F64[0] = x;
|
|
720
|
+
return Boolean(U64[1] >>> 31);
|
|
721
|
+
}
|
|
722
|
+
},
|
|
723
|
+
sincos: {
|
|
724
|
+
value: function sincos(x) {
|
|
725
|
+
this.sincos_sin = Math.sin(x);
|
|
726
|
+
this.sincos_cos = Math.cos(x);
|
|
727
|
+
}
|
|
728
|
+
},
|
|
729
|
+
exp2: {
|
|
730
|
+
value: function exp2(x) {
|
|
731
|
+
return Math.pow(2, x);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
});
|
|
735
|
+
globalScope["unmanaged"] = function() {
|
|
736
|
+
};
|
|
737
|
+
globalScope["trace"] = function(message, n) {
|
|
738
|
+
if (n) message += Array.prototype.slice.call(arguments, 2, 2 + n);
|
|
739
|
+
console.error("trace: " + message);
|
|
740
|
+
};
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
// dist/build/js/assembly/math.js
|
|
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);
|
|
766
|
+
|
|
767
|
+
// dist/build/js/assembly/arguments.js
|
|
768
|
+
var Arguments;
|
|
769
|
+
(function(Arguments2) {
|
|
770
|
+
Arguments2[Arguments2["Zero"] = 0] = "Zero";
|
|
771
|
+
Arguments2[Arguments2["OneImm"] = 1] = "OneImm";
|
|
772
|
+
Arguments2[Arguments2["TwoImm"] = 2] = "TwoImm";
|
|
773
|
+
Arguments2[Arguments2["OneOff"] = 3] = "OneOff";
|
|
774
|
+
Arguments2[Arguments2["OneRegOneImm"] = 4] = "OneRegOneImm";
|
|
775
|
+
Arguments2[Arguments2["OneRegOneExtImm"] = 5] = "OneRegOneExtImm";
|
|
776
|
+
Arguments2[Arguments2["OneRegTwoImm"] = 6] = "OneRegTwoImm";
|
|
777
|
+
Arguments2[Arguments2["OneRegOneImmOneOff"] = 7] = "OneRegOneImmOneOff";
|
|
778
|
+
Arguments2[Arguments2["TwoReg"] = 8] = "TwoReg";
|
|
779
|
+
Arguments2[Arguments2["TwoRegOneImm"] = 9] = "TwoRegOneImm";
|
|
780
|
+
Arguments2[Arguments2["TwoRegOneOff"] = 10] = "TwoRegOneOff";
|
|
781
|
+
Arguments2[Arguments2["TwoRegTwoImm"] = 11] = "TwoRegTwoImm";
|
|
782
|
+
Arguments2[Arguments2["ThreeReg"] = 12] = "ThreeReg";
|
|
783
|
+
})(Arguments || (Arguments = {}));
|
|
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]);
|
|
786
|
+
var Args = class {
|
|
787
|
+
constructor() {
|
|
788
|
+
this.a = 0;
|
|
789
|
+
this.b = 0;
|
|
790
|
+
this.c = 0;
|
|
791
|
+
this.d = 0;
|
|
792
|
+
}
|
|
793
|
+
fill(a, b = 0, c = 0, d = 0) {
|
|
794
|
+
this.a = a;
|
|
795
|
+
this.b = b;
|
|
796
|
+
this.c = c;
|
|
797
|
+
this.d = d;
|
|
798
|
+
return this;
|
|
799
|
+
}
|
|
800
|
+
};
|
|
801
|
+
function twoImm(args, code, offset, end) {
|
|
802
|
+
const low = lowNibble(portable.staticArrayAt(code, offset));
|
|
803
|
+
const split = IntMath.minI32(4, low) + 1;
|
|
804
|
+
const first = decodeI32(code, offset + 1, offset + split);
|
|
805
|
+
const second = decodeI32(code, offset + split, end);
|
|
806
|
+
return args.fill(first, second, 0, 0);
|
|
807
|
+
}
|
|
808
|
+
var DECODERS = StaticArray.fromArray([
|
|
809
|
+
// DECODERS[Arguments.Zero] =
|
|
810
|
+
(args, _d, _o, _l) => {
|
|
811
|
+
return args.fill(0, 0, 0, 0);
|
|
812
|
+
},
|
|
813
|
+
// DECODERS[Arguments.OneImm] =
|
|
814
|
+
(args, data, o, lim) => {
|
|
815
|
+
return args.fill(decodeI32(data, o, lim), 0, 0, 0);
|
|
816
|
+
},
|
|
817
|
+
// DECODERS[Arguments.TwoImm] =
|
|
818
|
+
(args, data, o, lim) => twoImm(args, data, o, lim),
|
|
819
|
+
// DECODERS[Arguments.OneOff] =
|
|
820
|
+
(args, data, o, lim) => {
|
|
821
|
+
return args.fill(decodeI32(data, o, lim), 0, 0, 0);
|
|
822
|
+
},
|
|
823
|
+
// DECODERS[Arguments.OneRegOneImm] =
|
|
824
|
+
(args, data, o, lim) => {
|
|
825
|
+
return args.fill(lowNibble(data[o]), decodeI32(data, o + 1, lim), 0, 0);
|
|
826
|
+
},
|
|
827
|
+
// DECODERS[Arguments.OneRegOneExtImm] =
|
|
828
|
+
(args, data, o, _lim) => {
|
|
829
|
+
const a = lowNibble(data[o]);
|
|
830
|
+
const b = decodeU32(data, o + 1);
|
|
831
|
+
const c = decodeU32(data, o + 5);
|
|
832
|
+
return args.fill(a, b, c, 0);
|
|
833
|
+
},
|
|
834
|
+
//DECODERS[Arguments.OneRegTwoImm] =
|
|
835
|
+
(args, data, o, lim) => {
|
|
836
|
+
const h = higNibble(data[o]);
|
|
837
|
+
const l = lowNibble(data[o]);
|
|
838
|
+
const split = IntMath.minI32(4, h) + 1;
|
|
839
|
+
const immA = decodeI32(data, o + 1, o + split);
|
|
840
|
+
const immB = decodeI32(data, o + split, lim);
|
|
841
|
+
return args.fill(l, immA, immB, 0);
|
|
842
|
+
},
|
|
843
|
+
// DECODERS[Arguments.OneRegOneImmOneOff] =
|
|
844
|
+
(args, data, o, lim) => {
|
|
845
|
+
const h = higNibble(data[o]);
|
|
846
|
+
const l = lowNibble(data[o]);
|
|
847
|
+
const split = IntMath.minI32(4, h) + 1;
|
|
848
|
+
const immA = decodeI32(data, o + 1, o + split);
|
|
849
|
+
const offs = decodeI32(data, o + split, lim);
|
|
850
|
+
return args.fill(l, immA, offs, 0);
|
|
851
|
+
},
|
|
852
|
+
// DECODERS[Arguments.TwoReg] =
|
|
853
|
+
(args, data, o, _lim) => {
|
|
854
|
+
return args.fill(higNibble(data[o]), lowNibble(data[o]), 0, 0);
|
|
855
|
+
},
|
|
856
|
+
// DECODERS[Arguments.TwoRegOneImm] =
|
|
857
|
+
(args, data, o, lim) => {
|
|
858
|
+
const hig = higNibble(data[o]);
|
|
859
|
+
const low = lowNibble(data[o]);
|
|
860
|
+
return args.fill(hig, low, decodeI32(data, o + 1, lim), 0);
|
|
861
|
+
},
|
|
862
|
+
// DECODERS[Arguments.TwoRegOneOff] =
|
|
863
|
+
(args, data, o, lim) => {
|
|
864
|
+
const hig = higNibble(data[o]);
|
|
865
|
+
const low = lowNibble(data[o]);
|
|
866
|
+
return args.fill(hig, low, decodeI32(data, o + 1, lim), 0);
|
|
867
|
+
},
|
|
868
|
+
// DECODERS[Arguments.TwoRegTwoImm] =
|
|
869
|
+
(args, data, o, lim) => {
|
|
870
|
+
const hig = higNibble(data[o]);
|
|
871
|
+
const low = lowNibble(data[o]);
|
|
872
|
+
const result = twoImm(args, data, o + 1, lim);
|
|
873
|
+
return args.fill(hig, low, result.a, result.b);
|
|
874
|
+
},
|
|
875
|
+
// DECODERS[Arguments.ThreeReg] =
|
|
876
|
+
(args, data, o, _lim) => {
|
|
877
|
+
const hig = higNibble(data[o]);
|
|
878
|
+
const low = lowNibble(data[o]);
|
|
879
|
+
const b = lowNibble(data[o + 1]);
|
|
880
|
+
return args.fill(hig, low, b, 0);
|
|
881
|
+
}
|
|
882
|
+
]);
|
|
883
|
+
function lowNibble(byte) {
|
|
884
|
+
return byte & 15;
|
|
885
|
+
}
|
|
886
|
+
function higNibble(byte) {
|
|
887
|
+
return byte >> 4;
|
|
888
|
+
}
|
|
889
|
+
function decodeI32(input, start, end) {
|
|
890
|
+
if (end <= start) {
|
|
891
|
+
return 0;
|
|
892
|
+
}
|
|
893
|
+
const l = end - start;
|
|
894
|
+
const len = l < 4 ? l : 4;
|
|
895
|
+
let num = 0;
|
|
896
|
+
for (let i = 0; i < len; i++) {
|
|
897
|
+
num |= u32(input[start + i]) << i * 8;
|
|
898
|
+
}
|
|
899
|
+
const msb = portable.staticArrayAt(input, start + len - 1) & 128;
|
|
900
|
+
if (len < 4 && msb > 0) {
|
|
901
|
+
num |= 4294967295 << len * 8;
|
|
902
|
+
}
|
|
903
|
+
return num;
|
|
904
|
+
}
|
|
905
|
+
function decodeU32(data, offset) {
|
|
906
|
+
let num = u32(data[offset + 0]);
|
|
907
|
+
num |= u32(data[offset + 1]) << 8;
|
|
908
|
+
num |= u32(data[offset + 2]) << 16;
|
|
909
|
+
num |= u32(data[offset + 3]) << 24;
|
|
910
|
+
return portable.asU32(num);
|
|
911
|
+
}
|
|
912
|
+
|
|
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
|
+
};
|
|
920
|
+
function gasCounter(gas) {
|
|
921
|
+
return new GasCounter(gas);
|
|
922
|
+
}
|
|
923
|
+
var GasCounter = class {
|
|
924
|
+
constructor(gas) {
|
|
925
|
+
this.gas = gas;
|
|
926
|
+
}
|
|
927
|
+
set(g2) {
|
|
928
|
+
this.gas = g2;
|
|
929
|
+
}
|
|
930
|
+
get() {
|
|
931
|
+
return this.gas;
|
|
932
|
+
}
|
|
933
|
+
sub(g2) {
|
|
934
|
+
const cost = u64(g2);
|
|
935
|
+
if (cost > this.gas) {
|
|
936
|
+
this.gas = u64(0);
|
|
937
|
+
return true;
|
|
938
|
+
}
|
|
939
|
+
this.gas = this.gas - cost;
|
|
940
|
+
return false;
|
|
941
|
+
}
|
|
942
|
+
};
|
|
943
|
+
__decorate3([
|
|
944
|
+
inline
|
|
945
|
+
], GasCounter.prototype, "sub", null);
|
|
946
|
+
|
|
947
|
+
// dist/build/js/assembly/instructions.js
|
|
948
|
+
var Instruction = class {
|
|
949
|
+
constructor() {
|
|
950
|
+
this.name = "";
|
|
951
|
+
this.kind = Arguments.Zero;
|
|
952
|
+
this.gas = u32(0);
|
|
953
|
+
this.isTerminating = false;
|
|
954
|
+
}
|
|
955
|
+
};
|
|
956
|
+
function instruction(name, kind, gas, isTerminating = false) {
|
|
957
|
+
const i = new Instruction();
|
|
958
|
+
i.name = name;
|
|
959
|
+
i.kind = kind;
|
|
960
|
+
i.gas = u32(gas);
|
|
961
|
+
i.isTerminating = isTerminating;
|
|
962
|
+
return i;
|
|
963
|
+
}
|
|
964
|
+
var MISSING_INSTRUCTION = instruction("INVALID", Arguments.Zero, 1, false);
|
|
965
|
+
var SBRK = instruction("SBRK", Arguments.TwoReg, 1);
|
|
966
|
+
var INSTRUCTIONS = StaticArray.fromArray([
|
|
967
|
+
/* 000 */
|
|
968
|
+
instruction("TRAP", Arguments.Zero, 1, true),
|
|
969
|
+
/* 001 */
|
|
970
|
+
instruction("FALLTHROUGH", Arguments.Zero, 1, true),
|
|
971
|
+
MISSING_INSTRUCTION,
|
|
972
|
+
MISSING_INSTRUCTION,
|
|
973
|
+
MISSING_INSTRUCTION,
|
|
974
|
+
MISSING_INSTRUCTION,
|
|
975
|
+
MISSING_INSTRUCTION,
|
|
976
|
+
MISSING_INSTRUCTION,
|
|
977
|
+
MISSING_INSTRUCTION,
|
|
978
|
+
MISSING_INSTRUCTION,
|
|
979
|
+
/* 010 */
|
|
980
|
+
instruction("ECALLI", Arguments.OneImm, 1),
|
|
981
|
+
MISSING_INSTRUCTION,
|
|
982
|
+
MISSING_INSTRUCTION,
|
|
983
|
+
MISSING_INSTRUCTION,
|
|
984
|
+
MISSING_INSTRUCTION,
|
|
985
|
+
MISSING_INSTRUCTION,
|
|
986
|
+
MISSING_INSTRUCTION,
|
|
987
|
+
MISSING_INSTRUCTION,
|
|
988
|
+
MISSING_INSTRUCTION,
|
|
989
|
+
MISSING_INSTRUCTION,
|
|
990
|
+
/* 020 */
|
|
991
|
+
instruction("LOAD_IMM_64", Arguments.OneRegOneExtImm, 1),
|
|
992
|
+
MISSING_INSTRUCTION,
|
|
993
|
+
MISSING_INSTRUCTION,
|
|
994
|
+
MISSING_INSTRUCTION,
|
|
995
|
+
MISSING_INSTRUCTION,
|
|
996
|
+
MISSING_INSTRUCTION,
|
|
997
|
+
MISSING_INSTRUCTION,
|
|
998
|
+
MISSING_INSTRUCTION,
|
|
999
|
+
MISSING_INSTRUCTION,
|
|
1000
|
+
MISSING_INSTRUCTION,
|
|
1001
|
+
/* 030 */
|
|
1002
|
+
instruction("STORE_IMM_U8", Arguments.TwoImm, 1),
|
|
1003
|
+
/* 031 */
|
|
1004
|
+
instruction("STORE_IMM_U16", Arguments.TwoImm, 1),
|
|
1005
|
+
/* 032 */
|
|
1006
|
+
instruction("STORE_IMM_U32", Arguments.TwoImm, 1),
|
|
1007
|
+
/* 033 */
|
|
1008
|
+
instruction("STORE_IMM_U64", Arguments.TwoImm, 1),
|
|
1009
|
+
MISSING_INSTRUCTION,
|
|
1010
|
+
MISSING_INSTRUCTION,
|
|
1011
|
+
MISSING_INSTRUCTION,
|
|
1012
|
+
MISSING_INSTRUCTION,
|
|
1013
|
+
MISSING_INSTRUCTION,
|
|
1014
|
+
MISSING_INSTRUCTION,
|
|
1015
|
+
/* 040 */
|
|
1016
|
+
instruction("JUMP", Arguments.OneOff, 1, true),
|
|
1017
|
+
MISSING_INSTRUCTION,
|
|
1018
|
+
MISSING_INSTRUCTION,
|
|
1019
|
+
MISSING_INSTRUCTION,
|
|
1020
|
+
MISSING_INSTRUCTION,
|
|
1021
|
+
MISSING_INSTRUCTION,
|
|
1022
|
+
MISSING_INSTRUCTION,
|
|
1023
|
+
MISSING_INSTRUCTION,
|
|
1024
|
+
MISSING_INSTRUCTION,
|
|
1025
|
+
MISSING_INSTRUCTION,
|
|
1026
|
+
/* 050 */
|
|
1027
|
+
instruction("JUMP_IND", Arguments.OneRegOneImm, 1, true),
|
|
1028
|
+
/* 051 */
|
|
1029
|
+
instruction("LOAD_IMM", Arguments.OneRegOneImm, 1),
|
|
1030
|
+
/* 052 */
|
|
1031
|
+
instruction("LOAD_U8", Arguments.OneRegOneImm, 1),
|
|
1032
|
+
/* 053 */
|
|
1033
|
+
instruction("LOAD_I8", Arguments.OneRegOneImm, 1),
|
|
1034
|
+
/* 054 */
|
|
1035
|
+
instruction("LOAD_U16", Arguments.OneRegOneImm, 1),
|
|
1036
|
+
/* 055 */
|
|
1037
|
+
instruction("LOAD_I16", Arguments.OneRegOneImm, 1),
|
|
1038
|
+
/* 056 */
|
|
1039
|
+
instruction("LOAD_U32", Arguments.OneRegOneImm, 1),
|
|
1040
|
+
/* 057 */
|
|
1041
|
+
instruction("LOAD_I32", Arguments.OneRegOneImm, 1),
|
|
1042
|
+
/* 058 */
|
|
1043
|
+
instruction("LOAD_U64", Arguments.OneRegOneImm, 1),
|
|
1044
|
+
/* 059 */
|
|
1045
|
+
instruction("STORE_U8", Arguments.OneRegOneImm, 1),
|
|
1046
|
+
/* 060 */
|
|
1047
|
+
instruction("STORE_U16", Arguments.OneRegOneImm, 1),
|
|
1048
|
+
/* 061 */
|
|
1049
|
+
instruction("STORE_U32", Arguments.OneRegOneImm, 1),
|
|
1050
|
+
/* 062 */
|
|
1051
|
+
instruction("STORE_U64", Arguments.OneRegOneImm, 1),
|
|
1052
|
+
MISSING_INSTRUCTION,
|
|
1053
|
+
MISSING_INSTRUCTION,
|
|
1054
|
+
MISSING_INSTRUCTION,
|
|
1055
|
+
MISSING_INSTRUCTION,
|
|
1056
|
+
MISSING_INSTRUCTION,
|
|
1057
|
+
MISSING_INSTRUCTION,
|
|
1058
|
+
MISSING_INSTRUCTION,
|
|
1059
|
+
/* 070 */
|
|
1060
|
+
instruction("STORE_IMM_IND_U8", Arguments.OneRegTwoImm, 1),
|
|
1061
|
+
/* 071 */
|
|
1062
|
+
instruction("STORE_IMM_IND_U16", Arguments.OneRegTwoImm, 1),
|
|
1063
|
+
/* 072 */
|
|
1064
|
+
instruction("STORE_IMM_IND_U32", Arguments.OneRegTwoImm, 1),
|
|
1065
|
+
/* 073 */
|
|
1066
|
+
instruction("STORE_IMM_IND_U64", Arguments.OneRegTwoImm, 1),
|
|
1067
|
+
MISSING_INSTRUCTION,
|
|
1068
|
+
MISSING_INSTRUCTION,
|
|
1069
|
+
MISSING_INSTRUCTION,
|
|
1070
|
+
MISSING_INSTRUCTION,
|
|
1071
|
+
MISSING_INSTRUCTION,
|
|
1072
|
+
MISSING_INSTRUCTION,
|
|
1073
|
+
/* 080 */
|
|
1074
|
+
instruction("LOAD_IMM_JUMP", Arguments.OneRegOneImmOneOff, 1, true),
|
|
1075
|
+
/* 081 */
|
|
1076
|
+
instruction("BRANCH_EQ_IMM", Arguments.OneRegOneImmOneOff, 1, true),
|
|
1077
|
+
/* 082 */
|
|
1078
|
+
instruction("BRANCH_NE_IMM", Arguments.OneRegOneImmOneOff, 1, true),
|
|
1079
|
+
/* 083 */
|
|
1080
|
+
instruction("BRANCH_LT_U_IMM", Arguments.OneRegOneImmOneOff, 1, true),
|
|
1081
|
+
/* 084 */
|
|
1082
|
+
instruction("BRANCH_LE_U_IMM", Arguments.OneRegOneImmOneOff, 1, true),
|
|
1083
|
+
/* 085 */
|
|
1084
|
+
instruction("BRANCH_GE_U_IMM", Arguments.OneRegOneImmOneOff, 1, true),
|
|
1085
|
+
/* 086 */
|
|
1086
|
+
instruction("BRANCH_GT_U_IMM", Arguments.OneRegOneImmOneOff, 1, true),
|
|
1087
|
+
/* 087 */
|
|
1088
|
+
instruction("BRANCH_LT_S_IMM", Arguments.OneRegOneImmOneOff, 1, true),
|
|
1089
|
+
/* 088 */
|
|
1090
|
+
instruction("BRANCH_LE_S_IMM", Arguments.OneRegOneImmOneOff, 1, true),
|
|
1091
|
+
/* 089 */
|
|
1092
|
+
instruction("BRANCH_GE_S_IMM", Arguments.OneRegOneImmOneOff, 1, true),
|
|
1093
|
+
/* 090 */
|
|
1094
|
+
instruction("BRANCH_GT_S_IMM", Arguments.OneRegOneImmOneOff, 1, true),
|
|
1095
|
+
MISSING_INSTRUCTION,
|
|
1096
|
+
MISSING_INSTRUCTION,
|
|
1097
|
+
MISSING_INSTRUCTION,
|
|
1098
|
+
MISSING_INSTRUCTION,
|
|
1099
|
+
MISSING_INSTRUCTION,
|
|
1100
|
+
MISSING_INSTRUCTION,
|
|
1101
|
+
MISSING_INSTRUCTION,
|
|
1102
|
+
MISSING_INSTRUCTION,
|
|
1103
|
+
MISSING_INSTRUCTION,
|
|
1104
|
+
/* 100 */
|
|
1105
|
+
instruction("MOVE_REG", Arguments.TwoReg, 1),
|
|
1106
|
+
/* 101 */
|
|
1107
|
+
SBRK,
|
|
1108
|
+
/* 102 */
|
|
1109
|
+
instruction("COUNT_SET_BITS_64", Arguments.TwoReg, 1),
|
|
1110
|
+
/* 103 */
|
|
1111
|
+
instruction("COUNT_SET_BITS_32", Arguments.TwoReg, 1),
|
|
1112
|
+
/* 104 */
|
|
1113
|
+
instruction("LEADING_ZERO_BITS_64", Arguments.TwoReg, 1),
|
|
1114
|
+
/* 105 */
|
|
1115
|
+
instruction("LEADING_ZERO_BITS_32", Arguments.TwoReg, 1),
|
|
1116
|
+
/* 106 */
|
|
1117
|
+
instruction("TRAILING_ZERO_BITS_64", Arguments.TwoReg, 1),
|
|
1118
|
+
/* 107 */
|
|
1119
|
+
instruction("TRAILING_ZERO_BITS_32", Arguments.TwoReg, 1),
|
|
1120
|
+
/* 108 */
|
|
1121
|
+
instruction("SIGN_EXTEND_8", Arguments.TwoReg, 1),
|
|
1122
|
+
/* 109 */
|
|
1123
|
+
instruction("SIGN_EXTEND_16", Arguments.TwoReg, 1),
|
|
1124
|
+
/* 110 */
|
|
1125
|
+
instruction("ZERO_EXTEND_16", Arguments.TwoReg, 1),
|
|
1126
|
+
/* 111 */
|
|
1127
|
+
instruction("REVERSE_BYTES", Arguments.TwoReg, 1),
|
|
1128
|
+
MISSING_INSTRUCTION,
|
|
1129
|
+
MISSING_INSTRUCTION,
|
|
1130
|
+
MISSING_INSTRUCTION,
|
|
1131
|
+
MISSING_INSTRUCTION,
|
|
1132
|
+
MISSING_INSTRUCTION,
|
|
1133
|
+
MISSING_INSTRUCTION,
|
|
1134
|
+
MISSING_INSTRUCTION,
|
|
1135
|
+
MISSING_INSTRUCTION,
|
|
1136
|
+
/* 120 */
|
|
1137
|
+
instruction("STORE_IND_U8", Arguments.TwoRegOneImm, 1),
|
|
1138
|
+
/* 121 */
|
|
1139
|
+
instruction("STORE_IND_U16", Arguments.TwoRegOneImm, 1),
|
|
1140
|
+
/* 122 */
|
|
1141
|
+
instruction("STORE_IND_U32", Arguments.TwoRegOneImm, 1),
|
|
1142
|
+
/* 123 */
|
|
1143
|
+
instruction("STORE_IND_U64", Arguments.TwoRegOneImm, 1),
|
|
1144
|
+
/* 124 */
|
|
1145
|
+
instruction("LOAD_IND_U8", Arguments.TwoRegOneImm, 1),
|
|
1146
|
+
/* 125 */
|
|
1147
|
+
instruction("LOAD_IND_I8", Arguments.TwoRegOneImm, 1),
|
|
1148
|
+
/* 126 */
|
|
1149
|
+
instruction("LOAD_IND_U16", Arguments.TwoRegOneImm, 1),
|
|
1150
|
+
/* 127 */
|
|
1151
|
+
instruction("LOAD_IND_I16", Arguments.TwoRegOneImm, 1),
|
|
1152
|
+
/* 128 */
|
|
1153
|
+
instruction("LOAD_IND_U32", Arguments.TwoRegOneImm, 1),
|
|
1154
|
+
/* 129 */
|
|
1155
|
+
instruction("LOAD_IND_I32", Arguments.TwoRegOneImm, 1),
|
|
1156
|
+
/* 130 */
|
|
1157
|
+
instruction("LOAD_IND_U64", Arguments.TwoRegOneImm, 1),
|
|
1158
|
+
/* 131 */
|
|
1159
|
+
instruction("ADD_IMM_32", Arguments.TwoRegOneImm, 1),
|
|
1160
|
+
/* 132 */
|
|
1161
|
+
instruction("AND_IMM", Arguments.TwoRegOneImm, 1),
|
|
1162
|
+
/* 133 */
|
|
1163
|
+
instruction("XOR_IMM", Arguments.TwoRegOneImm, 1),
|
|
1164
|
+
/* 134 */
|
|
1165
|
+
instruction("OR_IMM", Arguments.TwoRegOneImm, 1),
|
|
1166
|
+
/* 135 */
|
|
1167
|
+
instruction("MUL_IMM_32", Arguments.TwoRegOneImm, 1),
|
|
1168
|
+
/* 136 */
|
|
1169
|
+
instruction("SET_LT_U_IMM", Arguments.TwoRegOneImm, 1),
|
|
1170
|
+
/* 137 */
|
|
1171
|
+
instruction("SET_LT_S_IMM", Arguments.TwoRegOneImm, 1),
|
|
1172
|
+
/* 138 */
|
|
1173
|
+
instruction("SHLO_L_IMM_32", Arguments.TwoRegOneImm, 1),
|
|
1174
|
+
/* 139 */
|
|
1175
|
+
instruction("SHLO_R_IMM_32", Arguments.TwoRegOneImm, 1),
|
|
1176
|
+
/* 140 */
|
|
1177
|
+
instruction("SHAR_R_IMM_32", Arguments.TwoRegOneImm, 1),
|
|
1178
|
+
/* 141 */
|
|
1179
|
+
instruction("NEG_ADD_IMM_32", Arguments.TwoRegOneImm, 1),
|
|
1180
|
+
/* 142 */
|
|
1181
|
+
instruction("SET_GT_U_IMM", Arguments.TwoRegOneImm, 1),
|
|
1182
|
+
/* 143 */
|
|
1183
|
+
instruction("SET_GT_S_IMM", Arguments.TwoRegOneImm, 1),
|
|
1184
|
+
/* 144 */
|
|
1185
|
+
instruction("SHLO_L_IMM_ALT_32", Arguments.TwoRegOneImm, 1),
|
|
1186
|
+
/* 145 */
|
|
1187
|
+
instruction("SHLO_R_IMM_ALT_32", Arguments.TwoRegOneImm, 1),
|
|
1188
|
+
/* 146 */
|
|
1189
|
+
instruction("SHAR_R_IMM_ALT_32", Arguments.TwoRegOneImm, 1),
|
|
1190
|
+
/* 147 */
|
|
1191
|
+
instruction("CMOV_IZ_IMM", Arguments.TwoRegOneImm, 1),
|
|
1192
|
+
/* 148 */
|
|
1193
|
+
instruction("CMOV_NZ_IMM", Arguments.TwoRegOneImm, 1),
|
|
1194
|
+
/* 149 */
|
|
1195
|
+
instruction("ADD_IMM_64", Arguments.TwoRegOneImm, 1),
|
|
1196
|
+
/* 150 */
|
|
1197
|
+
instruction("MUL_IMM_64", Arguments.TwoRegOneImm, 1),
|
|
1198
|
+
/* 151 */
|
|
1199
|
+
instruction("SHLO_L_IMM_64", Arguments.TwoRegOneImm, 1),
|
|
1200
|
+
/* 152 */
|
|
1201
|
+
instruction("SHLO_R_IMM_64", Arguments.TwoRegOneImm, 1),
|
|
1202
|
+
/* 153 */
|
|
1203
|
+
instruction("SHAR_R_IMM_64", Arguments.TwoRegOneImm, 1),
|
|
1204
|
+
/* 154 */
|
|
1205
|
+
instruction("NEG_ADD_IMM_64", Arguments.TwoRegOneImm, 1),
|
|
1206
|
+
/* 155 */
|
|
1207
|
+
instruction("SHLO_L_IMM_ALT_64", Arguments.TwoRegOneImm, 1),
|
|
1208
|
+
/* 156 */
|
|
1209
|
+
instruction("SHLO_R_IMM_ALT_64", Arguments.TwoRegOneImm, 1),
|
|
1210
|
+
/* 157 */
|
|
1211
|
+
instruction("SHAR_R_IMM_ALT_64", Arguments.TwoRegOneImm, 1),
|
|
1212
|
+
/* 158 */
|
|
1213
|
+
instruction("ROT_R_64_IMM", Arguments.TwoRegOneImm, 1),
|
|
1214
|
+
/* 159 */
|
|
1215
|
+
instruction("ROT_R_64_IMM_ALT", Arguments.TwoRegOneImm, 1),
|
|
1216
|
+
/* 160 */
|
|
1217
|
+
instruction("ROT_R_32_IMM", Arguments.TwoRegOneImm, 1),
|
|
1218
|
+
/* 161 */
|
|
1219
|
+
instruction("ROT_R_32_IMM_ALT", Arguments.TwoRegOneImm, 1),
|
|
1220
|
+
MISSING_INSTRUCTION,
|
|
1221
|
+
MISSING_INSTRUCTION,
|
|
1222
|
+
MISSING_INSTRUCTION,
|
|
1223
|
+
MISSING_INSTRUCTION,
|
|
1224
|
+
MISSING_INSTRUCTION,
|
|
1225
|
+
MISSING_INSTRUCTION,
|
|
1226
|
+
MISSING_INSTRUCTION,
|
|
1227
|
+
MISSING_INSTRUCTION,
|
|
1228
|
+
/* 170 */
|
|
1229
|
+
instruction("BRANCH_EQ", Arguments.TwoRegOneOff, 1, true),
|
|
1230
|
+
/* 171 */
|
|
1231
|
+
instruction("BRANCH_NE", Arguments.TwoRegOneOff, 1, true),
|
|
1232
|
+
/* 172 */
|
|
1233
|
+
instruction("BRANCH_LT_U", Arguments.TwoRegOneOff, 1, true),
|
|
1234
|
+
/* 173 */
|
|
1235
|
+
instruction("BRANCH_LT_S", Arguments.TwoRegOneOff, 1, true),
|
|
1236
|
+
/* 174 */
|
|
1237
|
+
instruction("BRANCH_GE_U", Arguments.TwoRegOneOff, 1, true),
|
|
1238
|
+
/* 175 */
|
|
1239
|
+
instruction("BRANCH_GE_S", Arguments.TwoRegOneOff, 1, true),
|
|
1240
|
+
MISSING_INSTRUCTION,
|
|
1241
|
+
MISSING_INSTRUCTION,
|
|
1242
|
+
MISSING_INSTRUCTION,
|
|
1243
|
+
MISSING_INSTRUCTION,
|
|
1244
|
+
/* 180 */
|
|
1245
|
+
instruction("LOAD_IMM_JUMP_IND", Arguments.TwoRegTwoImm, 1, true),
|
|
1246
|
+
MISSING_INSTRUCTION,
|
|
1247
|
+
MISSING_INSTRUCTION,
|
|
1248
|
+
MISSING_INSTRUCTION,
|
|
1249
|
+
MISSING_INSTRUCTION,
|
|
1250
|
+
MISSING_INSTRUCTION,
|
|
1251
|
+
MISSING_INSTRUCTION,
|
|
1252
|
+
MISSING_INSTRUCTION,
|
|
1253
|
+
MISSING_INSTRUCTION,
|
|
1254
|
+
MISSING_INSTRUCTION,
|
|
1255
|
+
/* 190 */
|
|
1256
|
+
instruction("ADD_32", Arguments.ThreeReg, 1),
|
|
1257
|
+
/* 191 */
|
|
1258
|
+
instruction("SUB_32", Arguments.ThreeReg, 1),
|
|
1259
|
+
/* 192 */
|
|
1260
|
+
instruction("MUL_32", Arguments.ThreeReg, 1),
|
|
1261
|
+
/* 193 */
|
|
1262
|
+
instruction("DIV_U_32", Arguments.ThreeReg, 1),
|
|
1263
|
+
/* 194 */
|
|
1264
|
+
instruction("DIV_S_32", Arguments.ThreeReg, 1),
|
|
1265
|
+
/* 195 */
|
|
1266
|
+
instruction("REM_U_32", Arguments.ThreeReg, 1),
|
|
1267
|
+
/* 196 */
|
|
1268
|
+
instruction("REM_S_32", Arguments.ThreeReg, 1),
|
|
1269
|
+
/* 197 */
|
|
1270
|
+
instruction("SHLO_L_32", Arguments.ThreeReg, 1),
|
|
1271
|
+
/* 198 */
|
|
1272
|
+
instruction("SHLO_R_32", Arguments.ThreeReg, 1),
|
|
1273
|
+
/* 199 */
|
|
1274
|
+
instruction("SHAR_R_32", Arguments.ThreeReg, 1),
|
|
1275
|
+
/* 200 */
|
|
1276
|
+
instruction("ADD_64", Arguments.ThreeReg, 1),
|
|
1277
|
+
/* 201 */
|
|
1278
|
+
instruction("SUB_64", Arguments.ThreeReg, 1),
|
|
1279
|
+
/* 202 */
|
|
1280
|
+
instruction("MUL_64", Arguments.ThreeReg, 1),
|
|
1281
|
+
/* 203 */
|
|
1282
|
+
instruction("DIV_U_64", Arguments.ThreeReg, 1),
|
|
1283
|
+
/* 204 */
|
|
1284
|
+
instruction("DIV_S_64", Arguments.ThreeReg, 1),
|
|
1285
|
+
/* 205 */
|
|
1286
|
+
instruction("REM_U_64", Arguments.ThreeReg, 1),
|
|
1287
|
+
/* 206 */
|
|
1288
|
+
instruction("REM_S_64", Arguments.ThreeReg, 1),
|
|
1289
|
+
/* 207 */
|
|
1290
|
+
instruction("SHLO_L_64", Arguments.ThreeReg, 1),
|
|
1291
|
+
/* 208 */
|
|
1292
|
+
instruction("SHLO_R_64", Arguments.ThreeReg, 1),
|
|
1293
|
+
/* 209 */
|
|
1294
|
+
instruction("SHAR_R_64", Arguments.ThreeReg, 1),
|
|
1295
|
+
/* 210 */
|
|
1296
|
+
instruction("AND", Arguments.ThreeReg, 1),
|
|
1297
|
+
/* 211 */
|
|
1298
|
+
instruction("XOR", Arguments.ThreeReg, 1),
|
|
1299
|
+
/* 212 */
|
|
1300
|
+
instruction("OR", Arguments.ThreeReg, 1),
|
|
1301
|
+
/* 213 */
|
|
1302
|
+
instruction("MUL_UPPER_S_S", Arguments.ThreeReg, 1),
|
|
1303
|
+
/* 214 */
|
|
1304
|
+
instruction("MUL_UPPER_U_U", Arguments.ThreeReg, 1),
|
|
1305
|
+
/* 215 */
|
|
1306
|
+
instruction("MUL_UPPER_S_U", Arguments.ThreeReg, 1),
|
|
1307
|
+
/* 216 */
|
|
1308
|
+
instruction("SET_LT_U", Arguments.ThreeReg, 1),
|
|
1309
|
+
/* 217 */
|
|
1310
|
+
instruction("SET_LT_S", Arguments.ThreeReg, 1),
|
|
1311
|
+
/* 218 */
|
|
1312
|
+
instruction("CMOV_IZ", Arguments.ThreeReg, 1),
|
|
1313
|
+
/* 219 */
|
|
1314
|
+
instruction("CMOV_NZ", Arguments.ThreeReg, 1),
|
|
1315
|
+
/* 220 */
|
|
1316
|
+
instruction("ROT_L_64", Arguments.ThreeReg, 1),
|
|
1317
|
+
/* 221 */
|
|
1318
|
+
instruction("ROT_L_32", Arguments.ThreeReg, 1),
|
|
1319
|
+
/* 222 */
|
|
1320
|
+
instruction("ROT_R_64", Arguments.ThreeReg, 1),
|
|
1321
|
+
/* 223 */
|
|
1322
|
+
instruction("ROT_R_32", Arguments.ThreeReg, 1),
|
|
1323
|
+
/* 224 */
|
|
1324
|
+
instruction("AND_INV", Arguments.ThreeReg, 1),
|
|
1325
|
+
/* 225 */
|
|
1326
|
+
instruction("OR_INV", Arguments.ThreeReg, 1),
|
|
1327
|
+
/* 226 */
|
|
1328
|
+
instruction("XNOR", Arguments.ThreeReg, 1),
|
|
1329
|
+
/* 227 */
|
|
1330
|
+
instruction("MAX", Arguments.ThreeReg, 1),
|
|
1331
|
+
/* 228 */
|
|
1332
|
+
instruction("MAX_U", Arguments.ThreeReg, 1),
|
|
1333
|
+
/* 229 */
|
|
1334
|
+
instruction("MIN", Arguments.ThreeReg, 1),
|
|
1335
|
+
/* 230 */
|
|
1336
|
+
instruction("MIN_U", Arguments.ThreeReg, 1)
|
|
1337
|
+
]);
|
|
1338
|
+
|
|
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
|
+
};
|
|
1346
|
+
var Result;
|
|
1347
|
+
(function(Result2) {
|
|
1348
|
+
Result2[Result2["PANIC"] = 0] = "PANIC";
|
|
1349
|
+
Result2[Result2["FAULT"] = 1] = "FAULT";
|
|
1350
|
+
Result2[Result2["FAULT_ACCESS"] = 2] = "FAULT_ACCESS";
|
|
1351
|
+
Result2[Result2["HOST"] = 3] = "HOST";
|
|
1352
|
+
})(Result || (Result = {}));
|
|
1353
|
+
var Outcome;
|
|
1354
|
+
(function(Outcome2) {
|
|
1355
|
+
Outcome2[Outcome2["Ok"] = 0] = "Ok";
|
|
1356
|
+
Outcome2[Outcome2["StaticJump"] = 1] = "StaticJump";
|
|
1357
|
+
Outcome2[Outcome2["DynamicJump"] = 2] = "DynamicJump";
|
|
1358
|
+
Outcome2[Outcome2["Result"] = 3] = "Result";
|
|
1359
|
+
})(Outcome || (Outcome = {}));
|
|
1360
|
+
var OutcomeData = class _OutcomeData {
|
|
1361
|
+
constructor() {
|
|
1362
|
+
this.outcome = Outcome.Ok;
|
|
1363
|
+
this.staticJump = 0;
|
|
1364
|
+
this.dJump = 0;
|
|
1365
|
+
this.result = Result.PANIC;
|
|
1366
|
+
this.exitCode = 0;
|
|
1367
|
+
}
|
|
1368
|
+
static status(r, result) {
|
|
1369
|
+
r.outcome = Outcome.Result;
|
|
1370
|
+
r.result = result;
|
|
1371
|
+
return r;
|
|
1372
|
+
}
|
|
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);
|
|
1425
|
+
|
|
1426
|
+
// dist/build/js/assembly/registers.js
|
|
1427
|
+
var NO_OF_REGISTERS = 13;
|
|
1428
|
+
var REG_SIZE_BYTES = 8;
|
|
1429
|
+
function newRegisters() {
|
|
1430
|
+
const regs = new StaticArray(NO_OF_REGISTERS);
|
|
1431
|
+
for (let i = 0; i < NO_OF_REGISTERS; i++) {
|
|
1432
|
+
regs[i] = u64(0);
|
|
1433
|
+
}
|
|
1434
|
+
return regs;
|
|
1435
|
+
}
|
|
1436
|
+
|
|
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
|
+
};
|
|
1444
|
+
function mulUpperUnsigned(a, b) {
|
|
1445
|
+
const aHigh = a >> u64(32);
|
|
1446
|
+
const aLow = a & u64(4294967295);
|
|
1447
|
+
const bHigh = b >> u64(32);
|
|
1448
|
+
const bLow = b & u64(4294967295);
|
|
1449
|
+
const lowLow = portable.u64_mul(aLow, bLow);
|
|
1450
|
+
const lowHigh = portable.u64_mul(aLow, bHigh);
|
|
1451
|
+
const highLow = portable.u64_mul(aHigh, bLow);
|
|
1452
|
+
const highHigh = portable.u64_mul(aHigh, bHigh);
|
|
1453
|
+
const carry = portable.u64_add(portable.u64_add(lowLow >> u64(32), lowHigh & u64(4294967295)), highLow & u64(4294967295));
|
|
1454
|
+
return portable.u64_add(portable.u64_add(portable.u64_add(highHigh, lowHigh >> u64(32)), highLow >> u64(32)), carry >> u64(32));
|
|
1455
|
+
}
|
|
1456
|
+
function mulUpperSigned(a, b) {
|
|
1457
|
+
let isResultNegative = false;
|
|
1458
|
+
let aAbs = a;
|
|
1459
|
+
let bAbs = b;
|
|
1460
|
+
if (a < i64(0)) {
|
|
1461
|
+
isResultNegative = !isResultNegative;
|
|
1462
|
+
aAbs = portable.u64_add(~a, i64(1));
|
|
1463
|
+
}
|
|
1464
|
+
if (b < i64(0)) {
|
|
1465
|
+
isResultNegative = !isResultNegative;
|
|
1466
|
+
bAbs = portable.u64_add(~b, i64(1));
|
|
1467
|
+
}
|
|
1468
|
+
if (isResultNegative) {
|
|
1469
|
+
const upper = mulUpperUnsigned(aAbs, bAbs);
|
|
1470
|
+
const lower = portable.u64_mul(aAbs, bAbs);
|
|
1471
|
+
return portable.u64_add(~upper, lower === u64(0) ? u64(1) : u64(0));
|
|
1472
|
+
}
|
|
1473
|
+
return mulUpperUnsigned(aAbs, bAbs);
|
|
1474
|
+
}
|
|
1475
|
+
function mulUpperSignedUnsigned(a, b) {
|
|
1476
|
+
if (a < i64(0)) {
|
|
1477
|
+
const aAbs = portable.u64_add(~a, u64(1));
|
|
1478
|
+
const upper = mulUpperUnsigned(aAbs, b);
|
|
1479
|
+
const lower = portable.u64_mul(aAbs, b);
|
|
1480
|
+
return portable.u64_add(~upper, lower === u64(0) ? u64(1) : u64(0));
|
|
1481
|
+
}
|
|
1482
|
+
return mulUpperUnsigned(a, b);
|
|
1483
|
+
}
|
|
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);
|
|
1510
|
+
|
|
1511
|
+
// dist/build/js/assembly/instructions/bit.js
|
|
1512
|
+
var count_set_bits_64 = (r, args, regs) => {
|
|
1513
|
+
regs[Inst.reg(args.b)] = portable.popcnt_u64(regs[Inst.reg(args.a)]);
|
|
1514
|
+
return OutcomeData.ok(r);
|
|
1515
|
+
};
|
|
1516
|
+
var count_set_bits_32 = (r, args, regs) => {
|
|
1517
|
+
regs[Inst.reg(args.b)] = u64(portable.popcnt_u32(u32(regs[Inst.reg(args.a)])));
|
|
1518
|
+
return OutcomeData.ok(r);
|
|
1519
|
+
};
|
|
1520
|
+
var leading_zero_bits_64 = (r, args, regs) => {
|
|
1521
|
+
regs[Inst.reg(args.b)] = portable.clz_u64(regs[Inst.reg(args.a)]);
|
|
1522
|
+
return OutcomeData.ok(r);
|
|
1523
|
+
};
|
|
1524
|
+
var leading_zero_bits_32 = (r, args, regs) => {
|
|
1525
|
+
regs[Inst.reg(args.b)] = u64(portable.clz_u32(u32(regs[Inst.reg(args.a)])));
|
|
1526
|
+
return OutcomeData.ok(r);
|
|
1527
|
+
};
|
|
1528
|
+
var trailing_zero_bits_64 = (r, args, regs) => {
|
|
1529
|
+
regs[Inst.reg(args.b)] = portable.ctz_u64(regs[Inst.reg(args.a)]);
|
|
1530
|
+
return OutcomeData.ok(r);
|
|
1531
|
+
};
|
|
1532
|
+
var trailing_zero_bits_32 = (r, args, regs) => {
|
|
1533
|
+
regs[Inst.reg(args.b)] = u64(portable.ctz_u32(u32(regs[Inst.reg(args.a)])));
|
|
1534
|
+
return OutcomeData.ok(r);
|
|
1535
|
+
};
|
|
1536
|
+
var sign_extend_8 = (r, args, regs) => {
|
|
1537
|
+
regs[Inst.reg(args.b)] = Inst.u8SignExtend(u8(regs[Inst.reg(args.a)]));
|
|
1538
|
+
return OutcomeData.ok(r);
|
|
1539
|
+
};
|
|
1540
|
+
var sign_extend_16 = (r, args, regs) => {
|
|
1541
|
+
regs[Inst.reg(args.b)] = Inst.u16SignExtend(u16(regs[Inst.reg(args.a)]));
|
|
1542
|
+
return OutcomeData.ok(r);
|
|
1543
|
+
};
|
|
1544
|
+
var zero_extend_16 = (r, args, regs) => {
|
|
1545
|
+
regs[Inst.reg(args.b)] = u64(u16(regs[Inst.reg(args.a)]));
|
|
1546
|
+
return OutcomeData.ok(r);
|
|
1547
|
+
};
|
|
1548
|
+
var reverse_bytes = (r, args, regs) => {
|
|
1549
|
+
regs[Inst.reg(args.b)] = portable.bswap_u64(regs[Inst.reg(args.a)]);
|
|
1550
|
+
return OutcomeData.ok(r);
|
|
1551
|
+
};
|
|
1552
|
+
|
|
1553
|
+
// dist/build/js/assembly/instructions/branch.js
|
|
1554
|
+
var branch_eq_imm = (r, args, registers) => {
|
|
1555
|
+
const b = u64(Inst.u32SignExtend(args.b));
|
|
1556
|
+
if (registers[Inst.reg(args.a)] === b) {
|
|
1557
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1558
|
+
}
|
|
1559
|
+
return OutcomeData.ok(r);
|
|
1560
|
+
};
|
|
1561
|
+
var branch_ne_imm = (r, args, registers) => {
|
|
1562
|
+
const b = u64(Inst.u32SignExtend(args.b));
|
|
1563
|
+
if (registers[Inst.reg(args.a)] !== b) {
|
|
1564
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1565
|
+
}
|
|
1566
|
+
return OutcomeData.ok(r);
|
|
1567
|
+
};
|
|
1568
|
+
var branch_lt_u_imm = (r, args, registers) => {
|
|
1569
|
+
const b = u64(Inst.u32SignExtend(args.b));
|
|
1570
|
+
if (registers[Inst.reg(args.a)] < b) {
|
|
1571
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1572
|
+
}
|
|
1573
|
+
return OutcomeData.ok(r);
|
|
1574
|
+
};
|
|
1575
|
+
var branch_le_u_imm = (r, args, registers) => {
|
|
1576
|
+
const b = u64(Inst.u32SignExtend(args.b));
|
|
1577
|
+
if (registers[Inst.reg(args.a)] <= b) {
|
|
1578
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1579
|
+
}
|
|
1580
|
+
return OutcomeData.ok(r);
|
|
1581
|
+
};
|
|
1582
|
+
var branch_ge_u_imm = (r, args, registers) => {
|
|
1583
|
+
const b = u64(Inst.u32SignExtend(args.b));
|
|
1584
|
+
if (registers[Inst.reg(args.a)] >= b) {
|
|
1585
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1586
|
+
}
|
|
1587
|
+
return OutcomeData.ok(r);
|
|
1588
|
+
};
|
|
1589
|
+
var branch_gt_u_imm = (r, args, registers) => {
|
|
1590
|
+
const b = u64(Inst.u32SignExtend(args.b));
|
|
1591
|
+
if (registers[Inst.reg(args.a)] > b) {
|
|
1592
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1593
|
+
}
|
|
1594
|
+
return OutcomeData.ok(r);
|
|
1595
|
+
};
|
|
1596
|
+
var branch_lt_s_imm = (r, args, registers) => {
|
|
1597
|
+
if (i64(registers[Inst.reg(args.a)]) < i64(Inst.u32SignExtend(args.b))) {
|
|
1598
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1599
|
+
}
|
|
1600
|
+
return OutcomeData.ok(r);
|
|
1601
|
+
};
|
|
1602
|
+
var branch_le_s_imm = (r, args, registers) => {
|
|
1603
|
+
if (i64(registers[Inst.reg(args.a)]) <= i64(Inst.u32SignExtend(args.b))) {
|
|
1604
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1605
|
+
}
|
|
1606
|
+
return OutcomeData.ok(r);
|
|
1607
|
+
};
|
|
1608
|
+
var branch_ge_s_imm = (r, args, registers) => {
|
|
1609
|
+
if (i64(registers[Inst.reg(args.a)]) >= i64(Inst.u32SignExtend(args.b))) {
|
|
1610
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1611
|
+
}
|
|
1612
|
+
return OutcomeData.ok(r);
|
|
1613
|
+
};
|
|
1614
|
+
var branch_gt_s_imm = (r, args, registers) => {
|
|
1615
|
+
if (i64(registers[Inst.reg(args.a)]) > i64(Inst.u32SignExtend(args.b))) {
|
|
1616
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1617
|
+
}
|
|
1618
|
+
return OutcomeData.ok(r);
|
|
1619
|
+
};
|
|
1620
|
+
var branch_eq = (r, args, registers) => {
|
|
1621
|
+
if (registers[Inst.reg(args.a)] === registers[Inst.reg(args.b)]) {
|
|
1622
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1623
|
+
}
|
|
1624
|
+
return OutcomeData.ok(r);
|
|
1625
|
+
};
|
|
1626
|
+
var branch_ne = (r, args, registers) => {
|
|
1627
|
+
if (registers[Inst.reg(args.a)] !== registers[Inst.reg(args.b)]) {
|
|
1628
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1629
|
+
}
|
|
1630
|
+
return OutcomeData.ok(r);
|
|
1631
|
+
};
|
|
1632
|
+
var branch_lt_u = (r, args, registers) => {
|
|
1633
|
+
if (registers[Inst.reg(args.b)] < registers[Inst.reg(args.a)]) {
|
|
1634
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1635
|
+
}
|
|
1636
|
+
return OutcomeData.ok(r);
|
|
1637
|
+
};
|
|
1638
|
+
var branch_lt_s = (r, args, registers) => {
|
|
1639
|
+
if (i64(registers[Inst.reg(args.b)]) < i64(registers[Inst.reg(args.a)])) {
|
|
1640
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1641
|
+
}
|
|
1642
|
+
return OutcomeData.ok(r);
|
|
1643
|
+
};
|
|
1644
|
+
var branch_ge_u = (r, args, registers) => {
|
|
1645
|
+
if (registers[Inst.reg(args.b)] >= registers[Inst.reg(args.a)]) {
|
|
1646
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1647
|
+
}
|
|
1648
|
+
return OutcomeData.ok(r);
|
|
1649
|
+
};
|
|
1650
|
+
var branch_ge_s = (r, args, registers) => {
|
|
1651
|
+
if (i64(registers[Inst.reg(args.b)]) >= i64(registers[Inst.reg(args.a)])) {
|
|
1652
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1653
|
+
}
|
|
1654
|
+
return OutcomeData.ok(r);
|
|
1655
|
+
};
|
|
1656
|
+
|
|
1657
|
+
// dist/build/js/assembly/instructions/jump.js
|
|
1658
|
+
var jump = (r, args) => OutcomeData.staticJump(r, args.a);
|
|
1659
|
+
var jump_ind = (r, args, registers) => {
|
|
1660
|
+
const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.b)));
|
|
1661
|
+
return OutcomeData.dJump(r, address);
|
|
1662
|
+
};
|
|
1663
|
+
var load_imm_jump = (r, args, registers) => {
|
|
1664
|
+
registers[Inst.reg(args.a)] = Inst.u32SignExtend(args.b);
|
|
1665
|
+
return OutcomeData.staticJump(r, args.c);
|
|
1666
|
+
};
|
|
1667
|
+
var load_imm_jump_ind = (r, args, registers) => {
|
|
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);
|
|
1671
|
+
};
|
|
1672
|
+
|
|
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
|
+
};
|
|
1680
|
+
var PAGE_SIZE = 2 ** 12;
|
|
1681
|
+
var PAGE_SIZE_SHIFT = 12;
|
|
1682
|
+
var SEGMENT_SIZE = 2 ** 16;
|
|
1683
|
+
var SEGMENT_SIZE_SHIFT = 16;
|
|
1684
|
+
var RESERVED_MEMORY = 2 ** 16;
|
|
1685
|
+
var RESERVED_PAGES = RESERVED_MEMORY / PAGE_SIZE;
|
|
1686
|
+
var Access;
|
|
1687
|
+
(function(Access2) {
|
|
1688
|
+
Access2[Access2["None"] = 0] = "None";
|
|
1689
|
+
Access2[Access2["Read"] = 1] = "Read";
|
|
1690
|
+
Access2[Access2["Write"] = 2] = "Write";
|
|
1691
|
+
})(Access || (Access = {}));
|
|
1692
|
+
var Page = class {
|
|
1693
|
+
constructor(access, raw) {
|
|
1694
|
+
this.access = access;
|
|
1695
|
+
this.raw = raw;
|
|
1696
|
+
}
|
|
1697
|
+
can(access) {
|
|
1698
|
+
return this.access === Access.Write || this.access === access;
|
|
1699
|
+
}
|
|
1700
|
+
};
|
|
1701
|
+
__decorate6([
|
|
1702
|
+
inline
|
|
1703
|
+
], Page.prototype, "can", null);
|
|
1704
|
+
var RawPage = class {
|
|
1705
|
+
constructor(id, page) {
|
|
1706
|
+
this.id = id;
|
|
1707
|
+
this.page = page;
|
|
1708
|
+
}
|
|
1709
|
+
get data() {
|
|
1710
|
+
return this.page;
|
|
1711
|
+
}
|
|
1712
|
+
};
|
|
1713
|
+
__decorate6([
|
|
1714
|
+
inline
|
|
1715
|
+
], RawPage.prototype, "data", null);
|
|
1716
|
+
var Arena = class {
|
|
1717
|
+
constructor(pageCount) {
|
|
1718
|
+
this.arenaBytes = PAGE_SIZE * pageCount;
|
|
1719
|
+
this.free = [];
|
|
1720
|
+
this.extraPageIndex = pageCount;
|
|
1721
|
+
const data = new ArrayBuffer(this.arenaBytes);
|
|
1722
|
+
for (let i = 0; i < pageCount; i++) {
|
|
1723
|
+
this.free.unshift(new RawPage(i, portable.uint8ArrayView(data, i * PAGE_SIZE, PAGE_SIZE)));
|
|
1724
|
+
}
|
|
1725
|
+
}
|
|
1726
|
+
acquire() {
|
|
1727
|
+
if (this.free.length > 0) {
|
|
1728
|
+
return this.free.pop();
|
|
1729
|
+
}
|
|
1730
|
+
const allocatedMemory = this.extraPageIndex * PAGE_SIZE;
|
|
1731
|
+
if (allocatedMemory === this.arenaBytes) {
|
|
1732
|
+
console.log("Warning: Run out of pages! Allocating.");
|
|
1733
|
+
}
|
|
1734
|
+
const data = new Uint8Array(PAGE_SIZE);
|
|
1735
|
+
this.extraPageIndex += 1;
|
|
1736
|
+
return new RawPage(this.extraPageIndex, data);
|
|
1737
|
+
}
|
|
1738
|
+
release(page) {
|
|
1739
|
+
this.free.push(page);
|
|
1740
|
+
}
|
|
1741
|
+
};
|
|
1742
|
+
|
|
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
|
+
};
|
|
1750
|
+
var MaybePageFault = class {
|
|
1751
|
+
constructor() {
|
|
1752
|
+
this.isFault = false;
|
|
1753
|
+
this.isAccess = false;
|
|
1754
|
+
this.fault = 0;
|
|
1755
|
+
}
|
|
1756
|
+
};
|
|
1757
|
+
var EMPTY_UINT8ARRAY = new Uint8Array(0);
|
|
1758
|
+
var EMPTY_PAGE = new Page(Access.None, new RawPage(-1, EMPTY_UINT8ARRAY));
|
|
1759
|
+
var Chunks = class {
|
|
1760
|
+
constructor() {
|
|
1761
|
+
this.firstPageData = EMPTY_UINT8ARRAY;
|
|
1762
|
+
this.firstPageOffset = 0;
|
|
1763
|
+
this.secondPageData = EMPTY_UINT8ARRAY;
|
|
1764
|
+
this.secondPageEnd = 0;
|
|
1765
|
+
}
|
|
1766
|
+
};
|
|
1767
|
+
var PageResult = class {
|
|
1768
|
+
constructor() {
|
|
1769
|
+
this.page = EMPTY_PAGE;
|
|
1770
|
+
this.relativeAddress = 0;
|
|
1771
|
+
}
|
|
1772
|
+
};
|
|
1773
|
+
var MEMORY_SIZE = 4294967296;
|
|
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);
|
|
1813
|
+
var MemoryBuilder = class {
|
|
1814
|
+
constructor(preAllocatePages = 0) {
|
|
1815
|
+
this.pages = /* @__PURE__ */ new Map();
|
|
1816
|
+
this.arena = new Arena(preAllocatePages);
|
|
1817
|
+
}
|
|
1818
|
+
/** Allocates memory pages with given `access`, for given `address` and initialize with `zeroes` */
|
|
1819
|
+
setEmpty(access, address, len) {
|
|
1820
|
+
const endAddress = address + len;
|
|
1821
|
+
for (let currentAddress = address; currentAddress < endAddress; currentAddress += PAGE_SIZE) {
|
|
1822
|
+
this.getOrCreatePageForAddress(access, currentAddress);
|
|
1823
|
+
}
|
|
1824
|
+
return this;
|
|
1825
|
+
}
|
|
1826
|
+
/** Allocates memory pages with given `access`, for given `address` and writes there `data` */
|
|
1827
|
+
setData(access, address, data) {
|
|
1828
|
+
let currentAddress = address;
|
|
1829
|
+
let currentData = data;
|
|
1830
|
+
while (currentData.length > 0) {
|
|
1831
|
+
const page = this.getOrCreatePageForAddress(access, currentAddress);
|
|
1832
|
+
const relAddress = currentAddress % PAGE_SIZE;
|
|
1833
|
+
const spaceInPage = PAGE_SIZE - relAddress;
|
|
1834
|
+
const end = u32(currentData.length) < spaceInPage ? currentData.length : spaceInPage;
|
|
1835
|
+
page.raw.data.set(currentData.subarray(0, end), relAddress);
|
|
1836
|
+
currentAddress = currentAddress + end;
|
|
1837
|
+
currentData = currentData.subarray(end);
|
|
1838
|
+
}
|
|
1839
|
+
return this;
|
|
1840
|
+
}
|
|
1841
|
+
/** Returns memory page for given address (creates if not exists) */
|
|
1842
|
+
getOrCreatePageForAddress(access, address) {
|
|
1843
|
+
const pageIdx = u32(address >> PAGE_SIZE_SHIFT);
|
|
1844
|
+
if (pageIdx < RESERVED_PAGES) {
|
|
1845
|
+
throw new Error(`Attempting to allocate reserved page: ${pageIdx}`);
|
|
1846
|
+
}
|
|
1847
|
+
if (!this.pages.has(pageIdx)) {
|
|
1848
|
+
const page = this.arena.acquire();
|
|
1849
|
+
this.pages.set(pageIdx, new Page(access, page));
|
|
1850
|
+
}
|
|
1851
|
+
return this.pages.get(pageIdx);
|
|
1852
|
+
}
|
|
1853
|
+
build(sbrkAddress = RESERVED_MEMORY, maxHeapPointer = MAX_MEMORY_ADDRESS) {
|
|
1854
|
+
return new Memory(this.arena, this.pages, sbrkAddress, maxHeapPointer);
|
|
1855
|
+
}
|
|
1856
|
+
};
|
|
1857
|
+
var Memory = class {
|
|
1858
|
+
constructor(arena, pages = /* @__PURE__ */ new Map(), sbrkAddress = 0, maxHeapPointer = MAX_MEMORY_ADDRESS) {
|
|
1859
|
+
this.arena = arena;
|
|
1860
|
+
this.pages = pages;
|
|
1861
|
+
this.sbrkAddress = sbrkAddress;
|
|
1862
|
+
this.pageResult = new PageResult();
|
|
1863
|
+
this.chunksResult = new Chunks();
|
|
1864
|
+
this.cache = new PageCache();
|
|
1865
|
+
const sbrkPage = u32(sbrkAddress >> PAGE_SIZE_SHIFT);
|
|
1866
|
+
if (sbrkPage < RESERVED_PAGES) {
|
|
1867
|
+
throw new Error("sbrk within reserved memory is not allowed!");
|
|
1868
|
+
}
|
|
1869
|
+
this.lastAllocatedPage = pages.has(sbrkPage) ? sbrkPage : sbrkPage - 1;
|
|
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
|
+
}
|
|
1876
|
+
}
|
|
1877
|
+
pageDump(index) {
|
|
1878
|
+
const cached = this.cache.lookup(index);
|
|
1879
|
+
if (cached !== null) {
|
|
1880
|
+
return cached.raw.data;
|
|
1881
|
+
}
|
|
1882
|
+
if (!this.pages.has(index)) {
|
|
1883
|
+
return null;
|
|
1884
|
+
}
|
|
1885
|
+
const page = this.pages.get(index);
|
|
1886
|
+
this.cache.insert(index, page);
|
|
1887
|
+
return page.raw.data;
|
|
1888
|
+
}
|
|
1889
|
+
/**
|
|
1890
|
+
* Returns the WASM linear memory pointer (byte offset) for the backing buffer of the page at `pageIndex`.
|
|
1891
|
+
*
|
|
1892
|
+
* Returns `0` if the page does not exist or is not readable (page/access fault).
|
|
1893
|
+
*
|
|
1894
|
+
* This enables efficient memory reading on the JS side without extra WASM allocations:
|
|
1895
|
+
* ```ts
|
|
1896
|
+
* let pagesRead = 0;
|
|
1897
|
+
* for (let address = start; address < end; address += PAGE_SIZE) {
|
|
1898
|
+
* const page = address >> PAGE_SIZE_SHIFT;
|
|
1899
|
+
* const ptr = getPagePointer(page);
|
|
1900
|
+
* if (ptr === 0) {
|
|
1901
|
+
* throw new Error(`Page fault at ${page << PAGE_SIZE_SHIFT}`);
|
|
1902
|
+
* }
|
|
1903
|
+
* destination.set(
|
|
1904
|
+
* new Uint8Array(wasm.instance.exports.memory.buffer, ptr, Math.min(end - address, PAGE_SIZE)),
|
|
1905
|
+
* pagesRead << PAGE_SIZE_SHIFT,
|
|
1906
|
+
* );
|
|
1907
|
+
* pagesRead += 1;
|
|
1908
|
+
* }
|
|
1909
|
+
* ```
|
|
1910
|
+
*/
|
|
1911
|
+
getPagePointer(pageIndex) {
|
|
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);
|
|
1919
|
+
}
|
|
1920
|
+
if (!page.can(Access.Read)) {
|
|
1921
|
+
return 0;
|
|
1922
|
+
}
|
|
1923
|
+
return page.raw.data.dataStart;
|
|
1924
|
+
}
|
|
1925
|
+
free() {
|
|
1926
|
+
const pages = portable.asArray(this.pages.values());
|
|
1927
|
+
for (let i = 0; i < pages.length; i++) {
|
|
1928
|
+
this.arena.release(pages[i].raw);
|
|
1929
|
+
}
|
|
1930
|
+
this.pages.clear();
|
|
1931
|
+
this.cache.clear();
|
|
1932
|
+
}
|
|
1933
|
+
sbrk(faultRes4, amount) {
|
|
1934
|
+
const freeMemoryStart = u64(this.sbrkAddress);
|
|
1935
|
+
if (amount === 0) {
|
|
1936
|
+
faultRes4.isFault = false;
|
|
1937
|
+
return freeMemoryStart;
|
|
1938
|
+
}
|
|
1939
|
+
const newSbrk = portable.u64_add(freeMemoryStart, u64(amount));
|
|
1940
|
+
if (newSbrk > this.maxHeapPointer) {
|
|
1941
|
+
faultRes4.isFault = true;
|
|
1942
|
+
return freeMemoryStart;
|
|
1943
|
+
}
|
|
1944
|
+
this.sbrkAddress = u32(newSbrk);
|
|
1945
|
+
const pageIdx = i32(portable.u64_sub(newSbrk, u64(1)) >> u64(PAGE_SIZE_SHIFT));
|
|
1946
|
+
if (pageIdx === this.lastAllocatedPage) {
|
|
1947
|
+
faultRes4.isFault = false;
|
|
1948
|
+
return freeMemoryStart;
|
|
1949
|
+
}
|
|
1950
|
+
for (let i = this.lastAllocatedPage + 1; i <= pageIdx; i++) {
|
|
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);
|
|
1955
|
+
}
|
|
1956
|
+
this.lastAllocatedPage = pageIdx;
|
|
1957
|
+
faultRes4.isFault = false;
|
|
1958
|
+
return freeMemoryStart;
|
|
1959
|
+
}
|
|
1960
|
+
getU8(faultRes4, address) {
|
|
1961
|
+
return u64(u8(this.getBytesReversed(faultRes4, Access.Read, address, 1)));
|
|
1962
|
+
}
|
|
1963
|
+
getU16(faultRes4, address) {
|
|
1964
|
+
return u64(portable.bswap_u16(u16(this.getBytesReversed(faultRes4, Access.Read, address, 2))));
|
|
1965
|
+
}
|
|
1966
|
+
getU32(faultRes4, address) {
|
|
1967
|
+
return u64(portable.bswap_u32(u32(this.getBytesReversed(faultRes4, Access.Read, address, 4))));
|
|
1968
|
+
}
|
|
1969
|
+
getU64(faultRes4, address) {
|
|
1970
|
+
return portable.bswap_u64(this.getBytesReversed(faultRes4, Access.Read, address, 8));
|
|
1971
|
+
}
|
|
1972
|
+
getI8(faultRes4, address) {
|
|
1973
|
+
return Inst.u8SignExtend(u8(this.getU8(faultRes4, address)));
|
|
1974
|
+
}
|
|
1975
|
+
getI16(faultRes4, address) {
|
|
1976
|
+
return Inst.u16SignExtend(u16(this.getU16(faultRes4, address)));
|
|
1977
|
+
}
|
|
1978
|
+
getI32(faultRes4, address) {
|
|
1979
|
+
return Inst.u32SignExtend(u32(this.getU32(faultRes4, address)));
|
|
1980
|
+
}
|
|
1981
|
+
setU8(faultRes4, address, value) {
|
|
1982
|
+
this.setBytes(faultRes4, address, value, 1);
|
|
1983
|
+
}
|
|
1984
|
+
setU16(faultRes4, address, value) {
|
|
1985
|
+
this.setBytes(faultRes4, address, value, 2);
|
|
1986
|
+
}
|
|
1987
|
+
setU32(faultRes4, address, value) {
|
|
1988
|
+
this.setBytes(faultRes4, address, value, 4);
|
|
1989
|
+
}
|
|
1990
|
+
setU64(faultRes4, address, value) {
|
|
1991
|
+
this.setBytes(faultRes4, address, value, 8);
|
|
1992
|
+
}
|
|
1993
|
+
/**
|
|
1994
|
+
* DO NOT USE.
|
|
1995
|
+
*
|
|
1996
|
+
* @deprecated exposed temporarily for debugger/typeberry API.
|
|
1997
|
+
*/
|
|
1998
|
+
getMemory(fault2, address, length) {
|
|
1999
|
+
if (length > 0) {
|
|
2000
|
+
let nextAddress = address;
|
|
2001
|
+
const pagesToCheck = i32(portable.u64_add(u64(length), u64(PAGE_SIZE - 1)) >> u64(PAGE_SIZE_SHIFT));
|
|
2002
|
+
for (let page = 0; page < pagesToCheck; page++) {
|
|
2003
|
+
const pageData = this.pageResult;
|
|
2004
|
+
this.getPage(fault2, pageData, Access.Read, nextAddress);
|
|
2005
|
+
if (fault2.isFault) {
|
|
2006
|
+
return null;
|
|
2007
|
+
}
|
|
2008
|
+
nextAddress += PAGE_SIZE;
|
|
2009
|
+
}
|
|
2010
|
+
}
|
|
2011
|
+
const destination = new Uint8Array(length);
|
|
2012
|
+
this.bytesRead(fault2, address, destination, 0);
|
|
2013
|
+
if (fault2.isFault) {
|
|
2014
|
+
return null;
|
|
2015
|
+
}
|
|
2016
|
+
return destination;
|
|
2017
|
+
}
|
|
2018
|
+
bytesRead(faultRes4, address, destination, destinationOffset) {
|
|
2019
|
+
let nextAddress = address;
|
|
2020
|
+
let destinationIndex = i32(destinationOffset);
|
|
2021
|
+
while (destinationIndex < destination.length) {
|
|
2022
|
+
const bytesLeft = destination.length - destinationIndex;
|
|
2023
|
+
const pageData = this.pageResult;
|
|
2024
|
+
this.getPage(faultRes4, pageData, Access.Read, nextAddress);
|
|
2025
|
+
if (faultRes4.isFault) {
|
|
2026
|
+
return;
|
|
2027
|
+
}
|
|
2028
|
+
const relAddress = pageData.relativeAddress;
|
|
2029
|
+
const bytesToRead = relAddress + bytesLeft < PAGE_SIZE ? bytesLeft : PAGE_SIZE - pageData.relativeAddress;
|
|
2030
|
+
const pageEnd = relAddress + bytesToRead;
|
|
2031
|
+
const data = pageData.page.raw.data;
|
|
2032
|
+
for (let i = relAddress; i < pageEnd; i++) {
|
|
2033
|
+
destination[destinationIndex] = data[i];
|
|
2034
|
+
destinationIndex++;
|
|
2035
|
+
}
|
|
2036
|
+
nextAddress += bytesToRead;
|
|
2037
|
+
}
|
|
2038
|
+
return;
|
|
2039
|
+
}
|
|
2040
|
+
/** Write bytes from given `source` (with `sourceOffset`) at given `address`. */
|
|
2041
|
+
bytesWrite(faultRes4, address, source, sourceOffset) {
|
|
2042
|
+
let nextAddress = address;
|
|
2043
|
+
let sourceIndex = i32(sourceOffset);
|
|
2044
|
+
while (sourceIndex < source.length) {
|
|
2045
|
+
const bytesLeft = source.length - sourceIndex;
|
|
2046
|
+
const pageData = this.pageResult;
|
|
2047
|
+
this.getPage(faultRes4, pageData, Access.Write, nextAddress);
|
|
2048
|
+
if (faultRes4.isFault) {
|
|
2049
|
+
return;
|
|
2050
|
+
}
|
|
2051
|
+
const relAddress = pageData.relativeAddress;
|
|
2052
|
+
const bytesToWrite = relAddress + bytesLeft < PAGE_SIZE ? bytesLeft : PAGE_SIZE - pageData.relativeAddress;
|
|
2053
|
+
const pageEnd = relAddress + bytesToWrite;
|
|
2054
|
+
const data = pageData.page.raw.data;
|
|
2055
|
+
for (let i = relAddress; i < pageEnd; i++) {
|
|
2056
|
+
data[i] = source[sourceIndex];
|
|
2057
|
+
sourceIndex++;
|
|
2058
|
+
}
|
|
2059
|
+
nextAddress += bytesToWrite;
|
|
2060
|
+
}
|
|
2061
|
+
return;
|
|
2062
|
+
}
|
|
2063
|
+
getPage(faultRes4, pageData, access, address) {
|
|
2064
|
+
const pageIdx = u32(address >> PAGE_SIZE_SHIFT);
|
|
2065
|
+
const relAddress = address & PAGE_SIZE - 1;
|
|
2066
|
+
const cached = this.cache.lookup(pageIdx);
|
|
2067
|
+
if (cached !== null) {
|
|
2068
|
+
if (!cached.can(access)) {
|
|
2069
|
+
fault(faultRes4, pageIdx << PAGE_SIZE_SHIFT);
|
|
2070
|
+
faultRes4.isAccess = true;
|
|
2071
|
+
pageData.page = EMPTY_PAGE;
|
|
2072
|
+
pageData.relativeAddress = relAddress;
|
|
2073
|
+
return;
|
|
2074
|
+
}
|
|
2075
|
+
faultRes4.isFault = false;
|
|
2076
|
+
pageData.page = cached;
|
|
2077
|
+
pageData.relativeAddress = relAddress;
|
|
2078
|
+
return;
|
|
2079
|
+
}
|
|
2080
|
+
if (!this.pages.has(pageIdx)) {
|
|
2081
|
+
fault(faultRes4, pageIdx << PAGE_SIZE_SHIFT);
|
|
2082
|
+
pageData.page = EMPTY_PAGE;
|
|
2083
|
+
pageData.relativeAddress = relAddress;
|
|
2084
|
+
return;
|
|
2085
|
+
}
|
|
2086
|
+
const page = this.pages.get(pageIdx);
|
|
2087
|
+
this.cache.insert(pageIdx, page);
|
|
2088
|
+
if (!page.can(access)) {
|
|
2089
|
+
fault(faultRes4, pageIdx << PAGE_SIZE_SHIFT);
|
|
2090
|
+
faultRes4.isAccess = true;
|
|
2091
|
+
pageData.page = EMPTY_PAGE;
|
|
2092
|
+
pageData.relativeAddress = relAddress;
|
|
2093
|
+
return;
|
|
2094
|
+
}
|
|
2095
|
+
faultRes4.isFault = false;
|
|
2096
|
+
pageData.page = page;
|
|
2097
|
+
pageData.relativeAddress = relAddress;
|
|
2098
|
+
return;
|
|
2099
|
+
}
|
|
2100
|
+
getChunks(faultRes4, chunks, access, address, bytes) {
|
|
2101
|
+
if (bytes === 0) {
|
|
2102
|
+
faultRes4.isFault = false;
|
|
2103
|
+
chunks.firstPageData = EMPTY_UINT8ARRAY;
|
|
2104
|
+
chunks.firstPageOffset = 0;
|
|
2105
|
+
chunks.secondPageData = EMPTY_UINT8ARRAY;
|
|
2106
|
+
chunks.secondPageEnd = 0;
|
|
2107
|
+
return;
|
|
2108
|
+
}
|
|
2109
|
+
const pageData = this.pageResult;
|
|
2110
|
+
this.getPage(faultRes4, pageData, access, address);
|
|
2111
|
+
if (faultRes4.isFault) {
|
|
2112
|
+
return;
|
|
2113
|
+
}
|
|
2114
|
+
const page = pageData.page;
|
|
2115
|
+
const relativeAddress = pageData.relativeAddress;
|
|
2116
|
+
const endAddress = relativeAddress + u32(bytes);
|
|
2117
|
+
const needSecondPage = endAddress > PAGE_SIZE;
|
|
2118
|
+
if (!needSecondPage) {
|
|
2119
|
+
chunks.firstPageData = page.raw.data;
|
|
2120
|
+
chunks.firstPageOffset = relativeAddress;
|
|
2121
|
+
return;
|
|
2122
|
+
}
|
|
2123
|
+
const secondPageIdx = u32((address + u32(bytes)) % MEMORY_SIZE) >> PAGE_SIZE_SHIFT;
|
|
2124
|
+
const secondPageStart = secondPageIdx << PAGE_SIZE_SHIFT;
|
|
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);
|
|
2133
|
+
}
|
|
2134
|
+
if (!secondPage.can(access)) {
|
|
2135
|
+
fault(faultRes4, secondPageStart);
|
|
2136
|
+
faultRes4.isAccess = true;
|
|
2137
|
+
return;
|
|
2138
|
+
}
|
|
2139
|
+
chunks.firstPageData = page.raw.data;
|
|
2140
|
+
chunks.firstPageOffset = relativeAddress;
|
|
2141
|
+
chunks.secondPageData = secondPage.raw.data;
|
|
2142
|
+
chunks.secondPageEnd = relativeAddress + u32(bytes) - PAGE_SIZE;
|
|
2143
|
+
return;
|
|
2144
|
+
}
|
|
2145
|
+
/** Write some bytes to at most 2 pages. */
|
|
2146
|
+
setBytes(faultRes4, address, value, bytes) {
|
|
2147
|
+
const r = this.chunksResult;
|
|
2148
|
+
this.getChunks(faultRes4, r, Access.Write, address, bytes);
|
|
2149
|
+
if (faultRes4.isFault) {
|
|
2150
|
+
return;
|
|
2151
|
+
}
|
|
2152
|
+
let bytesLeft = u64(value);
|
|
2153
|
+
const firstPageEnd = IntMath.minU32(PAGE_SIZE, r.firstPageOffset + bytes);
|
|
2154
|
+
for (let i = r.firstPageOffset; i < firstPageEnd; i++) {
|
|
2155
|
+
r.firstPageData[i] = u8(bytesLeft);
|
|
2156
|
+
bytesLeft >>= u64(8);
|
|
2157
|
+
}
|
|
2158
|
+
for (let i = 0; i < r.secondPageEnd; i++) {
|
|
2159
|
+
r.secondPageData[i] = u8(bytesLeft);
|
|
2160
|
+
bytesLeft >>= u64(8);
|
|
2161
|
+
}
|
|
2162
|
+
}
|
|
2163
|
+
getBytesReversed(faultRes4, access, address, bytes) {
|
|
2164
|
+
this.getChunks(faultRes4, this.chunksResult, access, address, bytes);
|
|
2165
|
+
if (faultRes4.isFault) {
|
|
2166
|
+
return u64(0);
|
|
2167
|
+
}
|
|
2168
|
+
let r = u64(0);
|
|
2169
|
+
const firstPageEnd = IntMath.minU32(PAGE_SIZE, this.chunksResult.firstPageOffset + bytes);
|
|
2170
|
+
for (let i = this.chunksResult.firstPageOffset; i < firstPageEnd; i++) {
|
|
2171
|
+
r = r << u64(8) | u64(this.chunksResult.firstPageData[i]);
|
|
2172
|
+
}
|
|
2173
|
+
for (let i = 0; i < this.chunksResult.secondPageEnd; i++) {
|
|
2174
|
+
r = r << u64(8) | u64(this.chunksResult.secondPageData[i]);
|
|
2175
|
+
}
|
|
2176
|
+
return r;
|
|
2177
|
+
}
|
|
2178
|
+
};
|
|
2179
|
+
function fault(r, address) {
|
|
2180
|
+
r.isFault = true;
|
|
2181
|
+
r.isAccess = false;
|
|
2182
|
+
r.fault = address;
|
|
2183
|
+
}
|
|
2184
|
+
|
|
2185
|
+
// dist/build/js/assembly/instructions/load.js
|
|
2186
|
+
var faultRes = new MaybePageFault();
|
|
2187
|
+
var load_imm_64 = (r, args, registers) => {
|
|
2188
|
+
registers[Inst.reg(args.a)] = portable.u64_add(u64(args.b), u64(args.c) << u64(32));
|
|
2189
|
+
return OutcomeData.ok(r);
|
|
2190
|
+
};
|
|
2191
|
+
var load_imm = (r, args, registers) => {
|
|
2192
|
+
registers[Inst.reg(args.a)] = Inst.u32SignExtend(args.b);
|
|
2193
|
+
return OutcomeData.ok(r);
|
|
2194
|
+
};
|
|
2195
|
+
var load_u8 = (r, args, registers, memory) => {
|
|
2196
|
+
const result = memory.getU8(faultRes, args.b);
|
|
2197
|
+
if (!faultRes.isFault) {
|
|
2198
|
+
registers[Inst.reg(args.a)] = result;
|
|
2199
|
+
}
|
|
2200
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2201
|
+
};
|
|
2202
|
+
var load_i8 = (r, args, registers, memory) => {
|
|
2203
|
+
const result = memory.getI8(faultRes, args.b);
|
|
2204
|
+
if (!faultRes.isFault) {
|
|
2205
|
+
registers[Inst.reg(args.a)] = result;
|
|
2206
|
+
}
|
|
2207
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2208
|
+
};
|
|
2209
|
+
var load_u16 = (r, args, registers, memory) => {
|
|
2210
|
+
const result = memory.getU16(faultRes, args.b);
|
|
2211
|
+
if (!faultRes.isFault) {
|
|
2212
|
+
registers[Inst.reg(args.a)] = result;
|
|
2213
|
+
}
|
|
2214
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2215
|
+
};
|
|
2216
|
+
var load_i16 = (r, args, registers, memory) => {
|
|
2217
|
+
const result = memory.getI16(faultRes, args.b);
|
|
2218
|
+
if (!faultRes.isFault) {
|
|
2219
|
+
registers[Inst.reg(args.a)] = result;
|
|
2220
|
+
}
|
|
2221
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2222
|
+
};
|
|
2223
|
+
var load_u32 = (r, args, registers, memory) => {
|
|
2224
|
+
const result = memory.getU32(faultRes, args.b);
|
|
2225
|
+
if (!faultRes.isFault) {
|
|
2226
|
+
registers[Inst.reg(args.a)] = result;
|
|
2227
|
+
}
|
|
2228
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2229
|
+
};
|
|
2230
|
+
var load_i32 = (r, args, registers, memory) => {
|
|
2231
|
+
const result = memory.getI32(faultRes, args.b);
|
|
2232
|
+
if (!faultRes.isFault) {
|
|
2233
|
+
registers[Inst.reg(args.a)] = result;
|
|
2234
|
+
}
|
|
2235
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2236
|
+
};
|
|
2237
|
+
var load_u64 = (r, args, registers, memory) => {
|
|
2238
|
+
const result = memory.getU64(faultRes, args.b);
|
|
2239
|
+
if (!faultRes.isFault) {
|
|
2240
|
+
registers[Inst.reg(args.a)] = result;
|
|
2241
|
+
}
|
|
2242
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2243
|
+
};
|
|
2244
|
+
var load_ind_u8 = (r, args, registers, memory) => {
|
|
2245
|
+
const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
|
|
2246
|
+
const result = memory.getU8(faultRes, address);
|
|
2247
|
+
if (!faultRes.isFault) {
|
|
2248
|
+
registers[Inst.reg(args.b)] = result;
|
|
2249
|
+
}
|
|
2250
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2251
|
+
};
|
|
2252
|
+
var load_ind_i8 = (r, args, registers, memory) => {
|
|
2253
|
+
const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
|
|
2254
|
+
const result = memory.getI8(faultRes, address);
|
|
2255
|
+
if (!faultRes.isFault) {
|
|
2256
|
+
registers[Inst.reg(args.b)] = result;
|
|
2257
|
+
}
|
|
2258
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2259
|
+
};
|
|
2260
|
+
var load_ind_u16 = (r, args, registers, memory) => {
|
|
2261
|
+
const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
|
|
2262
|
+
const result = memory.getU16(faultRes, address);
|
|
2263
|
+
if (!faultRes.isFault) {
|
|
2264
|
+
registers[Inst.reg(args.b)] = result;
|
|
2265
|
+
}
|
|
2266
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2267
|
+
};
|
|
2268
|
+
var load_ind_i16 = (r, args, registers, memory) => {
|
|
2269
|
+
const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
|
|
2270
|
+
const result = memory.getI16(faultRes, address);
|
|
2271
|
+
if (!faultRes.isFault) {
|
|
2272
|
+
registers[Inst.reg(args.b)] = result;
|
|
2273
|
+
}
|
|
2274
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2275
|
+
};
|
|
2276
|
+
var load_ind_u32 = (r, args, registers, memory) => {
|
|
2277
|
+
const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
|
|
2278
|
+
const result = memory.getU32(faultRes, address);
|
|
2279
|
+
if (!faultRes.isFault) {
|
|
2280
|
+
registers[Inst.reg(args.b)] = result;
|
|
2281
|
+
}
|
|
2282
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2283
|
+
};
|
|
2284
|
+
var load_ind_i32 = (r, args, registers, memory) => {
|
|
2285
|
+
const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
|
|
2286
|
+
const result = memory.getI32(faultRes, address);
|
|
2287
|
+
if (!faultRes.isFault) {
|
|
2288
|
+
registers[Inst.reg(args.b)] = result;
|
|
2289
|
+
}
|
|
2290
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2291
|
+
};
|
|
2292
|
+
var load_ind_u64 = (r, args, registers, memory) => {
|
|
2293
|
+
const address = u32(portable.u64_add(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c)));
|
|
2294
|
+
const result = memory.getU64(faultRes, u32(address));
|
|
2295
|
+
if (!faultRes.isFault) {
|
|
2296
|
+
registers[Inst.reg(args.b)] = result;
|
|
2297
|
+
}
|
|
2298
|
+
return OutcomeData.okOrFault(r, faultRes);
|
|
2299
|
+
};
|
|
2300
|
+
|
|
2301
|
+
// dist/build/js/assembly/instructions/logic.js
|
|
2302
|
+
var and_imm = (r, args, registers) => {
|
|
2303
|
+
registers[Inst.reg(args.b)] = registers[Inst.reg(args.a)] & Inst.u32SignExtend(args.c);
|
|
2304
|
+
return OutcomeData.ok(r);
|
|
2305
|
+
};
|
|
2306
|
+
var xor_imm = (r, args, registers) => {
|
|
2307
|
+
registers[Inst.reg(args.b)] = registers[Inst.reg(args.a)] ^ Inst.u32SignExtend(args.c);
|
|
2308
|
+
return OutcomeData.ok(r);
|
|
2309
|
+
};
|
|
2310
|
+
var or_imm = (r, args, registers) => {
|
|
2311
|
+
registers[Inst.reg(args.b)] = registers[Inst.reg(args.a)] | Inst.u32SignExtend(args.c);
|
|
2312
|
+
return OutcomeData.ok(r);
|
|
2313
|
+
};
|
|
2314
|
+
var and = (r, args, registers) => {
|
|
2315
|
+
registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] & registers[Inst.reg(args.a)];
|
|
2316
|
+
return OutcomeData.ok(r);
|
|
2317
|
+
};
|
|
2318
|
+
var xor = (r, args, registers) => {
|
|
2319
|
+
registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] ^ registers[Inst.reg(args.a)];
|
|
2320
|
+
return OutcomeData.ok(r);
|
|
2321
|
+
};
|
|
2322
|
+
var or = (r, args, registers) => {
|
|
2323
|
+
registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] | registers[Inst.reg(args.a)];
|
|
2324
|
+
return OutcomeData.ok(r);
|
|
2325
|
+
};
|
|
2326
|
+
var and_inv = (r, args, registers) => {
|
|
2327
|
+
registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] & ~registers[Inst.reg(args.a)];
|
|
2328
|
+
return OutcomeData.ok(r);
|
|
2329
|
+
};
|
|
2330
|
+
var or_inv = (r, args, registers) => {
|
|
2331
|
+
registers[Inst.reg(args.c)] = u64(registers[Inst.reg(args.b)] | ~registers[Inst.reg(args.a)]);
|
|
2332
|
+
return OutcomeData.ok(r);
|
|
2333
|
+
};
|
|
2334
|
+
var xnor = (r, args, registers) => {
|
|
2335
|
+
registers[Inst.reg(args.c)] = u64(~(registers[Inst.reg(args.b)] ^ registers[Inst.reg(args.a)]));
|
|
2336
|
+
return OutcomeData.ok(r);
|
|
2337
|
+
};
|
|
2338
|
+
|
|
2339
|
+
// dist/build/js/assembly/instructions/math.js
|
|
2340
|
+
var add_imm_32 = (r, args, registers) => {
|
|
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);
|
|
2345
|
+
};
|
|
2346
|
+
var mul_imm_32 = (r, args, registers) => {
|
|
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);
|
|
2349
|
+
};
|
|
2350
|
+
var neg_add_imm_32 = (r, args, registers) => {
|
|
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);
|
|
2354
|
+
};
|
|
2355
|
+
var add_imm = (r, args, registers) => {
|
|
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);
|
|
2359
|
+
};
|
|
2360
|
+
var mul_imm = (r, args, registers) => {
|
|
2361
|
+
registers[Inst.reg(args.b)] = portable.u64_mul(registers[Inst.reg(args.a)], Inst.u32SignExtend(args.c));
|
|
2362
|
+
return OutcomeData.ok(r);
|
|
2363
|
+
};
|
|
2364
|
+
var neg_add_imm = (r, args, registers) => {
|
|
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);
|
|
2368
|
+
};
|
|
2369
|
+
var add_32 = (r, args, registers) => {
|
|
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);
|
|
2374
|
+
};
|
|
2375
|
+
var sub_32 = (r, args, registers) => {
|
|
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);
|
|
2380
|
+
};
|
|
2381
|
+
var mul_32 = (r, args, registers) => {
|
|
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);
|
|
2384
|
+
};
|
|
2385
|
+
var div_u_32 = (r, args, registers) => {
|
|
2386
|
+
const a = u32(registers[Inst.reg(args.a)]);
|
|
2387
|
+
if (a === 0) {
|
|
2388
|
+
registers[Inst.reg(args.c)] = u64.MAX_VALUE;
|
|
2389
|
+
} else {
|
|
2390
|
+
const b = u32(registers[Inst.reg(args.b)]);
|
|
2391
|
+
registers[Inst.reg(args.c)] = Inst.u32SignExtend(b / a);
|
|
2392
|
+
}
|
|
2393
|
+
return OutcomeData.ok(r);
|
|
2394
|
+
};
|
|
2395
|
+
var div_s_32 = (r, args, registers) => {
|
|
2396
|
+
const b = i64(Inst.u32SignExtend(u32(registers[Inst.reg(args.b)])));
|
|
2397
|
+
const a = i64(Inst.u32SignExtend(u32(registers[Inst.reg(args.a)])));
|
|
2398
|
+
if (a === i64(0)) {
|
|
2399
|
+
registers[Inst.reg(args.c)] = u64.MAX_VALUE;
|
|
2400
|
+
} else if (a === i64(-1) && b === i64(i32.MIN_VALUE)) {
|
|
2401
|
+
registers[Inst.reg(args.c)] = u64(b);
|
|
2402
|
+
} else {
|
|
2403
|
+
registers[Inst.reg(args.c)] = u64(b / a);
|
|
2404
|
+
}
|
|
2405
|
+
return OutcomeData.ok(r);
|
|
2406
|
+
};
|
|
2407
|
+
var rem_u_32 = (r, args, registers) => {
|
|
2408
|
+
const a = u32(registers[Inst.reg(args.a)]);
|
|
2409
|
+
const b = u32(registers[Inst.reg(args.b)]);
|
|
2410
|
+
if (a === 0) {
|
|
2411
|
+
registers[Inst.reg(args.c)] = Inst.u32SignExtend(b);
|
|
2412
|
+
} else {
|
|
2413
|
+
registers[Inst.reg(args.c)] = Inst.u32SignExtend(b % a);
|
|
2414
|
+
}
|
|
2415
|
+
return OutcomeData.ok(r);
|
|
2416
|
+
};
|
|
2417
|
+
var rem_s_32 = (r, args, registers) => {
|
|
2418
|
+
const b = i32(registers[Inst.reg(args.b)]);
|
|
2419
|
+
const a = i32(registers[Inst.reg(args.a)]);
|
|
2420
|
+
if (a === 0) {
|
|
2421
|
+
registers[Inst.reg(args.c)] = u64(i64(b));
|
|
2422
|
+
} else if (a === -1 && b === i32.MIN_VALUE) {
|
|
2423
|
+
registers[Inst.reg(args.c)] = u64(0);
|
|
2424
|
+
} else {
|
|
2425
|
+
registers[Inst.reg(args.c)] = u64(i64(b) % i64(a));
|
|
2426
|
+
}
|
|
2427
|
+
return OutcomeData.ok(r);
|
|
2428
|
+
};
|
|
2429
|
+
var add_64 = (r, args, registers) => {
|
|
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);
|
|
2434
|
+
};
|
|
2435
|
+
var sub = (r, args, registers) => {
|
|
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);
|
|
2440
|
+
};
|
|
2441
|
+
var mul = (r, args, registers) => {
|
|
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);
|
|
2446
|
+
};
|
|
2447
|
+
var div_u = (r, args, registers) => {
|
|
2448
|
+
if (registers[Inst.reg(args.a)] === u64(0)) {
|
|
2449
|
+
registers[Inst.reg(args.c)] = u64.MAX_VALUE;
|
|
2450
|
+
} else {
|
|
2451
|
+
registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] / registers[Inst.reg(args.a)];
|
|
2452
|
+
}
|
|
2453
|
+
return OutcomeData.ok(r);
|
|
2454
|
+
};
|
|
2455
|
+
var div_s = (r, args, registers) => {
|
|
2456
|
+
const b = i64(registers[Inst.reg(args.b)]);
|
|
2457
|
+
const a = i64(registers[Inst.reg(args.a)]);
|
|
2458
|
+
if (a === i64(0)) {
|
|
2459
|
+
registers[Inst.reg(args.c)] = u64.MAX_VALUE;
|
|
2460
|
+
} else if (a === i64(-1) && b === i64.MIN_VALUE) {
|
|
2461
|
+
registers[Inst.reg(args.c)] = u64(b);
|
|
2462
|
+
} else {
|
|
2463
|
+
registers[Inst.reg(args.c)] = u64(b / a);
|
|
2464
|
+
}
|
|
2465
|
+
return OutcomeData.ok(r);
|
|
2466
|
+
};
|
|
2467
|
+
var rem_u = (r, args, registers) => {
|
|
2468
|
+
if (registers[Inst.reg(args.a)] === u64(0)) {
|
|
2469
|
+
registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)];
|
|
2470
|
+
} else {
|
|
2471
|
+
registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)] % registers[Inst.reg(args.a)];
|
|
2472
|
+
}
|
|
2473
|
+
return OutcomeData.ok(r);
|
|
2474
|
+
};
|
|
2475
|
+
var rem_s = (r, args, registers) => {
|
|
2476
|
+
const b = i64(registers[Inst.reg(args.b)]);
|
|
2477
|
+
const a = i64(registers[Inst.reg(args.a)]);
|
|
2478
|
+
if (a === i64(0)) {
|
|
2479
|
+
registers[Inst.reg(args.c)] = u64(b);
|
|
2480
|
+
} else if (a === i64(-1) && b === i64.MIN_VALUE) {
|
|
2481
|
+
registers[Inst.reg(args.c)] = u64(0);
|
|
2482
|
+
} else {
|
|
2483
|
+
registers[Inst.reg(args.c)] = u64(b % a);
|
|
2484
|
+
}
|
|
2485
|
+
return OutcomeData.ok(r);
|
|
2486
|
+
};
|
|
2487
|
+
var mul_upper_s_s = (r, args, registers) => {
|
|
2488
|
+
registers[Inst.reg(args.c)] = mulUpperSigned(i64(registers[Inst.reg(args.b)]), i64(registers[Inst.reg(args.a)]));
|
|
2489
|
+
return OutcomeData.ok(r);
|
|
2490
|
+
};
|
|
2491
|
+
var mul_upper_u_u = (r, args, registers) => {
|
|
2492
|
+
registers[Inst.reg(args.c)] = mulUpperUnsigned(registers[Inst.reg(args.b)], registers[Inst.reg(args.a)]);
|
|
2493
|
+
return OutcomeData.ok(r);
|
|
2494
|
+
};
|
|
2495
|
+
var mul_upper_s_u = (r, args, registers) => {
|
|
2496
|
+
registers[Inst.reg(args.c)] = mulUpperSignedUnsigned(i64(registers[Inst.reg(args.b)]), registers[Inst.reg(args.a)]);
|
|
2497
|
+
return OutcomeData.ok(r);
|
|
2498
|
+
};
|
|
2499
|
+
var max = (r, args, registers) => {
|
|
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);
|
|
2504
|
+
};
|
|
2505
|
+
var max_u = (r, args, registers) => {
|
|
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);
|
|
2510
|
+
};
|
|
2511
|
+
var min = (r, args, registers) => {
|
|
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);
|
|
2516
|
+
};
|
|
2517
|
+
var min_u = (r, args, registers) => {
|
|
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);
|
|
2522
|
+
};
|
|
2523
|
+
|
|
2524
|
+
// dist/build/js/assembly/instructions/misc.js
|
|
2525
|
+
var faultRes2 = new MaybePageFault();
|
|
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);
|
|
2530
|
+
var sbrk = (r, args, registers, memory) => {
|
|
2531
|
+
const res = memory.sbrk(faultRes2, u32(registers[Inst.reg(args.a)]));
|
|
2532
|
+
if (faultRes2.isFault) {
|
|
2533
|
+
return OutcomeData.okOrFault(r, faultRes2);
|
|
2534
|
+
}
|
|
2535
|
+
registers[Inst.reg(args.b)] = res;
|
|
2536
|
+
return OutcomeData.ok(r);
|
|
2537
|
+
};
|
|
2538
|
+
|
|
2539
|
+
// dist/build/js/assembly/instructions/mov.js
|
|
2540
|
+
var move_reg = (r, args, registers) => {
|
|
2541
|
+
registers[Inst.reg(args.b)] = registers[Inst.reg(args.a)];
|
|
2542
|
+
return OutcomeData.ok(r);
|
|
2543
|
+
};
|
|
2544
|
+
var cmov_iz_imm = (r, args, registers) => {
|
|
2545
|
+
if (registers[Inst.reg(args.a)] === u64(0)) {
|
|
2546
|
+
registers[Inst.reg(args.b)] = Inst.u32SignExtend(args.c);
|
|
2547
|
+
}
|
|
2548
|
+
return OutcomeData.ok(r);
|
|
2549
|
+
};
|
|
2550
|
+
var cmov_nz_imm = (r, args, registers) => {
|
|
2551
|
+
if (registers[Inst.reg(args.a)] !== u64(0)) {
|
|
2552
|
+
registers[Inst.reg(args.b)] = Inst.u32SignExtend(args.c);
|
|
2553
|
+
}
|
|
2554
|
+
return OutcomeData.ok(r);
|
|
2555
|
+
};
|
|
2556
|
+
var cmov_iz = (r, args, registers) => {
|
|
2557
|
+
if (registers[Inst.reg(args.a)] === u64(0)) {
|
|
2558
|
+
registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)];
|
|
2559
|
+
}
|
|
2560
|
+
return OutcomeData.ok(r);
|
|
2561
|
+
};
|
|
2562
|
+
var cmov_nz = (r, args, registers) => {
|
|
2563
|
+
if (registers[Inst.reg(args.a)] !== u64(0)) {
|
|
2564
|
+
registers[Inst.reg(args.c)] = registers[Inst.reg(args.b)];
|
|
2565
|
+
}
|
|
2566
|
+
return OutcomeData.ok(r);
|
|
2567
|
+
};
|
|
2568
|
+
|
|
2569
|
+
// dist/build/js/assembly/instructions/rot.js
|
|
2570
|
+
var rot_r_64_imm = (r, args, regs) => {
|
|
2571
|
+
regs[Inst.reg(args.b)] = math.rot_r(regs[Inst.reg(args.a)], Inst.u32SignExtend(args.c));
|
|
2572
|
+
return OutcomeData.ok(r);
|
|
2573
|
+
};
|
|
2574
|
+
var rot_r_64_imm_alt = (r, args, regs) => {
|
|
2575
|
+
regs[Inst.reg(args.b)] = math.rot_r(Inst.u32SignExtend(args.c), regs[Inst.reg(args.a)]);
|
|
2576
|
+
return OutcomeData.ok(r);
|
|
2577
|
+
};
|
|
2578
|
+
var rot_r_32_imm = (r, args, regs) => {
|
|
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);
|
|
2581
|
+
};
|
|
2582
|
+
var rot_r_32_imm_alt = (r, args, regs) => {
|
|
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);
|
|
2585
|
+
};
|
|
2586
|
+
var rot_l_64 = (r, args, regs) => {
|
|
2587
|
+
regs[Inst.reg(args.c)] = math.rot_l(regs[Inst.reg(args.b)], regs[Inst.reg(args.a)]);
|
|
2588
|
+
return OutcomeData.ok(r);
|
|
2589
|
+
};
|
|
2590
|
+
var rot_l_32 = (r, args, regs) => {
|
|
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);
|
|
2593
|
+
};
|
|
2594
|
+
var rot_r_64 = (r, args, regs) => {
|
|
2595
|
+
regs[Inst.reg(args.c)] = math.rot_r(regs[Inst.reg(args.b)], regs[Inst.reg(args.a)]);
|
|
2596
|
+
return OutcomeData.ok(r);
|
|
2597
|
+
};
|
|
2598
|
+
var rot_r_32 = (r, args, regs) => {
|
|
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);
|
|
2601
|
+
};
|
|
2602
|
+
var math;
|
|
2603
|
+
(function(math2) {
|
|
2604
|
+
function rot_r(v, shift) {
|
|
2605
|
+
return portable.rotr_u64(v, shift);
|
|
2606
|
+
}
|
|
2607
|
+
math2.rot_r = rot_r;
|
|
2608
|
+
function rot_r_322(v, shift) {
|
|
2609
|
+
return portable.rotr_u32(v, shift);
|
|
2610
|
+
}
|
|
2611
|
+
math2.rot_r_32 = rot_r_322;
|
|
2612
|
+
function rot_l(v, shift) {
|
|
2613
|
+
return portable.rotl_u64(v, shift);
|
|
2614
|
+
}
|
|
2615
|
+
math2.rot_l = rot_l;
|
|
2616
|
+
function rot_l_322(v, shift) {
|
|
2617
|
+
return portable.rotl_u32(v, shift);
|
|
2618
|
+
}
|
|
2619
|
+
math2.rot_l_32 = rot_l_322;
|
|
2620
|
+
})(math || (math = {}));
|
|
2621
|
+
|
|
2622
|
+
// dist/build/js/assembly/instructions/set.js
|
|
2623
|
+
var set_lt_u_imm = (r, args, registers) => {
|
|
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);
|
|
2627
|
+
};
|
|
2628
|
+
var set_lt_s_imm = (r, args, registers) => {
|
|
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);
|
|
2632
|
+
};
|
|
2633
|
+
var set_gt_u_imm = (r, args, registers) => {
|
|
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);
|
|
2637
|
+
};
|
|
2638
|
+
var set_gt_s_imm = (r, args, registers) => {
|
|
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);
|
|
2642
|
+
};
|
|
2643
|
+
var set_lt_u = (r, args, registers) => {
|
|
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);
|
|
2646
|
+
};
|
|
2647
|
+
var set_lt_s = (r, args, registers) => {
|
|
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);
|
|
2650
|
+
};
|
|
2651
|
+
|
|
2652
|
+
// dist/build/js/assembly/instructions/shift.js
|
|
2653
|
+
var MAX_SHIFT_64 = 64;
|
|
2654
|
+
var MAX_SHIFT_32 = 32;
|
|
2655
|
+
var shlo_l_imm_32 = (r, args, registers) => {
|
|
2656
|
+
const shift = u32(args.c % MAX_SHIFT_32);
|
|
2657
|
+
const value = u32(registers[Inst.reg(args.a)]);
|
|
2658
|
+
registers[Inst.reg(args.b)] = Inst.u32SignExtend(value << shift);
|
|
2659
|
+
return OutcomeData.ok(r);
|
|
2660
|
+
};
|
|
2661
|
+
var shlo_r_imm_32 = (r, args, registers) => {
|
|
2662
|
+
const shift = u32(args.c % MAX_SHIFT_32);
|
|
2663
|
+
const value = u32(registers[Inst.reg(args.a)]);
|
|
2664
|
+
registers[Inst.reg(args.b)] = Inst.u32SignExtend(value >>> shift);
|
|
2665
|
+
return OutcomeData.ok(r);
|
|
2666
|
+
};
|
|
2667
|
+
var shar_r_imm_32 = (r, args, registers) => {
|
|
2668
|
+
const shift = u32(args.c % MAX_SHIFT_32);
|
|
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);
|
|
2672
|
+
};
|
|
2673
|
+
var shlo_l_imm_alt_32 = (r, args, registers) => {
|
|
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);
|
|
2677
|
+
};
|
|
2678
|
+
var shlo_r_imm_alt_32 = (r, args, registers) => {
|
|
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);
|
|
2682
|
+
};
|
|
2683
|
+
var shar_r_imm_alt_32 = (r, args, registers) => {
|
|
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);
|
|
2688
|
+
};
|
|
2689
|
+
var shlo_l_imm = (r, args, registers) => {
|
|
2690
|
+
const shift = u32(args.c % MAX_SHIFT_64);
|
|
2691
|
+
registers[Inst.reg(args.b)] = u64(registers[Inst.reg(args.a)] << u64(shift));
|
|
2692
|
+
return OutcomeData.ok(r);
|
|
2693
|
+
};
|
|
2694
|
+
var shlo_r_imm = (r, args, registers) => {
|
|
2695
|
+
const shift = u32(args.c % MAX_SHIFT_64);
|
|
2696
|
+
registers[Inst.reg(args.b)] = registers[Inst.reg(args.a)] >> u64(shift);
|
|
2697
|
+
return OutcomeData.ok(r);
|
|
2698
|
+
};
|
|
2699
|
+
var shar_r_imm = (r, args, registers) => {
|
|
2700
|
+
const shift = u32(args.c % MAX_SHIFT_64);
|
|
2701
|
+
const value = i64(registers[Inst.reg(args.a)]);
|
|
2702
|
+
registers[Inst.reg(args.b)] = u64(value >> i64(shift));
|
|
2703
|
+
return OutcomeData.ok(r);
|
|
2704
|
+
};
|
|
2705
|
+
var shlo_l_imm_alt = (r, args, registers) => {
|
|
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);
|
|
2709
|
+
};
|
|
2710
|
+
var shlo_r_imm_alt = (r, args, registers) => {
|
|
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);
|
|
2714
|
+
};
|
|
2715
|
+
var shar_r_imm_alt = (r, args, registers) => {
|
|
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);
|
|
2720
|
+
};
|
|
2721
|
+
var shlo_l_32 = (r, args, registers) => {
|
|
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);
|
|
2726
|
+
};
|
|
2727
|
+
var shlo_r_32 = (r, args, registers) => {
|
|
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);
|
|
2732
|
+
};
|
|
2733
|
+
var shar_r_32 = (r, args, registers) => {
|
|
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);
|
|
2738
|
+
};
|
|
2739
|
+
var shlo_l = (r, args, registers) => {
|
|
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);
|
|
2743
|
+
};
|
|
2744
|
+
var shlo_r = (r, args, registers) => {
|
|
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);
|
|
2748
|
+
};
|
|
2749
|
+
var shar_r = (r, args, registers) => {
|
|
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);
|
|
2753
|
+
};
|
|
2754
|
+
|
|
2755
|
+
// dist/build/js/assembly/instructions/store.js
|
|
2756
|
+
var faultRes3 = new MaybePageFault();
|
|
2757
|
+
function effectiveAddress(registers, baseReg, offset) {
|
|
2758
|
+
return u32(portable.u64_add(registers[Inst.reg(u64(baseReg))], Inst.u32SignExtend(offset)));
|
|
2759
|
+
}
|
|
2760
|
+
var store_imm_u8 = (r, args, _registers, memory) => {
|
|
2761
|
+
const address = args.a;
|
|
2762
|
+
memory.setU8(faultRes3, address, args.b & 255);
|
|
2763
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2764
|
+
};
|
|
2765
|
+
var store_imm_u16 = (r, args, _registers, memory) => {
|
|
2766
|
+
const address = args.a;
|
|
2767
|
+
memory.setU16(faultRes3, address, args.b & 65535);
|
|
2768
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2769
|
+
};
|
|
2770
|
+
var store_imm_u32 = (r, args, _registers, memory) => {
|
|
2771
|
+
const address = args.a;
|
|
2772
|
+
memory.setU32(faultRes3, address, args.b);
|
|
2773
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2774
|
+
};
|
|
2775
|
+
var store_imm_u64 = (r, args, _registers, memory) => {
|
|
2776
|
+
const address = args.a;
|
|
2777
|
+
memory.setU64(faultRes3, address, Inst.u32SignExtend(args.b));
|
|
2778
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2779
|
+
};
|
|
2780
|
+
var store_u8 = (r, args, registers, memory) => {
|
|
2781
|
+
memory.setU8(faultRes3, args.b, registers[Inst.reg(args.a)] & u64(255));
|
|
2782
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2783
|
+
};
|
|
2784
|
+
var store_u16 = (r, args, registers, memory) => {
|
|
2785
|
+
memory.setU16(faultRes3, args.b, registers[Inst.reg(args.a)] & u64(65535));
|
|
2786
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2787
|
+
};
|
|
2788
|
+
var store_u32 = (r, args, registers, memory) => {
|
|
2789
|
+
memory.setU32(faultRes3, args.b, u32(registers[Inst.reg(args.a)]));
|
|
2790
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2791
|
+
};
|
|
2792
|
+
var store_u64 = (r, args, registers, memory) => {
|
|
2793
|
+
memory.setU64(faultRes3, args.b, registers[Inst.reg(args.a)]);
|
|
2794
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2795
|
+
};
|
|
2796
|
+
var store_imm_ind_u8 = (r, args, registers, memory) => {
|
|
2797
|
+
const address = effectiveAddress(registers, args.a, args.b);
|
|
2798
|
+
memory.setU8(faultRes3, address, args.c & 255);
|
|
2799
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2800
|
+
};
|
|
2801
|
+
var store_imm_ind_u16 = (r, args, registers, memory) => {
|
|
2802
|
+
const address = effectiveAddress(registers, args.a, args.b);
|
|
2803
|
+
memory.setU16(faultRes3, address, args.c & 65535);
|
|
2804
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2805
|
+
};
|
|
2806
|
+
var store_imm_ind_u32 = (r, args, registers, memory) => {
|
|
2807
|
+
const address = effectiveAddress(registers, args.a, args.b);
|
|
2808
|
+
memory.setU32(faultRes3, address, args.c);
|
|
2809
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2810
|
+
};
|
|
2811
|
+
var store_imm_ind_u64 = (r, args, registers, memory) => {
|
|
2812
|
+
const address = effectiveAddress(registers, args.a, args.b);
|
|
2813
|
+
memory.setU64(faultRes3, address, Inst.u32SignExtend(args.c));
|
|
2814
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2815
|
+
};
|
|
2816
|
+
var store_ind_u8 = (r, args, registers, memory) => {
|
|
2817
|
+
const address = effectiveAddress(registers, args.a, args.c);
|
|
2818
|
+
memory.setU8(faultRes3, address, registers[Inst.reg(args.b)] & u64(255));
|
|
2819
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2820
|
+
};
|
|
2821
|
+
var store_ind_u16 = (r, args, registers, memory) => {
|
|
2822
|
+
const address = effectiveAddress(registers, args.a, args.c);
|
|
2823
|
+
memory.setU16(faultRes3, address, registers[Inst.reg(args.b)] & u64(65535));
|
|
2824
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2825
|
+
};
|
|
2826
|
+
var store_ind_u32 = (r, args, registers, memory) => {
|
|
2827
|
+
const address = effectiveAddress(registers, args.a, args.c);
|
|
2828
|
+
memory.setU32(faultRes3, address, u32(registers[Inst.reg(args.b)]));
|
|
2829
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2830
|
+
};
|
|
2831
|
+
var store_ind_u64 = (r, args, registers, memory) => {
|
|
2832
|
+
const address = effectiveAddress(registers, args.a, args.c);
|
|
2833
|
+
memory.setU64(faultRes3, address, registers[Inst.reg(args.b)]);
|
|
2834
|
+
return OutcomeData.okOrFault(r, faultRes3);
|
|
2835
|
+
};
|
|
2836
|
+
|
|
2837
|
+
// dist/build/js/assembly/instructions-exe.js
|
|
2838
|
+
var RUN = [
|
|
2839
|
+
/* 000 */
|
|
2840
|
+
trap,
|
|
2841
|
+
/* 001 */
|
|
2842
|
+
fallthrough,
|
|
2843
|
+
INVALID,
|
|
2844
|
+
INVALID,
|
|
2845
|
+
INVALID,
|
|
2846
|
+
INVALID,
|
|
2847
|
+
INVALID,
|
|
2848
|
+
INVALID,
|
|
2849
|
+
INVALID,
|
|
2850
|
+
INVALID,
|
|
2851
|
+
/* 010 */
|
|
2852
|
+
ecalli,
|
|
2853
|
+
INVALID,
|
|
2854
|
+
INVALID,
|
|
2855
|
+
INVALID,
|
|
2856
|
+
INVALID,
|
|
2857
|
+
INVALID,
|
|
2858
|
+
INVALID,
|
|
2859
|
+
INVALID,
|
|
2860
|
+
INVALID,
|
|
2861
|
+
INVALID,
|
|
2862
|
+
load_imm_64,
|
|
2863
|
+
INVALID,
|
|
2864
|
+
INVALID,
|
|
2865
|
+
INVALID,
|
|
2866
|
+
INVALID,
|
|
2867
|
+
INVALID,
|
|
2868
|
+
INVALID,
|
|
2869
|
+
INVALID,
|
|
2870
|
+
INVALID,
|
|
2871
|
+
INVALID,
|
|
2872
|
+
store_imm_u8,
|
|
2873
|
+
store_imm_u16,
|
|
2874
|
+
store_imm_u32,
|
|
2875
|
+
store_imm_u64,
|
|
2876
|
+
INVALID,
|
|
2877
|
+
INVALID,
|
|
2878
|
+
INVALID,
|
|
2879
|
+
INVALID,
|
|
2880
|
+
INVALID,
|
|
2881
|
+
INVALID,
|
|
2882
|
+
jump,
|
|
2883
|
+
INVALID,
|
|
2884
|
+
INVALID,
|
|
2885
|
+
INVALID,
|
|
2886
|
+
INVALID,
|
|
2887
|
+
INVALID,
|
|
2888
|
+
INVALID,
|
|
2889
|
+
INVALID,
|
|
2890
|
+
INVALID,
|
|
2891
|
+
INVALID,
|
|
2892
|
+
jump_ind,
|
|
2893
|
+
load_imm,
|
|
2894
|
+
load_u8,
|
|
2895
|
+
load_i8,
|
|
2896
|
+
load_u16,
|
|
2897
|
+
load_i16,
|
|
2898
|
+
load_u32,
|
|
2899
|
+
load_i32,
|
|
2900
|
+
load_u64,
|
|
2901
|
+
store_u8,
|
|
2902
|
+
store_u16,
|
|
2903
|
+
store_u32,
|
|
2904
|
+
store_u64,
|
|
2905
|
+
INVALID,
|
|
2906
|
+
INVALID,
|
|
2907
|
+
INVALID,
|
|
2908
|
+
INVALID,
|
|
2909
|
+
INVALID,
|
|
2910
|
+
INVALID,
|
|
2911
|
+
INVALID,
|
|
2912
|
+
store_imm_ind_u8,
|
|
2913
|
+
store_imm_ind_u16,
|
|
2914
|
+
store_imm_ind_u32,
|
|
2915
|
+
store_imm_ind_u64,
|
|
2916
|
+
INVALID,
|
|
2917
|
+
INVALID,
|
|
2918
|
+
INVALID,
|
|
2919
|
+
INVALID,
|
|
2920
|
+
INVALID,
|
|
2921
|
+
INVALID,
|
|
2922
|
+
load_imm_jump,
|
|
2923
|
+
branch_eq_imm,
|
|
2924
|
+
branch_ne_imm,
|
|
2925
|
+
branch_lt_u_imm,
|
|
2926
|
+
branch_le_u_imm,
|
|
2927
|
+
branch_ge_u_imm,
|
|
2928
|
+
branch_gt_u_imm,
|
|
2929
|
+
branch_lt_s_imm,
|
|
2930
|
+
branch_le_s_imm,
|
|
2931
|
+
branch_ge_s_imm,
|
|
2932
|
+
branch_gt_s_imm,
|
|
2933
|
+
INVALID,
|
|
2934
|
+
INVALID,
|
|
2935
|
+
INVALID,
|
|
2936
|
+
INVALID,
|
|
2937
|
+
INVALID,
|
|
2938
|
+
INVALID,
|
|
2939
|
+
INVALID,
|
|
2940
|
+
INVALID,
|
|
2941
|
+
INVALID,
|
|
2942
|
+
move_reg,
|
|
2943
|
+
/* 101 */
|
|
2944
|
+
sbrk,
|
|
2945
|
+
count_set_bits_64,
|
|
2946
|
+
count_set_bits_32,
|
|
2947
|
+
leading_zero_bits_64,
|
|
2948
|
+
leading_zero_bits_32,
|
|
2949
|
+
trailing_zero_bits_64,
|
|
2950
|
+
trailing_zero_bits_32,
|
|
2951
|
+
sign_extend_8,
|
|
2952
|
+
sign_extend_16,
|
|
2953
|
+
zero_extend_16,
|
|
2954
|
+
reverse_bytes,
|
|
2955
|
+
INVALID,
|
|
2956
|
+
INVALID,
|
|
2957
|
+
INVALID,
|
|
2958
|
+
INVALID,
|
|
2959
|
+
INVALID,
|
|
2960
|
+
INVALID,
|
|
2961
|
+
INVALID,
|
|
2962
|
+
INVALID,
|
|
2963
|
+
store_ind_u8,
|
|
2964
|
+
store_ind_u16,
|
|
2965
|
+
store_ind_u32,
|
|
2966
|
+
store_ind_u64,
|
|
2967
|
+
load_ind_u8,
|
|
2968
|
+
load_ind_i8,
|
|
2969
|
+
load_ind_u16,
|
|
2970
|
+
load_ind_i16,
|
|
2971
|
+
load_ind_u32,
|
|
2972
|
+
load_ind_i32,
|
|
2973
|
+
load_ind_u64,
|
|
2974
|
+
add_imm_32,
|
|
2975
|
+
and_imm,
|
|
2976
|
+
xor_imm,
|
|
2977
|
+
or_imm,
|
|
2978
|
+
mul_imm_32,
|
|
2979
|
+
set_lt_u_imm,
|
|
2980
|
+
set_lt_s_imm,
|
|
2981
|
+
shlo_l_imm_32,
|
|
2982
|
+
shlo_r_imm_32,
|
|
2983
|
+
shar_r_imm_32,
|
|
2984
|
+
neg_add_imm_32,
|
|
2985
|
+
set_gt_u_imm,
|
|
2986
|
+
set_gt_s_imm,
|
|
2987
|
+
shlo_l_imm_alt_32,
|
|
2988
|
+
shlo_r_imm_alt_32,
|
|
2989
|
+
shar_r_imm_alt_32,
|
|
2990
|
+
cmov_iz_imm,
|
|
2991
|
+
cmov_nz_imm,
|
|
2992
|
+
add_imm,
|
|
2993
|
+
mul_imm,
|
|
2994
|
+
shlo_l_imm,
|
|
2995
|
+
shlo_r_imm,
|
|
2996
|
+
shar_r_imm,
|
|
2997
|
+
neg_add_imm,
|
|
2998
|
+
shlo_l_imm_alt,
|
|
2999
|
+
shlo_r_imm_alt,
|
|
3000
|
+
shar_r_imm_alt,
|
|
3001
|
+
rot_r_64_imm,
|
|
3002
|
+
rot_r_64_imm_alt,
|
|
3003
|
+
rot_r_32_imm,
|
|
3004
|
+
rot_r_32_imm_alt,
|
|
3005
|
+
INVALID,
|
|
3006
|
+
INVALID,
|
|
3007
|
+
INVALID,
|
|
3008
|
+
INVALID,
|
|
3009
|
+
INVALID,
|
|
3010
|
+
INVALID,
|
|
3011
|
+
INVALID,
|
|
3012
|
+
INVALID,
|
|
3013
|
+
branch_eq,
|
|
3014
|
+
branch_ne,
|
|
3015
|
+
branch_lt_u,
|
|
3016
|
+
branch_lt_s,
|
|
3017
|
+
branch_ge_u,
|
|
3018
|
+
branch_ge_s,
|
|
3019
|
+
INVALID,
|
|
3020
|
+
INVALID,
|
|
3021
|
+
INVALID,
|
|
3022
|
+
INVALID,
|
|
3023
|
+
load_imm_jump_ind,
|
|
3024
|
+
INVALID,
|
|
3025
|
+
INVALID,
|
|
3026
|
+
INVALID,
|
|
3027
|
+
INVALID,
|
|
3028
|
+
INVALID,
|
|
3029
|
+
INVALID,
|
|
3030
|
+
INVALID,
|
|
3031
|
+
INVALID,
|
|
3032
|
+
INVALID,
|
|
3033
|
+
add_32,
|
|
3034
|
+
sub_32,
|
|
3035
|
+
mul_32,
|
|
3036
|
+
div_u_32,
|
|
3037
|
+
div_s_32,
|
|
3038
|
+
rem_u_32,
|
|
3039
|
+
rem_s_32,
|
|
3040
|
+
shlo_l_32,
|
|
3041
|
+
shlo_r_32,
|
|
3042
|
+
shar_r_32,
|
|
3043
|
+
add_64,
|
|
3044
|
+
sub,
|
|
3045
|
+
mul,
|
|
3046
|
+
div_u,
|
|
3047
|
+
div_s,
|
|
3048
|
+
rem_u,
|
|
3049
|
+
rem_s,
|
|
3050
|
+
shlo_l,
|
|
3051
|
+
shlo_r,
|
|
3052
|
+
shar_r,
|
|
3053
|
+
and,
|
|
3054
|
+
xor,
|
|
3055
|
+
or,
|
|
3056
|
+
mul_upper_s_s,
|
|
3057
|
+
mul_upper_u_u,
|
|
3058
|
+
mul_upper_s_u,
|
|
3059
|
+
set_lt_u,
|
|
3060
|
+
set_lt_s,
|
|
3061
|
+
cmov_iz,
|
|
3062
|
+
cmov_nz,
|
|
3063
|
+
rot_l_64,
|
|
3064
|
+
rot_l_32,
|
|
3065
|
+
rot_r_64,
|
|
3066
|
+
rot_r_32,
|
|
3067
|
+
and_inv,
|
|
3068
|
+
or_inv,
|
|
3069
|
+
xnor,
|
|
3070
|
+
max,
|
|
3071
|
+
max_u,
|
|
3072
|
+
min,
|
|
3073
|
+
min_u
|
|
3074
|
+
];
|
|
3075
|
+
|
|
3076
|
+
// dist/build/js/assembly/codec.js
|
|
3077
|
+
var MASKS = [255, 254, 252, 248, 240, 224, 192, 128];
|
|
3078
|
+
var variableLength = (firstByte) => {
|
|
3079
|
+
const len = MASKS.length;
|
|
3080
|
+
for (let i = 0; i < len; i++) {
|
|
3081
|
+
if (firstByte >= MASKS[i]) {
|
|
3082
|
+
return 8 - i;
|
|
3083
|
+
}
|
|
3084
|
+
}
|
|
3085
|
+
return 0;
|
|
3086
|
+
};
|
|
3087
|
+
var Decoder = class {
|
|
3088
|
+
constructor(source, offset = 0) {
|
|
3089
|
+
this.source = source;
|
|
3090
|
+
this.offset = offset;
|
|
3091
|
+
}
|
|
3092
|
+
isExhausted() {
|
|
3093
|
+
return this.offset >= this.source.length;
|
|
3094
|
+
}
|
|
3095
|
+
ensureBytes(need) {
|
|
3096
|
+
if (this.offset + need > this.source.length) {
|
|
3097
|
+
throw new Error(`Not enough bytes left. Need: ${need}, left: ${this.source.length - this.offset}`);
|
|
3098
|
+
}
|
|
3099
|
+
}
|
|
3100
|
+
finish() {
|
|
3101
|
+
if (!this.isExhausted()) {
|
|
3102
|
+
throw new Error(`Expecting to use all bytes from the decoder. Left: ${this.source.length - this.offset}`);
|
|
3103
|
+
}
|
|
3104
|
+
}
|
|
3105
|
+
varU32() {
|
|
3106
|
+
this.ensureBytes(1);
|
|
3107
|
+
const v = decodeVarU32(this.source.subarray(this.offset));
|
|
3108
|
+
this.offset += v.offset;
|
|
3109
|
+
return v.value;
|
|
3110
|
+
}
|
|
3111
|
+
u8() {
|
|
3112
|
+
this.ensureBytes(1);
|
|
3113
|
+
const v = this.source[this.offset];
|
|
3114
|
+
this.offset += 1;
|
|
3115
|
+
return v;
|
|
3116
|
+
}
|
|
3117
|
+
u16() {
|
|
3118
|
+
this.ensureBytes(2);
|
|
3119
|
+
let v = this.source[this.offset];
|
|
3120
|
+
v |= u16(this.source[this.offset + 1]) << 8;
|
|
3121
|
+
this.offset += 2;
|
|
3122
|
+
return v;
|
|
3123
|
+
}
|
|
3124
|
+
u24() {
|
|
3125
|
+
this.ensureBytes(3);
|
|
3126
|
+
let v = this.source[this.offset];
|
|
3127
|
+
v |= u32(this.source[this.offset + 1]) << 8;
|
|
3128
|
+
v |= u32(this.source[this.offset + 2]) << 16;
|
|
3129
|
+
this.offset += 3;
|
|
3130
|
+
return v;
|
|
3131
|
+
}
|
|
3132
|
+
u32() {
|
|
3133
|
+
this.ensureBytes(4);
|
|
3134
|
+
let v = this.source[this.offset];
|
|
3135
|
+
v |= u32(this.source[this.offset + 1]) << 8;
|
|
3136
|
+
v |= u32(this.source[this.offset + 2]) << 16;
|
|
3137
|
+
v |= u32(this.source[this.offset + 3]) << 24;
|
|
3138
|
+
this.offset += 4;
|
|
3139
|
+
return v;
|
|
3140
|
+
}
|
|
3141
|
+
bytes(len) {
|
|
3142
|
+
this.ensureBytes(len);
|
|
3143
|
+
const v = this.source.subarray(this.offset, this.offset + len);
|
|
3144
|
+
this.offset += len;
|
|
3145
|
+
return v;
|
|
3146
|
+
}
|
|
3147
|
+
/** Read remaining bytes into Uint8Array */
|
|
3148
|
+
remainingBytes() {
|
|
3149
|
+
const v = this.source.subarray(this.offset);
|
|
3150
|
+
this.offset += v.length;
|
|
3151
|
+
return v;
|
|
3152
|
+
}
|
|
3153
|
+
};
|
|
3154
|
+
var ValOffset = class {
|
|
3155
|
+
constructor(value, offset) {
|
|
3156
|
+
this.value = value;
|
|
3157
|
+
this.offset = offset;
|
|
3158
|
+
}
|
|
3159
|
+
};
|
|
3160
|
+
function decodeVarU32(data) {
|
|
3161
|
+
const length = i32(variableLength(data[0]));
|
|
3162
|
+
const first = u32(data[0]);
|
|
3163
|
+
if (length === 0) {
|
|
3164
|
+
return new ValOffset(first, 1);
|
|
3165
|
+
}
|
|
3166
|
+
if (data.length < length) {
|
|
3167
|
+
throw new Error(`Not enough bytes to decode 'varU32'. Need ${length}, got: ${data.length}`);
|
|
3168
|
+
}
|
|
3169
|
+
const msb = first + 2 ** (8 - length) - 2 ** 8 << length * 8;
|
|
3170
|
+
let number = 0;
|
|
3171
|
+
for (let i = length - 1; i >= 0; i--) {
|
|
3172
|
+
number = (number << 8) + data[1 + i];
|
|
3173
|
+
}
|
|
3174
|
+
number += msb;
|
|
3175
|
+
return new ValOffset(number, 1 + length);
|
|
3176
|
+
}
|
|
3177
|
+
function encodeVarU32(v) {
|
|
3178
|
+
v = u64(v);
|
|
3179
|
+
if (v === u64(0)) {
|
|
3180
|
+
return new Uint8Array(1);
|
|
3181
|
+
}
|
|
3182
|
+
let maxEncoded = u64(2 ** (7 * 8));
|
|
3183
|
+
if (v >= maxEncoded) {
|
|
3184
|
+
const dest = new Uint8Array(9);
|
|
3185
|
+
dest[0] = 255;
|
|
3186
|
+
const dataView = new DataView(dest.buffer);
|
|
3187
|
+
dataView.setUint64(1, v, true);
|
|
3188
|
+
return dest;
|
|
3189
|
+
}
|
|
3190
|
+
let minEncoded = maxEncoded >> u64(7);
|
|
3191
|
+
for (let l = 7; l >= 0; l -= 1) {
|
|
3192
|
+
if (v >= minEncoded) {
|
|
3193
|
+
const dest = new Uint8Array(l + 1);
|
|
3194
|
+
const maxVal = u64(2 ** (8 * l));
|
|
3195
|
+
const byte = u32(2 ** 8 - 2 ** (8 - l)) + u32(v / maxVal) & 4294967295;
|
|
3196
|
+
dest[0] = u8(byte);
|
|
3197
|
+
let rest = v % maxVal;
|
|
3198
|
+
for (let i = 1; i < 1 + l; i += 1) {
|
|
3199
|
+
dest[i] = u8(rest);
|
|
3200
|
+
rest >>= u64(8);
|
|
3201
|
+
}
|
|
3202
|
+
return dest;
|
|
3203
|
+
}
|
|
3204
|
+
maxEncoded = minEncoded;
|
|
3205
|
+
minEncoded >>= u64(7);
|
|
3206
|
+
}
|
|
3207
|
+
throw new Error(`Unhandled number encoding: ${v}`);
|
|
3208
|
+
}
|
|
3209
|
+
|
|
3210
|
+
// dist/build/js/assembly/program.js
|
|
3211
|
+
var MAX_SKIP = 24;
|
|
3212
|
+
var CodeAndMetadata = class {
|
|
3213
|
+
constructor(code, metadata) {
|
|
3214
|
+
this.code = code;
|
|
3215
|
+
this.metadata = metadata;
|
|
3216
|
+
}
|
|
3217
|
+
};
|
|
3218
|
+
function extractCodeAndMetadata(data) {
|
|
3219
|
+
const decoder = new Decoder(data);
|
|
3220
|
+
const metadataLength = decoder.varU32();
|
|
3221
|
+
const metadata = decoder.bytes(metadataLength);
|
|
3222
|
+
const code = decoder.remainingBytes();
|
|
3223
|
+
return new CodeAndMetadata(code, metadata);
|
|
3224
|
+
}
|
|
3225
|
+
function liftBytes(data) {
|
|
3226
|
+
const p = new Uint8Array(data.length);
|
|
3227
|
+
p.set(data, 0);
|
|
3228
|
+
return p;
|
|
3229
|
+
}
|
|
3230
|
+
function lowerBytes(data) {
|
|
3231
|
+
const r = new StaticArray(data.length);
|
|
3232
|
+
for (let i = 0; i < data.length; i++) {
|
|
3233
|
+
r[i] = data[i];
|
|
3234
|
+
}
|
|
3235
|
+
return r;
|
|
3236
|
+
}
|
|
3237
|
+
function deblob(program, useBlockGas) {
|
|
3238
|
+
const decoder = new Decoder(program);
|
|
3239
|
+
const jumpTableLength = decoder.varU32();
|
|
3240
|
+
const jumpTableItemLength = decoder.u8();
|
|
3241
|
+
const codeLength = decoder.varU32();
|
|
3242
|
+
const jumpTableLengthInBytes = i32(jumpTableLength * jumpTableItemLength);
|
|
3243
|
+
const rawJumpTable = decoder.bytes(jumpTableLengthInBytes);
|
|
3244
|
+
const rawCode = lowerBytes(decoder.bytes(codeLength));
|
|
3245
|
+
const rawMask = decoder.bytes(i32((codeLength + 7) / 8));
|
|
3246
|
+
const mask = new Mask(rawMask, codeLength);
|
|
3247
|
+
const jumpTable = new JumpTable(jumpTableItemLength, rawJumpTable);
|
|
3248
|
+
const basicBlocks = new BasicBlocks(rawCode, mask);
|
|
3249
|
+
const gasCosts = new GasCosts(rawCode, mask, basicBlocks, useBlockGas);
|
|
3250
|
+
return new Program(rawCode, mask, jumpTable, basicBlocks, gasCosts);
|
|
3251
|
+
}
|
|
3252
|
+
var Mask = class {
|
|
3253
|
+
constructor(packedMask, codeLength) {
|
|
3254
|
+
this.bytesToSkip = new StaticArray(codeLength);
|
|
3255
|
+
let lastInstructionOffset = 0;
|
|
3256
|
+
for (let i = packedMask.length - 1; i >= 0; i -= 1) {
|
|
3257
|
+
let bits = packedMask[i];
|
|
3258
|
+
const index = i * 8;
|
|
3259
|
+
for (let b = 7; b >= 0; b--) {
|
|
3260
|
+
const isSet = bits & 128;
|
|
3261
|
+
bits = bits << 1;
|
|
3262
|
+
if (index + b < codeLength) {
|
|
3263
|
+
lastInstructionOffset = isSet ? 0 : lastInstructionOffset + 1;
|
|
3264
|
+
this.bytesToSkip[index + b] = lastInstructionOffset < MAX_SKIP + 1 ? lastInstructionOffset : MAX_SKIP + 1;
|
|
3265
|
+
}
|
|
3266
|
+
}
|
|
3267
|
+
}
|
|
3268
|
+
}
|
|
3269
|
+
isInstruction(index) {
|
|
3270
|
+
if (index >= u32(this.bytesToSkip.length)) {
|
|
3271
|
+
return false;
|
|
3272
|
+
}
|
|
3273
|
+
return portable.staticArrayAt(this.bytesToSkip, u32(index)) === 0;
|
|
3274
|
+
}
|
|
3275
|
+
/**
|
|
3276
|
+
* Given we are at instruction `i`, how many bytes should be skipped to
|
|
3277
|
+
* reach the next instruction (i.e. `skip(i) + 1` from the GP).
|
|
3278
|
+
*
|
|
3279
|
+
* NOTE: we don't guarantee that `isInstruction()` will return true
|
|
3280
|
+
* for the new program counter, since `skip` function is bounded by
|
|
3281
|
+
* an upper limit of `24` bytes.
|
|
3282
|
+
*/
|
|
3283
|
+
skipBytesToNextInstruction(i) {
|
|
3284
|
+
if (i + 1 < this.bytesToSkip.length) {
|
|
3285
|
+
return portable.staticArrayAt(this.bytesToSkip, i + 1);
|
|
3286
|
+
}
|
|
3287
|
+
return 0;
|
|
3288
|
+
}
|
|
3289
|
+
toString() {
|
|
3290
|
+
let v = "Mask[";
|
|
3291
|
+
for (let i = 0; i < this.bytesToSkip.length; i += 1) {
|
|
3292
|
+
v += `${this.bytesToSkip[i]}, `;
|
|
3293
|
+
}
|
|
3294
|
+
return `${v}]`;
|
|
3295
|
+
}
|
|
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
|
+
};
|
|
3342
|
+
var BasicBlock;
|
|
3343
|
+
(function(BasicBlock2) {
|
|
3344
|
+
BasicBlock2[BasicBlock2["NONE"] = 0] = "NONE";
|
|
3345
|
+
BasicBlock2[BasicBlock2["START"] = 2] = "START";
|
|
3346
|
+
BasicBlock2[BasicBlock2["END"] = 4] = "END";
|
|
3347
|
+
})(BasicBlock || (BasicBlock = {}));
|
|
3348
|
+
var BasicBlocks = class {
|
|
3349
|
+
constructor(code, mask) {
|
|
3350
|
+
const len = code.length;
|
|
3351
|
+
const isStartOrEnd = new StaticArray(len);
|
|
3352
|
+
if (len > 0) {
|
|
3353
|
+
isStartOrEnd[0] = BasicBlock.START;
|
|
3354
|
+
}
|
|
3355
|
+
for (let n = 0; n < len; n += 1) {
|
|
3356
|
+
const isInstructionInMask = mask.isInstruction(n);
|
|
3357
|
+
if (!isInstructionInMask) {
|
|
3358
|
+
continue;
|
|
3359
|
+
}
|
|
3360
|
+
const skipArgs = mask.skipBytesToNextInstruction(n);
|
|
3361
|
+
const iData = code[n] >= INSTRUCTIONS.length ? MISSING_INSTRUCTION : INSTRUCTIONS[code[n]];
|
|
3362
|
+
const isTerminating = iData.isTerminating;
|
|
3363
|
+
if (isTerminating) {
|
|
3364
|
+
const newBlockStart = n + 1 + skipArgs;
|
|
3365
|
+
if (newBlockStart < len) {
|
|
3366
|
+
isStartOrEnd[newBlockStart] = BasicBlock.START;
|
|
3367
|
+
}
|
|
3368
|
+
isStartOrEnd[n] |= BasicBlock.END;
|
|
3369
|
+
}
|
|
3370
|
+
}
|
|
3371
|
+
this.isStartOrEnd = isStartOrEnd;
|
|
3372
|
+
}
|
|
3373
|
+
isStart(newPc) {
|
|
3374
|
+
if (newPc < this.isStartOrEnd.length) {
|
|
3375
|
+
return (portable.staticArrayAt(this.isStartOrEnd, newPc) & BasicBlock.START) > 0;
|
|
3376
|
+
}
|
|
3377
|
+
return false;
|
|
3378
|
+
}
|
|
3379
|
+
toString() {
|
|
3380
|
+
let v = "BasicBlocks[";
|
|
3381
|
+
for (let i = 0; i < this.isStartOrEnd.length; i += 1) {
|
|
3382
|
+
let t = "";
|
|
3383
|
+
const isStart = (this.isStartOrEnd[i] & BasicBlock.START) > 0;
|
|
3384
|
+
t += isStart ? "start" : "";
|
|
3385
|
+
const isEnd = (this.isStartOrEnd[i] & BasicBlock.END) > 0;
|
|
3386
|
+
t += isEnd ? "end" : "";
|
|
3387
|
+
if (t.length > 0) {
|
|
3388
|
+
v += `${i} -> ${t}, `;
|
|
3389
|
+
}
|
|
3390
|
+
}
|
|
3391
|
+
return `${v}]`;
|
|
3392
|
+
}
|
|
3393
|
+
};
|
|
3394
|
+
var JumpTable = class {
|
|
3395
|
+
constructor(itemBytes, data) {
|
|
3396
|
+
const jumps = new StaticArray(itemBytes > 0 ? i32(data.length / itemBytes) : 0);
|
|
3397
|
+
for (let i = 0; i < data.length; i += itemBytes) {
|
|
3398
|
+
let num = u64(0);
|
|
3399
|
+
for (let j = itemBytes - 1; j >= 0; j--) {
|
|
3400
|
+
let nextNum = num << u64(8);
|
|
3401
|
+
let isOverflow = nextNum < num;
|
|
3402
|
+
nextNum = portable.u64_add(nextNum, u64(data[i + j]));
|
|
3403
|
+
isOverflow = isOverflow || nextNum < num;
|
|
3404
|
+
num = isOverflow ? u64.MAX_VALUE : nextNum;
|
|
3405
|
+
}
|
|
3406
|
+
jumps[i32(i / itemBytes)] = num;
|
|
3407
|
+
}
|
|
3408
|
+
this.jumps = jumps;
|
|
3409
|
+
}
|
|
3410
|
+
toString() {
|
|
3411
|
+
let v = "JumpTable[";
|
|
3412
|
+
for (let i = 0; i < this.jumps.length; i += 1) {
|
|
3413
|
+
v += `${i} -> ${this.jumps[i]}, `;
|
|
3414
|
+
}
|
|
3415
|
+
return `${v}]`;
|
|
3416
|
+
}
|
|
3417
|
+
};
|
|
3418
|
+
var Program = class {
|
|
3419
|
+
constructor(code, mask, jumpTable, basicBlocks, gasCosts) {
|
|
3420
|
+
this.code = code;
|
|
3421
|
+
this.mask = mask;
|
|
3422
|
+
this.jumpTable = jumpTable;
|
|
3423
|
+
this.basicBlocks = basicBlocks;
|
|
3424
|
+
this.gasCosts = gasCosts;
|
|
3425
|
+
}
|
|
3426
|
+
toString() {
|
|
3427
|
+
return `Program { code: ${this.code}, mask: ${this.mask}, jumpTable: ${this.jumpTable}, basicBlocks: ${this.basicBlocks}, gasCosts: ${this.gasCosts} }`;
|
|
3428
|
+
}
|
|
3429
|
+
};
|
|
3430
|
+
var EXTENDED_BUF = new StaticArray(16);
|
|
3431
|
+
function decodeArguments(args, kind, code, offset, lim) {
|
|
3432
|
+
if (code.length < offset + REQUIRED_BYTES[kind]) {
|
|
3433
|
+
const reqBytes = unchecked(REQUIRED_BYTES[kind]);
|
|
3434
|
+
for (let i = 0; i < reqBytes; i++) {
|
|
3435
|
+
EXTENDED_BUF[i] = 0;
|
|
3436
|
+
}
|
|
3437
|
+
for (let i = offset; i < code.length; i++) {
|
|
3438
|
+
EXTENDED_BUF[i - offset] = unchecked(code[i]);
|
|
3439
|
+
}
|
|
3440
|
+
return unchecked(DECODERS[kind])(args, EXTENDED_BUF, 0, lim);
|
|
3441
|
+
}
|
|
3442
|
+
return unchecked(DECODERS[kind])(args, code, offset, offset + lim);
|
|
3443
|
+
}
|
|
3444
|
+
var ResolvedArguments = class {
|
|
3445
|
+
constructor() {
|
|
3446
|
+
this.a = i64(0);
|
|
3447
|
+
this.b = i64(0);
|
|
3448
|
+
this.c = i64(0);
|
|
3449
|
+
this.d = i64(0);
|
|
3450
|
+
this.decoded = new Args();
|
|
3451
|
+
}
|
|
3452
|
+
};
|
|
3453
|
+
function resolveArguments(argsRes, kind, code, offset, lim, registers) {
|
|
3454
|
+
const args = decodeArguments(argsRes, kind, code, offset, lim);
|
|
3455
|
+
if (args === null) {
|
|
3456
|
+
return null;
|
|
3457
|
+
}
|
|
3458
|
+
const resolved = new ResolvedArguments();
|
|
3459
|
+
resolved.decoded = args;
|
|
3460
|
+
switch (kind) {
|
|
3461
|
+
case Arguments.Zero:
|
|
3462
|
+
return resolved;
|
|
3463
|
+
case Arguments.OneImm:
|
|
3464
|
+
resolved.a = Inst.u32SignExtend(args.a);
|
|
3465
|
+
return resolved;
|
|
3466
|
+
case Arguments.TwoImm:
|
|
3467
|
+
resolved.a = Inst.u32SignExtend(args.a);
|
|
3468
|
+
resolved.b = Inst.u32SignExtend(args.b);
|
|
3469
|
+
return resolved;
|
|
3470
|
+
case Arguments.OneOff:
|
|
3471
|
+
resolved.a = Inst.u32SignExtend(args.a);
|
|
3472
|
+
return resolved;
|
|
3473
|
+
case Arguments.OneRegOneImm:
|
|
3474
|
+
resolved.a = registers[Inst.reg(u64(args.a))];
|
|
3475
|
+
resolved.b = Inst.u32SignExtend(args.b);
|
|
3476
|
+
return resolved;
|
|
3477
|
+
case Arguments.OneRegOneExtImm:
|
|
3478
|
+
resolved.a = registers[Inst.reg(u64(args.a))];
|
|
3479
|
+
resolved.b = portable.u64_add(u64(args.a) << u64(32), u64(args.b));
|
|
3480
|
+
return resolved;
|
|
3481
|
+
case Arguments.OneRegTwoImm:
|
|
3482
|
+
resolved.a = registers[Inst.reg(u64(args.a))];
|
|
3483
|
+
resolved.b = Inst.u32SignExtend(args.b);
|
|
3484
|
+
resolved.c = Inst.u32SignExtend(args.c);
|
|
3485
|
+
return resolved;
|
|
3486
|
+
case Arguments.OneRegOneImmOneOff:
|
|
3487
|
+
resolved.a = registers[Inst.reg(u64(args.a))];
|
|
3488
|
+
resolved.b = Inst.u32SignExtend(args.b);
|
|
3489
|
+
resolved.c = Inst.u32SignExtend(args.c);
|
|
3490
|
+
return resolved;
|
|
3491
|
+
case Arguments.TwoReg:
|
|
3492
|
+
resolved.a = registers[Inst.reg(u64(args.a))];
|
|
3493
|
+
resolved.b = registers[Inst.reg(u64(args.b))];
|
|
3494
|
+
return resolved;
|
|
3495
|
+
case Arguments.TwoRegOneImm:
|
|
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);
|
|
3499
|
+
return resolved;
|
|
3500
|
+
case Arguments.TwoRegOneOff:
|
|
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);
|
|
3504
|
+
return resolved;
|
|
3505
|
+
case Arguments.TwoRegTwoImm:
|
|
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);
|
|
3510
|
+
return resolved;
|
|
3511
|
+
case Arguments.ThreeReg:
|
|
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))];
|
|
3515
|
+
return resolved;
|
|
3516
|
+
default:
|
|
3517
|
+
throw new Error(`Unhandled arguments kind: ${kind}`);
|
|
3518
|
+
}
|
|
3519
|
+
}
|
|
3520
|
+
|
|
3521
|
+
// dist/build/js/assembly/interpreter.js
|
|
3522
|
+
var Status;
|
|
3523
|
+
(function(Status2) {
|
|
3524
|
+
Status2[Status2["OK"] = -1] = "OK";
|
|
3525
|
+
Status2[Status2["HALT"] = 0] = "HALT";
|
|
3526
|
+
Status2[Status2["PANIC"] = 1] = "PANIC";
|
|
3527
|
+
Status2[Status2["FAULT"] = 2] = "FAULT";
|
|
3528
|
+
Status2[Status2["HOST"] = 3] = "HOST";
|
|
3529
|
+
Status2[Status2["OOG"] = 4] = "OOG";
|
|
3530
|
+
})(Status || (Status = {}));
|
|
3531
|
+
var DjumpStatus;
|
|
3532
|
+
(function(DjumpStatus2) {
|
|
3533
|
+
DjumpStatus2[DjumpStatus2["OK"] = 0] = "OK";
|
|
3534
|
+
DjumpStatus2[DjumpStatus2["HALT"] = 1] = "HALT";
|
|
3535
|
+
DjumpStatus2[DjumpStatus2["PANIC"] = 2] = "PANIC";
|
|
3536
|
+
})(DjumpStatus || (DjumpStatus = {}));
|
|
3537
|
+
var DjumpResult = class {
|
|
3538
|
+
constructor() {
|
|
3539
|
+
this.status = DjumpStatus.OK;
|
|
3540
|
+
this.newPc = 0;
|
|
3541
|
+
}
|
|
3542
|
+
};
|
|
3543
|
+
var BranchResult = class {
|
|
3544
|
+
constructor() {
|
|
3545
|
+
this.isOkay = false;
|
|
3546
|
+
this.newPc = 0;
|
|
3547
|
+
}
|
|
3548
|
+
};
|
|
3549
|
+
var Interpreter = class {
|
|
3550
|
+
constructor(program, registers, memory = new MemoryBuilder().build(0)) {
|
|
3551
|
+
this.djumpRes = new DjumpResult();
|
|
3552
|
+
this.argsRes = new Args();
|
|
3553
|
+
this.outcomeRes = new OutcomeData();
|
|
3554
|
+
this.branchRes = new BranchResult();
|
|
3555
|
+
this.program = program;
|
|
3556
|
+
this.registers = registers;
|
|
3557
|
+
this.memory = memory;
|
|
3558
|
+
this.gas = gasCounter(i64(0));
|
|
3559
|
+
this.pc = 0;
|
|
3560
|
+
this.status = Status.OK;
|
|
3561
|
+
this.exitCode = 0;
|
|
3562
|
+
this.nextPc = 0;
|
|
3563
|
+
}
|
|
3564
|
+
nextSteps(nSteps2 = 1) {
|
|
3565
|
+
if (this.status === Status.HOST) {
|
|
3566
|
+
this.status = Status.OK;
|
|
3567
|
+
this.pc = this.nextPc;
|
|
3568
|
+
this.nextPc = -1;
|
|
3569
|
+
}
|
|
3570
|
+
if (this.status !== Status.OK) {
|
|
3571
|
+
return false;
|
|
3572
|
+
}
|
|
3573
|
+
if (this.nextPc !== -1) {
|
|
3574
|
+
this.pc = this.nextPc;
|
|
3575
|
+
this.nextPc = -1;
|
|
3576
|
+
return true;
|
|
3577
|
+
}
|
|
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;
|
|
3583
|
+
const argsRes = this.argsRes;
|
|
3584
|
+
const outcomeRes = this.outcomeRes;
|
|
3585
|
+
for (let i = 0; i < nSteps2; i++) {
|
|
3586
|
+
this.exitCode = 0;
|
|
3587
|
+
outcomeRes.result = Result.PANIC;
|
|
3588
|
+
outcomeRes.outcome = Outcome.Ok;
|
|
3589
|
+
const pc = this.pc;
|
|
3590
|
+
if (!mask.isInstruction(pc)) {
|
|
3591
|
+
if (this.gas.sub(MISSING_INSTRUCTION.gas)) {
|
|
3592
|
+
this.status = Status.OOG;
|
|
3593
|
+
} else {
|
|
3594
|
+
this.status = Status.PANIC;
|
|
3595
|
+
}
|
|
3596
|
+
return false;
|
|
3597
|
+
}
|
|
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)) {
|
|
3603
|
+
this.status = Status.OOG;
|
|
3604
|
+
return false;
|
|
3605
|
+
}
|
|
3606
|
+
if (iData === MISSING_INSTRUCTION) {
|
|
3607
|
+
this.status = Status.PANIC;
|
|
3608
|
+
return false;
|
|
3609
|
+
}
|
|
3610
|
+
const skipBytes2 = mask.skipBytesToNextInstruction(pc);
|
|
3611
|
+
const args = decodeArguments(argsRes, iData.kind, code, pc + 1, skipBytes2);
|
|
3612
|
+
const exe = unchecked(RUN[instruction2]);
|
|
3613
|
+
const outcome = exe(outcomeRes, args, this.registers, this.memory);
|
|
3614
|
+
if (outcome.outcome === Outcome.Ok) {
|
|
3615
|
+
this.pc += 1 + skipBytes2;
|
|
3616
|
+
continue;
|
|
3617
|
+
}
|
|
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
|
+
}
|
|
3628
|
+
case Outcome.DynamicJump: {
|
|
3629
|
+
const res = dJump(this.djumpRes, jumpTable, outcome.dJump);
|
|
3630
|
+
if (res.status === DjumpStatus.HALT) {
|
|
3631
|
+
this.status = Status.HALT;
|
|
3632
|
+
return false;
|
|
3633
|
+
}
|
|
3634
|
+
if (res.status === DjumpStatus.PANIC) {
|
|
3635
|
+
this.status = Status.PANIC;
|
|
3636
|
+
return false;
|
|
3637
|
+
}
|
|
3638
|
+
const branchResult = branch(this.branchRes, basicBlocks, res.newPc, 0);
|
|
3639
|
+
if (!branchResult.isOkay) {
|
|
3640
|
+
this.status = Status.PANIC;
|
|
3641
|
+
return false;
|
|
3642
|
+
}
|
|
3643
|
+
this.pc = branchResult.newPc;
|
|
3644
|
+
continue;
|
|
3645
|
+
}
|
|
3646
|
+
case Outcome.Result: {
|
|
3647
|
+
if (outcome.result === Result.HOST) {
|
|
3648
|
+
this.status = Status.HOST;
|
|
3649
|
+
this.exitCode = outcome.exitCode;
|
|
3650
|
+
this.nextPc = this.pc + 1 + skipBytes2;
|
|
3651
|
+
return false;
|
|
3652
|
+
}
|
|
3653
|
+
if (outcome.result === Result.FAULT) {
|
|
3654
|
+
if (outcome.exitCode < RESERVED_MEMORY) {
|
|
3655
|
+
this.status = Status.PANIC;
|
|
3656
|
+
} else {
|
|
3657
|
+
this.status = Status.FAULT;
|
|
3658
|
+
this.exitCode = outcome.exitCode;
|
|
3659
|
+
}
|
|
3660
|
+
return false;
|
|
3661
|
+
}
|
|
3662
|
+
if (outcome.result === Result.FAULT_ACCESS) {
|
|
3663
|
+
this.status = Status.PANIC;
|
|
3664
|
+
return false;
|
|
3665
|
+
}
|
|
3666
|
+
if (outcome.result === Result.PANIC) {
|
|
3667
|
+
this.status = Status.PANIC;
|
|
3668
|
+
this.exitCode = outcome.exitCode;
|
|
3669
|
+
return false;
|
|
3670
|
+
}
|
|
3671
|
+
throw new Error("Unknown result");
|
|
3672
|
+
}
|
|
3673
|
+
}
|
|
3674
|
+
}
|
|
3675
|
+
return true;
|
|
3676
|
+
}
|
|
3677
|
+
};
|
|
3678
|
+
function branch(r, basicBlocks, pc, offset) {
|
|
3679
|
+
const newPc = pc + offset;
|
|
3680
|
+
if (basicBlocks.isStart(newPc)) {
|
|
3681
|
+
r.isOkay = true;
|
|
3682
|
+
r.newPc = newPc;
|
|
3683
|
+
} else {
|
|
3684
|
+
r.isOkay = false;
|
|
3685
|
+
r.newPc = 0;
|
|
3686
|
+
}
|
|
3687
|
+
return r;
|
|
3688
|
+
}
|
|
3689
|
+
var EXIT = 4294901760;
|
|
3690
|
+
var JUMP_ALIGMENT_FACTOR = 2;
|
|
3691
|
+
function dJump(r, jumpTable, address) {
|
|
3692
|
+
if (address === EXIT) {
|
|
3693
|
+
r.status = DjumpStatus.HALT;
|
|
3694
|
+
return r;
|
|
3695
|
+
}
|
|
3696
|
+
if (address === 0 || address % JUMP_ALIGMENT_FACTOR !== 0) {
|
|
3697
|
+
r.status = DjumpStatus.PANIC;
|
|
3698
|
+
return r;
|
|
3699
|
+
}
|
|
3700
|
+
const index = u32(address / JUMP_ALIGMENT_FACTOR) - 1;
|
|
3701
|
+
if (index >= jumpTable.jumps.length) {
|
|
3702
|
+
r.status = DjumpStatus.PANIC;
|
|
3703
|
+
return r;
|
|
3704
|
+
}
|
|
3705
|
+
const newPc = portable.staticArrayAt(jumpTable.jumps, index);
|
|
3706
|
+
if (newPc >= MAX_U32) {
|
|
3707
|
+
r.status = DjumpStatus.PANIC;
|
|
3708
|
+
return r;
|
|
3709
|
+
}
|
|
3710
|
+
r.status = DjumpStatus.OK;
|
|
3711
|
+
r.newPc = u32(newPc);
|
|
3712
|
+
return r;
|
|
3713
|
+
}
|
|
3714
|
+
var MAX_U32 = u64(4294967296);
|
|
3715
|
+
|
|
3716
|
+
// dist/build/js/assembly/api-types.js
|
|
3717
|
+
var InitialPage = class {
|
|
3718
|
+
constructor() {
|
|
3719
|
+
this.address = 0;
|
|
3720
|
+
this.length = 0;
|
|
3721
|
+
this.access = Access.None;
|
|
3722
|
+
}
|
|
3723
|
+
};
|
|
3724
|
+
var InitialChunk = class {
|
|
3725
|
+
constructor() {
|
|
3726
|
+
this.address = 0;
|
|
3727
|
+
this.data = [];
|
|
3728
|
+
}
|
|
3729
|
+
};
|
|
3730
|
+
var VmRunOptions = class {
|
|
3731
|
+
constructor() {
|
|
3732
|
+
this.logs = false;
|
|
3733
|
+
this.dumpMemory = false;
|
|
3734
|
+
}
|
|
3735
|
+
};
|
|
3736
|
+
var VmInput = class {
|
|
3737
|
+
constructor(program, memory, registers) {
|
|
3738
|
+
this.program = program;
|
|
3739
|
+
this.memory = memory;
|
|
3740
|
+
this.registers = registers;
|
|
3741
|
+
this.pc = 0;
|
|
3742
|
+
this.gas = u64(0);
|
|
3743
|
+
}
|
|
3744
|
+
};
|
|
3745
|
+
var VmPause = class {
|
|
3746
|
+
constructor() {
|
|
3747
|
+
this.status = Status.OK;
|
|
3748
|
+
this.exitCode = 0;
|
|
3749
|
+
this.pc = 0;
|
|
3750
|
+
this.nextPc = 0;
|
|
3751
|
+
this.gas = u64(0);
|
|
3752
|
+
this.registers = [];
|
|
3753
|
+
}
|
|
3754
|
+
};
|
|
3755
|
+
var VmOutput = class {
|
|
3756
|
+
constructor() {
|
|
3757
|
+
this.status = Status.OK;
|
|
3758
|
+
this.exitCode = 0;
|
|
3759
|
+
this.pc = 0;
|
|
3760
|
+
this.gas = u64(0);
|
|
3761
|
+
this.result = [];
|
|
3762
|
+
this.registers = [];
|
|
3763
|
+
this.memory = [];
|
|
3764
|
+
}
|
|
3765
|
+
};
|
|
3766
|
+
|
|
3767
|
+
// dist/build/js/assembly/api-internal.js
|
|
3768
|
+
function getAssembly(p) {
|
|
3769
|
+
const len = p.code.length;
|
|
3770
|
+
if (len === 0) {
|
|
3771
|
+
return "<seems that there is no code>";
|
|
3772
|
+
}
|
|
3773
|
+
let v = "";
|
|
3774
|
+
const argsRes = new Args();
|
|
3775
|
+
for (let i = 0; i < len; i++) {
|
|
3776
|
+
if (!p.mask.isInstruction(i)) {
|
|
3777
|
+
throw new Error("We should iterate only over instructions!");
|
|
3778
|
+
}
|
|
3779
|
+
const instruction2 = p.code[i];
|
|
3780
|
+
const iData = instruction2 >= INSTRUCTIONS.length ? MISSING_INSTRUCTION : INSTRUCTIONS[instruction2];
|
|
3781
|
+
v += "\n";
|
|
3782
|
+
v += `${i}: `;
|
|
3783
|
+
v += iData.name;
|
|
3784
|
+
v += `(${instruction2})`;
|
|
3785
|
+
const skipBytes2 = p.mask.skipBytesToNextInstruction(i);
|
|
3786
|
+
const args = decodeArguments(argsRes, iData.kind, p.code, i + 1, skipBytes2);
|
|
3787
|
+
const argsArray = [args.a, args.b, args.c, args.d];
|
|
3788
|
+
const relevantArgs = RELEVANT_ARGS[iData.kind];
|
|
3789
|
+
for (let i2 = 0; i2 < relevantArgs; i2++) {
|
|
3790
|
+
v += ` ${argsArray[i2]}, `;
|
|
3791
|
+
}
|
|
3792
|
+
i += skipBytes2;
|
|
3793
|
+
}
|
|
3794
|
+
return v;
|
|
3795
|
+
}
|
|
3796
|
+
function buildMemory(builder, pages, chunks) {
|
|
3797
|
+
let sbrkIndex = RESERVED_MEMORY;
|
|
3798
|
+
for (let i = 0; i < pages.length; i++) {
|
|
3799
|
+
const initPage = pages[i];
|
|
3800
|
+
builder.setData(initPage.access, initPage.address, new Uint8Array(initPage.length));
|
|
3801
|
+
if (initPage.access === Access.Write) {
|
|
3802
|
+
const pageEnd = initPage.address + initPage.length;
|
|
3803
|
+
sbrkIndex = pageEnd < sbrkIndex ? sbrkIndex : pageEnd;
|
|
3804
|
+
}
|
|
3805
|
+
}
|
|
3806
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
3807
|
+
const initChunk = chunks[i];
|
|
3808
|
+
const data = new Uint8Array(initChunk.data.length);
|
|
3809
|
+
for (let j = 0; j < data.length; j++) {
|
|
3810
|
+
data[j] = initChunk.data[j];
|
|
3811
|
+
}
|
|
3812
|
+
builder.setData(Access.None, initChunk.address, data);
|
|
3813
|
+
const chunkEnd = initChunk.address + initChunk.data.length;
|
|
3814
|
+
sbrkIndex = chunkEnd < sbrkIndex ? sbrkIndex : chunkEnd;
|
|
3815
|
+
}
|
|
3816
|
+
return builder.build(sbrkIndex);
|
|
3817
|
+
}
|
|
3818
|
+
function vmInit(input) {
|
|
3819
|
+
const int = new Interpreter(input.program, input.registers, input.memory);
|
|
3820
|
+
int.nextPc = input.pc;
|
|
3821
|
+
int.gas.set(input.gas);
|
|
3822
|
+
return int;
|
|
3823
|
+
}
|
|
3824
|
+
function vmRunOnce(input, options) {
|
|
3825
|
+
const int = vmInit(input);
|
|
3826
|
+
vmExecute(int, options.logs);
|
|
3827
|
+
return vmDestroy(int, options.dumpMemory);
|
|
3828
|
+
}
|
|
3829
|
+
function vmExecute(int, logs = false) {
|
|
3830
|
+
let isOk = true;
|
|
3831
|
+
const argsRes = new Args();
|
|
3832
|
+
for (; ; ) {
|
|
3833
|
+
if (!isOk) {
|
|
3834
|
+
if (logs)
|
|
3835
|
+
console.log(`REGISTERS (final) = [${int.registers.map((x) => `${x} (0x${x.toString(16)})`).join(", ")}]`);
|
|
3836
|
+
if (logs)
|
|
3837
|
+
console.log(`Finished with status: ${int.status}`);
|
|
3838
|
+
if (logs)
|
|
3839
|
+
console.log(`Exit code: ${int.exitCode}`);
|
|
3840
|
+
break;
|
|
3841
|
+
}
|
|
3842
|
+
if (logs)
|
|
3843
|
+
console.log(`PC = ${int.pc}`);
|
|
3844
|
+
if (logs)
|
|
3845
|
+
console.log(`GAS = ${int.gas.get()}`);
|
|
3846
|
+
if (logs)
|
|
3847
|
+
console.log(`STATUS = ${int.status}`);
|
|
3848
|
+
if (logs)
|
|
3849
|
+
console.log(`REGISTERS = [${int.registers.map((x) => `${x} (0x${x.toString(16)})`).join(", ")}]`);
|
|
3850
|
+
if (logs && int.pc < u32(int.program.code.length)) {
|
|
3851
|
+
const instruction2 = int.program.code[int.pc];
|
|
3852
|
+
const iData = instruction2 >= INSTRUCTIONS.length ? MISSING_INSTRUCTION : INSTRUCTIONS[instruction2];
|
|
3853
|
+
const skipBytes2 = int.program.mask.skipBytesToNextInstruction(int.pc);
|
|
3854
|
+
const args = resolveArguments(argsRes, iData.kind, int.program.code, int.pc + 1, skipBytes2, int.registers);
|
|
3855
|
+
if (args !== null) {
|
|
3856
|
+
console.log(`ARGUMENTS:
|
|
3857
|
+
${args.a} (${args.decoded.a}) = 0x${u64(args.a).toString(16)},
|
|
3858
|
+
${args.b} (${args.decoded.b}) = 0x${u64(args.b).toString(16)},
|
|
3859
|
+
${args.c} (${args.decoded.c}) = 0x${u64(args.c).toString(16)},
|
|
3860
|
+
${args.d} (${args.decoded.d}) = 0x${u64(args.d).toString(16)}`);
|
|
3861
|
+
}
|
|
3862
|
+
}
|
|
3863
|
+
isOk = int.nextSteps();
|
|
3864
|
+
}
|
|
3865
|
+
}
|
|
3866
|
+
function vmDestroy(int, dumpMemory = false) {
|
|
3867
|
+
const output = new VmOutput();
|
|
3868
|
+
output.status = int.status;
|
|
3869
|
+
output.registers = int.registers.slice(0);
|
|
3870
|
+
output.pc = int.pc;
|
|
3871
|
+
output.gas = int.gas.get();
|
|
3872
|
+
if (dumpMemory) {
|
|
3873
|
+
output.memory = getOutputChunks(int.memory);
|
|
3874
|
+
}
|
|
3875
|
+
output.exitCode = int.exitCode;
|
|
3876
|
+
output.result = readResult(int);
|
|
3877
|
+
int.memory.free();
|
|
3878
|
+
return output;
|
|
3879
|
+
}
|
|
3880
|
+
function readResult(int) {
|
|
3881
|
+
if (int.status !== Status.HALT) {
|
|
3882
|
+
return [];
|
|
3883
|
+
}
|
|
3884
|
+
const ptr_start = u32(int.registers[7] & u64(4294967295));
|
|
3885
|
+
const ptr_end = u32(int.registers[8] & u64(4294967295));
|
|
3886
|
+
if (ptr_start >= ptr_end) {
|
|
3887
|
+
return [];
|
|
3888
|
+
}
|
|
3889
|
+
const totalLength = ptr_end - ptr_start;
|
|
3890
|
+
if (totalLength > 1024 * 1024) {
|
|
3891
|
+
return [];
|
|
3892
|
+
}
|
|
3893
|
+
const result = new Uint8Array(totalLength);
|
|
3894
|
+
const faultRes4 = new MaybePageFault();
|
|
3895
|
+
int.memory.bytesRead(faultRes4, ptr_start, result, 0);
|
|
3896
|
+
if (faultRes4.isFault) {
|
|
3897
|
+
return [];
|
|
3898
|
+
}
|
|
3899
|
+
const out = new Array(totalLength);
|
|
3900
|
+
for (let i = 0; i < totalLength; i++) {
|
|
3901
|
+
out[i] = result[i];
|
|
3902
|
+
}
|
|
3903
|
+
return out;
|
|
3904
|
+
}
|
|
3905
|
+
function getOutputChunks(memory) {
|
|
3906
|
+
const chunks = [];
|
|
3907
|
+
const pages = portable.asArray(memory.pages.keys());
|
|
3908
|
+
let currentChunk = null;
|
|
3909
|
+
for (let i = 0; i < pages.length; i++) {
|
|
3910
|
+
const pageIdx = pages[i];
|
|
3911
|
+
const page = memory.pages.get(pageIdx);
|
|
3912
|
+
if (page.raw.page === null) {
|
|
3913
|
+
continue;
|
|
3914
|
+
}
|
|
3915
|
+
for (let n = 0; n < page.raw.data.length; n++) {
|
|
3916
|
+
const v = page.raw.data[n];
|
|
3917
|
+
if (v !== 0) {
|
|
3918
|
+
if (currentChunk !== null) {
|
|
3919
|
+
currentChunk.data.push(v);
|
|
3920
|
+
} else {
|
|
3921
|
+
currentChunk = new InitialChunk();
|
|
3922
|
+
currentChunk.address = pageIdx * PAGE_SIZE + n;
|
|
3923
|
+
currentChunk.data = [v];
|
|
3924
|
+
}
|
|
3925
|
+
} else if (currentChunk !== null) {
|
|
3926
|
+
chunks.push(currentChunk);
|
|
3927
|
+
currentChunk = null;
|
|
3928
|
+
}
|
|
3929
|
+
}
|
|
3930
|
+
}
|
|
3931
|
+
if (currentChunk !== null) {
|
|
3932
|
+
chunks.push(currentChunk);
|
|
3933
|
+
}
|
|
3934
|
+
return chunks;
|
|
3935
|
+
}
|
|
3936
|
+
|
|
3937
|
+
// dist/build/js/assembly/spi.js
|
|
3938
|
+
var MAX_ARGS_LEN = 2 ** 24;
|
|
3939
|
+
var ARGS_SEGMENT_START = 2 ** 32 - SEGMENT_SIZE - MAX_ARGS_LEN;
|
|
3940
|
+
var STACK_SEGMENT_END = ARGS_SEGMENT_START - SEGMENT_SIZE;
|
|
3941
|
+
function decodeSpi(data, args, preallocateMemoryPages = 0, useBlockGas = false) {
|
|
3942
|
+
const argsLength = args.length;
|
|
3943
|
+
if (argsLength > MAX_ARGS_LEN) {
|
|
3944
|
+
throw new Error(`Arguments length is too big. Got: ${argsLength}, max: ${MAX_ARGS_LEN}`);
|
|
3945
|
+
}
|
|
3946
|
+
const decoder = new Decoder(data);
|
|
3947
|
+
const roLength = decoder.u24();
|
|
3948
|
+
const rwLength = decoder.u24();
|
|
3949
|
+
const heapPages = decoder.u16();
|
|
3950
|
+
const stackSize = decoder.u24();
|
|
3951
|
+
const roMem = decoder.bytes(roLength);
|
|
3952
|
+
const rwMem = decoder.bytes(rwLength);
|
|
3953
|
+
const codeLength = decoder.u32();
|
|
3954
|
+
const code = decoder.bytes(codeLength);
|
|
3955
|
+
decoder.finish();
|
|
3956
|
+
const program = deblob(code, useBlockGas);
|
|
3957
|
+
const builder = new MemoryBuilder(preallocateMemoryPages);
|
|
3958
|
+
const heapStart = 2 * SEGMENT_SIZE + alignToSegmentSize(roLength);
|
|
3959
|
+
const heapZerosStart = heapStart + alignToPageSize(rwLength);
|
|
3960
|
+
const heapZerosLength = heapPages * PAGE_SIZE;
|
|
3961
|
+
const stackLength = alignToPageSize(stackSize);
|
|
3962
|
+
const stackStart = STACK_SEGMENT_END - stackLength;
|
|
3963
|
+
if (roLength > 0) {
|
|
3964
|
+
builder.setData(Access.Read, SEGMENT_SIZE, roMem);
|
|
3965
|
+
}
|
|
3966
|
+
if (argsLength > 0) {
|
|
3967
|
+
builder.setData(Access.Read, ARGS_SEGMENT_START, args);
|
|
3968
|
+
}
|
|
3969
|
+
if (rwLength > 0) {
|
|
3970
|
+
builder.setData(Access.Write, heapStart, rwMem);
|
|
3971
|
+
}
|
|
3972
|
+
if (heapZerosLength > 0) {
|
|
3973
|
+
builder.setEmpty(Access.Write, heapZerosStart, heapZerosLength);
|
|
3974
|
+
}
|
|
3975
|
+
if (stackLength > 0) {
|
|
3976
|
+
builder.setEmpty(Access.Write, stackStart, stackLength);
|
|
3977
|
+
}
|
|
3978
|
+
const memory = builder.build(heapZerosStart + heapZerosLength, stackStart);
|
|
3979
|
+
const registers = newRegisters();
|
|
3980
|
+
registers[0] = 4294901760;
|
|
3981
|
+
registers[1] = STACK_SEGMENT_END;
|
|
3982
|
+
registers[7] = ARGS_SEGMENT_START;
|
|
3983
|
+
registers[8] = argsLength;
|
|
3984
|
+
return new StandardProgram(program, memory, registers);
|
|
3985
|
+
}
|
|
3986
|
+
function alignToPageSize(size) {
|
|
3987
|
+
return size + PAGE_SIZE - 1 >> PAGE_SIZE_SHIFT << PAGE_SIZE_SHIFT;
|
|
3988
|
+
}
|
|
3989
|
+
function alignToSegmentSize(size) {
|
|
3990
|
+
return size + SEGMENT_SIZE - 1 >> SEGMENT_SIZE_SHIFT << SEGMENT_SIZE_SHIFT;
|
|
3991
|
+
}
|
|
3992
|
+
var StandardProgram = class {
|
|
3993
|
+
constructor(program, memory, registers) {
|
|
3994
|
+
this.program = program;
|
|
3995
|
+
this.memory = memory;
|
|
3996
|
+
this.registers = registers;
|
|
3997
|
+
this.metadata = new Uint8Array(0);
|
|
3998
|
+
}
|
|
3999
|
+
toString() {
|
|
4000
|
+
return `StandardProgram { program: ${this.program}, memory_pages: ${this.memory.pages.size}, registers: ${this.registers} }`;
|
|
4001
|
+
}
|
|
4002
|
+
};
|
|
4003
|
+
|
|
4004
|
+
// dist/build/js/assembly/api-debugger.js
|
|
4005
|
+
var interpreter = null;
|
|
4006
|
+
function resetJAM(program, pc, initialGas, args, hasMetadata = false, useBlockGas = false) {
|
|
4007
|
+
const code = hasMetadata ? extractCodeAndMetadata(liftBytes(program)).code : liftBytes(program);
|
|
4008
|
+
const p = decodeSpi(code, liftBytes(args), 128, useBlockGas);
|
|
4009
|
+
const int = new Interpreter(p.program, p.registers, p.memory);
|
|
4010
|
+
int.nextPc = pc;
|
|
4011
|
+
int.gas.set(initialGas);
|
|
4012
|
+
if (interpreter !== null) {
|
|
4013
|
+
interpreter.memory.free();
|
|
4014
|
+
}
|
|
4015
|
+
interpreter = int;
|
|
4016
|
+
}
|
|
4017
|
+
function resetGeneric(program, flatRegisters, initialGas, hasMetadata = false, useBlockGas = false) {
|
|
4018
|
+
const code = hasMetadata ? extractCodeAndMetadata(liftBytes(program)).code : liftBytes(program);
|
|
4019
|
+
const p = deblob(code, useBlockGas);
|
|
4020
|
+
const registers = newRegisters();
|
|
4021
|
+
fillRegisters(registers, flatRegisters);
|
|
4022
|
+
const int = new Interpreter(p, registers);
|
|
4023
|
+
int.gas.set(initialGas);
|
|
4024
|
+
if (interpreter !== null) {
|
|
4025
|
+
interpreter.memory.free();
|
|
4026
|
+
}
|
|
4027
|
+
interpreter = int;
|
|
4028
|
+
}
|
|
4029
|
+
function resetGenericWithMemory(program, flatRegisters, pageMap, chunks, initialGas, hasMetadata = false, useBlockGas = false) {
|
|
4030
|
+
const code = hasMetadata ? extractCodeAndMetadata(liftBytes(program)).code : liftBytes(program);
|
|
4031
|
+
const p = deblob(code, useBlockGas);
|
|
4032
|
+
const registers = newRegisters();
|
|
4033
|
+
fillRegisters(registers, flatRegisters);
|
|
4034
|
+
const builder = new MemoryBuilder();
|
|
4035
|
+
const memory = buildMemory(builder, readPages(pageMap), readChunks(chunks));
|
|
4036
|
+
const int = new Interpreter(p, registers, memory);
|
|
4037
|
+
int.gas.set(initialGas);
|
|
4038
|
+
interpreter = int;
|
|
4039
|
+
}
|
|
4040
|
+
function nextStep() {
|
|
4041
|
+
if (interpreter !== null) {
|
|
4042
|
+
const int = interpreter;
|
|
4043
|
+
return int.nextSteps();
|
|
4044
|
+
}
|
|
4045
|
+
return false;
|
|
4046
|
+
}
|
|
4047
|
+
function nSteps(steps) {
|
|
4048
|
+
if (interpreter !== null) {
|
|
4049
|
+
const int = interpreter;
|
|
4050
|
+
return int.nextSteps(steps);
|
|
4051
|
+
}
|
|
4052
|
+
return false;
|
|
4053
|
+
}
|
|
4054
|
+
function getProgramCounter() {
|
|
4055
|
+
if (interpreter === null) {
|
|
4056
|
+
return 0;
|
|
4057
|
+
}
|
|
4058
|
+
const int = interpreter;
|
|
4059
|
+
return u32(int.pc);
|
|
4060
|
+
}
|
|
4061
|
+
function setNextProgramCounter(pc) {
|
|
4062
|
+
if (interpreter === null) {
|
|
4063
|
+
return;
|
|
4064
|
+
}
|
|
4065
|
+
const int = interpreter;
|
|
4066
|
+
int.nextPc = pc;
|
|
4067
|
+
}
|
|
4068
|
+
function getStatus() {
|
|
4069
|
+
if (interpreter === null) {
|
|
4070
|
+
return Status.PANIC;
|
|
4071
|
+
}
|
|
4072
|
+
const int = interpreter;
|
|
4073
|
+
return int.status;
|
|
4074
|
+
}
|
|
4075
|
+
function getExitArg() {
|
|
4076
|
+
if (interpreter === null) {
|
|
4077
|
+
return 0;
|
|
4078
|
+
}
|
|
4079
|
+
const int = interpreter;
|
|
4080
|
+
return int.exitCode || 0;
|
|
4081
|
+
}
|
|
4082
|
+
function getGasLeft() {
|
|
4083
|
+
if (interpreter === null) {
|
|
4084
|
+
return i64(0);
|
|
4085
|
+
}
|
|
4086
|
+
const int = interpreter;
|
|
4087
|
+
return int.gas.get();
|
|
4088
|
+
}
|
|
4089
|
+
function setGasLeft(gas) {
|
|
4090
|
+
if (interpreter !== null) {
|
|
4091
|
+
const int = interpreter;
|
|
4092
|
+
int.gas.set(gas);
|
|
4093
|
+
}
|
|
4094
|
+
}
|
|
4095
|
+
function getRegisters() {
|
|
4096
|
+
const flat = new Uint8Array(NO_OF_REGISTERS * REG_SIZE_BYTES).fill(0);
|
|
4097
|
+
if (interpreter === null) {
|
|
4098
|
+
return flat;
|
|
4099
|
+
}
|
|
4100
|
+
const int = interpreter;
|
|
4101
|
+
for (let i = 0; i < int.registers.length; i++) {
|
|
4102
|
+
let val = int.registers[i];
|
|
4103
|
+
for (let j = 0; j < REG_SIZE_BYTES; j++) {
|
|
4104
|
+
const index = i * REG_SIZE_BYTES + j;
|
|
4105
|
+
flat[index] = val & u64(255);
|
|
4106
|
+
val = val >> u64(8);
|
|
4107
|
+
}
|
|
4108
|
+
}
|
|
4109
|
+
return flat;
|
|
4110
|
+
}
|
|
4111
|
+
function setRegisters(flatRegisters) {
|
|
4112
|
+
if (interpreter === null) {
|
|
4113
|
+
return;
|
|
4114
|
+
}
|
|
4115
|
+
const int = interpreter;
|
|
4116
|
+
fillRegisters(int.registers, flatRegisters);
|
|
4117
|
+
}
|
|
4118
|
+
function getPageDump(index) {
|
|
4119
|
+
if (interpreter === null) {
|
|
4120
|
+
return new Uint8Array(PAGE_SIZE).fill(0);
|
|
4121
|
+
}
|
|
4122
|
+
const int = interpreter;
|
|
4123
|
+
const page = int.memory.pageDump(index);
|
|
4124
|
+
if (page === null) {
|
|
4125
|
+
return new Uint8Array(PAGE_SIZE).fill(0);
|
|
4126
|
+
}
|
|
4127
|
+
return page;
|
|
4128
|
+
}
|
|
4129
|
+
function getPagePointer(page) {
|
|
4130
|
+
if (interpreter === null) {
|
|
4131
|
+
return 0;
|
|
4132
|
+
}
|
|
4133
|
+
const int = interpreter;
|
|
4134
|
+
return int.memory.getPagePointer(page);
|
|
4135
|
+
}
|
|
4136
|
+
function getMemory(address, length) {
|
|
4137
|
+
if (interpreter === null) {
|
|
4138
|
+
return null;
|
|
4139
|
+
}
|
|
4140
|
+
const int = interpreter;
|
|
4141
|
+
const faultRes4 = new MaybePageFault();
|
|
4142
|
+
const result = int.memory.getMemory(faultRes4, address, length);
|
|
4143
|
+
if (faultRes4.isFault) {
|
|
4144
|
+
return null;
|
|
4145
|
+
}
|
|
4146
|
+
return result;
|
|
4147
|
+
}
|
|
4148
|
+
function setMemory(address, data) {
|
|
4149
|
+
if (interpreter === null) {
|
|
4150
|
+
return false;
|
|
4151
|
+
}
|
|
4152
|
+
const int = interpreter;
|
|
4153
|
+
const end = address + data.length;
|
|
4154
|
+
const faultRes4 = new MaybePageFault();
|
|
4155
|
+
for (let i = address; i < end; i++) {
|
|
4156
|
+
int.memory.setU8(faultRes4, i, data[i - address]);
|
|
4157
|
+
if (faultRes4.isFault) {
|
|
4158
|
+
return false;
|
|
4159
|
+
}
|
|
4160
|
+
}
|
|
4161
|
+
return true;
|
|
4162
|
+
}
|
|
4163
|
+
function fillRegisters(registers, flat) {
|
|
4164
|
+
const len = registers.length * REG_SIZE_BYTES;
|
|
4165
|
+
if (len !== flat.length) {
|
|
4166
|
+
throw new Error(`Mismatching registers size, got: ${flat.length}, expected: ${len}`);
|
|
4167
|
+
}
|
|
4168
|
+
for (let i = 0; i < registers.length; i++) {
|
|
4169
|
+
let num = u64(0);
|
|
4170
|
+
for (let j = 0; j < REG_SIZE_BYTES; j++) {
|
|
4171
|
+
const index = i * REG_SIZE_BYTES + j;
|
|
4172
|
+
num |= flat[index] << u64(j * 8);
|
|
4173
|
+
}
|
|
4174
|
+
registers[i] = num;
|
|
4175
|
+
}
|
|
4176
|
+
}
|
|
4177
|
+
function readPages(pageMap) {
|
|
4178
|
+
const pages = [];
|
|
4179
|
+
const codec = new Decoder(pageMap);
|
|
4180
|
+
while (!codec.isExhausted()) {
|
|
4181
|
+
const p = new InitialPage();
|
|
4182
|
+
p.address = codec.u32();
|
|
4183
|
+
p.length = codec.u32();
|
|
4184
|
+
p.access = codec.u8() > 0 ? Access.Write : Access.Read;
|
|
4185
|
+
pages.push(p);
|
|
4186
|
+
}
|
|
4187
|
+
return pages;
|
|
4188
|
+
}
|
|
4189
|
+
function readChunks(chunks) {
|
|
4190
|
+
const res = [];
|
|
4191
|
+
const codec = new Decoder(chunks);
|
|
4192
|
+
while (!codec.isExhausted()) {
|
|
4193
|
+
const c = new InitialChunk();
|
|
4194
|
+
c.address = codec.u32();
|
|
4195
|
+
const len = codec.u32();
|
|
4196
|
+
const data = codec.bytes(len);
|
|
4197
|
+
for (let i = 0; i < len; i++) {
|
|
4198
|
+
c.data.push(data[i]);
|
|
4199
|
+
}
|
|
4200
|
+
res.push(c);
|
|
4201
|
+
}
|
|
4202
|
+
return res;
|
|
4203
|
+
}
|
|
4204
|
+
|
|
4205
|
+
// dist/build/js/assembly/api-utils.js
|
|
4206
|
+
var InputKind;
|
|
4207
|
+
(function(InputKind2) {
|
|
4208
|
+
InputKind2[InputKind2["Generic"] = 0] = "Generic";
|
|
4209
|
+
InputKind2[InputKind2["SPI"] = 1] = "SPI";
|
|
4210
|
+
})(InputKind || (InputKind = {}));
|
|
4211
|
+
var HasMetadata;
|
|
4212
|
+
(function(HasMetadata2) {
|
|
4213
|
+
HasMetadata2[HasMetadata2["Yes"] = 0] = "Yes";
|
|
4214
|
+
HasMetadata2[HasMetadata2["No"] = 1] = "No";
|
|
4215
|
+
})(HasMetadata || (HasMetadata = {}));
|
|
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;
|
|
4236
|
+
}
|
|
4237
|
+
function disassemble(input, kind, withMetadata) {
|
|
4238
|
+
const program = prepareProgram(kind, withMetadata, input, [], [], [], [], 0, false);
|
|
4239
|
+
let output = "";
|
|
4240
|
+
if (withMetadata === HasMetadata.Yes) {
|
|
4241
|
+
output = "Metadata: \n";
|
|
4242
|
+
output += "0x";
|
|
4243
|
+
output += program.metadata.reduce((acc, x) => acc + x.toString(16).padStart(2, "0"), "");
|
|
4244
|
+
output += "\n\n";
|
|
4245
|
+
}
|
|
4246
|
+
output += getAssembly(program.program);
|
|
4247
|
+
return output;
|
|
4248
|
+
}
|
|
4249
|
+
function prepareProgram(kind, hasMetadata, program, initialRegisters, initialPageMap, initialMemory, args, preallocateMemoryPages, useBlockGas) {
|
|
4250
|
+
let code = liftBytes(program);
|
|
4251
|
+
let metadata = new Uint8Array(0);
|
|
4252
|
+
if (hasMetadata === HasMetadata.Yes) {
|
|
4253
|
+
const data = extractCodeAndMetadata(code);
|
|
4254
|
+
code = data.code;
|
|
4255
|
+
metadata = data.metadata;
|
|
4256
|
+
}
|
|
4257
|
+
if (kind === InputKind.Generic) {
|
|
4258
|
+
const program2 = deblob(code, useBlockGas);
|
|
4259
|
+
const builder = new MemoryBuilder(preallocateMemoryPages);
|
|
4260
|
+
const memory = buildMemory(builder, initialPageMap, initialMemory);
|
|
4261
|
+
const registers = newRegisters();
|
|
4262
|
+
const safeLen = initialRegisters.length < NO_OF_REGISTERS ? initialRegisters.length : NO_OF_REGISTERS;
|
|
4263
|
+
for (let r = 0; r < safeLen; r++) {
|
|
4264
|
+
registers[r] = initialRegisters[r];
|
|
4265
|
+
}
|
|
4266
|
+
const exe = new StandardProgram(program2, memory, registers);
|
|
4267
|
+
exe.metadata = metadata;
|
|
4268
|
+
return exe;
|
|
4269
|
+
}
|
|
4270
|
+
if (kind === InputKind.SPI) {
|
|
4271
|
+
const exe = decodeSpi(code, liftBytes(args), preallocateMemoryPages);
|
|
4272
|
+
exe.metadata = metadata;
|
|
4273
|
+
return exe;
|
|
4274
|
+
}
|
|
4275
|
+
throw new Error(`Unknown kind: ${kind}`);
|
|
4276
|
+
}
|
|
4277
|
+
function runProgram(program, initialGas = 0, programCounter = 0, logs = false, dumpMemory = false) {
|
|
4278
|
+
const vmInput = new VmInput(program.program, program.memory, program.registers);
|
|
4279
|
+
vmInput.gas = i64(initialGas);
|
|
4280
|
+
vmInput.pc = programCounter;
|
|
4281
|
+
const vmOptions = new VmRunOptions();
|
|
4282
|
+
vmOptions.logs = logs;
|
|
4283
|
+
vmOptions.dumpMemory = dumpMemory;
|
|
4284
|
+
return vmRunOnce(vmInput, vmOptions);
|
|
4285
|
+
}
|
|
4286
|
+
var nextPvmId = 0;
|
|
4287
|
+
var pvms = /* @__PURE__ */ new Map();
|
|
4288
|
+
function pvmStart(program) {
|
|
4289
|
+
const vmInput = new VmInput(program.program, program.memory, program.registers);
|
|
4290
|
+
nextPvmId += 1;
|
|
4291
|
+
pvms.set(nextPvmId, vmInit(vmInput));
|
|
4292
|
+
return nextPvmId;
|
|
4293
|
+
}
|
|
4294
|
+
function pvmDestroy(pvmId) {
|
|
4295
|
+
if (pvms.has(pvmId)) {
|
|
4296
|
+
const int = pvms.get(pvmId);
|
|
4297
|
+
pvms.delete(pvmId);
|
|
4298
|
+
return vmDestroy(int, false);
|
|
4299
|
+
}
|
|
4300
|
+
return null;
|
|
4301
|
+
}
|
|
4302
|
+
function pvmSetRegisters(pvmId, registers) {
|
|
4303
|
+
if (pvms.has(pvmId)) {
|
|
4304
|
+
const int = pvms.get(pvmId);
|
|
4305
|
+
const safeIter = registers.length < NO_OF_REGISTERS ? registers.length : NO_OF_REGISTERS;
|
|
4306
|
+
for (let i = 0; i < safeIter; i++) {
|
|
4307
|
+
int.registers[i] = registers[i];
|
|
4308
|
+
}
|
|
4309
|
+
}
|
|
4310
|
+
}
|
|
4311
|
+
function pvmReadMemory(pvmId, address, length) {
|
|
4312
|
+
if (pvms.has(pvmId)) {
|
|
4313
|
+
const int = pvms.get(pvmId);
|
|
4314
|
+
const faultRes4 = new MaybePageFault();
|
|
4315
|
+
const result = int.memory.getMemory(faultRes4, address, length);
|
|
4316
|
+
if (!faultRes4.isFault) {
|
|
4317
|
+
return result;
|
|
4318
|
+
}
|
|
4319
|
+
}
|
|
4320
|
+
return null;
|
|
4321
|
+
}
|
|
4322
|
+
function pvmGetPagePointer(pvmId, page) {
|
|
4323
|
+
if (pvms.has(pvmId)) {
|
|
4324
|
+
const int = pvms.get(pvmId);
|
|
4325
|
+
return int.memory.getPagePointer(page);
|
|
4326
|
+
}
|
|
4327
|
+
return 0;
|
|
4328
|
+
}
|
|
4329
|
+
function pvmWriteMemory(pvmId, address, data) {
|
|
4330
|
+
if (pvms.has(pvmId)) {
|
|
4331
|
+
const int = pvms.get(pvmId);
|
|
4332
|
+
const faultRes4 = new MaybePageFault();
|
|
4333
|
+
const tempBuffer = new Uint8Array(data.length);
|
|
4334
|
+
int.memory.bytesRead(faultRes4, address, tempBuffer, 0);
|
|
4335
|
+
if (faultRes4.isFault) {
|
|
4336
|
+
return false;
|
|
4337
|
+
}
|
|
4338
|
+
faultRes4.isFault = false;
|
|
4339
|
+
faultRes4.isAccess = false;
|
|
4340
|
+
int.memory.bytesWrite(faultRes4, address, data, 0);
|
|
4341
|
+
if (!faultRes4.isFault) {
|
|
4342
|
+
return true;
|
|
4343
|
+
}
|
|
4344
|
+
}
|
|
4345
|
+
return false;
|
|
4346
|
+
}
|
|
4347
|
+
function pvmResume(pvmId, gas, pc, logs = false) {
|
|
4348
|
+
if (pvms.has(pvmId)) {
|
|
4349
|
+
const int = pvms.get(pvmId);
|
|
4350
|
+
int.nextPc = pc;
|
|
4351
|
+
int.gas.set(gas);
|
|
4352
|
+
vmExecute(int, logs);
|
|
4353
|
+
const pause = new VmPause();
|
|
4354
|
+
pause.status = int.status;
|
|
4355
|
+
pause.exitCode = int.exitCode;
|
|
4356
|
+
pause.pc = int.pc;
|
|
4357
|
+
pause.nextPc = int.nextPc;
|
|
4358
|
+
pause.gas = int.gas.get();
|
|
4359
|
+
pause.registers = int.registers.slice(0);
|
|
4360
|
+
return pause;
|
|
4361
|
+
}
|
|
4362
|
+
return null;
|
|
4363
|
+
}
|
|
4364
|
+
|
|
4365
|
+
// dist/build/js/assembly/program-build.js
|
|
4366
|
+
function wrapAsProgram(bytecode) {
|
|
4367
|
+
const jumpTableLength = 0;
|
|
4368
|
+
const jumpTableItemLength = 0;
|
|
4369
|
+
const codeLength = bytecode.length;
|
|
4370
|
+
const mask = buildMask(bytecode);
|
|
4371
|
+
const codeLengthBytes = encodeVarU32(codeLength);
|
|
4372
|
+
const data = new Uint8Array(1 + 1 + codeLengthBytes.length + codeLength + mask.length);
|
|
4373
|
+
data[0] = jumpTableLength;
|
|
4374
|
+
data[1] = jumpTableItemLength;
|
|
4375
|
+
let offset = 2;
|
|
4376
|
+
for (let i = 0; i < codeLengthBytes.length; i++) {
|
|
4377
|
+
data[offset] = codeLengthBytes[i];
|
|
4378
|
+
offset++;
|
|
4379
|
+
}
|
|
4380
|
+
for (let i = 0; i < bytecode.length; i++) {
|
|
4381
|
+
data[offset] = bytecode[i];
|
|
4382
|
+
offset++;
|
|
4383
|
+
}
|
|
4384
|
+
for (let i = 0; i < mask.length; i++) {
|
|
4385
|
+
data[offset] = mask[i];
|
|
4386
|
+
offset++;
|
|
4387
|
+
}
|
|
4388
|
+
return data;
|
|
4389
|
+
}
|
|
4390
|
+
function skipBytes(kind, data) {
|
|
4391
|
+
switch (kind) {
|
|
4392
|
+
case Arguments.Zero:
|
|
4393
|
+
return 0;
|
|
4394
|
+
case Arguments.OneImm:
|
|
4395
|
+
return immBytes(data.length, 0);
|
|
4396
|
+
case Arguments.TwoImm: {
|
|
4397
|
+
const low = lowNibble(data[0]);
|
|
4398
|
+
const split = low + 1;
|
|
4399
|
+
return 1 + split + immBytes(data.length, split + 1);
|
|
4400
|
+
}
|
|
4401
|
+
case Arguments.OneOff:
|
|
4402
|
+
return immBytes(data.length, 0);
|
|
4403
|
+
case Arguments.OneRegOneImm:
|
|
4404
|
+
return 1 + immBytes(data.length, 1);
|
|
4405
|
+
case Arguments.OneRegOneExtImm:
|
|
4406
|
+
return 9;
|
|
4407
|
+
case Arguments.OneRegTwoImm: {
|
|
4408
|
+
const hig = higNibble(data[0]);
|
|
4409
|
+
const split = hig + 1;
|
|
4410
|
+
return 1 + split + immBytes(data.length, 1 + split);
|
|
4411
|
+
}
|
|
4412
|
+
case Arguments.OneRegOneImmOneOff: {
|
|
4413
|
+
const hig = higNibble(data[0]);
|
|
4414
|
+
const split = hig + 1;
|
|
4415
|
+
return 1 + split + immBytes(data.length, 1 + split);
|
|
4416
|
+
}
|
|
4417
|
+
case Arguments.TwoReg:
|
|
4418
|
+
return 1;
|
|
4419
|
+
case Arguments.TwoRegOneImm:
|
|
4420
|
+
return 1 + IntMath.minI32(4, data.length);
|
|
4421
|
+
case Arguments.TwoRegOneOff:
|
|
4422
|
+
return 1 + IntMath.minI32(4, data.length);
|
|
4423
|
+
case Arguments.TwoRegTwoImm: {
|
|
4424
|
+
const low = lowNibble(data[1]);
|
|
4425
|
+
const split = low + 1;
|
|
4426
|
+
return 2 + split + immBytes(data.length, 2 + split);
|
|
4427
|
+
}
|
|
4428
|
+
case Arguments.ThreeReg:
|
|
4429
|
+
return 2;
|
|
4430
|
+
default:
|
|
4431
|
+
throw new Error(`Unhandled arguments kind: ${kind}`);
|
|
4432
|
+
}
|
|
4433
|
+
}
|
|
4434
|
+
function buildMask(bytecode) {
|
|
4435
|
+
const mask = new StaticArray(bytecode.length);
|
|
4436
|
+
for (let i = 0; i < bytecode.length; i++) {
|
|
4437
|
+
const instruction2 = bytecode[i];
|
|
4438
|
+
const iData = instruction2 < INSTRUCTIONS.length ? INSTRUCTIONS[instruction2] : MISSING_INSTRUCTION;
|
|
4439
|
+
mask[i] = true;
|
|
4440
|
+
const requiredBytes = REQUIRED_BYTES[iData.kind];
|
|
4441
|
+
if (i + 1 + requiredBytes <= bytecode.length) {
|
|
4442
|
+
i += skipBytes(iData.kind, bytecode.subarray(i + 1));
|
|
4443
|
+
}
|
|
4444
|
+
}
|
|
4445
|
+
const packed = [];
|
|
4446
|
+
for (let i = 0; i < mask.length; i += 8) {
|
|
4447
|
+
let byte = 0;
|
|
4448
|
+
for (let j = i; j < i + 8; j++) {
|
|
4449
|
+
byte >>= 1;
|
|
4450
|
+
if (j < mask.length && mask[j]) {
|
|
4451
|
+
byte |= 128;
|
|
4452
|
+
}
|
|
4453
|
+
}
|
|
4454
|
+
packed.push(byte);
|
|
4455
|
+
}
|
|
4456
|
+
return packed;
|
|
4457
|
+
}
|
|
4458
|
+
function immBytes(dataLength, required) {
|
|
4459
|
+
if (dataLength < required) {
|
|
4460
|
+
return 0;
|
|
4461
|
+
}
|
|
4462
|
+
return IntMath.minI32(4, dataLength - required);
|
|
4463
|
+
}
|
|
4464
|
+
export {
|
|
4465
|
+
HasMetadata,
|
|
4466
|
+
InputKind,
|
|
4467
|
+
disassemble,
|
|
4468
|
+
getAssembly,
|
|
4469
|
+
getBlockGasCosts,
|
|
4470
|
+
getExitArg,
|
|
4471
|
+
getGasLeft,
|
|
4472
|
+
getMemory,
|
|
4473
|
+
getPageDump,
|
|
4474
|
+
getPagePointer,
|
|
4475
|
+
getProgramCounter,
|
|
4476
|
+
getRegisters,
|
|
4477
|
+
getStatus,
|
|
4478
|
+
nSteps,
|
|
4479
|
+
nextStep,
|
|
4480
|
+
prepareProgram,
|
|
4481
|
+
pvmDestroy,
|
|
4482
|
+
pvmGetPagePointer,
|
|
4483
|
+
pvmReadMemory,
|
|
4484
|
+
pvmResume,
|
|
4485
|
+
pvmSetRegisters,
|
|
4486
|
+
pvmStart,
|
|
4487
|
+
pvmWriteMemory,
|
|
4488
|
+
resetGeneric,
|
|
4489
|
+
resetGenericWithMemory,
|
|
4490
|
+
resetJAM,
|
|
4491
|
+
runProgram,
|
|
4492
|
+
setGasLeft,
|
|
4493
|
+
setMemory,
|
|
4494
|
+
setNextProgramCounter,
|
|
4495
|
+
setRegisters,
|
|
4496
|
+
wrapAsProgram
|
|
4497
|
+
};
|