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.