WebAssembly opcodes as data types(WASM_OP.rfi):
Class: Machine OpCodes representation, Status: Complete, Last change: 09.02.2024 18:09:26
// https://pengowray.github.io/wasm-ops/
type
blocktype0 TTypeCode():assert[@ in (empty,tcI32,tcI64,tcF32,tcF64,tcV128,tcFuncRef,tcExternRef)] //numtype | vectype | reftype
blocktype try
t: blocktype0
x: TLEB128s
endt
opcode enum byte of (
//Control Instructions
unreachable = 0x00,
nop = 0x01,
block = 0x02, //bt:blocktype (in:instr)* 0x0B,
loop = 0x03, //bt:blocktype (in:instr)* 0x0B,
"if" = 0x04, // bt:blocktype (in:instr)* 0x0B,0x04 bt:blocktype (in1:instr)*
//else if bt in*1 else in*2 end = 0x05 (in2:instr)* 0x0B,
"else" = 0x05,
"end" = 0x0B, //instruction sequence end
br = 0x0C, //l:labelidx,
br_if = 0x0D, //l:labelidx,
br_table = 0x0E, //l*:vec(labelidx) l_N:labelidx,
return = 0x0F,
call = 0x10, //x:funcidx,
call_indirect = 0x11, //y:typeidx x:tableidx,
//Reference Instructions
"ref.null" = 0xD0, //t:reftype,
"ref.is_null" = 0xD1,
"ref.func" = 0xD2 , //x:funcidx,
//Parametric Instructions
drop = 0x1A,
select0 = 0x1B,
select = 0x1C, //t*:vec(valtype),
//Variable Instructions
"local.get" = 0x20, //x:localidx,
"local.set" = 0x21, //x:localidx,
"local.tee" = 0x22, //x:localidx,
"global.get" = 0x23, //x:globalidx,
"global.set" = 0x24, //x:globalidx,
//Table Instructions
"table.get" = 0x25, //x:tableidx,
"table.set" = 0x26, //x:tableidx,
/*
"table.init" = 0xFC, //12:u32 y:elemidx x:tableidx,
"elem.drop" = 0xFC, //13:u32 x:elemidx,
"table.copy" = 0xFC, //14:u32 x:tableidx y:tableidx,
"table.grow" = 0xFC, //15:u32 x:tableidx,
"table.size" = 0xFC, //16:u32 x:tableidx,
"table.fill" = 0xFC, //17:u32 x:tableidx,
*/
//Memory Instructions
"i32.load" = 0x28, //m:memarg,
"i64.load" = 0x29, //m:memarg,
"f32.load" = 0x2A, //m:memarg,
"f64.load" = 0x2B, //m:memarg,
"i32.load8_s" = 0x2C, //m:memarg,
"i32.load8_u" = 0x2D, //m:memarg,
"i32.load16_s" = 0x2E, //m:memarg,
"i32.load16_u" = 0x2F, //m:memarg,
"i64.load8_s" = 0x30, //m:memarg,
"i64.load8_u" = 0x31, //m:memarg,
"i64.load16_s" = 0x32, //m:memarg,
"i64.load16_u" = 0x33, //m:memarg,
"i64.load32_s" = 0x34, //m:memarg,
"i64.load32_u" = 0x35, //m:memarg,
"i32.store" = 0x36, //m:memarg,
"i64.store" = 0x37, //m:memarg,
"f32.store" = 0x38, //m:memarg,
"f64.store" = 0x39, //m:memarg,
"i32.store8" = 0x3A, //m:memarg,
"i32.store16" = 0x3B, //m:memarg,
"i64.store8" = 0x3C, //m:memarg,
"i64.store16" = 0x3D, //m:memarg,
"i64.store32" = 0x3E, //m:memarg,
"memory.size" = 0x3F, //0x00,
"memory.grow" = 0x40, //0x00,
/*
"memory.init" = 0xFC, //8:u32 x:dataidx 0x00,
"data.drop" = 0xFC, //9:u32 x:dataidx,
"memory.copy" = 0xFC, //10:u32 0x00 0x00,
"memory.fill" = 0xFC, //11:u32 0x00,
*/
//Numeric Instructions
"i32.const" = 0x41, //n:i32,
"i64.const" = 0x42, //n:i64,
"f32.const" = 0x43, //z:f32,
"f64.const" = 0x44, //z:f64,
"i32.eqz" = 0x45,
"i32.eq" = 0x46,
"i32.ne" = 0x47,
"i32.lt_s" = 0x48,
"i32.lt_u" = 0x49,
"i32.gt_s" = 0x4A,
"i32.gt_u" = 0x4B,
"i32.le_s" = 0x4C,
"i32.le_u" = 0x4D,
"i32.ge_s" = 0x4E,
"i32.ge_u" = 0x4F,
"i64.eqz" = 0x50,
"i64.eq" = 0x51,
"i64.ne" = 0x52,
"i64.lt_s" = 0x53,
"i64.lt_u" = 0x54,
"i64.gt_s" = 0x55,
"i64.gt_u" = 0x56,
"i64.le_s" = 0x57,
"i64.le_u" = 0x58,
"i64.ge_s" = 0x59,
"i64.ge_u" = 0x5A,
"f32.eq" = 0x5B,
"f32.ne" = 0x5C,
"f32.lt" = 0x5D,
"f32.gt" = 0x5E,
"f32.le" = 0x5F,
"f32.ge" = 0x60,
"f64.eq" = 0x61,
"f64.ne" = 0x62,
"f64.lt" = 0x63,
"f64.gt" = 0x64,
"f64.le" = 0x65,
"f64.ge" = 0x66,
"i32.clz" = 0x67,
"i32.ctz" = 0x68,
"i32.popcnt" = 0x69,
"i32.add" = 0x6A,
"i32.sub" = 0x6B,
"i32.mul" = 0x6C,
"i32.div_s" = 0x6D,
"i32.div_u" = 0x6E,
"i32.rem_s" = 0x6F,
"i32.rem_u" = 0x70,
"i32.and" = 0x71,
"i32.or" = 0x72,
"i32.xor" = 0x73,
"i32.shl" = 0x74,
"i32.shr_s" = 0x75,
"i32.shr_u" = 0x76,
"i32.rotl" = 0x77,
"i32.rotr" = 0x78,
"i64.clz" = 0x79,
"i64.ctz" = 0x7A,
"i64.popcnt" = 0x7B,
"i64.add" = 0x7C,
"i64.sub" = 0x7D,
"i64.mul" = 0x7E,
"i64.div_s" = 0x7F,
"i64.div_u" = 0x80,
"i64.rem_s" = 0x81,
"i64.rem_u" = 0x82,
"i64.and" = 0x83,
"i64.or" = 0x84,
"i64.xor" = 0x85,
"i64.shl" = 0x86,
"i64.shr_s" = 0x87,
"i64.shr_u" = 0x88,
"i64.rotl" = 0x89,
"i64.rotr" = 0x8A,
"f32.abs" = 0x8B,
"f32.neg" = 0x8C,
"f32.ceil" = 0x8D,
"f32.floor" = 0x8E,
"f32.trunc" = 0x8F,
"f32.nearest" = 0x90,
"f32.sqrt" = 0x91,
"f32.add" = 0x92,
"f32.sub" = 0x93,
"f32.mul" = 0x94,
"f32.div" = 0x95,
"f32.min" = 0x96,
"f32.max" = 0x97,
"f32.copysign" = 0x98,
"f64.abs" = 0x99,
"f64.neg" = 0x9A,
"f64.ceil" = 0x9B,
"f64.floor" = 0x9C,
"f64.trunc" = 0x9D,
"f64.nearest" = 0x9E,
"f64.sqrt" = 0x9F,
"f64.add" = 0xA0,
"f64.sub" = 0xA1,
"f64.mul" = 0xA2,
"f64.div" = 0xA3,
"f64.min" = 0xA4,
"f64.max" = 0xA5,
"f64.copysign" = 0xA6,
"i32.wrap_i64" = 0xA7,
"i32.trunc_f32_s" = 0xA8,
"i32.trunc_f32_u" = 0xA9,
"i32.trunc_f64_s" = 0xAA,
"i32.trunc_f64_u" = 0xAB,
"i64.extend_i32_s" = 0xAC,
"i64.extend_i32_u" = 0xAD,
"i64.trunc_f32_s" = 0xAE,
"i64.trunc_f32_u" = 0xAF,
"i64.trunc_f64_s" = 0xB0,
"i64.trunc_f64_u" = 0xB1,
"f32.convert_i32_s" = 0xB2,
"f32.convert_i32_u" = 0xB3,
"f32.convert_i64_s" = 0xB4,
"f32.convert_i64_u" = 0xB5,
"f32.demote_f64" = 0xB6,
"f64.convert_i32_s" = 0xB7,
"f64.convert_i32_u" = 0xB8,
"f64.convert_i64_s" = 0xB9,
"f64.convert_i64_u" = 0xBA,
"f64.promote_f32" = 0xBB,
"i32.reinterpret_f32" = 0xBC,
"i64.reinterpret_f64" = 0xBD,
"f32.reinterpret_i32" = 0xBE,
"f64.reinterpret_i64" = 0xBF,
"i32.extend8_s" = 0xC0,
"i32.extend16_s" = 0xC1,
"i64.extend8_s" = 0xC2,
"i64.extend16_s" = 0xC3,
"i64.extend32_s" = 0xC4
esc1 = 0xFC,
esc2 = 0xFD,
esc3 = 0xFE
):assert[HasEnumName(@,opcode)]
opcode_esc1 enum byte/*!!!it should be u32 some day*/of (
//Numeric Instructions
"i32.trunc_sat_f32_s" = 0,
"i32.trunc_sat_f32_u" = 1,
"i32.trunc_sat_f64_s" = 2,
"i32.trunc_sat_f64_u" = 3,
"i64.trunc_sat_f32_s" = 4,
"i64.trunc_sat_f32_u" = 5,
"i64.trunc_sat_f64_s" = 6,
"i64.trunc_sat_f64_u" = 7,
//Memory Instructions
"memory.init" = 8, //x:dataidx 0x00,
"data.drop" = 9, //x:dataidx,
"memory.copy" = 10, //0x00 0x00,
"memory.fill" = 11, //0x00,
//Table Instructions
"table.init" = 12, //y:elemidx x:tableidx,
"elem.drop" = 13, //x:elemidx,
"table.copy" = 14, //x:tableidx y:tableidx,
"table.grow" = 15, //x:tableidx,
"table.size" = 16, //x:tableidx,
"table.fill" = 17 //x:tableidx,
):assert[HasEnumName(@,opcode_esc1)]
opcode_esc2_tbl enum ulong /*!!!it is just a table of opcodes*/of (
"v128.load" = 0, //m:memarg
"v128.load8x8_s" = 1, //m:memarg
"v128.load8x8_u" = 2, //m:memarg
"v128.load16x4_s" = 3, //m:memarg
"v128.load16x4_u" = 4, //m:memarg
"v128.load32x2_s" = 5, //m:memarg
"v128.load32x2_u" = 6, //m:memarg
"v128.load8_splat" = 7, //m:memarg
"v128.load16_splat" = 8, //m:memarg
"v128.load32_splat" = 9, //m:memarg
"v128.load64_splat" = 10, //m:memarg
"v128.load32_zero" = 92, //m:memarg
"v128.load64_zero" = 93, //m:memarg
"v128.store" = 11, //m:memarg
"v128.load8_lane" = 84, //m:memarg l:laneidx
"v128.load16_lane" = 85, //m:memarg l:laneidx
"v128.load32_lane" = 86, //m:memarg l:laneidx
"v128.load64_lane" = 87, //m:memarg l:laneidx
"v128.store8_lane" = 88, //m:memarg l:laneidx
"v128.store16_lane" = 89, //m:memarg l:laneidx
"v128.store32_lane" = 90, //m:memarg l:laneidx
"v128.store64_lane" = 91, //m:memarg l:laneidx
"v128.const"= 12, //(b:byte)^16
"i8x16.shuffle" = 13, //(l:laneidx)^16
"i8x16.extract_lane_s" = 21, //l:laneidx
"i8x16.extract_lane_u" = 22, //l:laneidx
"i8x16.replace_lane" = 23, //l:laneidx
"i16x8.extract_lane_s" = 24, //l:laneidx
"i16x8.extract_lane_u" = 25, //l:laneidx
"i16x8.replace_lane" = 26, //l:laneidx
"i32x4.extract_lane" = 27, //l:laneidx
"i32x4.replace_lane" = 28, //l:laneidx
"i64x2.extract_lane" = 29, //l:laneidx
"i64x2.replace_lane" = 30, //l:laneidx
"f32x4.extract_lane" = 31, //l:laneidx
"f32x4.replace_lane" = 32, //l:laneidx
"f64x2.extract_lane" = 33, //l:laneidx
"f64x2.replace_lane" = 34, //l:laneidx
"i8x16.swizzle" = 14,
"i8x16.splat" = 15,
"i16x8.splat" = 16,
"i32x4.splat" = 17,
"i64x2.splat" = 18,
"f32x4.splat" = 19,
"f64x2.splat" = 20,
"i8x16.eq" = 35,
"i8x16.ne" = 36,
"i8x16.lt_s" = 37,
"i8x16.lt_u" = 38,
"i8x16.gt_s" = 39,
"i8x16.gt_u" = 40,
"i8x16.le_s" = 41,
"i8x16.le_u" = 42,
"i8x16.ge_s" = 43,
"i8x16.ge_u" = 44,
"i16x8.eq" = 45,
"i16x8.ne" = 46,
"i16x8.lt_s" = 47,
"i16x8.lt_u" = 48,
"i16x8.gt_s" = 49,
"i16x8.gt_u" = 50,
"i16x8.le_s" = 51,
"i16x8.le_u" = 52,
"i16x8.ge_s" = 53,
"i16x8.ge_u" = 54,
"i32x4.eq" = 55,
"i32x4.ne" = 56,
"i32x4.lt_s" = 57,
"i32x4.lt_u" = 58,
"i32x4.gt_s" = 59,
"i32x4.gt_u" = 60,
"i32x4.le_s" = 61,
"i32x4.le_u" = 62,
"i32x4.ge_s" = 63,
"i32x4.ge_u" = 64,
"i64x2.eq" = 214,
"i64x2.ne" = 215,
"i64x2.lt_s" = 216,
"i64x2.gt_s" = 217,
"i64x2.le_s" = 218,
"i64x2.ge_s" = 219,
"f32x4.eq" = 65,
"f32x4.ne" = 66,
"f32x4.lt" = 67,
"f32x4.gt" = 68,
"f32x4.le" = 69,
"f32x4.ge" = 70,
"f64x2.eq" = 71,
"f64x2.ne" = 72,
"f64x2.lt" = 73,
"f64x2.gt" = 74,
"f64x2.le" = 75,
"f64x2.ge" = 76,
"v128.not" = 77,
"v128.and" = 78,
"v128.andnot" = 79,
"v128.or" = 80,
"v128.xor" = 81,
"v128.bitselect" = 82,
"v128.any_true" = 83,
"i8x16.abs" = 96,
"i8x16.neg" = 97,
"i8x16.popcnt" = 98,
"i8x16.all_true" = 99,
"i8x16.bitmask" = 100,
"i8x16.narrow_i16x8_s" = 101,
"i8x16.narrow_i16x8_u" = 102,
"i8x16.shl" = 107,
"i8x16.shr_s" = 108,
"i8x16.shr_u" = 109,
"i8x16.add" = 110,
"i8x16.add_sat_s" = 111,
"i8x16.add_sat_u" = 112,
"i8x16.sub" = 113,
"i8x16.sub_sat_s" = 114,
"i8x16.sub_sat_u" = 115,
"i8x16.min_s" = 118,
"i8x16.min_u" = 119,
"i8x16.max_s" = 120,
"i8x16.max_u" = 121,
"i8x16.avgr_u" = 123,
"i16x8.extadd_pairwise_i8x16_s" = 124,
"i16x8.extadd_pairwise_i8x16_u" = 125,
"i16x8.abs" = 128,
"i16x8.neg" = 129,
"i16x8.q15mulr_sat_s" = 130,
"i16x8.all_true" = 131,
"i16x8.bitmask" = 132,
"i16x8.narrow_i32x4_s" = 133,
"i16x8.narrow_i32x4_u" = 134,
"i16x8.extend_low_i8x16_s" = 135,
"i16x8.extend_high_i8x16_s" = 136,
"i16x8.extend_low_i8x16_u" = 137,
"i16x8.extend_high_i8x16_u" = 138,
"i16x8.shl" = 139,
"i16x8.shr_s" = 140,
"i16x8.shr_u" = 141,
"i16x8.add" = 142,
"i16x8.add_sat_s" = 143,
"i16x8.add_sat_u" = 144,
"i16x8.sub" = 145,
"i16x8.sub_sat_s" = 146,
"i16x8.sub_sat_u" = 147,
"i16x8.mul" = 149,
"i16x8.min_s" = 150,
"i16x8.min_u" = 151,
"i16x8.max_s" = 152,
"i16x8.max_u" = 153,
"i16x8.avgr_u" = 155,
"i16x8.extmul_low_i8x16_s" = 156,
"i16x8.extmul_high_i8x16_s" = 157,
"i16x8.extmul_low_i8x16_u" = 158,
"i16x8.extmul_high_i8x16_u" = 159,
"i32x4.extadd_pairwise_i16x8_s" = 126,
"i32x4.extadd_pairwise_i16x8_u" = 127,
"i32x4.abs" = 160,
"i32x4.neg" = 161,
"i32x4.all_true" = 163,
"i32x4.bitmask" = 164,
"i32x4.extend_low_i16x8_s" = 167,
"i32x4.extend_high_i16x8_s" = 168,
"i32x4.extend_low_i16x8_u" = 169,
"i32x4.extend_high_i16x8_u" = 170,
"i32x4.shl" = 171,
"i32x4.shr_s" = 172,
"i32x4.shr_u" = 173,
"i32x4.add" = 174,
"i32x4.sub" = 177,
"i32x4.mul" = 181,
"i32x4.min_s" = 182,
"i32x4.min_u" = 183,
"i32x4.max_s" = 184,
"i32x4.max_u" = 185,
"i32x4.dot_i16x8_s" = 186,
"i32x4.extmul_low_i16x8_s" = 188,
"i32x4.extmul_high_i16x8_s" = 189,
"i32x4.extmul_low_i16x8_u" = 190,
"i32x4.extmul_high_i16x8_u" = 191,
"i64x2.abs" = 192,
"i64x2.neg" = 193,
"i64x2.all_true" = 195,
"i64x2.bitmask" = 196,
"i64x2.extend_low_i32x4_s" = 199,
"i64x2.extend_high_i32x4_s" = 200,
"i64x2.extend_low_i32x4_u" = 201,
"i64x2.extend_high_i32x4_u" = 202,
"i64x2.shl" = 203,
"i64x2.shr_s" = 204,
"i64x2.shr_u" = 205,
"i64x2.add" = 206,
"i64x2.sub" = 209,
"i64x2.mul" = 213,
"i64x2.extmul_low_i32x4_s" = 220,
"i64x2.extmul_high_i32x4_s" = 221,
"i64x2.extmul_low_i32x4_u" = 222,
"i64x2.extmul_high_i32x4_u" = 223,
"f32x4.ceil" = 103,
"f32x4.floor" = 104,
"f32x4.trunc" = 105,
"f32x4.nearest" = 106,
"f32x4.abs" = 224,
"f32x4.neg" = 225,
"f32x4.sqrt" = 227,
"f32x4.add" = 228,
"f32x4.sub" = 229,
"f32x4.mul" = 230,
"f32x4.div" = 231,
"f32x4.min" = 232,
"f32x4.max" = 233,
"f32x4.pmin" = 234,
"f32x4.pmax" = 235,
"f64x2.ceil" = 116,
"f64x2.floor" = 117,
"f64x2.trunc" = 122,
"f64x2.nearest" = 148,
"f64x2.abs" = 236,
"f64x2.neg" = 237,
"f64x2.sqrt" = 239,
"f64x2.add" = 240,
"f64x2.sub" = 241,
"f64x2.mul" = 242,
"f64x2.div" = 243,
"f64x2.min" = 244,
"f64x2.max" = 245,
"f64x2.pmin" = 246,
"f64x2.pmax" = 247,
"i32x4.trunc_sat_f32x4_s" = 248,
"i32x4.trunc_sat_f32x4_u" = 249,
"f32x4.convert_i32x4_s" = 250,
"f32x4.convert_i32x4_u" = 251,
"i32x4.trunc_sat_f64x2_s_zero" = 252,
"i32x4.trunc_sat_f64x2_u_zero" = 253,
"f64x2.convert_low_i32x4_s" = 254,
"f64x2.convert_low_i32x4_u" = 255,
"f32x4.demote_f64x2_zero" = 94,
"f64x2.promote_low_f32x4" = 95
)
opcode_esc2 TLEB128u():assert[HasEnumName(@:Value,opcode_esc2_tbl)]:displ=(valname(@:Value,opcode_esc2_tbl),'{',@,'}')
opcode_esc3 enum byte/*!!!it should be u32 some day*/of (
"memory.atomic.notify" = 0x00,
"memory.atomic.wait32" = 0x01,
"memory.atomic.wait64" = 0x02,
"atomic.fence" = 0x03,
"i32.atomic.load" = 0x10,
"i64.atomic.load" = 0x11,
"i32.atomic.load8_u" = 0x12,
"i32.atomic.load16_u" = 0x13,
"i64.atomic.load8_u" = 0x14,
"i64.atomic.load16_u" = 0x15,
"i64.atomic.load32_u" = 0x16,
"i32.atomic.store" = 0x17,
"i64.atomic.store" = 0x18,
"i32.atomic.store8" = 0x19,
"i32.atomic.store16" = 0x1A,
"i64.atomic.store8" = 0x1B,
"i64.atomic.store16" = 0x1C,
"i64.atomic.store32" = 0x1D,
"i32.atomic.rmw.add" = 0x1E,
"i64.atomic.rmw.add" = 0x1F,
"i32.atomic.rmw8.add_u" = 0x20,
"i32.atomic.rmw16.add_u" = 0x21,
"i64.atomic.rmw8.add_u" = 0x22,
"i64.atomic.rmw16.add_u" = 0x23,
"i64.atomic.rmw32.add_u" = 0x24,
"i32.atomic.rmw.sub" = 0x25,
"i64.atomic.rmw.sub" = 0x26,
"i32.atomic.rmw8.sub_u" = 0x27,
"i32.atomic.rmw16.sub_u" = 0x28,
"i64.atomic.rmw8.sub_u" = 0x29,
"i64.atomic.rmw16.sub_u" = 0x2A,
"i64.atomic.rmw32.sub_u" = 0x2B,
"i32.atomic.rmw.and" = 0x2C,
"i64.atomic.rmw.and" = 0x2D,
"i32.atomic.rmw8.and_u" = 0x2E,
"i32.atomic.rmw16.and_u" = 0x2F,
"i64.atomic.rmw32.xor_u" = 0x30,
"i32.atomic.rmw.xchg" = 0x31,
"i64.atomic.rmw.xchg" = 0x32,
"i32.atomic.rmw8.xchg_u" = 0x33,
"i32.atomic.rmw16.xchg_u" = 0x34,
"i64.atomic.rmw8.xchg_u" = 0x35,
"i64.atomic.rmw16.xchg_u" = 0x36,
"i64.atomic.rmw32.xchg_u" = 0x37,
"i32.atomic.rmw.cmpxchg" = 0x38,
"i64.atomic.rmw.cmpxchg" = 0x39,
"i32.atomic.rmw8.cmpxchg_u" = 0x3A,
"i32.atomic.rmw16.cmpxchg_u" = 0x3B,
"i64.atomic.rmw8.cmpxchg_u" = 0x3C,
"i64.atomic.rmw16.cmpxchg_u" = 0x3D,
"i64.atomic.rmw32.cmpxchg_u" = 0x3E
):assert[HasEnumName(@,opcode_esc3)]
simpleblock(base,lim) forward
ifblock(base,lim) forward
switchtable struc
TLEB128u len
array[@.len:Value]of labelidx l
labelidx l_N
ends
valtypes struc
TLEB128u len
array[@.len:Value]of valtype t
ends
memarg struc
TLEB128u al //align
TLEB128u ofs //offset
ends
byte0 byte():assert[@=0]
instruction_esc1 struc
opcode_esc1 op
case @.op of
//Memory Instructions
"memory.init": struc
dataidx x
byte0 Z
ends
"data.drop": dataidx
"memory.copy": struc
byte0 Z
byte0 Z1
ends
"memory.fill": byte0
//Table Instructions
"table.init": struc
elemidx y
tableidx x
ends
"elem.drop": elemidx
"table.copy": struc
tableidx x
tableidx y
ends
"table.grow": tableidx
"table.size": tableidx
"table.fill": tableidx
endc arg
ends
laneidx byte
byte16 array[16]of byte
laneidx16 array[16]of laneidx
memarg_laneidx struc
memarg m
laneidx l
ends
instruction_esc2 struc
opcode_esc2 op
case opcode_esc2_tbl @.op:Value of
"v128.load": memarg
"v128.load8x8_s": memarg
"v128.load8x8_u": memarg
"v128.load16x4_s": memarg
"v128.load16x4_u": memarg
"v128.load32x2_s": memarg
"v128.load32x2_u": memarg
"v128.load8_splat": memarg
"v128.load16_splat": memarg
"v128.load32_splat": memarg
"v128.load64_splat": memarg
"v128.load32_zero": memarg
"v128.load64_zero": memarg
"v128.store": memarg
"v128.load8_lane": memarg_laneidx
"v128.load16_lane": memarg_laneidx
"v128.load32_lane": memarg_laneidx
"v128.load64_lane": memarg_laneidx
"v128.store8_lane": memarg_laneidx
"v128.store16_lane": memarg_laneidx
"v128.store32_lane": memarg_laneidx
"v128.store64_lane": memarg_laneidx
"v128.const": byte16
"i8x16.shuffle": laneidx16
"i8x16.extract_lane_s": laneidx
"i8x16.extract_lane_u": laneidx
"i8x16.replace_lane": laneidx
"i16x8.extract_lane_s": laneidx
"i16x8.extract_lane_u": laneidx
"i16x8.replace_lane": laneidx
"i32x4.extract_lane": laneidx
"i32x4.replace_lane": laneidx
"i64x2.extract_lane": laneidx
"i64x2.replace_lane": laneidx
"f32x4.extract_lane": laneidx
"f32x4.replace_lane": laneidx
"f64x2.extract_lane": laneidx
"f64x2.replace_lane": laneidx
endc arg
ends
/*Not needed: no atomic instruction has args
instruction_esc3 struc
opcode_esc3 op
case @.op:Value of
endc arg
ends*/
instruction(base,lim) struc
opcode op
case @.op of
//Control Instructions
block,loop: simpleblock(@@:base,@@:lim)
"if": ifblock(@@:base,@@:lim)
br,br_if: labelidx
br_table: switchtable
call: funcidx
call_indirect: struc
typeidx y
tableidx x
ends
//Reference Instructions
"ref.null": reftype
"ref.func": funcidx
//Parametric Instructions
select: valtypes
//Variable Instructions
"local.get": localidx
"local.set": localidx
"local.tee": localidx
"global.get": globalidx
"global.set": globalidx
//Table Instructions
"table.get": tableidx
"table.set": tableidx
//Memory Instructions
"i32.load": memarg
"i64.load": memarg
"f32.load": memarg
"f64.load": memarg
"i32.load8_s": memarg
"i32.load8_u": memarg
"i32.load16_s": memarg
"i32.load16_u": memarg
"i64.load8_s": memarg
"i64.load8_u": memarg
"i64.load16_s": memarg
"i64.load16_u": memarg
"i64.load32_s": memarg
"i64.load32_u": memarg
"i32.store": memarg
"i64.store": memarg
"f32.store": memarg
"f64.store": memarg
"i32.store8": memarg
"i32.store16": memarg
"i64.store8": memarg
"i64.store16": memarg
"i64.store32": memarg
"memory.size": byte0 //0x00,
"memory.grow": byte0 //0x00,
/*
"memory.init" = 0xFC, //8:u32 x:dataidx 0x00,
"data.drop" = 0xFC, //9:u32 x:dataidx,
"memory.copy" = 0xFC, //10:u32 0x00 0x00,
"memory.fill" = 0xFC, //11:u32 0x00,
*/
//Numeric Instructions
"i32.const": TLEB128s //n:i32,
"i64.const": TLEB128s //n:i64,
"f32.const": f32
"f64.const": f64
esc1: instruction_esc1
esc2: instruction_esc2
esc3: opcode_esc3
endc arg
ends:displ=(@.op,' ',@.arg)//:displ=(NL,'[',HEX(&@-@:base),'=',ADDR(&@),']: ',@)
/*
instructions(base,lim) array of instruction(@:base,@:lim)?(@.op=opcode."end")or(&@>=@:lim);
theninstructions(base,lim) array of instruction(@:base,@:lim)?(@.op in("else","end"))or(&@>=@:lim)!void;
elseinstructions(base,lim) struc
opcode elseop
instructions(@:base,@:lim) ins
ends:assert[@.elseop=opcode."else",@.ins:assert]
simpleblock(base,lim) struc
blocktype bt
instructions(@:base,@:lim) ins
ends
endopcode opcode():assert[@=opcode."end"]
ifblock(base,lim) struc
blocktype bt
theninstructions(@:base,@:lim) ins1
try
present: elseinstructions(@@:base,@@:lim)
empty: endopcode
err: void
endt:assert[@.err:size exc 1/*can access err => fail*/] ins0
ends
expr_ex(lim) instructions(&@,@:lim)
expr instructions(&@,FileSize)
*/
instructions0(base,lim) array of instruction(@:base,@:lim)?(@.op in("else","end"))or
(&@>=@:lim)!void;:displ=(ShowArray(@,(cond(@:size>0,(NL,INT(@:#),':[',HEX(&@-@:base),'=',ADDR(&@),']: ',@)))))
endopcode opcode():assert[@=opcode."end"]
instructions(base,lim) struc
instructions0(@:base,@:lim) ins
endopcode e
ends:assert[@:SubAssert]
elseinstructions(base,lim) struc
opcode elseop
instructions0(@:base,@:lim) ins
endopcode ee
ends:assert[@.elseop=opcode."else",@.ee:assert,@.ins:assert]:displ=(
@.elseop,@.ins,NL,@.ee)
simpleblock(base,lim) struc
blocktype bt
instructions0(@:base,@:lim) i
endopcode e
ends:displ=(@.bt,@.i,NL,@.e,'/',valname((@:@:@ as instruction).op)):assert[@:SubAssert]
ifblock(base,lim) struc
blocktype bt
instructions0(@:base,@:lim) ins1
try
present: elseinstructions(@@:base,@@:lim)
empty: endopcode
err: void
endt:assert[@.err:size exc 1/*can access err => fail*/] ins0
ends:displ=(@.bt,@.ins1,NL,@.ins0,'/if')
expr_ex(lim) instructions(&@,@:lim)
expr instructions(&@,FileSize)
Other specifications.
FlexT home page,
Author`s home page.