summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/wasm/wasm-module-builder.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/wasm/wasm-module-builder.js')
-rw-r--r--deps/v8/test/mjsunit/wasm/wasm-module-builder.js485
1 files changed, 257 insertions, 228 deletions
diff --git a/deps/v8/test/mjsunit/wasm/wasm-module-builder.js b/deps/v8/test/mjsunit/wasm/wasm-module-builder.js
index b914ee91e3..79e70ff792 100644
--- a/deps/v8/test/mjsunit/wasm/wasm-module-builder.js
+++ b/deps/v8/test/mjsunit/wasm/wasm-module-builder.js
@@ -75,8 +75,10 @@ let kLocalNamesCode = 2;
let kWasmFunctionTypeForm = 0x60;
let kWasmAnyFunctionTypeForm = 0x70;
-let kHasMaximumFlag = 1;
-let kSharedHasMaximumFlag = 3;
+let kLimitsNoMaximum = 0
+let kLimitsHasMaximum = 1;
+let kLimitsSharedNoMaximum = 2;
+let kLimitsSharedHasMaximum = 3;
// Segment flags
let kActiveNoIndex = 0;
@@ -197,204 +199,226 @@ function makeSig_r_xx(r, x) {
}
// Opcodes
-let kExprUnreachable = 0x00;
-let kExprNop = 0x01;
-let kExprBlock = 0x02;
-let kExprLoop = 0x03;
-let kExprIf = 0x04;
-let kExprElse = 0x05;
-let kExprTry = 0x06;
-let kExprCatch = 0x07;
-let kExprThrow = 0x08;
-let kExprRethrow = 0x09;
-let kExprBrOnExn = 0x0a;
-let kExprEnd = 0x0b;
-let kExprBr = 0x0c;
-let kExprBrIf = 0x0d;
-let kExprBrTable = 0x0e;
-let kExprReturn = 0x0f;
-let kExprCallFunction = 0x10;
-let kExprCallIndirect = 0x11;
-let kExprReturnCall = 0x12;
-let kExprReturnCallIndirect = 0x13;
-let kExprCallRef = 0x14;
-let kExprReturnCallRef = 0x15;
-let kExprDrop = 0x1a;
-let kExprSelect = 0x1b;
-let kExprSelectWithType = 0x1c;
-let kExprLocalGet = 0x20;
-let kExprLocalSet = 0x21;
-let kExprLocalTee = 0x22;
-let kExprGlobalGet = 0x23;
-let kExprGlobalSet = 0x24;
-let kExprTableGet = 0x25;
-let kExprTableSet = 0x26;
-let kExprI32LoadMem = 0x28;
-let kExprI64LoadMem = 0x29;
-let kExprF32LoadMem = 0x2a;
-let kExprF64LoadMem = 0x2b;
-let kExprI32LoadMem8S = 0x2c;
-let kExprI32LoadMem8U = 0x2d;
-let kExprI32LoadMem16S = 0x2e;
-let kExprI32LoadMem16U = 0x2f;
-let kExprI64LoadMem8S = 0x30;
-let kExprI64LoadMem8U = 0x31;
-let kExprI64LoadMem16S = 0x32;
-let kExprI64LoadMem16U = 0x33;
-let kExprI64LoadMem32S = 0x34;
-let kExprI64LoadMem32U = 0x35;
-let kExprI32StoreMem = 0x36;
-let kExprI64StoreMem = 0x37;
-let kExprF32StoreMem = 0x38;
-let kExprF64StoreMem = 0x39;
-let kExprI32StoreMem8 = 0x3a;
-let kExprI32StoreMem16 = 0x3b;
-let kExprI64StoreMem8 = 0x3c;
-let kExprI64StoreMem16 = 0x3d;
-let kExprI64StoreMem32 = 0x3e;
-let kExprMemorySize = 0x3f;
-let kExprMemoryGrow = 0x40;
-let kExprI32Const = 0x41;
-let kExprI64Const = 0x42;
-let kExprF32Const = 0x43;
-let kExprF64Const = 0x44;
-let kExprI32Eqz = 0x45;
-let kExprI32Eq = 0x46;
-let kExprI32Ne = 0x47;
-let kExprI32LtS = 0x48;
-let kExprI32LtU = 0x49;
-let kExprI32GtS = 0x4a;
-let kExprI32GtU = 0x4b;
-let kExprI32LeS = 0x4c;
-let kExprI32LeU = 0x4d;
-let kExprI32GeS = 0x4e;
-let kExprI32GeU = 0x4f;
-let kExprI64Eqz = 0x50;
-let kExprI64Eq = 0x51;
-let kExprI64Ne = 0x52;
-let kExprI64LtS = 0x53;
-let kExprI64LtU = 0x54;
-let kExprI64GtS = 0x55;
-let kExprI64GtU = 0x56;
-let kExprI64LeS = 0x57;
-let kExprI64LeU = 0x58;
-let kExprI64GeS = 0x59;
-let kExprI64GeU = 0x5a;
-let kExprF32Eq = 0x5b;
-let kExprF32Ne = 0x5c;
-let kExprF32Lt = 0x5d;
-let kExprF32Gt = 0x5e;
-let kExprF32Le = 0x5f;
-let kExprF32Ge = 0x60;
-let kExprF64Eq = 0x61;
-let kExprF64Ne = 0x62;
-let kExprF64Lt = 0x63;
-let kExprF64Gt = 0x64;
-let kExprF64Le = 0x65;
-let kExprF64Ge = 0x66;
-let kExprI32Clz = 0x67;
-let kExprI32Ctz = 0x68;
-let kExprI32Popcnt = 0x69;
-let kExprI32Add = 0x6a;
-let kExprI32Sub = 0x6b;
-let kExprI32Mul = 0x6c;
-let kExprI32DivS = 0x6d;
-let kExprI32DivU = 0x6e;
-let kExprI32RemS = 0x6f;
-let kExprI32RemU = 0x70;
-let kExprI32And = 0x71;
-let kExprI32Ior = 0x72;
-let kExprI32Xor = 0x73;
-let kExprI32Shl = 0x74;
-let kExprI32ShrS = 0x75;
-let kExprI32ShrU = 0x76;
-let kExprI32Rol = 0x77;
-let kExprI32Ror = 0x78;
-let kExprI64Clz = 0x79;
-let kExprI64Ctz = 0x7a;
-let kExprI64Popcnt = 0x7b;
-let kExprI64Add = 0x7c;
-let kExprI64Sub = 0x7d;
-let kExprI64Mul = 0x7e;
-let kExprI64DivS = 0x7f;
-let kExprI64DivU = 0x80;
-let kExprI64RemS = 0x81;
-let kExprI64RemU = 0x82;
-let kExprI64And = 0x83;
-let kExprI64Ior = 0x84;
-let kExprI64Xor = 0x85;
-let kExprI64Shl = 0x86;
-let kExprI64ShrS = 0x87;
-let kExprI64ShrU = 0x88;
-let kExprI64Rol = 0x89;
-let kExprI64Ror = 0x8a;
-let kExprF32Abs = 0x8b;
-let kExprF32Neg = 0x8c;
-let kExprF32Ceil = 0x8d;
-let kExprF32Floor = 0x8e;
-let kExprF32Trunc = 0x8f;
-let kExprF32NearestInt = 0x90;
-let kExprF32Sqrt = 0x91;
-let kExprF32Add = 0x92;
-let kExprF32Sub = 0x93;
-let kExprF32Mul = 0x94;
-let kExprF32Div = 0x95;
-let kExprF32Min = 0x96;
-let kExprF32Max = 0x97;
-let kExprF32CopySign = 0x98;
-let kExprF64Abs = 0x99;
-let kExprF64Neg = 0x9a;
-let kExprF64Ceil = 0x9b;
-let kExprF64Floor = 0x9c;
-let kExprF64Trunc = 0x9d;
-let kExprF64NearestInt = 0x9e;
-let kExprF64Sqrt = 0x9f;
-let kExprF64Add = 0xa0;
-let kExprF64Sub = 0xa1;
-let kExprF64Mul = 0xa2;
-let kExprF64Div = 0xa3;
-let kExprF64Min = 0xa4;
-let kExprF64Max = 0xa5;
-let kExprF64CopySign = 0xa6;
-let kExprI32ConvertI64 = 0xa7;
-let kExprI32SConvertF32 = 0xa8;
-let kExprI32UConvertF32 = 0xa9;
-let kExprI32SConvertF64 = 0xaa;
-let kExprI32UConvertF64 = 0xab;
-let kExprI64SConvertI32 = 0xac;
-let kExprI64UConvertI32 = 0xad;
-let kExprI64SConvertF32 = 0xae;
-let kExprI64UConvertF32 = 0xaf;
-let kExprI64SConvertF64 = 0xb0;
-let kExprI64UConvertF64 = 0xb1;
-let kExprF32SConvertI32 = 0xb2;
-let kExprF32UConvertI32 = 0xb3;
-let kExprF32SConvertI64 = 0xb4;
-let kExprF32UConvertI64 = 0xb5;
-let kExprF32ConvertF64 = 0xb6;
-let kExprF64SConvertI32 = 0xb7;
-let kExprF64UConvertI32 = 0xb8;
-let kExprF64SConvertI64 = 0xb9;
-let kExprF64UConvertI64 = 0xba;
-let kExprF64ConvertF32 = 0xbb;
-let kExprI32ReinterpretF32 = 0xbc;
-let kExprI64ReinterpretF64 = 0xbd;
-let kExprF32ReinterpretI32 = 0xbe;
-let kExprF64ReinterpretI64 = 0xbf;
-let kExprI32SExtendI8 = 0xc0;
-let kExprI32SExtendI16 = 0xc1;
-let kExprI64SExtendI8 = 0xc2;
-let kExprI64SExtendI16 = 0xc3;
-let kExprI64SExtendI32 = 0xc4;
-let kExprRefNull = 0xd0;
-let kExprRefIsNull = 0xd1;
-let kExprRefFunc = 0xd2;
+const kWasmOpcodes = {
+ 'Unreachable': 0x00,
+ 'Nop': 0x01,
+ 'Block': 0x02,
+ 'Loop': 0x03,
+ 'If': 0x04,
+ 'Else': 0x05,
+ 'Try': 0x06,
+ 'Catch': 0x07,
+ 'Throw': 0x08,
+ 'Rethrow': 0x09,
+ 'BrOnExn': 0x0a,
+ 'End': 0x0b,
+ 'Br': 0x0c,
+ 'BrIf': 0x0d,
+ 'BrTable': 0x0e,
+ 'Return': 0x0f,
+ 'CallFunction': 0x10,
+ 'CallIndirect': 0x11,
+ 'ReturnCall': 0x12,
+ 'ReturnCallIndirect': 0x13,
+ 'CallRef': 0x14,
+ 'ReturnCallRef': 0x15,
+ 'Drop': 0x1a,
+ 'Select': 0x1b,
+ 'SelectWithType': 0x1c,
+ 'LocalGet': 0x20,
+ 'LocalSet': 0x21,
+ 'LocalTee': 0x22,
+ 'GlobalGet': 0x23,
+ 'GlobalSet': 0x24,
+ 'TableGet': 0x25,
+ 'TableSet': 0x26,
+ 'I32LoadMem': 0x28,
+ 'I64LoadMem': 0x29,
+ 'F32LoadMem': 0x2a,
+ 'F64LoadMem': 0x2b,
+ 'I32LoadMem8S': 0x2c,
+ 'I32LoadMem8U': 0x2d,
+ 'I32LoadMem16S': 0x2e,
+ 'I32LoadMem16U': 0x2f,
+ 'I64LoadMem8S': 0x30,
+ 'I64LoadMem8U': 0x31,
+ 'I64LoadMem16S': 0x32,
+ 'I64LoadMem16U': 0x33,
+ 'I64LoadMem32S': 0x34,
+ 'I64LoadMem32U': 0x35,
+ 'I32StoreMem': 0x36,
+ 'I64StoreMem': 0x37,
+ 'F32StoreMem': 0x38,
+ 'F64StoreMem': 0x39,
+ 'I32StoreMem8': 0x3a,
+ 'I32StoreMem16': 0x3b,
+ 'I64StoreMem8': 0x3c,
+ 'I64StoreMem16': 0x3d,
+ 'I64StoreMem32': 0x3e,
+ 'MemorySize': 0x3f,
+ 'MemoryGrow': 0x40,
+ 'I32Const': 0x41,
+ 'I64Const': 0x42,
+ 'F32Const': 0x43,
+ 'F64Const': 0x44,
+ 'I32Eqz': 0x45,
+ 'I32Eq': 0x46,
+ 'I32Ne': 0x47,
+ 'I32LtS': 0x48,
+ 'I32LtU': 0x49,
+ 'I32GtS': 0x4a,
+ 'I32GtU': 0x4b,
+ 'I32LeS': 0x4c,
+ 'I32LeU': 0x4d,
+ 'I32GeS': 0x4e,
+ 'I32GeU': 0x4f,
+ 'I64Eqz': 0x50,
+ 'I64Eq': 0x51,
+ 'I64Ne': 0x52,
+ 'I64LtS': 0x53,
+ 'I64LtU': 0x54,
+ 'I64GtS': 0x55,
+ 'I64GtU': 0x56,
+ 'I64LeS': 0x57,
+ 'I64LeU': 0x58,
+ 'I64GeS': 0x59,
+ 'I64GeU': 0x5a,
+ 'F32Eq': 0x5b,
+ 'F32Ne': 0x5c,
+ 'F32Lt': 0x5d,
+ 'F32Gt': 0x5e,
+ 'F32Le': 0x5f,
+ 'F32Ge': 0x60,
+ 'F64Eq': 0x61,
+ 'F64Ne': 0x62,
+ 'F64Lt': 0x63,
+ 'F64Gt': 0x64,
+ 'F64Le': 0x65,
+ 'F64Ge': 0x66,
+ 'I32Clz': 0x67,
+ 'I32Ctz': 0x68,
+ 'I32Popcnt': 0x69,
+ 'I32Add': 0x6a,
+ 'I32Sub': 0x6b,
+ 'I32Mul': 0x6c,
+ 'I32DivS': 0x6d,
+ 'I32DivU': 0x6e,
+ 'I32RemS': 0x6f,
+ 'I32RemU': 0x70,
+ 'I32And': 0x71,
+ 'I32Ior': 0x72,
+ 'I32Xor': 0x73,
+ 'I32Shl': 0x74,
+ 'I32ShrS': 0x75,
+ 'I32ShrU': 0x76,
+ 'I32Rol': 0x77,
+ 'I32Ror': 0x78,
+ 'I64Clz': 0x79,
+ 'I64Ctz': 0x7a,
+ 'I64Popcnt': 0x7b,
+ 'I64Add': 0x7c,
+ 'I64Sub': 0x7d,
+ 'I64Mul': 0x7e,
+ 'I64DivS': 0x7f,
+ 'I64DivU': 0x80,
+ 'I64RemS': 0x81,
+ 'I64RemU': 0x82,
+ 'I64And': 0x83,
+ 'I64Ior': 0x84,
+ 'I64Xor': 0x85,
+ 'I64Shl': 0x86,
+ 'I64ShrS': 0x87,
+ 'I64ShrU': 0x88,
+ 'I64Rol': 0x89,
+ 'I64Ror': 0x8a,
+ 'F32Abs': 0x8b,
+ 'F32Neg': 0x8c,
+ 'F32Ceil': 0x8d,
+ 'F32Floor': 0x8e,
+ 'F32Trunc': 0x8f,
+ 'F32NearestInt': 0x90,
+ 'F32Sqrt': 0x91,
+ 'F32Add': 0x92,
+ 'F32Sub': 0x93,
+ 'F32Mul': 0x94,
+ 'F32Div': 0x95,
+ 'F32Min': 0x96,
+ 'F32Max': 0x97,
+ 'F32CopySign': 0x98,
+ 'F64Abs': 0x99,
+ 'F64Neg': 0x9a,
+ 'F64Ceil': 0x9b,
+ 'F64Floor': 0x9c,
+ 'F64Trunc': 0x9d,
+ 'F64NearestInt': 0x9e,
+ 'F64Sqrt': 0x9f,
+ 'F64Add': 0xa0,
+ 'F64Sub': 0xa1,
+ 'F64Mul': 0xa2,
+ 'F64Div': 0xa3,
+ 'F64Min': 0xa4,
+ 'F64Max': 0xa5,
+ 'F64CopySign': 0xa6,
+ 'I32ConvertI64': 0xa7,
+ 'I32SConvertF32': 0xa8,
+ 'I32UConvertF32': 0xa9,
+ 'I32SConvertF64': 0xaa,
+ 'I32UConvertF64': 0xab,
+ 'I64SConvertI32': 0xac,
+ 'I64UConvertI32': 0xad,
+ 'I64SConvertF32': 0xae,
+ 'I64UConvertF32': 0xaf,
+ 'I64SConvertF64': 0xb0,
+ 'I64UConvertF64': 0xb1,
+ 'F32SConvertI32': 0xb2,
+ 'F32UConvertI32': 0xb3,
+ 'F32SConvertI64': 0xb4,
+ 'F32UConvertI64': 0xb5,
+ 'F32ConvertF64': 0xb6,
+ 'F64SConvertI32': 0xb7,
+ 'F64UConvertI32': 0xb8,
+ 'F64SConvertI64': 0xb9,
+ 'F64UConvertI64': 0xba,
+ 'F64ConvertF32': 0xbb,
+ 'I32ReinterpretF32': 0xbc,
+ 'I64ReinterpretF64': 0xbd,
+ 'F32ReinterpretI32': 0xbe,
+ 'F64ReinterpretI64': 0xbf,
+ 'I32SExtendI8': 0xc0,
+ 'I32SExtendI16': 0xc1,
+ 'I64SExtendI8': 0xc2,
+ 'I64SExtendI16': 0xc3,
+ 'I64SExtendI32': 0xc4,
+ 'RefNull': 0xd0,
+ 'RefIsNull': 0xd1,
+ 'RefFunc': 0xd2
+};
+
+function defineWasmOpcode(name, value) {
+ if (globalThis.kWasmOpcodeNames === undefined) {
+ globalThis.kWasmOpcodeNames = {};
+ }
+ Object.defineProperty(globalThis, name, {value: value});
+ if (globalThis.kWasmOpcodeNames[value] !== undefined) {
+ throw new Error(`Duplicate wasm opcode: ${value}. Previous name: ${
+ globalThis.kWasmOpcodeNames[value]}, new name: ${name}`);
+ }
+ globalThis.kWasmOpcodeNames[value] = name;
+}
+for (let name in kWasmOpcodes) {
+ defineWasmOpcode(`kExpr${name}`, kWasmOpcodes[name]);
+}
// Prefix opcodes
-let kGCPrefix = 0xfb;
-let kNumericPrefix = 0xfc;
-let kSimdPrefix = 0xfd;
-let kAtomicPrefix = 0xfe;
+const kPrefixOpcodes = {
+ 'GC': 0xfb,
+ 'Numeric': 0xfc,
+ 'Simd': 0xfd,
+ 'Atomic': 0xfe
+};
+for (let prefix in kPrefixOpcodes) {
+ defineWasmOpcode(`k${prefix}Prefix`, kPrefixOpcodes[prefix]);
+}
// GC opcodes
let kExprRttCanon = 0x30;
@@ -402,6 +426,14 @@ let kExprRefCast = 0x41;
let kExprI31New = 0x20;
// Numeric opcodes.
+let kExprI32SConvertSatF32 = 0x00;
+let kExprI32UConvertSatF32 = 0x01;
+let kExprI32SConvertSatF64 = 0x02;
+let kExprI32UConvertSatF64 = 0x03;
+let kExprI64SConvertSatF32 = 0x04;
+let kExprI64UConvertSatF32 = 0x05;
+let kExprI64SConvertSatF64 = 0x06;
+let kExprI64UConvertSatF64 = 0x07;
let kExprMemoryInit = 0x08;
let kExprDataDrop = 0x09;
let kExprMemoryCopy = 0x0a;
@@ -572,11 +604,11 @@ let kExprI8x16Shl = 0x6b;
let kExprI8x16ShrS = 0x6c;
let kExprI8x16ShrU = 0x6d;
let kExprI8x16Add = 0x6e;
-let kExprI8x16AddSaturateS = 0x6f;
-let kExprI8x16AddSaturateU = 0x70;
+let kExprI8x16AddSatS = 0x6f;
+let kExprI8x16AddSatU = 0x70;
let kExprI8x16Sub = 0x71;
-let kExprI8x16SubSaturateS = 0x72;
-let kExprI8x16SubSaturateU = 0x73;
+let kExprI8x16SubSatS = 0x72;
+let kExprI8x16SubSatU = 0x73;
let kExprI8x16MinS = 0x76;
let kExprI8x16MinU = 0x77;
let kExprI8x16MaxS = 0x78;
@@ -596,11 +628,11 @@ let kExprI16x8Shl = 0x8b;
let kExprI16x8ShrS = 0x8c;
let kExprI16x8ShrU = 0x8d;
let kExprI16x8Add = 0x8e;
-let kExprI16x8AddSaturateS = 0x8f;
-let kExprI16x8AddSaturateU = 0x90;
+let kExprI16x8AddSatS = 0x8f;
+let kExprI16x8AddSatU = 0x90;
let kExprI16x8Sub = 0x91;
-let kExprI16x8SubSaturateS = 0x92;
-let kExprI16x8SubSaturateU = 0x93;
+let kExprI16x8SubSatS = 0x92;
+let kExprI16x8SubSatU = 0x93;
let kExprI16x8Mul = 0x95;
let kExprI16x8MinS = 0x96;
let kExprI16x8MinU = 0x97;
@@ -670,15 +702,13 @@ let kTrapDivByZero = 2;
let kTrapDivUnrepresentable = 3;
let kTrapRemByZero = 4;
let kTrapFloatUnrepresentable = 5;
-let kTrapFuncInvalid = 6;
+let kTrapTableOutOfBounds = 6;
let kTrapFuncSigMismatch = 7;
-let kTrapTypeError = 8;
-let kTrapUnalignedAccess = 9;
-let kTrapDataSegmentDropped = 10;
-let kTrapElemSegmentDropped = 11;
-let kTrapTableOutOfBounds = 12;
-let kTrapBrOnExnNull = 13;
-let kTrapRethrowNull = 14;
+let kTrapUnalignedAccess = 8;
+let kTrapDataSegmentDropped = 9;
+let kTrapElemSegmentDropped = 10;
+let kTrapBrOnExnNull = 11;
+let kTrapRethrowNull = 12;
let kTrapMsgs = [
"unreachable",
@@ -687,13 +717,11 @@ let kTrapMsgs = [
"divide result unrepresentable",
"remainder by zero",
"float unrepresentable in integer range",
- "invalid index into function table",
+ "table index is out of bounds",
"function signature mismatch",
- "wasm function signature contains illegal type",
"operation does not support unaligned accesses",
"data segment has been dropped",
"element segment has been dropped",
- "table access out of bounds",
"br_on_exn on null value",
"rethrowing null value"
];
@@ -948,8 +976,8 @@ class WasmModuleBuilder {
return this;
}
- addMemory(min, max, exp, shared) {
- this.memory = {min: min, max: max, exp: exp, shared: shared};
+ addMemory(min, max, exported, shared) {
+ this.memory = {min: min, max: max, exported: exported, shared: shared};
return this;
}
@@ -1124,13 +1152,13 @@ class WasmModuleBuilder {
return this;
}
- addPassiveElementSegment(array, is_import = false) {
+ addPassiveElementSegment(array) {
this.element_segments.push(
{array: array, is_active: false, is_declarative: false});
return this;
}
- addDeclarativeElementSegment(array, is_import = false) {
+ addDeclarativeElementSegment(array) {
this.element_segments.push(
{array: array, is_active: false, is_declarative: true});
return this;
@@ -1266,12 +1294,9 @@ class WasmModuleBuilder {
section.emit_u8(1); // one memory entry
const has_max = wasm.memory.max !== undefined;
const is_shared = wasm.memory.shared !== undefined;
- // Emit flags (bit 0: reszeable max, bit 1: shared memory)
- if (is_shared) {
- section.emit_u8(has_max ? kSharedHasMaximumFlag : 2);
- } else {
- section.emit_u8(has_max ? kHasMaximumFlag : 0);
- }
+ section.emit_u8(is_shared
+ ? (has_max ? kLimitsSharedHasMaximum : kLimitsSharedNoMaximum)
+ : (has_max ? kLimitsHasMaximum : kLimitsNoMaximum));
section.emit_u32v(wasm.memory.min);
if (has_max) section.emit_u32v(wasm.memory.max);
});
@@ -1356,7 +1381,7 @@ class WasmModuleBuilder {
}
// Add export table.
- var mem_export = (wasm.memory !== undefined && wasm.memory.exp);
+ var mem_export = (wasm.memory !== undefined && wasm.memory.exported);
var exports_count = wasm.exports.length + (mem_export ? 1 : 0);
if (exports_count > 0) {
if (debug) print("emitting exports @ " + binary.length);
@@ -1666,3 +1691,7 @@ function wasmS128Const(f) {
// Write in little-endian order at offset 0.
return [kSimdPrefix, kExprS128Const, ...f];
}
+
+function getOpcodeName(opcode) {
+ return globalThis.kWasmOpcodeNames?.[opcode] ?? 'unknown';
+}