///|
/// The opcode table.
///
/// This is upstream's, near enough verbatim, and it is the reason to vendor at
/// all. What changed: the four reference-type arms now take heap types rather
/// than value types (the format's operand there is a heap type, so writing a
/// value type prefixed a spurious 0x63/0x64 byte), and the catch-all that
/// emitted `unreachable` for anything unmatched is gone.
fn encode_instruction(
  w : BinaryWriter,
  instr : Instruction,
) -> Unit raise EncodeError {
  match instr {
    // Control instructions
    Unreachable => w.write_byte(0x00)
    Nop => w.write_byte(0x01)
    Block(bt, body) => {
      w.write_byte(0x02)
      encode_block_type(w, bt)
      encode_instructions(w, body)
      w.write_byte(0x0B) // end
    }
    Loop(bt, body) => {
      w.write_byte(0x03)
      encode_block_type(w, bt)
      encode_instructions(w, body)
      w.write_byte(0x0B) // end
    }
    If(bt, then_body, else_body) => {
      w.write_byte(0x04)
      encode_block_type(w, bt)
      encode_instructions(w, then_body)
      if !else_body.is_empty() {
        w.write_byte(0x05) // else
        encode_instructions(w, else_body)
      }
      w.write_byte(0x0B) // end
    }
    Br(label) => {
      w.write_byte(0x0C)
      w.write_u32(label)
    }
    BrIf(label) => {
      w.write_byte(0x0D)
      w.write_u32(label)
    }
    BrTable(labels, default) => {
      w.write_byte(0x0E)
      w.write_u32(labels.length())
      for l in labels {
        w.write_u32(l)
      }
      w.write_u32(default)
    }
    Return => w.write_byte(0x0F)
    Call(idx) => {
      w.write_byte(0x10)
      w.write_u32(idx)
    }
    CallIndirect(type_idx, table_idx) => {
      w.write_byte(0x11)
      w.write_u32(type_idx)
      w.write_u32(table_idx)
    }
    ReturnCall(idx) => {
      w.write_byte(0x12)
      w.write_u32(idx)
    }
    ReturnCallIndirect(type_idx, table_idx) => {
      w.write_byte(0x13)
      w.write_u32(type_idx)
      w.write_u32(table_idx)
    }
    CallRef(type_idx) => {
      w.write_byte(0x14)
      w.write_u32(type_idx)
    }
    ReturnCallRef(type_idx) => {
      w.write_byte(0x15)
      w.write_u32(type_idx)
    }

    // Exception handling
    Throw(tag_idx) => {
      w.write_byte(0x08)
      w.write_u32(tag_idx)
    }
    ThrowRef => w.write_byte(0x0A)
    LegacyTry(bt, body, catches, catch_all) => {
      w.write_byte(0x06)
      encode_block_type(w, bt)
      encode_instructions(w, body)
      for entry in catches {
        w.write_byte(0x07)
        w.write_u32(entry.0)
        encode_instructions(w, entry.1)
      }
      if catch_all is Some(body) {
        w.write_byte(0x19)
        encode_instructions(w, body)
      }
      w.write_byte(0x0B) // end
    }
    TryTable(bt, handlers, body) => {
      w.write_byte(0x1F)
      encode_block_type(w, bt)
      w.write_u32(handlers.length())
      for handler in handlers {
        encode_catch_handler(w, handler)
      }
      encode_instructions(w, body)
      w.write_byte(0x0B) // end
    }

    // Parametric instructions
    Drop => w.write_byte(0x1A)
    Select => w.write_byte(0x1B)
    SelectTyped(types) => {
      w.write_byte(0x1C)
      w.write_u32(types.length())
      for t in types {
        encode_valtype(w, t)
      }
    }

    // Variable instructions
    LocalGet(idx) => {
      w.write_byte(0x20)
      w.write_u32(idx)
    }
    LocalSet(idx) => {
      w.write_byte(0x21)
      w.write_u32(idx)
    }
    LocalTee(idx) => {
      w.write_byte(0x22)
      w.write_u32(idx)
    }
    GlobalGet(idx) => {
      w.write_byte(0x23)
      w.write_u32(idx)
    }
    GlobalSet(idx) => {
      w.write_byte(0x24)
      w.write_u32(idx)
    }

    // Table instructions
    TableGet(idx) => {
      w.write_byte(0x25)
      w.write_u32(idx)
    }
    TableSet(idx) => {
      w.write_byte(0x26)
      w.write_u32(idx)
    }
    TableSize(idx) => {
      w.write_byte(0xFC)
      w.write_u32(16)
      w.write_u32(idx)
    }
    TableGrow(idx) => {
      w.write_byte(0xFC)
      w.write_u32(15)
      w.write_u32(idx)
    }
    TableFill(idx) => {
      w.write_byte(0xFC)
      w.write_u32(17)
      w.write_u32(idx)
    }
    TableCopy(dst, src) => {
      w.write_byte(0xFC)
      w.write_u32(14)
      w.write_u32(dst)
      w.write_u32(src)
    }
    TableInit(table_idx, elem_idx) => {
      w.write_byte(0xFC)
      w.write_u32(12)
      w.write_u32(elem_idx)
      w.write_u32(table_idx)
    }

    // Memory instructions
    I32Load(memidx, align, offset) => {
      w.write_byte(0x28)
      encode_memarg(w, memidx, align, offset)
    }
    I64Load(memidx, align, offset) => {
      w.write_byte(0x29)
      encode_memarg(w, memidx, align, offset)
    }
    F32Load(memidx, align, offset) => {
      w.write_byte(0x2A)
      encode_memarg(w, memidx, align, offset)
    }
    F64Load(memidx, align, offset) => {
      w.write_byte(0x2B)
      encode_memarg(w, memidx, align, offset)
    }
    I32Load8S(memidx, align, offset) => {
      w.write_byte(0x2C)
      encode_memarg(w, memidx, align, offset)
    }
    I32Load8U(memidx, align, offset) => {
      w.write_byte(0x2D)
      encode_memarg(w, memidx, align, offset)
    }
    I32Load16S(memidx, align, offset) => {
      w.write_byte(0x2E)
      encode_memarg(w, memidx, align, offset)
    }
    I32Load16U(memidx, align, offset) => {
      w.write_byte(0x2F)
      encode_memarg(w, memidx, align, offset)
    }
    I64Load8S(memidx, align, offset) => {
      w.write_byte(0x30)
      encode_memarg(w, memidx, align, offset)
    }
    I64Load8U(memidx, align, offset) => {
      w.write_byte(0x31)
      encode_memarg(w, memidx, align, offset)
    }
    I64Load16S(memidx, align, offset) => {
      w.write_byte(0x32)
      encode_memarg(w, memidx, align, offset)
    }
    I64Load16U(memidx, align, offset) => {
      w.write_byte(0x33)
      encode_memarg(w, memidx, align, offset)
    }
    I64Load32S(memidx, align, offset) => {
      w.write_byte(0x34)
      encode_memarg(w, memidx, align, offset)
    }
    I64Load32U(memidx, align, offset) => {
      w.write_byte(0x35)
      encode_memarg(w, memidx, align, offset)
    }
    I32Store(memidx, align, offset) => {
      w.write_byte(0x36)
      encode_memarg(w, memidx, align, offset)
    }
    I64Store(memidx, align, offset) => {
      w.write_byte(0x37)
      encode_memarg(w, memidx, align, offset)
    }
    F32Store(memidx, align, offset) => {
      w.write_byte(0x38)
      encode_memarg(w, memidx, align, offset)
    }
    F64Store(memidx, align, offset) => {
      w.write_byte(0x39)
      encode_memarg(w, memidx, align, offset)
    }
    I32Store8(memidx, align, offset) => {
      w.write_byte(0x3A)
      encode_memarg(w, memidx, align, offset)
    }
    I32Store16(memidx, align, offset) => {
      w.write_byte(0x3B)
      encode_memarg(w, memidx, align, offset)
    }
    I64Store8(memidx, align, offset) => {
      w.write_byte(0x3C)
      encode_memarg(w, memidx, align, offset)
    }
    I64Store16(memidx, align, offset) => {
      w.write_byte(0x3D)
      encode_memarg(w, memidx, align, offset)
    }
    I64Store32(memidx, align, offset) => {
      w.write_byte(0x3E)
      encode_memarg(w, memidx, align, offset)
    }
    MemorySize(memidx) => {
      w.write_byte(0x3F)
      w.write_u32(memidx)
    }
    MemoryGrow(memidx) => {
      w.write_byte(0x40)
      w.write_u32(memidx)
    }
    MemoryInit(memidx, data_idx) => {
      w.write_byte(0xFC)
      w.write_u32(8)
      w.write_u32(data_idx)
      w.write_u32(memidx)
    }
    DataDrop(data_idx) => {
      w.write_byte(0xFC)
      w.write_u32(9)
      w.write_u32(data_idx)
    }
    MemoryCopy(dst, src) => {
      w.write_byte(0xFC)
      w.write_u32(10)
      w.write_u32(dst)
      w.write_u32(src)
    }
    MemoryFill(memidx) => {
      w.write_byte(0xFC)
      w.write_u32(11)
      w.write_u32(memidx)
    }
    ElemDrop(elem_idx) => {
      w.write_byte(0xFC)
      w.write_u32(13)
      w.write_u32(elem_idx)
    }

    // Reference instructions
    RefNull(ht) => {
      w.write_byte(0xD0)
      encode_heaptype(w, ht)
    }
    RefIsNull => w.write_byte(0xD1)
    RefFunc(idx) => {
      w.write_byte(0xD2)
      w.write_u32(idx)
    }
    RefAsNonNull => w.write_byte(0xD4)
    RefEqInstr => w.write_byte(0xD3)
    BrOnNull(label) => {
      w.write_byte(0xD5)
      w.write_u32(label)
    }
    BrOnNonNull(label) => {
      w.write_byte(0xD6)
      w.write_u32(label)
    }

    // Numeric constants
    I32Const(val) => {
      w.write_byte(0x41)
      w.write_s32(val)
    }
    I64Const(val) => {
      w.write_byte(0x42)
      w.write_s64(val)
    }
    F32Const(val) => {
      w.write_byte(0x43)
      w.write_f32(val)
    }
    F64Const(val) => {
      w.write_byte(0x44)
      w.write_f64(val)
    }

    // i32 operations
    I32Eqz => w.write_byte(0x45)
    I32Eq => w.write_byte(0x46)
    I32Ne => w.write_byte(0x47)
    I32LtS => w.write_byte(0x48)
    I32LtU => w.write_byte(0x49)
    I32GtS => w.write_byte(0x4A)
    I32GtU => w.write_byte(0x4B)
    I32LeS => w.write_byte(0x4C)
    I32LeU => w.write_byte(0x4D)
    I32GeS => w.write_byte(0x4E)
    I32GeU => w.write_byte(0x4F)
    I32Clz => w.write_byte(0x67)
    I32Ctz => w.write_byte(0x68)
    I32Popcnt => w.write_byte(0x69)
    I32Add => w.write_byte(0x6A)
    I32Sub => w.write_byte(0x6B)
    I32Mul => w.write_byte(0x6C)
    I32DivS => w.write_byte(0x6D)
    I32DivU => w.write_byte(0x6E)
    I32RemS => w.write_byte(0x6F)
    I32RemU => w.write_byte(0x70)
    I32And => w.write_byte(0x71)
    I32Or => w.write_byte(0x72)
    I32Xor => w.write_byte(0x73)
    I32Shl => w.write_byte(0x74)
    I32ShrS => w.write_byte(0x75)
    I32ShrU => w.write_byte(0x76)
    I32Rotl => w.write_byte(0x77)
    I32Rotr => w.write_byte(0x78)
    I32Extend8S => w.write_byte(0xC0)
    I32Extend16S => w.write_byte(0xC1)

    // i64 operations
    I64Eqz => w.write_byte(0x50)
    I64Eq => w.write_byte(0x51)
    I64Ne => w.write_byte(0x52)
    I64LtS => w.write_byte(0x53)
    I64LtU => w.write_byte(0x54)
    I64GtS => w.write_byte(0x55)
    I64GtU => w.write_byte(0x56)
    I64LeS => w.write_byte(0x57)
    I64LeU => w.write_byte(0x58)
    I64GeS => w.write_byte(0x59)
    I64GeU => w.write_byte(0x5A)
    I64Clz => w.write_byte(0x79)
    I64Ctz => w.write_byte(0x7A)
    I64Popcnt => w.write_byte(0x7B)
    I64Add => w.write_byte(0x7C)
    I64Sub => w.write_byte(0x7D)
    I64Mul => w.write_byte(0x7E)
    I64DivS => w.write_byte(0x7F)
    I64DivU => w.write_byte(0x80)
    I64RemS => w.write_byte(0x81)
    I64RemU => w.write_byte(0x82)
    I64And => w.write_byte(0x83)
    I64Or => w.write_byte(0x84)
    I64Xor => w.write_byte(0x85)
    I64Shl => w.write_byte(0x86)
    I64ShrS => w.write_byte(0x87)
    I64ShrU => w.write_byte(0x88)
    I64Rotl => w.write_byte(0x89)
    I64Rotr => w.write_byte(0x8A)
    I64Extend8S => w.write_byte(0xC2)
    I64Extend16S => w.write_byte(0xC3)
    I64Extend32S => w.write_byte(0xC4)

    // f32 operations
    F32Eq => w.write_byte(0x5B)
    F32Ne => w.write_byte(0x5C)
    F32Lt => w.write_byte(0x5D)
    F32Gt => w.write_byte(0x5E)
    F32Le => w.write_byte(0x5F)
    F32Ge => w.write_byte(0x60)
    F32Abs => w.write_byte(0x8B)
    F32Neg => w.write_byte(0x8C)
    F32Ceil => w.write_byte(0x8D)
    F32Floor => w.write_byte(0x8E)
    F32Trunc => w.write_byte(0x8F)
    F32Nearest => w.write_byte(0x90)
    F32Sqrt => w.write_byte(0x91)
    F32Add => w.write_byte(0x92)
    F32Sub => w.write_byte(0x93)
    F32Mul => w.write_byte(0x94)
    F32Div => w.write_byte(0x95)
    F32Min => w.write_byte(0x96)
    F32Max => w.write_byte(0x97)
    F32Copysign => w.write_byte(0x98)

    // f64 operations
    F64Eq => w.write_byte(0x61)
    F64Ne => w.write_byte(0x62)
    F64Lt => w.write_byte(0x63)
    F64Gt => w.write_byte(0x64)
    F64Le => w.write_byte(0x65)
    F64Ge => w.write_byte(0x66)
    F64Abs => w.write_byte(0x99)
    F64Neg => w.write_byte(0x9A)
    F64Ceil => w.write_byte(0x9B)
    F64Floor => w.write_byte(0x9C)
    F64Trunc => w.write_byte(0x9D)
    F64Nearest => w.write_byte(0x9E)
    F64Sqrt => w.write_byte(0x9F)
    F64Add => w.write_byte(0xA0)
    F64Sub => w.write_byte(0xA1)
    F64Mul => w.write_byte(0xA2)
    F64Div => w.write_byte(0xA3)
    F64Min => w.write_byte(0xA4)
    F64Max => w.write_byte(0xA5)
    F64Copysign => w.write_byte(0xA6)

    // Conversions
    I32WrapI64 => w.write_byte(0xA7)
    I32TruncF32S => w.write_byte(0xA8)
    I32TruncF32U => w.write_byte(0xA9)
    I32TruncF64S => w.write_byte(0xAA)
    I32TruncF64U => w.write_byte(0xAB)
    I64ExtendI32S => w.write_byte(0xAC)
    I64ExtendI32U => w.write_byte(0xAD)
    I64TruncF32S => w.write_byte(0xAE)
    I64TruncF32U => w.write_byte(0xAF)
    I64TruncF64S => w.write_byte(0xB0)
    I64TruncF64U => w.write_byte(0xB1)
    F32ConvertI32S => w.write_byte(0xB2)
    F32ConvertI32U => w.write_byte(0xB3)
    F32ConvertI64S => w.write_byte(0xB4)
    F32ConvertI64U => w.write_byte(0xB5)
    F32DemoteF64 => w.write_byte(0xB6)
    F64ConvertI32S => w.write_byte(0xB7)
    F64ConvertI32U => w.write_byte(0xB8)
    F64ConvertI64S => w.write_byte(0xB9)
    F64ConvertI64U => w.write_byte(0xBA)
    F64PromoteF32 => w.write_byte(0xBB)
    I32ReinterpretF32 => w.write_byte(0xBC)
    I64ReinterpretF64 => w.write_byte(0xBD)
    F32ReinterpretI32 => w.write_byte(0xBE)
    F64ReinterpretI64 => w.write_byte(0xBF)

    // Saturating truncation
    I32TruncSatF32S => {
      w.write_byte(0xFC)
      w.write_u32(0)
    }
    I32TruncSatF32U => {
      w.write_byte(0xFC)
      w.write_u32(1)
    }
    I32TruncSatF64S => {
      w.write_byte(0xFC)
      w.write_u32(2)
    }
    I32TruncSatF64U => {
      w.write_byte(0xFC)
      w.write_u32(3)
    }
    I64TruncSatF32S => {
      w.write_byte(0xFC)
      w.write_u32(4)
    }
    I64TruncSatF32U => {
      w.write_byte(0xFC)
      w.write_u32(5)
    }
    I64TruncSatF64S => {
      w.write_byte(0xFC)
      w.write_u32(6)
    }
    I64TruncSatF64U => {
      w.write_byte(0xFC)
      w.write_u32(7)
    }

    // GC instructions
    StructNewDesc(type_idx) => {
      w.write_byte(0xFB)
      w.write_byte(0x20)
      w.write_u32(type_idx)
    }
    StructNewDefaultDesc(type_idx) => {
      w.write_byte(0xFB)
      w.write_byte(0x21)
      w.write_u32(type_idx)
    }
    RefGetDesc(type_idx) => {
      w.write_byte(0xFB)
      w.write_byte(0x22)
      w.write_u32(type_idx)
    }
    RefCastDescEq(rt) => {
      w.write_byte(0xFB)
      w.write_byte(if rt.nullable { 0x24 } else { 0x23 })
      encode_heaptype(w, rt.typ)
    }
    BrOnCastDescEq(label, from, to) => {
      w.write_byte(0xFB)
      w.write_byte(0x25)
      w.write_byte(
        (if from.nullable { 1 } else { 0 }) + (if to.nullable { 2 } else { 0 }),
      )
      w.write_u32(label)
      encode_heaptype(w, from.typ)
      encode_heaptype(w, to.typ)
    }
    BrOnCastDescEqFail(label, from, to) => {
      w.write_byte(0xFB)
      w.write_byte(0x26)
      w.write_byte(
        (if from.nullable { 1 } else { 0 }) + (if to.nullable { 2 } else { 0 }),
      )
      w.write_u32(label)
      encode_heaptype(w, from.typ)
      encode_heaptype(w, to.typ)
    }
    StructNew(type_idx) => {
      w.write_byte(0xFB)
      w.write_u32(0)
      w.write_u32(type_idx)
    }
    StructNewDefault(type_idx) => {
      w.write_byte(0xFB)
      w.write_u32(1)
      w.write_u32(type_idx)
    }
    StructGet(type_idx, field_idx) => {
      w.write_byte(0xFB)
      w.write_u32(2)
      w.write_u32(type_idx)
      w.write_u32(field_idx)
    }
    StructGetS(type_idx, field_idx) => {
      w.write_byte(0xFB)
      w.write_u32(3)
      w.write_u32(type_idx)
      w.write_u32(field_idx)
    }
    StructGetU(type_idx, field_idx) => {
      w.write_byte(0xFB)
      w.write_u32(4)
      w.write_u32(type_idx)
      w.write_u32(field_idx)
    }
    StructSet(type_idx, field_idx) => {
      w.write_byte(0xFB)
      w.write_u32(5)
      w.write_u32(type_idx)
      w.write_u32(field_idx)
    }
    ArrayNew(type_idx) => {
      w.write_byte(0xFB)
      w.write_u32(6)
      w.write_u32(type_idx)
    }
    ArrayNewDefault(type_idx) => {
      w.write_byte(0xFB)
      w.write_u32(7)
      w.write_u32(type_idx)
    }
    ArrayNewFixed(type_idx, len) => {
      w.write_byte(0xFB)
      w.write_u32(8)
      w.write_u32(type_idx)
      w.write_u32(len)
    }
    ArrayNewData(type_idx, data_idx) => {
      w.write_byte(0xFB)
      w.write_u32(9)
      w.write_u32(type_idx)
      w.write_u32(data_idx)
    }
    ArrayNewElem(type_idx, elem_idx) => {
      w.write_byte(0xFB)
      w.write_u32(10)
      w.write_u32(type_idx)
      w.write_u32(elem_idx)
    }
    ArrayGet(type_idx) => {
      w.write_byte(0xFB)
      w.write_u32(11)
      w.write_u32(type_idx)
    }
    ArrayGetS(type_idx) => {
      w.write_byte(0xFB)
      w.write_u32(12)
      w.write_u32(type_idx)
    }
    ArrayGetU(type_idx) => {
      w.write_byte(0xFB)
      w.write_u32(13)
      w.write_u32(type_idx)
    }
    ArraySet(type_idx) => {
      w.write_byte(0xFB)
      w.write_u32(14)
      w.write_u32(type_idx)
    }
    ArrayLen => {
      w.write_byte(0xFB)
      w.write_u32(15)
    }
    ArrayFill(type_idx) => {
      w.write_byte(0xFB)
      w.write_u32(16)
      w.write_u32(type_idx)
    }
    ArrayCopy(dst_type, src_type) => {
      w.write_byte(0xFB)
      w.write_u32(17)
      w.write_u32(dst_type)
      w.write_u32(src_type)
    }
    ArrayInitData(type_idx, data_idx) => {
      w.write_byte(0xFB)
      w.write_u32(18)
      w.write_u32(type_idx)
      w.write_u32(data_idx)
    }
    ArrayInitElem(type_idx, elem_idx) => {
      w.write_byte(0xFB)
      w.write_u32(19)
      w.write_u32(type_idx)
      w.write_u32(elem_idx)
    }
    RefTest(rt) => {
      w.write_byte(0xFB)
      w.write_u32(if rt.nullable { 21 } else { 20 })
      encode_heaptype(w, rt.typ)
    }
    RefCast(rt) => {
      w.write_byte(0xFB)
      w.write_u32(if rt.nullable { 23 } else { 22 })
      encode_heaptype(w, rt.typ)
    }
    BrOnCast(label, from_type, to_type) => {
      w.write_byte(0xFB)
      w.write_u32(24)
      // Cast flags: bit 0 = source nullable, bit 1 = target nullable.
      w.write_byte(cast_flags(from_type, to_type))
      w.write_u32(label)
      encode_heaptype(w, from_type.typ)
      encode_heaptype(w, to_type.typ)
    }
    BrOnCastFail(label, from_type, to_type) => {
      w.write_byte(0xFB)
      w.write_u32(25)
      w.write_byte(cast_flags(from_type, to_type))
      w.write_u32(label)
      encode_heaptype(w, from_type.typ)
      encode_heaptype(w, to_type.typ)
    }
    RefI31 => {
      w.write_byte(0xFB)
      w.write_u32(28)
    }
    I31GetS => {
      w.write_byte(0xFB)
      w.write_u32(29)
    }
    I31GetU => {
      w.write_byte(0xFB)
      w.write_u32(30)
    }
    AnyConvertExtern => {
      w.write_byte(0xFB)
      w.write_u32(26)
    }
    ExternConvertAny => {
      w.write_byte(0xFB)
      w.write_u32(27)
    }

    // SIMD - V128 constant and load/store
    V128Const(bytes) => {
      w.write_byte(0xFD)
      w.write_u32(12)
      for i in 0..<16 {
        w.write_byte(bytes[i].to_int())
      }
    }
    V128Load(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(0)
      encode_memarg(w, memidx, align, offset)
    }
    V128Store(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(11)
      encode_memarg(w, memidx, align, offset)
    }
    // Hints carry no opcode: record where the instruction they belong to
    // starts, then encode that instruction.
    Hinted(hints, inner) => {
      w.record_hint(hints)
      encode_instruction(w, inner)
    }
    // Neither a spelling nor a source form is part of the encoding: the bytes
    // are the value, and the construction is the construction.
    Spelled(_, inner) | FromChar(_, inner) | FromString(_, inner) =>
      encode_instruction(w, inner)
    // Stack switching. `wasm_core` had none of these; the encodings are
    // wasm_output.ml's, which is what they are measured against.
    ContNew(idx) => {
      w.write_byte(0xE0)
      w.write_u32(idx)
    }
    ContBind(from_idx, to_idx) => {
      w.write_byte(0xE1)
      w.write_u32(from_idx)
      w.write_u32(to_idx)
    }
    Suspend(tag) => {
      w.write_byte(0xE2)
      w.write_u32(tag)
    }
    Resume(idx, clauses) => {
      w.write_byte(0xE3)
      w.write_u32(idx)
      encode_resume_table(w, clauses)
    }
    ResumeThrow(idx, tag, clauses) => {
      w.write_byte(0xE4)
      w.write_u32(idx)
      w.write_u32(tag)
      encode_resume_table(w, clauses)
    }
    ResumeThrowRef(idx, clauses) => {
      w.write_byte(0xE5)
      w.write_u32(idx)
      encode_resume_table(w, clauses)
    }
    Switch(idx, tag) => {
      w.write_byte(0xE6)
      w.write_u32(idx)
      w.write_u32(tag)
    }
    // The threads proposal. The sub-opcode is a BYTE, not a LEB -- they all
    // happen to be under 0x80, so the two agree today, but the reference writes
    // a byte and that is what these bytes are measured against.
    Atomic(op, memidx, align, offset) => {
      w.write_byte(0xFE)
      w.write_byte(op)
      encode_memarg(w, memidx, align, offset)
    }
    // `atomic.fence` is the one atomic with no memory operand, so it cannot be
    // spelled as an `Atomic` with a degenerate memarg: the format wants a
    // single 0x00 where the memarg would go, not an alignment and an offset.
    AtomicFence => {
      w.write_byte(0xFE)
      w.write_byte(0x03)
      w.write_byte(0x00)
    }
    I16x8RelaxedDotI8x16I7x16S => {
      w.write_byte(0xFD)
      w.write_u32(0x112)
    }
    I16x8RelaxedQ15mulrS => {
      w.write_byte(0xFD)
      w.write_u32(0x111)
    }
    F64x2RelaxedMax => {
      w.write_byte(0xFD)
      w.write_u32(0x110)
    }
    F64x2RelaxedMin => {
      w.write_byte(0xFD)
      w.write_u32(0x10F)
    }
    F32x4RelaxedMax => {
      w.write_byte(0xFD)
      w.write_u32(0x10E)
    }
    F32x4RelaxedMin => {
      w.write_byte(0xFD)
      w.write_u32(0x10D)
    }
    I64x2RelaxedLaneselect => {
      w.write_byte(0xFD)
      w.write_u32(0x10C)
    }
    I32x4RelaxedLaneselect => {
      w.write_byte(0xFD)
      w.write_u32(0x10B)
    }
    I16x8RelaxedLaneselect => {
      w.write_byte(0xFD)
      w.write_u32(0x10A)
    }
    I8x16RelaxedLaneselect => {
      w.write_byte(0xFD)
      w.write_u32(0x109)
    }
    F64x2RelaxedNmadd => {
      w.write_byte(0xFD)
      w.write_u32(0x108)
    }
    F64x2RelaxedMadd => {
      w.write_byte(0xFD)
      w.write_u32(0x107)
    }
    F32x4RelaxedNmadd => {
      w.write_byte(0xFD)
      w.write_u32(0x106)
    }
    F32x4RelaxedMadd => {
      w.write_byte(0xFD)
      w.write_u32(0x105)
    }
    I32x4RelaxedTruncF64x2UZero => {
      w.write_byte(0xFD)
      w.write_u32(0x104)
    }
    I32x4RelaxedTruncF64x2SZero => {
      w.write_byte(0xFD)
      w.write_u32(0x103)
    }
    I32x4RelaxedTruncF32x4U => {
      w.write_byte(0xFD)
      w.write_u32(0x102)
    }
    I32x4RelaxedTruncF32x4S => {
      w.write_byte(0xFD)
      w.write_u32(0x101)
    }
    I8x16RelaxedSwizzle => {
      w.write_byte(0xFD)
      w.write_u32(0x100)
    }
    F64x2PromoteLowF32x4 => {
      w.write_byte(0xFD)
      w.write_u32(0x5F)
    }
    F32x4DemoteF64x2Zero => {
      w.write_byte(0xFD)
      w.write_u32(0x5E)
    }
    F64x2ConvertLowI32x4U => {
      w.write_byte(0xFD)
      w.write_u32(0xFF)
    }
    F64x2ConvertLowI32x4S => {
      w.write_byte(0xFD)
      w.write_u32(0xFE)
    }
    I32x4TruncSatF64x2UZero => {
      w.write_byte(0xFD)
      w.write_u32(0xFD)
    }
    I32x4TruncSatF64x2SZero => {
      w.write_byte(0xFD)
      w.write_u32(0xFC)
    }
    F32x4ConvertI32x4U => {
      w.write_byte(0xFD)
      w.write_u32(0xFB)
    }
    F32x4ConvertI32x4S => {
      w.write_byte(0xFD)
      w.write_u32(0xFA)
    }
    I32x4TruncSatF32x4U => {
      w.write_byte(0xFD)
      w.write_u32(0xF9)
    }
    I32x4TruncSatF32x4S => {
      w.write_byte(0xFD)
      w.write_u32(0xF8)
    }
    F64x2Pmax => {
      w.write_byte(0xFD)
      w.write_u32(0xF7)
    }
    F64x2Pmin => {
      w.write_byte(0xFD)
      w.write_u32(0xF6)
    }
    F64x2Max => {
      w.write_byte(0xFD)
      w.write_u32(0xF5)
    }
    F64x2Min => {
      w.write_byte(0xFD)
      w.write_u32(0xF4)
    }
    F64x2Div => {
      w.write_byte(0xFD)
      w.write_u32(0xF3)
    }
    F64x2Mul => {
      w.write_byte(0xFD)
      w.write_u32(0xF2)
    }
    F64x2Sub => {
      w.write_byte(0xFD)
      w.write_u32(0xF1)
    }
    F64x2Add => {
      w.write_byte(0xFD)
      w.write_u32(0xF0)
    }
    F64x2Sqrt => {
      w.write_byte(0xFD)
      w.write_u32(0xEF)
    }
    F64x2Neg => {
      w.write_byte(0xFD)
      w.write_u32(0xED)
    }
    F64x2Abs => {
      w.write_byte(0xFD)
      w.write_u32(0xEC)
    }
    F64x2Nearest => {
      w.write_byte(0xFD)
      w.write_u32(0x94)
    }
    F64x2Trunc => {
      w.write_byte(0xFD)
      w.write_u32(0x7A)
    }
    F64x2Floor => {
      w.write_byte(0xFD)
      w.write_u32(0x75)
    }
    F64x2Ceil => {
      w.write_byte(0xFD)
      w.write_u32(0x74)
    }
    F32x4Pmax => {
      w.write_byte(0xFD)
      w.write_u32(0xEB)
    }
    F32x4Pmin => {
      w.write_byte(0xFD)
      w.write_u32(0xEA)
    }
    F32x4Max => {
      w.write_byte(0xFD)
      w.write_u32(0xE9)
    }
    F32x4Min => {
      w.write_byte(0xFD)
      w.write_u32(0xE8)
    }
    F32x4Div => {
      w.write_byte(0xFD)
      w.write_u32(0xE7)
    }
    F32x4Mul => {
      w.write_byte(0xFD)
      w.write_u32(0xE6)
    }
    F32x4Sub => {
      w.write_byte(0xFD)
      w.write_u32(0xE5)
    }
    F32x4Add => {
      w.write_byte(0xFD)
      w.write_u32(0xE4)
    }
    F32x4Sqrt => {
      w.write_byte(0xFD)
      w.write_u32(0xE3)
    }
    F32x4Neg => {
      w.write_byte(0xFD)
      w.write_u32(0xE1)
    }
    F32x4Abs => {
      w.write_byte(0xFD)
      w.write_u32(0xE0)
    }
    F32x4Nearest => {
      w.write_byte(0xFD)
      w.write_u32(0x6A)
    }
    F32x4Trunc => {
      w.write_byte(0xFD)
      w.write_u32(0x69)
    }
    F32x4Floor => {
      w.write_byte(0xFD)
      w.write_u32(0x68)
    }
    F32x4Ceil => {
      w.write_byte(0xFD)
      w.write_u32(0x67)
    }
    I64x2ExtMulHighI32x4U => {
      w.write_byte(0xFD)
      w.write_u32(0xDF)
    }
    I64x2ExtMulLowI32x4U => {
      w.write_byte(0xFD)
      w.write_u32(0xDE)
    }
    I64x2ExtMulHighI32x4S => {
      w.write_byte(0xFD)
      w.write_u32(0xDD)
    }
    I64x2ExtMulLowI32x4S => {
      w.write_byte(0xFD)
      w.write_u32(0xDC)
    }
    I64x2Mul => {
      w.write_byte(0xFD)
      w.write_u32(0xD5)
    }
    I64x2Sub => {
      w.write_byte(0xFD)
      w.write_u32(0xD1)
    }
    I64x2Add => {
      w.write_byte(0xFD)
      w.write_u32(0xCE)
    }
    I64x2ShrU => {
      w.write_byte(0xFD)
      w.write_u32(0xCD)
    }
    I64x2ShrS => {
      w.write_byte(0xFD)
      w.write_u32(0xCC)
    }
    I64x2Shl => {
      w.write_byte(0xFD)
      w.write_u32(0xCB)
    }
    I64x2ExtendHighI32x4U => {
      w.write_byte(0xFD)
      w.write_u32(0xCA)
    }
    I64x2ExtendLowI32x4U => {
      w.write_byte(0xFD)
      w.write_u32(0xC9)
    }
    I64x2ExtendHighI32x4S => {
      w.write_byte(0xFD)
      w.write_u32(0xC8)
    }
    I64x2ExtendLowI32x4S => {
      w.write_byte(0xFD)
      w.write_u32(0xC7)
    }
    I64x2Bitmask => {
      w.write_byte(0xFD)
      w.write_u32(0xC4)
    }
    I64x2AllTrue => {
      w.write_byte(0xFD)
      w.write_u32(0xC3)
    }
    I64x2Neg => {
      w.write_byte(0xFD)
      w.write_u32(0xC1)
    }
    I64x2Abs => {
      w.write_byte(0xFD)
      w.write_u32(0xC0)
    }
    I32x4ExtMulHighI16x8U => {
      w.write_byte(0xFD)
      w.write_u32(0xBF)
    }
    I32x4ExtMulLowI16x8U => {
      w.write_byte(0xFD)
      w.write_u32(0xBE)
    }
    I32x4ExtMulHighI16x8S => {
      w.write_byte(0xFD)
      w.write_u32(0xBD)
    }
    I32x4ExtMulLowI16x8S => {
      w.write_byte(0xFD)
      w.write_u32(0xBC)
    }
    I32x4DotI16x8S => {
      w.write_byte(0xFD)
      w.write_u32(0xBA)
    }
    I32x4MaxU => {
      w.write_byte(0xFD)
      w.write_u32(0xB9)
    }
    I32x4MaxS => {
      w.write_byte(0xFD)
      w.write_u32(0xB8)
    }
    I32x4MinU => {
      w.write_byte(0xFD)
      w.write_u32(0xB7)
    }
    I32x4MinS => {
      w.write_byte(0xFD)
      w.write_u32(0xB6)
    }
    I32x4Mul => {
      w.write_byte(0xFD)
      w.write_u32(0xB5)
    }
    I32x4Sub => {
      w.write_byte(0xFD)
      w.write_u32(0xB1)
    }
    I32x4Add => {
      w.write_byte(0xFD)
      w.write_u32(0xAE)
    }
    I32x4ShrU => {
      w.write_byte(0xFD)
      w.write_u32(0xAD)
    }
    I32x4ShrS => {
      w.write_byte(0xFD)
      w.write_u32(0xAC)
    }
    I32x4Shl => {
      w.write_byte(0xFD)
      w.write_u32(0xAB)
    }
    I32x4ExtendHighI16x8U => {
      w.write_byte(0xFD)
      w.write_u32(0xAA)
    }
    I32x4ExtendLowI16x8U => {
      w.write_byte(0xFD)
      w.write_u32(0xA9)
    }
    I32x4ExtendHighI16x8S => {
      w.write_byte(0xFD)
      w.write_u32(0xA8)
    }
    I32x4ExtendLowI16x8S => {
      w.write_byte(0xFD)
      w.write_u32(0xA7)
    }
    I32x4Bitmask => {
      w.write_byte(0xFD)
      w.write_u32(0xA4)
    }
    I32x4AllTrue => {
      w.write_byte(0xFD)
      w.write_u32(0xA3)
    }
    I32x4Neg => {
      w.write_byte(0xFD)
      w.write_u32(0xA1)
    }
    I32x4Abs => {
      w.write_byte(0xFD)
      w.write_u32(0xA0)
    }
    I32x4ExtAddPairwiseI16x8U => {
      w.write_byte(0xFD)
      w.write_u32(0x7F)
    }
    I32x4ExtAddPairwiseI16x8S => {
      w.write_byte(0xFD)
      w.write_u32(0x7E)
    }
    I16x8ExtMulHighI8x16U => {
      w.write_byte(0xFD)
      w.write_u32(0x9F)
    }
    I16x8ExtMulLowI8x16U => {
      w.write_byte(0xFD)
      w.write_u32(0x9E)
    }
    I16x8ExtMulHighI8x16S => {
      w.write_byte(0xFD)
      w.write_u32(0x9D)
    }
    I16x8ExtMulLowI8x16S => {
      w.write_byte(0xFD)
      w.write_u32(0x9C)
    }
    I16x8AvgrU => {
      w.write_byte(0xFD)
      w.write_u32(0x9B)
    }
    I16x8MaxU => {
      w.write_byte(0xFD)
      w.write_u32(0x99)
    }
    I16x8MaxS => {
      w.write_byte(0xFD)
      w.write_u32(0x98)
    }
    I16x8MinU => {
      w.write_byte(0xFD)
      w.write_u32(0x97)
    }
    I16x8MinS => {
      w.write_byte(0xFD)
      w.write_u32(0x96)
    }
    I16x8Mul => {
      w.write_byte(0xFD)
      w.write_u32(0x95)
    }
    I16x8SubSatU => {
      w.write_byte(0xFD)
      w.write_u32(0x93)
    }
    I16x8SubSatS => {
      w.write_byte(0xFD)
      w.write_u32(0x92)
    }
    I16x8Sub => {
      w.write_byte(0xFD)
      w.write_u32(0x91)
    }
    I16x8AddSatU => {
      w.write_byte(0xFD)
      w.write_u32(0x90)
    }
    I16x8AddSatS => {
      w.write_byte(0xFD)
      w.write_u32(0x8F)
    }
    I16x8Add => {
      w.write_byte(0xFD)
      w.write_u32(0x8E)
    }
    I16x8ShrU => {
      w.write_byte(0xFD)
      w.write_u32(0x8D)
    }
    I16x8ShrS => {
      w.write_byte(0xFD)
      w.write_u32(0x8C)
    }
    I16x8Shl => {
      w.write_byte(0xFD)
      w.write_u32(0x8B)
    }
    I16x8ExtendHighI8x16U => {
      w.write_byte(0xFD)
      w.write_u32(0x8A)
    }
    I16x8ExtendLowI8x16U => {
      w.write_byte(0xFD)
      w.write_u32(0x89)
    }
    I16x8ExtendHighI8x16S => {
      w.write_byte(0xFD)
      w.write_u32(0x88)
    }
    I16x8ExtendLowI8x16S => {
      w.write_byte(0xFD)
      w.write_u32(0x87)
    }
    I16x8NarrowI32x4U => {
      w.write_byte(0xFD)
      w.write_u32(0x86)
    }
    I16x8NarrowI32x4S => {
      w.write_byte(0xFD)
      w.write_u32(0x85)
    }
    I16x8Bitmask => {
      w.write_byte(0xFD)
      w.write_u32(0x84)
    }
    I16x8AllTrue => {
      w.write_byte(0xFD)
      w.write_u32(0x83)
    }
    I16x8Q15MulrSatS => {
      w.write_byte(0xFD)
      w.write_u32(0x82)
    }
    I16x8Neg => {
      w.write_byte(0xFD)
      w.write_u32(0x81)
    }
    I16x8Abs => {
      w.write_byte(0xFD)
      w.write_u32(0x80)
    }
    I16x8ExtAddPairwiseI8x16U => {
      w.write_byte(0xFD)
      w.write_u32(0x7D)
    }
    I16x8ExtAddPairwiseI8x16S => {
      w.write_byte(0xFD)
      w.write_u32(0x7C)
    }
    I8x16AvgrU => {
      w.write_byte(0xFD)
      w.write_u32(0x7B)
    }
    I8x16MaxU => {
      w.write_byte(0xFD)
      w.write_u32(0x79)
    }
    I8x16MaxS => {
      w.write_byte(0xFD)
      w.write_u32(0x78)
    }
    I8x16MinU => {
      w.write_byte(0xFD)
      w.write_u32(0x77)
    }
    I8x16MinS => {
      w.write_byte(0xFD)
      w.write_u32(0x76)
    }
    I8x16SubSatU => {
      w.write_byte(0xFD)
      w.write_u32(0x73)
    }
    I8x16SubSatS => {
      w.write_byte(0xFD)
      w.write_u32(0x72)
    }
    I8x16Sub => {
      w.write_byte(0xFD)
      w.write_u32(0x71)
    }
    I8x16AddSatU => {
      w.write_byte(0xFD)
      w.write_u32(0x70)
    }
    I8x16AddSatS => {
      w.write_byte(0xFD)
      w.write_u32(0x6f)
    }
    I8x16Add => {
      w.write_byte(0xFD)
      w.write_u32(0x6e)
    }
    I8x16ShrU => {
      w.write_byte(0xFD)
      w.write_u32(0x6d)
    }
    I8x16ShrS => {
      w.write_byte(0xFD)
      w.write_u32(0x6c)
    }
    I8x16Shl => {
      w.write_byte(0xFD)
      w.write_u32(0x6b)
    }
    I8x16NarrowI16x8U => {
      w.write_byte(0xFD)
      w.write_u32(0x66)
    }
    I8x16NarrowI16x8S => {
      w.write_byte(0xFD)
      w.write_u32(0x65)
    }
    I8x16Bitmask => {
      w.write_byte(0xFD)
      w.write_u32(0x64)
    }
    I8x16AllTrue => {
      w.write_byte(0xFD)
      w.write_u32(0x63)
    }
    I8x16Popcnt => {
      w.write_byte(0xFD)
      w.write_u32(0x62)
    }
    I8x16Neg => {
      w.write_byte(0xFD)
      w.write_u32(0x61)
    }
    I8x16Abs => {
      w.write_byte(0xFD)
      w.write_u32(0x60)
    }
    V128AnyTrue => {
      w.write_byte(0xFD)
      w.write_u32(0x53)
    }
    V128Bitselect => {
      w.write_byte(0xFD)
      w.write_u32(0x52)
    }
    V128Xor => {
      w.write_byte(0xFD)
      w.write_u32(0x51)
    }
    V128Or => {
      w.write_byte(0xFD)
      w.write_u32(0x50)
    }
    V128AndNot => {
      w.write_byte(0xFD)
      w.write_u32(0x4F)
    }
    V128And => {
      w.write_byte(0xFD)
      w.write_u32(0x4E)
    }
    V128Not => {
      w.write_byte(0xFD)
      w.write_u32(0x4D)
    }
    F64x2Ge => {
      w.write_byte(0xFD)
      w.write_u32(0x4C)
    }
    F64x2Le => {
      w.write_byte(0xFD)
      w.write_u32(0x4B)
    }
    F64x2Gt => {
      w.write_byte(0xFD)
      w.write_u32(0x4A)
    }
    F64x2Lt => {
      w.write_byte(0xFD)
      w.write_u32(0x49)
    }
    F64x2Ne => {
      w.write_byte(0xFD)
      w.write_u32(0x48)
    }
    F64x2Eq => {
      w.write_byte(0xFD)
      w.write_u32(0x47)
    }
    F32x4Ge => {
      w.write_byte(0xFD)
      w.write_u32(0x46)
    }
    F32x4Le => {
      w.write_byte(0xFD)
      w.write_u32(0x45)
    }
    F32x4Gt => {
      w.write_byte(0xFD)
      w.write_u32(0x44)
    }
    F32x4Lt => {
      w.write_byte(0xFD)
      w.write_u32(0x43)
    }
    F32x4Ne => {
      w.write_byte(0xFD)
      w.write_u32(0x42)
    }
    F32x4Eq => {
      w.write_byte(0xFD)
      w.write_u32(0x41)
    }
    I64x2GeS => {
      w.write_byte(0xFD)
      w.write_u32(0xDB)
    }
    I64x2LeS => {
      w.write_byte(0xFD)
      w.write_u32(0xDA)
    }
    I64x2GtS => {
      w.write_byte(0xFD)
      w.write_u32(0xD9)
    }
    I64x2LtS => {
      w.write_byte(0xFD)
      w.write_u32(0xD8)
    }
    I64x2Ne => {
      w.write_byte(0xFD)
      w.write_u32(0xD7)
    }
    I64x2Eq => {
      w.write_byte(0xFD)
      w.write_u32(0xD6)
    }
    I32x4GeU => {
      w.write_byte(0xFD)
      w.write_u32(0x40)
    }
    I32x4GeS => {
      w.write_byte(0xFD)
      w.write_u32(0x3F)
    }
    I32x4LeU => {
      w.write_byte(0xFD)
      w.write_u32(0x3E)
    }
    I32x4LeS => {
      w.write_byte(0xFD)
      w.write_u32(0x3D)
    }
    I32x4GtU => {
      w.write_byte(0xFD)
      w.write_u32(0x3C)
    }
    I32x4GtS => {
      w.write_byte(0xFD)
      w.write_u32(0x3B)
    }
    I32x4LtU => {
      w.write_byte(0xFD)
      w.write_u32(0x3A)
    }
    I32x4LtS => {
      w.write_byte(0xFD)
      w.write_u32(0x39)
    }
    I32x4Ne => {
      w.write_byte(0xFD)
      w.write_u32(0x38)
    }
    I32x4Eq => {
      w.write_byte(0xFD)
      w.write_u32(0x37)
    }
    I16x8GeU => {
      w.write_byte(0xFD)
      w.write_u32(0x36)
    }
    I16x8GeS => {
      w.write_byte(0xFD)
      w.write_u32(0x35)
    }
    I16x8LeU => {
      w.write_byte(0xFD)
      w.write_u32(0x34)
    }
    I16x8LeS => {
      w.write_byte(0xFD)
      w.write_u32(0x33)
    }
    I16x8GtU => {
      w.write_byte(0xFD)
      w.write_u32(0x32)
    }
    I16x8GtS => {
      w.write_byte(0xFD)
      w.write_u32(0x31)
    }
    I16x8LtU => {
      w.write_byte(0xFD)
      w.write_u32(0x30)
    }
    I16x8LtS => {
      w.write_byte(0xFD)
      w.write_u32(0x2F)
    }
    I16x8Ne => {
      w.write_byte(0xFD)
      w.write_u32(0x2E)
    }
    I16x8Eq => {
      w.write_byte(0xFD)
      w.write_u32(0x2D)
    }
    I8x16GeU => {
      w.write_byte(0xFD)
      w.write_u32(0x2C)
    }
    I8x16GeS => {
      w.write_byte(0xFD)
      w.write_u32(0x2B)
    }
    I8x16LeU => {
      w.write_byte(0xFD)
      w.write_u32(0x2A)
    }
    I8x16LeS => {
      w.write_byte(0xFD)
      w.write_u32(0x29)
    }
    I8x16GtU => {
      w.write_byte(0xFD)
      w.write_u32(0x28)
    }
    I8x16GtS => {
      w.write_byte(0xFD)
      w.write_u32(0x27)
    }
    I8x16LtU => {
      w.write_byte(0xFD)
      w.write_u32(0x26)
    }
    I8x16LtS => {
      w.write_byte(0xFD)
      w.write_u32(0x25)
    }
    I8x16Ne => {
      w.write_byte(0xFD)
      w.write_u32(0x24)
    }
    I8x16Eq => {
      w.write_byte(0xFD)
      w.write_u32(0x23)
    }
    F64x2ReplaceLane(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x22)
      w.write_byte(lane)
    }
    F32x4ReplaceLane(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x20)
      w.write_byte(lane)
    }
    I64x2ReplaceLane(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x1E)
      w.write_byte(lane)
    }
    I32x4ReplaceLane(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x1C)
      w.write_byte(lane)
    }
    I16x8ReplaceLane(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x1A)
      w.write_byte(lane)
    }
    I8x16ReplaceLane(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x17)
      w.write_byte(lane)
    }
    F64x2ExtractLane(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x21)
      w.write_byte(lane)
    }
    F32x4ExtractLane(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x1F)
      w.write_byte(lane)
    }
    I64x2ExtractLane(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x1D)
      w.write_byte(lane)
    }
    I32x4ExtractLane(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x1B)
      w.write_byte(lane)
    }
    I16x8ExtractLaneU(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x19)
      w.write_byte(lane)
    }
    I16x8ExtractLaneS(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x18)
      w.write_byte(lane)
    }
    I8x16ExtractLaneU(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x16)
      w.write_byte(lane)
    }
    I8x16ExtractLaneS(lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x15)
      w.write_byte(lane)
    }
    F64x2Splat => {
      w.write_byte(0xFD)
      w.write_u32(0x14)
    }
    F32x4Splat => {
      w.write_byte(0xFD)
      w.write_u32(0x13)
    }
    I64x2Splat => {
      w.write_byte(0xFD)
      w.write_u32(0x12)
    }
    I32x4Splat => {
      w.write_byte(0xFD)
      w.write_u32(0x11)
    }
    I16x8Splat => {
      w.write_byte(0xFD)
      w.write_u32(0x10)
    }
    I8x16Splat => {
      w.write_byte(0xFD)
      w.write_u32(0x0F)
    }
    I8x16Swizzle => {
      w.write_byte(0xFD)
      w.write_u32(0x0E)
    }
    I8x16Shuffle(lanes) => {
      w.write_byte(0xFD)
      w.write_u32(0x0D)
      for lane in lanes {
        w.write_byte(lane)
      }
    }
    V128Store64Lane(memidx, align, offset, lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x5B)
      encode_memarg(w, memidx, align, offset)
      w.write_byte(lane)
    }
    V128Store32Lane(memidx, align, offset, lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x5A)
      encode_memarg(w, memidx, align, offset)
      w.write_byte(lane)
    }
    V128Store16Lane(memidx, align, offset, lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x59)
      encode_memarg(w, memidx, align, offset)
      w.write_byte(lane)
    }
    V128Store8Lane(memidx, align, offset, lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x58)
      encode_memarg(w, memidx, align, offset)
      w.write_byte(lane)
    }
    V128Load64Lane(memidx, align, offset, lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x57)
      encode_memarg(w, memidx, align, offset)
      w.write_byte(lane)
    }
    V128Load32Lane(memidx, align, offset, lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x56)
      encode_memarg(w, memidx, align, offset)
      w.write_byte(lane)
    }
    V128Load16Lane(memidx, align, offset, lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x55)
      encode_memarg(w, memidx, align, offset)
      w.write_byte(lane)
    }
    V128Load8Lane(memidx, align, offset, lane) => {
      w.write_byte(0xFD)
      w.write_u32(0x54)
      encode_memarg(w, memidx, align, offset)
      w.write_byte(lane)
    }
    V128Load64Zero(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(0x5D)
      encode_memarg(w, memidx, align, offset)
    }
    V128Load32Zero(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(0x5C)
      encode_memarg(w, memidx, align, offset)
    }
    V128Load64Splat(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(0x0A)
      encode_memarg(w, memidx, align, offset)
    }
    V128Load32Splat(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(0x09)
      encode_memarg(w, memidx, align, offset)
    }
    V128Load16Splat(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(0x08)
      encode_memarg(w, memidx, align, offset)
    }
    V128Load8Splat(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(0x07)
      encode_memarg(w, memidx, align, offset)
    }
    V128Load32x2U(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(0x06)
      encode_memarg(w, memidx, align, offset)
    }
    V128Load32x2S(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(0x05)
      encode_memarg(w, memidx, align, offset)
    }
    V128Load16x4U(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(0x04)
      encode_memarg(w, memidx, align, offset)
    }
    V128Load16x4S(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(0x03)
      encode_memarg(w, memidx, align, offset)
    }
    V128Load8x8U(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(0x02)
      encode_memarg(w, memidx, align, offset)
    }
    V128Load8x8S(memidx, align, offset) => {
      w.write_byte(0xFD)
      w.write_u32(0x01)
      encode_memarg(w, memidx, align, offset)
    }
    I64MulWideU => {
      w.write_byte(0xFC)
      w.write_u32(0x16)
    }
    I64Add128 => {
      w.write_byte(0xFC)
      w.write_u32(0x13)
    }
    I64Sub128 => {
      w.write_byte(0xFC)
      w.write_u32(0x14)
    }
    I64MulWideS => {
      w.write_byte(0xFC)
      w.write_u32(0x15)
    }
    I32x4RelaxedDotI8x16I7x16AddS => {
      w.write_byte(0xFD)
      w.write_u32(0x113)
    }
  }
}