#[allow(unused_imports)] use crate::Instruction; use crate::{ BlockType, Catch, Encode, Handle, HeapType, Ieee32, Ieee64, Lane, MemArg, Ordering, RefType, ValType, encode_vec, }; use alloc::vec::Vec; /// An encoder for Wasm instructions. #[derive(Debug)] pub struct InstructionSink<'a> { sink: &'a mut Vec, } impl<'a> InstructionSink<'a> { /// Create an instruction encoder pointing to the given byte sink. pub fn new(sink: &'a mut Vec) -> Self { Self { sink } } // Control instructions. /// Encode [`Instruction::Unreachable`]. pub fn unreachable(&mut self) -> &mut Self { self.sink.push(0x00); self } /// Encode [`Instruction::Nop`]. pub fn nop(&mut self) -> &mut Self { self.sink.push(0x01); self } /// Encode [`Instruction::Block`]. pub fn block(&mut self, bt: BlockType) -> &mut Self { self.sink.push(0x02); bt.encode(self.sink); self } /// Encode [`Instruction::Loop`]. pub fn loop_(&mut self, bt: BlockType) -> &mut Self { self.sink.push(0x03); bt.encode(self.sink); self } /// Encode [`Instruction::If`]. pub fn if_(&mut self, bt: BlockType) -> &mut Self { self.sink.push(0x04); bt.encode(self.sink); self } /// Encode [`Instruction::Else`]. pub fn else_(&mut self) -> &mut Self { self.sink.push(0x05); self } /// Encode [`Instruction::End`]. pub fn end(&mut self) -> &mut Self { self.sink.push(0x0B); self } /// Encode [`Instruction::Br`]. pub fn br(&mut self, l: u32) -> &mut Self { self.sink.push(0x0C); l.encode(self.sink); self } /// Encode [`Instruction::BrIf`]. pub fn br_if(&mut self, l: u32) -> &mut Self { self.sink.push(0x0D); l.encode(self.sink); self } /// Encode [`Instruction::BrTable`]. pub fn br_table>(&mut self, ls: V, l: u32) -> &mut Self where V::IntoIter: ExactSizeIterator, { self.sink.push(0x0E); encode_vec(ls, self.sink); l.encode(self.sink); self } /// Encode [`Instruction::BrOnNull`]. pub fn br_on_null(&mut self, l: u32) -> &mut Self { self.sink.push(0xD5); l.encode(self.sink); self } /// Encode [`Instruction::BrOnNonNull`]. pub fn br_on_non_null(&mut self, l: u32) -> &mut Self { self.sink.push(0xD6); l.encode(self.sink); self } /// Encode [`Instruction::Return`]. pub fn return_(&mut self) -> &mut Self { self.sink.push(0x0F); self } /// Encode [`Instruction::Call`]. pub fn call(&mut self, f: u32) -> &mut Self { self.sink.push(0x10); f.encode(self.sink); self } /// Encode [`Instruction::CallRef`]. pub fn call_ref(&mut self, ty: u32) -> &mut Self { self.sink.push(0x14); ty.encode(self.sink); self } /// Encode [`Instruction::CallIndirect`]. pub fn call_indirect(&mut self, table_index: u32, type_index: u32) -> &mut Self { self.sink.push(0x11); type_index.encode(self.sink); table_index.encode(self.sink); self } /// Encode [`Instruction::ReturnCallRef`]. pub fn return_call_ref(&mut self, ty: u32) -> &mut Self { self.sink.push(0x15); ty.encode(self.sink); self } /// Encode [`Instruction::ReturnCall`]. pub fn return_call(&mut self, f: u32) -> &mut Self { self.sink.push(0x12); f.encode(self.sink); self } /// Encode [`Instruction::ReturnCallIndirect`]. pub fn return_call_indirect(&mut self, table_index: u32, type_index: u32) -> &mut Self { self.sink.push(0x13); type_index.encode(self.sink); table_index.encode(self.sink); self } /// Encode [`Instruction::TryTable`]. pub fn try_table>( &mut self, ty: BlockType, catches: V, ) -> &mut Self where V::IntoIter: ExactSizeIterator, { self.sink.push(0x1f); ty.encode(self.sink); encode_vec(catches, self.sink); self } /// Encode [`Instruction::Throw`]. pub fn throw(&mut self, t: u32) -> &mut Self { self.sink.push(0x08); t.encode(self.sink); self } /// Encode [`Instruction::ThrowRef`]. pub fn throw_ref(&mut self) -> &mut Self { self.sink.push(0x0A); self } // Deprecated exception-handling instructions /// Encode [`Instruction::Try`]. pub fn try_(&mut self, bt: BlockType) -> &mut Self { self.sink.push(0x06); bt.encode(self.sink); self } /// Encode [`Instruction::Delegate`]. pub fn delegate(&mut self, l: u32) -> &mut Self { self.sink.push(0x18); l.encode(self.sink); self } /// Encode [`Instruction::Catch`]. pub fn catch(&mut self, t: u32) -> &mut Self { self.sink.push(0x07); t.encode(self.sink); self } /// Encode [`Instruction::CatchAll`]. pub fn catch_all(&mut self) -> &mut Self { self.sink.push(0x19); self } /// Encode [`Instruction::Rethrow`]. pub fn rethrow(&mut self, l: u32) -> &mut Self { self.sink.push(0x09); l.encode(self.sink); self } // Parametric instructions. /// Encode [`Instruction::Drop`]. pub fn drop(&mut self) -> &mut Self { self.sink.push(0x1A); self } /// Encode [`Instruction::Select`]. pub fn select(&mut self) -> &mut Self { self.sink.push(0x1B); self } // Variable instructions. /// Encode [`Instruction::LocalGet`]. pub fn local_get(&mut self, l: u32) -> &mut Self { self.sink.push(0x20); l.encode(self.sink); self } /// Encode [`Instruction::LocalSet`]. pub fn local_set(&mut self, l: u32) -> &mut Self { self.sink.push(0x21); l.encode(self.sink); self } /// Encode [`Instruction::LocalTee`]. pub fn local_tee(&mut self, l: u32) -> &mut Self { self.sink.push(0x22); l.encode(self.sink); self } /// Encode [`Instruction::GlobalGet`]. pub fn global_get(&mut self, g: u32) -> &mut Self { self.sink.push(0x23); g.encode(self.sink); self } /// Encode [`Instruction::GlobalSet`]. pub fn global_set(&mut self, g: u32) -> &mut Self { self.sink.push(0x24); g.encode(self.sink); self } // Memory instructions. /// Encode [`Instruction::I32Load`]. pub fn i32_load(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x28); m.encode(self.sink); self } /// Encode [`Instruction::I64Load`]. pub fn i64_load(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x29); m.encode(self.sink); self } /// Encode [`Instruction::F32Load`]. pub fn f32_load(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x2A); m.encode(self.sink); self } /// Encode [`Instruction::F64Load`]. pub fn f64_load(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x2B); m.encode(self.sink); self } /// Encode [`Instruction::I32Load8S`]. pub fn i32_load8_s(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x2C); m.encode(self.sink); self } /// Encode [`Instruction::I32Load8U`]. pub fn i32_load8_u(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x2D); m.encode(self.sink); self } /// Encode [`Instruction::I32Load16S`]. pub fn i32_load16_s(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x2E); m.encode(self.sink); self } /// Encode [`Instruction::I32Load16U`]. pub fn i32_load16_u(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x2F); m.encode(self.sink); self } /// Encode [`Instruction::I64Load8S`]. pub fn i64_load8_s(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x30); m.encode(self.sink); self } /// Encode [`Instruction::I64Load8U`]. pub fn i64_load8_u(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x31); m.encode(self.sink); self } /// Encode [`Instruction::I64Load16S`]. pub fn i64_load16_s(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x32); m.encode(self.sink); self } /// Encode [`Instruction::I64Load16U`]. pub fn i64_load16_u(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x33); m.encode(self.sink); self } /// Encode [`Instruction::I64Load32S`]. pub fn i64_load32_s(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x34); m.encode(self.sink); self } /// Encode [`Instruction::I64Load32U`]. pub fn i64_load32_u(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x35); m.encode(self.sink); self } /// Encode [`Instruction::I32Store`]. pub fn i32_store(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x36); m.encode(self.sink); self } /// Encode [`Instruction::I64Store`]. pub fn i64_store(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x37); m.encode(self.sink); self } /// Encode [`Instruction::F32Store`]. pub fn f32_store(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x38); m.encode(self.sink); self } /// Encode [`Instruction::F64Store`]. pub fn f64_store(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x39); m.encode(self.sink); self } /// Encode [`Instruction::I32Store8`]. pub fn i32_store8(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x3A); m.encode(self.sink); self } /// Encode [`Instruction::I32Store16`]. pub fn i32_store16(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x3B); m.encode(self.sink); self } /// Encode [`Instruction::I64Store8`]. pub fn i64_store8(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x3C); m.encode(self.sink); self } /// Encode [`Instruction::I64Store16`]. pub fn i64_store16(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x3D); m.encode(self.sink); self } /// Encode [`Instruction::I64Store32`]. pub fn i64_store32(&mut self, m: MemArg) -> &mut Self { self.sink.push(0x3E); m.encode(self.sink); self } /// Encode [`Instruction::MemorySize`]. pub fn memory_size(&mut self, i: u32) -> &mut Self { self.sink.push(0x3F); i.encode(self.sink); self } /// Encode [`Instruction::MemoryGrow`]. pub fn memory_grow(&mut self, i: u32) -> &mut Self { self.sink.push(0x40); i.encode(self.sink); self } /// Encode [`Instruction::MemoryInit`]. pub fn memory_init(&mut self, mem: u32, data_index: u32) -> &mut Self { self.sink.push(0xfc); self.sink.push(0x08); data_index.encode(self.sink); mem.encode(self.sink); self } /// Encode [`Instruction::DataDrop`]. pub fn data_drop(&mut self, data: u32) -> &mut Self { self.sink.push(0xfc); self.sink.push(0x09); data.encode(self.sink); self } /// Encode [`Instruction::MemoryCopy`]. pub fn memory_copy(&mut self, dst_mem: u32, src_mem: u32) -> &mut Self { self.sink.push(0xfc); self.sink.push(0x0a); dst_mem.encode(self.sink); src_mem.encode(self.sink); self } /// Encode [`Instruction::MemoryFill`]. pub fn memory_fill(&mut self, mem: u32) -> &mut Self { self.sink.push(0xfc); self.sink.push(0x0b); mem.encode(self.sink); self } /// Encode [`Instruction::MemoryDiscard`]. pub fn memory_discard(&mut self, mem: u32) -> &mut Self { self.sink.push(0xfc); self.sink.push(0x12); mem.encode(self.sink); self } // Numeric instructions. /// Encode [`Instruction::I32Const`]. pub fn i32_const(&mut self, x: i32) -> &mut Self { self.sink.push(0x41); x.encode(self.sink); self } /// Encode [`Instruction::I64Const`]. pub fn i64_const(&mut self, x: i64) -> &mut Self { self.sink.push(0x42); x.encode(self.sink); self } /// Encode [`Instruction::F32Const`]. pub fn f32_const(&mut self, x: Ieee32) -> &mut Self { self.sink.push(0x43); let x = x.bits(); self.sink.extend(x.to_le_bytes().iter().copied()); self } /// Encode [`Instruction::F64Const`]. pub fn f64_const(&mut self, x: Ieee64) -> &mut Self { self.sink.push(0x44); let x = x.bits(); self.sink.extend(x.to_le_bytes().iter().copied()); self } /// Encode [`Instruction::I32Eqz`]. pub fn i32_eqz(&mut self) -> &mut Self { self.sink.push(0x45); self } /// Encode [`Instruction::I32Eq`]. pub fn i32_eq(&mut self) -> &mut Self { self.sink.push(0x46); self } /// Encode [`Instruction::I32Ne`]. pub fn i32_ne(&mut self) -> &mut Self { self.sink.push(0x47); self } /// Encode [`Instruction::I32LtS`]. pub fn i32_lt_s(&mut self) -> &mut Self { self.sink.push(0x48); self } /// Encode [`Instruction::I32LtU`]. pub fn i32_lt_u(&mut self) -> &mut Self { self.sink.push(0x49); self } /// Encode [`Instruction::I32GtS`]. pub fn i32_gt_s(&mut self) -> &mut Self { self.sink.push(0x4A); self } /// Encode [`Instruction::I32GtU`]. pub fn i32_gt_u(&mut self) -> &mut Self { self.sink.push(0x4B); self } /// Encode [`Instruction::I32LeS`]. pub fn i32_le_s(&mut self) -> &mut Self { self.sink.push(0x4C); self } /// Encode [`Instruction::I32LeU`]. pub fn i32_le_u(&mut self) -> &mut Self { self.sink.push(0x4D); self } /// Encode [`Instruction::I32GeS`]. pub fn i32_ge_s(&mut self) -> &mut Self { self.sink.push(0x4E); self } /// Encode [`Instruction::I32GeU`]. pub fn i32_ge_u(&mut self) -> &mut Self { self.sink.push(0x4F); self } /// Encode [`Instruction::I64Eqz`]. pub fn i64_eqz(&mut self) -> &mut Self { self.sink.push(0x50); self } /// Encode [`Instruction::I64Eq`]. pub fn i64_eq(&mut self) -> &mut Self { self.sink.push(0x51); self } /// Encode [`Instruction::I64Ne`]. pub fn i64_ne(&mut self) -> &mut Self { self.sink.push(0x52); self } /// Encode [`Instruction::I64LtS`]. pub fn i64_lt_s(&mut self) -> &mut Self { self.sink.push(0x53); self } /// Encode [`Instruction::I64LtU`]. pub fn i64_lt_u(&mut self) -> &mut Self { self.sink.push(0x54); self } /// Encode [`Instruction::I64GtS`]. pub fn i64_gt_s(&mut self) -> &mut Self { self.sink.push(0x55); self } /// Encode [`Instruction::I64GtU`]. pub fn i64_gt_u(&mut self) -> &mut Self { self.sink.push(0x56); self } /// Encode [`Instruction::I64LeS`]. pub fn i64_le_s(&mut self) -> &mut Self { self.sink.push(0x57); self } /// Encode [`Instruction::I64LeU`]. pub fn i64_le_u(&mut self) -> &mut Self { self.sink.push(0x58); self } /// Encode [`Instruction::I64GeS`]. pub fn i64_ge_s(&mut self) -> &mut Self { self.sink.push(0x59); self } /// Encode [`Instruction::I64GeU`]. pub fn i64_ge_u(&mut self) -> &mut Self { self.sink.push(0x5A); self } /// Encode [`Instruction::F32Eq`]. pub fn f32_eq(&mut self) -> &mut Self { self.sink.push(0x5B); self } /// Encode [`Instruction::F32Ne`]. pub fn f32_ne(&mut self) -> &mut Self { self.sink.push(0x5C); self } /// Encode [`Instruction::F32Lt`]. pub fn f32_lt(&mut self) -> &mut Self { self.sink.push(0x5D); self } /// Encode [`Instruction::F32Gt`]. pub fn f32_gt(&mut self) -> &mut Self { self.sink.push(0x5E); self } /// Encode [`Instruction::F32Le`]. pub fn f32_le(&mut self) -> &mut Self { self.sink.push(0x5F); self } /// Encode [`Instruction::F32Ge`]. pub fn f32_ge(&mut self) -> &mut Self { self.sink.push(0x60); self } /// Encode [`Instruction::F64Eq`]. pub fn f64_eq(&mut self) -> &mut Self { self.sink.push(0x61); self } /// Encode [`Instruction::F64Ne`]. pub fn f64_ne(&mut self) -> &mut Self { self.sink.push(0x62); self } /// Encode [`Instruction::F64Lt`]. pub fn f64_lt(&mut self) -> &mut Self { self.sink.push(0x63); self } /// Encode [`Instruction::F64Gt`]. pub fn f64_gt(&mut self) -> &mut Self { self.sink.push(0x64); self } /// Encode [`Instruction::F64Le`]. pub fn f64_le(&mut self) -> &mut Self { self.sink.push(0x65); self } /// Encode [`Instruction::F64Ge`]. pub fn f64_ge(&mut self) -> &mut Self { self.sink.push(0x66); self } /// Encode [`Instruction::I32Clz`]. pub fn i32_clz(&mut self) -> &mut Self { self.sink.push(0x67); self } /// Encode [`Instruction::I32Ctz`]. pub fn i32_ctz(&mut self) -> &mut Self { self.sink.push(0x68); self } /// Encode [`Instruction::I32Popcnt`]. pub fn i32_popcnt(&mut self) -> &mut Self { self.sink.push(0x69); self } /// Encode [`Instruction::I32Add`]. pub fn i32_add(&mut self) -> &mut Self { self.sink.push(0x6A); self } /// Encode [`Instruction::I32Sub`]. pub fn i32_sub(&mut self) -> &mut Self { self.sink.push(0x6B); self } /// Encode [`Instruction::I32Mul`]. pub fn i32_mul(&mut self) -> &mut Self { self.sink.push(0x6C); self } /// Encode [`Instruction::I32DivS`]. pub fn i32_div_s(&mut self) -> &mut Self { self.sink.push(0x6D); self } /// Encode [`Instruction::I32DivU`]. pub fn i32_div_u(&mut self) -> &mut Self { self.sink.push(0x6E); self } /// Encode [`Instruction::I32RemS`]. pub fn i32_rem_s(&mut self) -> &mut Self { self.sink.push(0x6F); self } /// Encode [`Instruction::I32RemU`]. pub fn i32_rem_u(&mut self) -> &mut Self { self.sink.push(0x70); self } /// Encode [`Instruction::I32And`]. pub fn i32_and(&mut self) -> &mut Self { self.sink.push(0x71); self } /// Encode [`Instruction::I32Or`]. pub fn i32_or(&mut self) -> &mut Self { self.sink.push(0x72); self } /// Encode [`Instruction::I32Xor`]. pub fn i32_xor(&mut self) -> &mut Self { self.sink.push(0x73); self } /// Encode [`Instruction::I32Shl`]. pub fn i32_shl(&mut self) -> &mut Self { self.sink.push(0x74); self } /// Encode [`Instruction::I32ShrS`]. pub fn i32_shr_s(&mut self) -> &mut Self { self.sink.push(0x75); self } /// Encode [`Instruction::I32ShrU`]. pub fn i32_shr_u(&mut self) -> &mut Self { self.sink.push(0x76); self } /// Encode [`Instruction::I32Rotl`]. pub fn i32_rotl(&mut self) -> &mut Self { self.sink.push(0x77); self } /// Encode [`Instruction::I32Rotr`]. pub fn i32_rotr(&mut self) -> &mut Self { self.sink.push(0x78); self } /// Encode [`Instruction::I64Clz`]. pub fn i64_clz(&mut self) -> &mut Self { self.sink.push(0x79); self } /// Encode [`Instruction::I64Ctz`]. pub fn i64_ctz(&mut self) -> &mut Self { self.sink.push(0x7A); self } /// Encode [`Instruction::I64Popcnt`]. pub fn i64_popcnt(&mut self) -> &mut Self { self.sink.push(0x7B); self } /// Encode [`Instruction::I64Add`]. pub fn i64_add(&mut self) -> &mut Self { self.sink.push(0x7C); self } /// Encode [`Instruction::I64Sub`]. pub fn i64_sub(&mut self) -> &mut Self { self.sink.push(0x7D); self } /// Encode [`Instruction::I64Mul`]. pub fn i64_mul(&mut self) -> &mut Self { self.sink.push(0x7E); self } /// Encode [`Instruction::I64DivS`]. pub fn i64_div_s(&mut self) -> &mut Self { self.sink.push(0x7F); self } /// Encode [`Instruction::I64DivU`]. pub fn i64_div_u(&mut self) -> &mut Self { self.sink.push(0x80); self } /// Encode [`Instruction::I64RemS`]. pub fn i64_rem_s(&mut self) -> &mut Self { self.sink.push(0x81); self } /// Encode [`Instruction::I64RemU`]. pub fn i64_rem_u(&mut self) -> &mut Self { self.sink.push(0x82); self } /// Encode [`Instruction::I64And`]. pub fn i64_and(&mut self) -> &mut Self { self.sink.push(0x83); self } /// Encode [`Instruction::I64Or`]. pub fn i64_or(&mut self) -> &mut Self { self.sink.push(0x84); self } /// Encode [`Instruction::I64Xor`]. pub fn i64_xor(&mut self) -> &mut Self { self.sink.push(0x85); self } /// Encode [`Instruction::I64Shl`]. pub fn i64_shl(&mut self) -> &mut Self { self.sink.push(0x86); self } /// Encode [`Instruction::I64ShrS`]. pub fn i64_shr_s(&mut self) -> &mut Self { self.sink.push(0x87); self } /// Encode [`Instruction::I64ShrU`]. pub fn i64_shr_u(&mut self) -> &mut Self { self.sink.push(0x88); self } /// Encode [`Instruction::I64Rotl`]. pub fn i64_rotl(&mut self) -> &mut Self { self.sink.push(0x89); self } /// Encode [`Instruction::I64Rotr`]. pub fn i64_rotr(&mut self) -> &mut Self { self.sink.push(0x8A); self } /// Encode [`Instruction::F32Abs`]. pub fn f32_abs(&mut self) -> &mut Self { self.sink.push(0x8B); self } /// Encode [`Instruction::F32Neg`]. pub fn f32_neg(&mut self) -> &mut Self { self.sink.push(0x8C); self } /// Encode [`Instruction::F32Ceil`]. pub fn f32_ceil(&mut self) -> &mut Self { self.sink.push(0x8D); self } /// Encode [`Instruction::F32Floor`]. pub fn f32_floor(&mut self) -> &mut Self { self.sink.push(0x8E); self } /// Encode [`Instruction::F32Trunc`]. pub fn f32_trunc(&mut self) -> &mut Self { self.sink.push(0x8F); self } /// Encode [`Instruction::F32Nearest`]. pub fn f32_nearest(&mut self) -> &mut Self { self.sink.push(0x90); self } /// Encode [`Instruction::F32Sqrt`]. pub fn f32_sqrt(&mut self) -> &mut Self { self.sink.push(0x91); self } /// Encode [`Instruction::F32Add`]. pub fn f32_add(&mut self) -> &mut Self { self.sink.push(0x92); self } /// Encode [`Instruction::F32Sub`]. pub fn f32_sub(&mut self) -> &mut Self { self.sink.push(0x93); self } /// Encode [`Instruction::F32Mul`]. pub fn f32_mul(&mut self) -> &mut Self { self.sink.push(0x94); self } /// Encode [`Instruction::F32Div`]. pub fn f32_div(&mut self) -> &mut Self { self.sink.push(0x95); self } /// Encode [`Instruction::F32Min`]. pub fn f32_min(&mut self) -> &mut Self { self.sink.push(0x96); self } /// Encode [`Instruction::F32Max`]. pub fn f32_max(&mut self) -> &mut Self { self.sink.push(0x97); self } /// Encode [`Instruction::F32Copysign`]. pub fn f32_copysign(&mut self) -> &mut Self { self.sink.push(0x98); self } /// Encode [`Instruction::F64Abs`]. pub fn f64_abs(&mut self) -> &mut Self { self.sink.push(0x99); self } /// Encode [`Instruction::F64Neg`]. pub fn f64_neg(&mut self) -> &mut Self { self.sink.push(0x9A); self } /// Encode [`Instruction::F64Ceil`]. pub fn f64_ceil(&mut self) -> &mut Self { self.sink.push(0x9B); self } /// Encode [`Instruction::F64Floor`]. pub fn f64_floor(&mut self) -> &mut Self { self.sink.push(0x9C); self } /// Encode [`Instruction::F64Trunc`]. pub fn f64_trunc(&mut self) -> &mut Self { self.sink.push(0x9D); self } /// Encode [`Instruction::F64Nearest`]. pub fn f64_nearest(&mut self) -> &mut Self { self.sink.push(0x9E); self } /// Encode [`Instruction::F64Sqrt`]. pub fn f64_sqrt(&mut self) -> &mut Self { self.sink.push(0x9F); self } /// Encode [`Instruction::F64Add`]. pub fn f64_add(&mut self) -> &mut Self { self.sink.push(0xA0); self } /// Encode [`Instruction::F64Sub`]. pub fn f64_sub(&mut self) -> &mut Self { self.sink.push(0xA1); self } /// Encode [`Instruction::F64Mul`]. pub fn f64_mul(&mut self) -> &mut Self { self.sink.push(0xA2); self } /// Encode [`Instruction::F64Div`]. pub fn f64_div(&mut self) -> &mut Self { self.sink.push(0xA3); self } /// Encode [`Instruction::F64Min`]. pub fn f64_min(&mut self) -> &mut Self { self.sink.push(0xA4); self } /// Encode [`Instruction::F64Max`]. pub fn f64_max(&mut self) -> &mut Self { self.sink.push(0xA5); self } /// Encode [`Instruction::F64Copysign`]. pub fn f64_copysign(&mut self) -> &mut Self { self.sink.push(0xA6); self } /// Encode [`Instruction::I32WrapI64`]. pub fn i32_wrap_i64(&mut self) -> &mut Self { self.sink.push(0xA7); self } /// Encode [`Instruction::I32TruncF32S`]. pub fn i32_trunc_f32_s(&mut self) -> &mut Self { self.sink.push(0xA8); self } /// Encode [`Instruction::I32TruncF32U`]. pub fn i32_trunc_f32_u(&mut self) -> &mut Self { self.sink.push(0xA9); self } /// Encode [`Instruction::I32TruncF64S`]. pub fn i32_trunc_f64_s(&mut self) -> &mut Self { self.sink.push(0xAA); self } /// Encode [`Instruction::I32TruncF64U`]. pub fn i32_trunc_f64_u(&mut self) -> &mut Self { self.sink.push(0xAB); self } /// Encode [`Instruction::I64ExtendI32S`]. pub fn i64_extend_i32_s(&mut self) -> &mut Self { self.sink.push(0xAC); self } /// Encode [`Instruction::I64ExtendI32U`]. pub fn i64_extend_i32_u(&mut self) -> &mut Self { self.sink.push(0xAD); self } /// Encode [`Instruction::I64TruncF32S`]. pub fn i64_trunc_f32_s(&mut self) -> &mut Self { self.sink.push(0xAE); self } /// Encode [`Instruction::I64TruncF32U`]. pub fn i64_trunc_f32_u(&mut self) -> &mut Self { self.sink.push(0xAF); self } /// Encode [`Instruction::I64TruncF64S`]. pub fn i64_trunc_f64_s(&mut self) -> &mut Self { self.sink.push(0xB0); self } /// Encode [`Instruction::I64TruncF64U`]. pub fn i64_trunc_f64_u(&mut self) -> &mut Self { self.sink.push(0xB1); self } /// Encode [`Instruction::F32ConvertI32S`]. pub fn f32_convert_i32_s(&mut self) -> &mut Self { self.sink.push(0xB2); self } /// Encode [`Instruction::F32ConvertI32U`]. pub fn f32_convert_i32_u(&mut self) -> &mut Self { self.sink.push(0xB3); self } /// Encode [`Instruction::F32ConvertI64S`]. pub fn f32_convert_i64_s(&mut self) -> &mut Self { self.sink.push(0xB4); self } /// Encode [`Instruction::F32ConvertI64U`]. pub fn f32_convert_i64_u(&mut self) -> &mut Self { self.sink.push(0xB5); self } /// Encode [`Instruction::F32DemoteF64`]. pub fn f32_demote_f64(&mut self) -> &mut Self { self.sink.push(0xB6); self } /// Encode [`Instruction::F64ConvertI32S`]. pub fn f64_convert_i32_s(&mut self) -> &mut Self { self.sink.push(0xB7); self } /// Encode [`Instruction::F64ConvertI32U`]. pub fn f64_convert_i32_u(&mut self) -> &mut Self { self.sink.push(0xB8); self } /// Encode [`Instruction::F64ConvertI64S`]. pub fn f64_convert_i64_s(&mut self) -> &mut Self { self.sink.push(0xB9); self } /// Encode [`Instruction::F64ConvertI64U`]. pub fn f64_convert_i64_u(&mut self) -> &mut Self { self.sink.push(0xBA); self } /// Encode [`Instruction::F64PromoteF32`]. pub fn f64_promote_f32(&mut self) -> &mut Self { self.sink.push(0xBB); self } /// Encode [`Instruction::I32ReinterpretF32`]. pub fn i32_reinterpret_f32(&mut self) -> &mut Self { self.sink.push(0xBC); self } /// Encode [`Instruction::I64ReinterpretF64`]. pub fn i64_reinterpret_f64(&mut self) -> &mut Self { self.sink.push(0xBD); self } /// Encode [`Instruction::F32ReinterpretI32`]. pub fn f32_reinterpret_i32(&mut self) -> &mut Self { self.sink.push(0xBE); self } /// Encode [`Instruction::F64ReinterpretI64`]. pub fn f64_reinterpret_i64(&mut self) -> &mut Self { self.sink.push(0xBF); self } /// Encode [`Instruction::I32Extend8S`]. pub fn i32_extend8_s(&mut self) -> &mut Self { self.sink.push(0xC0); self } /// Encode [`Instruction::I32Extend16S`]. pub fn i32_extend16_s(&mut self) -> &mut Self { self.sink.push(0xC1); self } /// Encode [`Instruction::I64Extend8S`]. pub fn i64_extend8_s(&mut self) -> &mut Self { self.sink.push(0xC2); self } /// Encode [`Instruction::I64Extend16S`]. pub fn i64_extend16_s(&mut self) -> &mut Self { self.sink.push(0xC3); self } /// Encode [`Instruction::I64Extend32S`]. pub fn i64_extend32_s(&mut self) -> &mut Self { self.sink.push(0xC4); self } /// Encode [`Instruction::I32TruncSatF32S`]. pub fn i32_trunc_sat_f32_s(&mut self) -> &mut Self { self.sink.push(0xFC); self.sink.push(0x00); self } /// Encode [`Instruction::I32TruncSatF32U`]. pub fn i32_trunc_sat_f32_u(&mut self) -> &mut Self { self.sink.push(0xFC); self.sink.push(0x01); self } /// Encode [`Instruction::I32TruncSatF64S`]. pub fn i32_trunc_sat_f64_s(&mut self) -> &mut Self { self.sink.push(0xFC); self.sink.push(0x02); self } /// Encode [`Instruction::I32TruncSatF64U`]. pub fn i32_trunc_sat_f64_u(&mut self) -> &mut Self { self.sink.push(0xFC); self.sink.push(0x03); self } /// Encode [`Instruction::I64TruncSatF32S`]. pub fn i64_trunc_sat_f32_s(&mut self) -> &mut Self { self.sink.push(0xFC); self.sink.push(0x04); self } /// Encode [`Instruction::I64TruncSatF32U`]. pub fn i64_trunc_sat_f32_u(&mut self) -> &mut Self { self.sink.push(0xFC); self.sink.push(0x05); self } /// Encode [`Instruction::I64TruncSatF64S`]. pub fn i64_trunc_sat_f64_s(&mut self) -> &mut Self { self.sink.push(0xFC); self.sink.push(0x06); self } /// Encode [`Instruction::I64TruncSatF64U`]. pub fn i64_trunc_sat_f64_u(&mut self) -> &mut Self { self.sink.push(0xFC); self.sink.push(0x07); self } // Reference types instructions. /// Encode [`Instruction::TypedSelect`]. pub fn typed_select(&mut self, ty: ValType) -> &mut Self { self.sink.push(0x1c); [ty].encode(self.sink); self } /// Encode [`Instruction::TypedSelect`] with multiple results (currently invalid). pub fn typed_select_multi(&mut self, tys: &[ValType]) -> &mut Self { self.sink.push(0x1c); tys.encode(self.sink); self } /// Encode [`Instruction::RefNull`]. pub fn ref_null(&mut self, ty: HeapType) -> &mut Self { self.sink.push(0xd0); ty.encode(self.sink); self } /// Encode [`Instruction::RefIsNull`]. pub fn ref_is_null(&mut self) -> &mut Self { self.sink.push(0xd1); self } /// Encode [`Instruction::RefFunc`]. pub fn ref_func(&mut self, f: u32) -> &mut Self { self.sink.push(0xd2); f.encode(self.sink); self } /// Encode [`Instruction::RefEq`]. pub fn ref_eq(&mut self) -> &mut Self { self.sink.push(0xd3); self } /// Encode [`Instruction::RefAsNonNull`]. pub fn ref_as_non_null(&mut self) -> &mut Self { self.sink.push(0xd4); self } // GC types instructions. /// Encode [`Instruction::StructNew`]. pub fn struct_new(&mut self, type_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x00); type_index.encode(self.sink); self } /// Encode [`Instruction::StructNewDefault`]. pub fn struct_new_default(&mut self, type_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x01); type_index.encode(self.sink); self } /// Encode [`Instruction::StructGet`]. pub fn struct_get(&mut self, struct_type_index: u32, field_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x02); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructGetS`]. pub fn struct_get_s(&mut self, struct_type_index: u32, field_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x03); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructGetU`]. pub fn struct_get_u(&mut self, struct_type_index: u32, field_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x04); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructSet`]. pub fn struct_set(&mut self, struct_type_index: u32, field_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x05); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructNewDesc`]. pub fn struct_new_desc(&mut self, type_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x20); type_index.encode(self.sink); self } /// Encode [`Instruction::StructNewDefaultDesc`]. pub fn struct_new_default_desc(&mut self, type_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x21); type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayNew`]. pub fn array_new(&mut self, type_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x06); type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayNewDefault`]. pub fn array_new_default(&mut self, type_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x07); type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayNewFixed`]. pub fn array_new_fixed(&mut self, array_type_index: u32, array_size: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x08); array_type_index.encode(self.sink); array_size.encode(self.sink); self } /// Encode [`Instruction::ArrayNewData`]. pub fn array_new_data(&mut self, array_type_index: u32, array_data_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x09); array_type_index.encode(self.sink); array_data_index.encode(self.sink); self } /// Encode [`Instruction::ArrayNewElem`]. pub fn array_new_elem(&mut self, array_type_index: u32, array_elem_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x0a); array_type_index.encode(self.sink); array_elem_index.encode(self.sink); self } /// Encode [`Instruction::ArrayGet`]. pub fn array_get(&mut self, type_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x0b); type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayGetS`]. pub fn array_get_s(&mut self, type_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x0c); type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayGetU`]. pub fn array_get_u(&mut self, type_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x0d); type_index.encode(self.sink); self } /// Encode [`Instruction::ArraySet`]. pub fn array_set(&mut self, type_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x0e); type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayLen`]. pub fn array_len(&mut self) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x0f); self } /// Encode [`Instruction::ArrayFill`]. pub fn array_fill(&mut self, type_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x10); type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayCopy`]. pub fn array_copy( &mut self, array_type_index_dst: u32, array_type_index_src: u32, ) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x11); array_type_index_dst.encode(self.sink); array_type_index_src.encode(self.sink); self } /// Encode [`Instruction::ArrayInitData`]. pub fn array_init_data(&mut self, array_type_index: u32, array_data_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x12); array_type_index.encode(self.sink); array_data_index.encode(self.sink); self } /// Encode [`Instruction::ArrayInitElem`]. pub fn array_init_elem(&mut self, array_type_index: u32, array_elem_index: u32) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x13); array_type_index.encode(self.sink); array_elem_index.encode(self.sink); self } /// Encode [`Instruction::RefTestNonNull`]. pub fn ref_test_non_null(&mut self, heap_type: HeapType) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x14); heap_type.encode(self.sink); self } /// Encode [`Instruction::RefTestNullable`]. pub fn ref_test_nullable(&mut self, heap_type: HeapType) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x15); heap_type.encode(self.sink); self } /// Encode [`Instruction::RefCastNonNull`]. pub fn ref_cast_non_null(&mut self, heap_type: HeapType) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x16); heap_type.encode(self.sink); self } /// Encode [`Instruction::RefCastNullable`]. pub fn ref_cast_nullable(&mut self, heap_type: HeapType) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x17); heap_type.encode(self.sink); self } /// Encode [`Instruction::BrOnCast`]. pub fn br_on_cast( &mut self, relative_depth: u32, from_ref_type: RefType, to_ref_type: RefType, ) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x18); let cast_flags = (from_ref_type.nullable as u8) | ((to_ref_type.nullable as u8) << 1); self.sink.push(cast_flags); relative_depth.encode(self.sink); from_ref_type.heap_type.encode(self.sink); to_ref_type.heap_type.encode(self.sink); self } /// Encode [`Instruction::BrOnCastFail`]. pub fn br_on_cast_fail( &mut self, relative_depth: u32, from_ref_type: RefType, to_ref_type: RefType, ) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x19); let cast_flags = (from_ref_type.nullable as u8) | ((to_ref_type.nullable as u8) << 1); self.sink.push(cast_flags); relative_depth.encode(self.sink); from_ref_type.heap_type.encode(self.sink); to_ref_type.heap_type.encode(self.sink); self } /// Encode [`Instruction::AnyConvertExtern`]. pub fn any_convert_extern(&mut self) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x1a); self } /// Encode [`Instruction::ExternConvertAny`]. pub fn extern_convert_any(&mut self) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x1b); self } /// Encode [`Instruction::RefI31`]. pub fn ref_i31(&mut self) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x1c); self } /// Encode [`Instruction::I31GetS`]. pub fn i31_get_s(&mut self) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x1d); self } /// Encode [`Instruction::I31GetU`]. pub fn i31_get_u(&mut self) -> &mut Self { self.sink.push(0xfb); self.sink.push(0x1e); self } // Bulk memory instructions. /// Encode [`Instruction::TableInit`]. pub fn table_init(&mut self, table: u32, elem_index: u32) -> &mut Self { self.sink.push(0xfc); self.sink.push(0x0c); elem_index.encode(self.sink); table.encode(self.sink); self } /// Encode [`Instruction::ElemDrop`]. pub fn elem_drop(&mut self, segment: u32) -> &mut Self { self.sink.push(0xfc); self.sink.push(0x0d); segment.encode(self.sink); self } /// Encode [`Instruction::TableFill`]. pub fn table_fill(&mut self, table: u32) -> &mut Self { self.sink.push(0xfc); self.sink.push(0x11); table.encode(self.sink); self } /// Encode [`Instruction::TableSet`]. pub fn table_set(&mut self, table: u32) -> &mut Self { self.sink.push(0x26); table.encode(self.sink); self } /// Encode [`Instruction::TableGet`]. pub fn table_get(&mut self, table: u32) -> &mut Self { self.sink.push(0x25); table.encode(self.sink); self } /// Encode [`Instruction::TableGrow`]. pub fn table_grow(&mut self, table: u32) -> &mut Self { self.sink.push(0xfc); self.sink.push(0x0f); table.encode(self.sink); self } /// Encode [`Instruction::TableSize`]. pub fn table_size(&mut self, table: u32) -> &mut Self { self.sink.push(0xfc); self.sink.push(0x10); table.encode(self.sink); self } /// Encode [`Instruction::TableCopy`]. pub fn table_copy(&mut self, dst_table: u32, src_table: u32) -> &mut Self { self.sink.push(0xfc); self.sink.push(0x0e); dst_table.encode(self.sink); src_table.encode(self.sink); self } // SIMD instructions. /// Encode [`Instruction::V128Load`]. pub fn v128_load(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x00u32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Load8x8S`]. pub fn v128_load8x8_s(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x01u32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Load8x8U`]. pub fn v128_load8x8_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x02u32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Load16x4S`]. pub fn v128_load16x4_s(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x03u32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Load16x4U`]. pub fn v128_load16x4_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x04u32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Load32x2S`]. pub fn v128_load32x2_s(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x05u32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Load32x2U`]. pub fn v128_load32x2_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x06u32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Load8Splat`]. pub fn v128_load8_splat(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x07u32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Load16Splat`]. pub fn v128_load16_splat(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x08u32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Load32Splat`]. pub fn v128_load32_splat(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x09u32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Load64Splat`]. pub fn v128_load64_splat(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x0Au32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Load32Zero`]. pub fn v128_load32_zero(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x5Cu32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Load64Zero`]. pub fn v128_load64_zero(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x5Du32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Store`]. pub fn v128_store(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFD); 0x0Bu32.encode(self.sink); memarg.encode(self.sink); self } /// Encode [`Instruction::V128Load8Lane`]. pub fn v128_load8_lane(&mut self, memarg: MemArg, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x54u32.encode(self.sink); memarg.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::V128Load16Lane`]. pub fn v128_load16_lane(&mut self, memarg: MemArg, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x55u32.encode(self.sink); memarg.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::V128Load32Lane`]. pub fn v128_load32_lane(&mut self, memarg: MemArg, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x56u32.encode(self.sink); memarg.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::V128Load64Lane`]. pub fn v128_load64_lane(&mut self, memarg: MemArg, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x57u32.encode(self.sink); memarg.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::V128Store8Lane`]. pub fn v128_store8_lane(&mut self, memarg: MemArg, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x58u32.encode(self.sink); memarg.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::V128Store16Lane`]. pub fn v128_store16_lane(&mut self, memarg: MemArg, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x59u32.encode(self.sink); memarg.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::V128Store32Lane`]. pub fn v128_store32_lane(&mut self, memarg: MemArg, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x5Au32.encode(self.sink); memarg.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::V128Store64Lane`]. pub fn v128_store64_lane(&mut self, memarg: MemArg, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x5Bu32.encode(self.sink); memarg.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::V128Const`]. pub fn v128_const(&mut self, x: i128) -> &mut Self { self.sink.push(0xFD); 0x0Cu32.encode(self.sink); self.sink.extend(x.to_le_bytes().iter().copied()); self } /// Encode [`Instruction::I8x16Shuffle`]. pub fn i8x16_shuffle(&mut self, lanes: [Lane; 16]) -> &mut Self { self.sink.push(0xFD); 0x0Du32.encode(self.sink); self.sink.extend(lanes.iter().copied()); self } /// Encode [`Instruction::I8x16ExtractLaneS`]. pub fn i8x16_extract_lane_s(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x15u32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::I8x16ExtractLaneU`]. pub fn i8x16_extract_lane_u(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x16u32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::I8x16ReplaceLane`]. pub fn i8x16_replace_lane(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x17u32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::I16x8ExtractLaneS`]. pub fn i16x8_extract_lane_s(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x18u32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::I16x8ExtractLaneU`]. pub fn i16x8_extract_lane_u(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x19u32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::I16x8ReplaceLane`]. pub fn i16x8_replace_lane(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x1Au32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::I32x4ExtractLane`]. pub fn i32x4_extract_lane(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x1Bu32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::I32x4ReplaceLane`]. pub fn i32x4_replace_lane(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x1Cu32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::I64x2ExtractLane`]. pub fn i64x2_extract_lane(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x1Du32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::I64x2ReplaceLane`]. pub fn i64x2_replace_lane(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x1Eu32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::F32x4ExtractLane`]. pub fn f32x4_extract_lane(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x1Fu32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::F32x4ReplaceLane`]. pub fn f32x4_replace_lane(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x20u32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::F64x2ExtractLane`]. pub fn f64x2_extract_lane(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x21u32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::F64x2ReplaceLane`]. pub fn f64x2_replace_lane(&mut self, lane: Lane) -> &mut Self { self.sink.push(0xFD); 0x22u32.encode(self.sink); self.sink.push(lane); self } /// Encode [`Instruction::I8x16Swizzle`]. pub fn i8x16_swizzle(&mut self) -> &mut Self { self.sink.push(0xFD); 0x0Eu32.encode(self.sink); self } /// Encode [`Instruction::I8x16Splat`]. pub fn i8x16_splat(&mut self) -> &mut Self { self.sink.push(0xFD); 0x0Fu32.encode(self.sink); self } /// Encode [`Instruction::I16x8Splat`]. pub fn i16x8_splat(&mut self) -> &mut Self { self.sink.push(0xFD); 0x10u32.encode(self.sink); self } /// Encode [`Instruction::I32x4Splat`]. pub fn i32x4_splat(&mut self) -> &mut Self { self.sink.push(0xFD); 0x11u32.encode(self.sink); self } /// Encode [`Instruction::I64x2Splat`]. pub fn i64x2_splat(&mut self) -> &mut Self { self.sink.push(0xFD); 0x12u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Splat`]. pub fn f32x4_splat(&mut self) -> &mut Self { self.sink.push(0xFD); 0x13u32.encode(self.sink); self } /// Encode [`Instruction::F64x2Splat`]. pub fn f64x2_splat(&mut self) -> &mut Self { self.sink.push(0xFD); 0x14u32.encode(self.sink); self } /// Encode [`Instruction::I8x16Eq`]. pub fn i8x16_eq(&mut self) -> &mut Self { self.sink.push(0xFD); 0x23u32.encode(self.sink); self } /// Encode [`Instruction::I8x16Ne`]. pub fn i8x16_ne(&mut self) -> &mut Self { self.sink.push(0xFD); 0x24u32.encode(self.sink); self } /// Encode [`Instruction::I8x16LtS`]. pub fn i8x16_lt_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x25u32.encode(self.sink); self } /// Encode [`Instruction::I8x16LtU`]. pub fn i8x16_lt_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x26u32.encode(self.sink); self } /// Encode [`Instruction::I8x16GtS`]. pub fn i8x16_gt_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x27u32.encode(self.sink); self } /// Encode [`Instruction::I8x16GtU`]. pub fn i8x16_gt_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x28u32.encode(self.sink); self } /// Encode [`Instruction::I8x16LeS`]. pub fn i8x16_le_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x29u32.encode(self.sink); self } /// Encode [`Instruction::I8x16LeU`]. pub fn i8x16_le_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x2Au32.encode(self.sink); self } /// Encode [`Instruction::I8x16GeS`]. pub fn i8x16_ge_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x2Bu32.encode(self.sink); self } /// Encode [`Instruction::I8x16GeU`]. pub fn i8x16_ge_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x2Cu32.encode(self.sink); self } /// Encode [`Instruction::I16x8Eq`]. pub fn i16x8_eq(&mut self) -> &mut Self { self.sink.push(0xFD); 0x2Du32.encode(self.sink); self } /// Encode [`Instruction::I16x8Ne`]. pub fn i16x8_ne(&mut self) -> &mut Self { self.sink.push(0xFD); 0x2Eu32.encode(self.sink); self } /// Encode [`Instruction::I16x8LtS`]. pub fn i16x8_lt_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x2Fu32.encode(self.sink); self } /// Encode [`Instruction::I16x8LtU`]. pub fn i16x8_lt_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x30u32.encode(self.sink); self } /// Encode [`Instruction::I16x8GtS`]. pub fn i16x8_gt_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x31u32.encode(self.sink); self } /// Encode [`Instruction::I16x8GtU`]. pub fn i16x8_gt_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x32u32.encode(self.sink); self } /// Encode [`Instruction::I16x8LeS`]. pub fn i16x8_le_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x33u32.encode(self.sink); self } /// Encode [`Instruction::I16x8LeU`]. pub fn i16x8_le_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x34u32.encode(self.sink); self } /// Encode [`Instruction::I16x8GeS`]. pub fn i16x8_ge_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x35u32.encode(self.sink); self } /// Encode [`Instruction::I16x8GeU`]. pub fn i16x8_ge_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x36u32.encode(self.sink); self } /// Encode [`Instruction::I32x4Eq`]. pub fn i32x4_eq(&mut self) -> &mut Self { self.sink.push(0xFD); 0x37u32.encode(self.sink); self } /// Encode [`Instruction::I32x4Ne`]. pub fn i32x4_ne(&mut self) -> &mut Self { self.sink.push(0xFD); 0x38u32.encode(self.sink); self } /// Encode [`Instruction::I32x4LtS`]. pub fn i32x4_lt_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x39u32.encode(self.sink); self } /// Encode [`Instruction::I32x4LtU`]. pub fn i32x4_lt_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x3Au32.encode(self.sink); self } /// Encode [`Instruction::I32x4GtS`]. pub fn i32x4_gt_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x3Bu32.encode(self.sink); self } /// Encode [`Instruction::I32x4GtU`]. pub fn i32x4_gt_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x3Cu32.encode(self.sink); self } /// Encode [`Instruction::I32x4LeS`]. pub fn i32x4_le_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x3Du32.encode(self.sink); self } /// Encode [`Instruction::I32x4LeU`]. pub fn i32x4_le_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x3Eu32.encode(self.sink); self } /// Encode [`Instruction::I32x4GeS`]. pub fn i32x4_ge_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x3Fu32.encode(self.sink); self } /// Encode [`Instruction::I32x4GeU`]. pub fn i32x4_ge_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x40u32.encode(self.sink); self } /// Encode [`Instruction::I64x2Eq`]. pub fn i64x2_eq(&mut self) -> &mut Self { self.sink.push(0xFD); 0xD6u32.encode(self.sink); self } /// Encode [`Instruction::I64x2Ne`]. pub fn i64x2_ne(&mut self) -> &mut Self { self.sink.push(0xFD); 0xD7u32.encode(self.sink); self } /// Encode [`Instruction::I64x2LtS`]. pub fn i64x2_lt_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xD8u32.encode(self.sink); self } /// Encode [`Instruction::I64x2GtS`]. pub fn i64x2_gt_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xD9u32.encode(self.sink); self } /// Encode [`Instruction::I64x2LeS`]. pub fn i64x2_le_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xDAu32.encode(self.sink); self } /// Encode [`Instruction::I64x2GeS`]. pub fn i64x2_ge_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xDBu32.encode(self.sink); self } /// Encode [`Instruction::F32x4Eq`]. pub fn f32x4_eq(&mut self) -> &mut Self { self.sink.push(0xFD); 0x41u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Ne`]. pub fn f32x4_ne(&mut self) -> &mut Self { self.sink.push(0xFD); 0x42u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Lt`]. pub fn f32x4_lt(&mut self) -> &mut Self { self.sink.push(0xFD); 0x43u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Gt`]. pub fn f32x4_gt(&mut self) -> &mut Self { self.sink.push(0xFD); 0x44u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Le`]. pub fn f32x4_le(&mut self) -> &mut Self { self.sink.push(0xFD); 0x45u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Ge`]. pub fn f32x4_ge(&mut self) -> &mut Self { self.sink.push(0xFD); 0x46u32.encode(self.sink); self } /// Encode [`Instruction::F64x2Eq`]. pub fn f64x2_eq(&mut self) -> &mut Self { self.sink.push(0xFD); 0x47u32.encode(self.sink); self } /// Encode [`Instruction::F64x2Ne`]. pub fn f64x2_ne(&mut self) -> &mut Self { self.sink.push(0xFD); 0x48u32.encode(self.sink); self } /// Encode [`Instruction::F64x2Lt`]. pub fn f64x2_lt(&mut self) -> &mut Self { self.sink.push(0xFD); 0x49u32.encode(self.sink); self } /// Encode [`Instruction::F64x2Gt`]. pub fn f64x2_gt(&mut self) -> &mut Self { self.sink.push(0xFD); 0x4Au32.encode(self.sink); self } /// Encode [`Instruction::F64x2Le`]. pub fn f64x2_le(&mut self) -> &mut Self { self.sink.push(0xFD); 0x4Bu32.encode(self.sink); self } /// Encode [`Instruction::F64x2Ge`]. pub fn f64x2_ge(&mut self) -> &mut Self { self.sink.push(0xFD); 0x4Cu32.encode(self.sink); self } /// Encode [`Instruction::V128Not`]. pub fn v128_not(&mut self) -> &mut Self { self.sink.push(0xFD); 0x4Du32.encode(self.sink); self } /// Encode [`Instruction::V128And`]. pub fn v128_and(&mut self) -> &mut Self { self.sink.push(0xFD); 0x4Eu32.encode(self.sink); self } /// Encode [`Instruction::V128AndNot`]. pub fn v128_andnot(&mut self) -> &mut Self { self.sink.push(0xFD); 0x4Fu32.encode(self.sink); self } /// Encode [`Instruction::V128Or`]. pub fn v128_or(&mut self) -> &mut Self { self.sink.push(0xFD); 0x50u32.encode(self.sink); self } /// Encode [`Instruction::V128Xor`]. pub fn v128_xor(&mut self) -> &mut Self { self.sink.push(0xFD); 0x51u32.encode(self.sink); self } /// Encode [`Instruction::V128Bitselect`]. pub fn v128_bitselect(&mut self) -> &mut Self { self.sink.push(0xFD); 0x52u32.encode(self.sink); self } /// Encode [`Instruction::V128AnyTrue`]. pub fn v128_any_true(&mut self) -> &mut Self { self.sink.push(0xFD); 0x53u32.encode(self.sink); self } /// Encode [`Instruction::I8x16Abs`]. pub fn i8x16_abs(&mut self) -> &mut Self { self.sink.push(0xFD); 0x60u32.encode(self.sink); self } /// Encode [`Instruction::I8x16Neg`]. pub fn i8x16_neg(&mut self) -> &mut Self { self.sink.push(0xFD); 0x61u32.encode(self.sink); self } /// Encode [`Instruction::I8x16Popcnt`]. pub fn i8x16_popcnt(&mut self) -> &mut Self { self.sink.push(0xFD); 0x62u32.encode(self.sink); self } /// Encode [`Instruction::I8x16AllTrue`]. pub fn i8x16_all_true(&mut self) -> &mut Self { self.sink.push(0xFD); 0x63u32.encode(self.sink); self } /// Encode [`Instruction::I8x16Bitmask`]. pub fn i8x16_bitmask(&mut self) -> &mut Self { self.sink.push(0xFD); 0x64u32.encode(self.sink); self } /// Encode [`Instruction::I8x16NarrowI16x8S`]. pub fn i8x16_narrow_i16x8_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x65u32.encode(self.sink); self } /// Encode [`Instruction::I8x16NarrowI16x8U`]. pub fn i8x16_narrow_i16x8_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x66u32.encode(self.sink); self } /// Encode [`Instruction::I8x16Shl`]. pub fn i8x16_shl(&mut self) -> &mut Self { self.sink.push(0xFD); 0x6bu32.encode(self.sink); self } /// Encode [`Instruction::I8x16ShrS`]. pub fn i8x16_shr_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x6cu32.encode(self.sink); self } /// Encode [`Instruction::I8x16ShrU`]. pub fn i8x16_shr_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x6du32.encode(self.sink); self } /// Encode [`Instruction::I8x16Add`]. pub fn i8x16_add(&mut self) -> &mut Self { self.sink.push(0xFD); 0x6eu32.encode(self.sink); self } /// Encode [`Instruction::I8x16AddSatS`]. pub fn i8x16_add_sat_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x6fu32.encode(self.sink); self } /// Encode [`Instruction::I8x16AddSatU`]. pub fn i8x16_add_sat_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x70u32.encode(self.sink); self } /// Encode [`Instruction::I8x16Sub`]. pub fn i8x16_sub(&mut self) -> &mut Self { self.sink.push(0xFD); 0x71u32.encode(self.sink); self } /// Encode [`Instruction::I8x16SubSatS`]. pub fn i8x16_sub_sat_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x72u32.encode(self.sink); self } /// Encode [`Instruction::I8x16SubSatU`]. pub fn i8x16_sub_sat_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x73u32.encode(self.sink); self } /// Encode [`Instruction::I8x16MinS`]. pub fn i8x16_min_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x76u32.encode(self.sink); self } /// Encode [`Instruction::I8x16MinU`]. pub fn i8x16_min_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x77u32.encode(self.sink); self } /// Encode [`Instruction::I8x16MaxS`]. pub fn i8x16_max_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x78u32.encode(self.sink); self } /// Encode [`Instruction::I8x16MaxU`]. pub fn i8x16_max_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x79u32.encode(self.sink); self } /// Encode [`Instruction::I8x16AvgrU`]. pub fn i8x16_avgr_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x7Bu32.encode(self.sink); self } /// Encode [`Instruction::I16x8ExtAddPairwiseI8x16S`]. pub fn i16x8_extadd_pairwise_i8x16_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x7Cu32.encode(self.sink); self } /// Encode [`Instruction::I16x8ExtAddPairwiseI8x16U`]. pub fn i16x8_extadd_pairwise_i8x16_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x7Du32.encode(self.sink); self } /// Encode [`Instruction::I16x8Abs`]. pub fn i16x8_abs(&mut self) -> &mut Self { self.sink.push(0xFD); 0x80u32.encode(self.sink); self } /// Encode [`Instruction::I16x8Neg`]. pub fn i16x8_neg(&mut self) -> &mut Self { self.sink.push(0xFD); 0x81u32.encode(self.sink); self } /// Encode [`Instruction::I16x8Q15MulrSatS`]. pub fn i16x8_q15mulr_sat_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x82u32.encode(self.sink); self } /// Encode [`Instruction::I16x8AllTrue`]. pub fn i16x8_all_true(&mut self) -> &mut Self { self.sink.push(0xFD); 0x83u32.encode(self.sink); self } /// Encode [`Instruction::I16x8Bitmask`]. pub fn i16x8_bitmask(&mut self) -> &mut Self { self.sink.push(0xFD); 0x84u32.encode(self.sink); self } /// Encode [`Instruction::I16x8NarrowI32x4S`]. pub fn i16x8_narrow_i32x4_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x85u32.encode(self.sink); self } /// Encode [`Instruction::I16x8NarrowI32x4U`]. pub fn i16x8_narrow_i32x4_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x86u32.encode(self.sink); self } /// Encode [`Instruction::I16x8ExtendLowI8x16S`]. pub fn i16x8_extend_low_i8x16_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x87u32.encode(self.sink); self } /// Encode [`Instruction::I16x8ExtendHighI8x16S`]. pub fn i16x8_extend_high_i8x16_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x88u32.encode(self.sink); self } /// Encode [`Instruction::I16x8ExtendLowI8x16U`]. pub fn i16x8_extend_low_i8x16_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x89u32.encode(self.sink); self } /// Encode [`Instruction::I16x8ExtendHighI8x16U`]. pub fn i16x8_extend_high_i8x16_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x8Au32.encode(self.sink); self } /// Encode [`Instruction::I16x8Shl`]. pub fn i16x8_shl(&mut self) -> &mut Self { self.sink.push(0xFD); 0x8Bu32.encode(self.sink); self } /// Encode [`Instruction::I16x8ShrS`]. pub fn i16x8_shr_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x8Cu32.encode(self.sink); self } /// Encode [`Instruction::I16x8ShrU`]. pub fn i16x8_shr_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x8Du32.encode(self.sink); self } /// Encode [`Instruction::I16x8Add`]. pub fn i16x8_add(&mut self) -> &mut Self { self.sink.push(0xFD); 0x8Eu32.encode(self.sink); self } /// Encode [`Instruction::I16x8AddSatS`]. pub fn i16x8_add_sat_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x8Fu32.encode(self.sink); self } /// Encode [`Instruction::I16x8AddSatU`]. pub fn i16x8_add_sat_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x90u32.encode(self.sink); self } /// Encode [`Instruction::I16x8Sub`]. pub fn i16x8_sub(&mut self) -> &mut Self { self.sink.push(0xFD); 0x91u32.encode(self.sink); self } /// Encode [`Instruction::I16x8SubSatS`]. pub fn i16x8_sub_sat_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x92u32.encode(self.sink); self } /// Encode [`Instruction::I16x8SubSatU`]. pub fn i16x8_sub_sat_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x93u32.encode(self.sink); self } /// Encode [`Instruction::I16x8Mul`]. pub fn i16x8_mul(&mut self) -> &mut Self { self.sink.push(0xFD); 0x95u32.encode(self.sink); self } /// Encode [`Instruction::I16x8MinS`]. pub fn i16x8_min_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x96u32.encode(self.sink); self } /// Encode [`Instruction::I16x8MinU`]. pub fn i16x8_min_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x97u32.encode(self.sink); self } /// Encode [`Instruction::I16x8MaxS`]. pub fn i16x8_max_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x98u32.encode(self.sink); self } /// Encode [`Instruction::I16x8MaxU`]. pub fn i16x8_max_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x99u32.encode(self.sink); self } /// Encode [`Instruction::I16x8AvgrU`]. pub fn i16x8_avgr_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x9Bu32.encode(self.sink); self } /// Encode [`Instruction::I16x8ExtMulLowI8x16S`]. pub fn i16x8_extmul_low_i8x16_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x9Cu32.encode(self.sink); self } /// Encode [`Instruction::I16x8ExtMulHighI8x16S`]. pub fn i16x8_extmul_high_i8x16_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x9Du32.encode(self.sink); self } /// Encode [`Instruction::I16x8ExtMulLowI8x16U`]. pub fn i16x8_extmul_low_i8x16_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x9Eu32.encode(self.sink); self } /// Encode [`Instruction::I16x8ExtMulHighI8x16U`]. pub fn i16x8_extmul_high_i8x16_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x9Fu32.encode(self.sink); self } /// Encode [`Instruction::I32x4ExtAddPairwiseI16x8S`]. pub fn i32x4_extadd_pairwise_i16x8_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x7Eu32.encode(self.sink); self } /// Encode [`Instruction::I32x4ExtAddPairwiseI16x8U`]. pub fn i32x4_extadd_pairwise_i16x8_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x7Fu32.encode(self.sink); self } /// Encode [`Instruction::I32x4Abs`]. pub fn i32x4_abs(&mut self) -> &mut Self { self.sink.push(0xFD); 0xA0u32.encode(self.sink); self } /// Encode [`Instruction::I32x4Neg`]. pub fn i32x4_neg(&mut self) -> &mut Self { self.sink.push(0xFD); 0xA1u32.encode(self.sink); self } /// Encode [`Instruction::I32x4AllTrue`]. pub fn i32x4_all_true(&mut self) -> &mut Self { self.sink.push(0xFD); 0xA3u32.encode(self.sink); self } /// Encode [`Instruction::I32x4Bitmask`]. pub fn i32x4_bitmask(&mut self) -> &mut Self { self.sink.push(0xFD); 0xA4u32.encode(self.sink); self } /// Encode [`Instruction::I32x4ExtendLowI16x8S`]. pub fn i32x4_extend_low_i16x8_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xA7u32.encode(self.sink); self } /// Encode [`Instruction::I32x4ExtendHighI16x8S`]. pub fn i32x4_extend_high_i16x8_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xA8u32.encode(self.sink); self } /// Encode [`Instruction::I32x4ExtendLowI16x8U`]. pub fn i32x4_extend_low_i16x8_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xA9u32.encode(self.sink); self } /// Encode [`Instruction::I32x4ExtendHighI16x8U`]. pub fn i32x4_extend_high_i16x8_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xAAu32.encode(self.sink); self } /// Encode [`Instruction::I32x4Shl`]. pub fn i32x4_shl(&mut self) -> &mut Self { self.sink.push(0xFD); 0xABu32.encode(self.sink); self } /// Encode [`Instruction::I32x4ShrS`]. pub fn i32x4_shr_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xACu32.encode(self.sink); self } /// Encode [`Instruction::I32x4ShrU`]. pub fn i32x4_shr_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xADu32.encode(self.sink); self } /// Encode [`Instruction::I32x4Add`]. pub fn i32x4_add(&mut self) -> &mut Self { self.sink.push(0xFD); 0xAEu32.encode(self.sink); self } /// Encode [`Instruction::I32x4Sub`]. pub fn i32x4_sub(&mut self) -> &mut Self { self.sink.push(0xFD); 0xB1u32.encode(self.sink); self } /// Encode [`Instruction::I32x4Mul`]. pub fn i32x4_mul(&mut self) -> &mut Self { self.sink.push(0xFD); 0xB5u32.encode(self.sink); self } /// Encode [`Instruction::I32x4MinS`]. pub fn i32x4_min_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xB6u32.encode(self.sink); self } /// Encode [`Instruction::I32x4MinU`]. pub fn i32x4_min_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xB7u32.encode(self.sink); self } /// Encode [`Instruction::I32x4MaxS`]. pub fn i32x4_max_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xB8u32.encode(self.sink); self } /// Encode [`Instruction::I32x4MaxU`]. pub fn i32x4_max_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xB9u32.encode(self.sink); self } /// Encode [`Instruction::I32x4DotI16x8S`]. pub fn i32x4_dot_i16x8_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xBAu32.encode(self.sink); self } /// Encode [`Instruction::I32x4ExtMulLowI16x8S`]. pub fn i32x4_extmul_low_i16x8_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xBCu32.encode(self.sink); self } /// Encode [`Instruction::I32x4ExtMulHighI16x8S`]. pub fn i32x4_extmul_high_i16x8_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xBDu32.encode(self.sink); self } /// Encode [`Instruction::I32x4ExtMulLowI16x8U`]. pub fn i32x4_extmul_low_i16x8_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xBEu32.encode(self.sink); self } /// Encode [`Instruction::I32x4ExtMulHighI16x8U`]. pub fn i32x4_extmul_high_i16x8_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xBFu32.encode(self.sink); self } /// Encode [`Instruction::I64x2Abs`]. pub fn i64x2_abs(&mut self) -> &mut Self { self.sink.push(0xFD); 0xC0u32.encode(self.sink); self } /// Encode [`Instruction::I64x2Neg`]. pub fn i64x2_neg(&mut self) -> &mut Self { self.sink.push(0xFD); 0xC1u32.encode(self.sink); self } /// Encode [`Instruction::I64x2AllTrue`]. pub fn i64x2_all_true(&mut self) -> &mut Self { self.sink.push(0xFD); 0xC3u32.encode(self.sink); self } /// Encode [`Instruction::I64x2Bitmask`]. pub fn i64x2_bitmask(&mut self) -> &mut Self { self.sink.push(0xFD); 0xC4u32.encode(self.sink); self } /// Encode [`Instruction::I64x2ExtendLowI32x4S`]. pub fn i64x2_extend_low_i32x4_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xC7u32.encode(self.sink); self } /// Encode [`Instruction::I64x2ExtendHighI32x4S`]. pub fn i64x2_extend_high_i32x4_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xC8u32.encode(self.sink); self } /// Encode [`Instruction::I64x2ExtendLowI32x4U`]. pub fn i64x2_extend_low_i32x4_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xC9u32.encode(self.sink); self } /// Encode [`Instruction::I64x2ExtendHighI32x4U`]. pub fn i64x2_extend_high_i32x4_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xCAu32.encode(self.sink); self } /// Encode [`Instruction::I64x2Shl`]. pub fn i64x2_shl(&mut self) -> &mut Self { self.sink.push(0xFD); 0xCBu32.encode(self.sink); self } /// Encode [`Instruction::I64x2ShrS`]. pub fn i64x2_shr_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xCCu32.encode(self.sink); self } /// Encode [`Instruction::I64x2ShrU`]. pub fn i64x2_shr_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xCDu32.encode(self.sink); self } /// Encode [`Instruction::I64x2Add`]. pub fn i64x2_add(&mut self) -> &mut Self { self.sink.push(0xFD); 0xCEu32.encode(self.sink); self } /// Encode [`Instruction::I64x2Sub`]. pub fn i64x2_sub(&mut self) -> &mut Self { self.sink.push(0xFD); 0xD1u32.encode(self.sink); self } /// Encode [`Instruction::I64x2Mul`]. pub fn i64x2_mul(&mut self) -> &mut Self { self.sink.push(0xFD); 0xD5u32.encode(self.sink); self } /// Encode [`Instruction::I64x2ExtMulLowI32x4S`]. pub fn i64x2_extmul_low_i32x4_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xDCu32.encode(self.sink); self } /// Encode [`Instruction::I64x2ExtMulHighI32x4S`]. pub fn i64x2_extmul_high_i32x4_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xDDu32.encode(self.sink); self } /// Encode [`Instruction::I64x2ExtMulLowI32x4U`]. pub fn i64x2_extmul_low_i32x4_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xDEu32.encode(self.sink); self } /// Encode [`Instruction::I64x2ExtMulHighI32x4U`]. pub fn i64x2_extmul_high_i32x4_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xDFu32.encode(self.sink); self } /// Encode [`Instruction::F32x4Ceil`]. pub fn f32x4_ceil(&mut self) -> &mut Self { self.sink.push(0xFD); 0x67u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Floor`]. pub fn f32x4_floor(&mut self) -> &mut Self { self.sink.push(0xFD); 0x68u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Trunc`]. pub fn f32x4_trunc(&mut self) -> &mut Self { self.sink.push(0xFD); 0x69u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Nearest`]. pub fn f32x4_nearest(&mut self) -> &mut Self { self.sink.push(0xFD); 0x6Au32.encode(self.sink); self } /// Encode [`Instruction::F32x4Abs`]. pub fn f32x4_abs(&mut self) -> &mut Self { self.sink.push(0xFD); 0xE0u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Neg`]. pub fn f32x4_neg(&mut self) -> &mut Self { self.sink.push(0xFD); 0xE1u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Sqrt`]. pub fn f32x4_sqrt(&mut self) -> &mut Self { self.sink.push(0xFD); 0xE3u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Add`]. pub fn f32x4_add(&mut self) -> &mut Self { self.sink.push(0xFD); 0xE4u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Sub`]. pub fn f32x4_sub(&mut self) -> &mut Self { self.sink.push(0xFD); 0xE5u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Mul`]. pub fn f32x4_mul(&mut self) -> &mut Self { self.sink.push(0xFD); 0xE6u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Div`]. pub fn f32x4_div(&mut self) -> &mut Self { self.sink.push(0xFD); 0xE7u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Min`]. pub fn f32x4_min(&mut self) -> &mut Self { self.sink.push(0xFD); 0xE8u32.encode(self.sink); self } /// Encode [`Instruction::F32x4Max`]. pub fn f32x4_max(&mut self) -> &mut Self { self.sink.push(0xFD); 0xE9u32.encode(self.sink); self } /// Encode [`Instruction::F32x4PMin`]. pub fn f32x4_pmin(&mut self) -> &mut Self { self.sink.push(0xFD); 0xEAu32.encode(self.sink); self } /// Encode [`Instruction::F32x4PMax`]. pub fn f32x4_pmax(&mut self) -> &mut Self { self.sink.push(0xFD); 0xEBu32.encode(self.sink); self } /// Encode [`Instruction::F64x2Ceil`]. pub fn f64x2_ceil(&mut self) -> &mut Self { self.sink.push(0xFD); 0x74u32.encode(self.sink); self } /// Encode [`Instruction::F64x2Floor`]. pub fn f64x2_floor(&mut self) -> &mut Self { self.sink.push(0xFD); 0x75u32.encode(self.sink); self } /// Encode [`Instruction::F64x2Trunc`]. pub fn f64x2_trunc(&mut self) -> &mut Self { self.sink.push(0xFD); 0x7Au32.encode(self.sink); self } /// Encode [`Instruction::F64x2Nearest`]. pub fn f64x2_nearest(&mut self) -> &mut Self { self.sink.push(0xFD); 0x94u32.encode(self.sink); self } /// Encode [`Instruction::F64x2Abs`]. pub fn f64x2_abs(&mut self) -> &mut Self { self.sink.push(0xFD); 0xECu32.encode(self.sink); self } /// Encode [`Instruction::F64x2Neg`]. pub fn f64x2_neg(&mut self) -> &mut Self { self.sink.push(0xFD); 0xEDu32.encode(self.sink); self } /// Encode [`Instruction::F64x2Sqrt`]. pub fn f64x2_sqrt(&mut self) -> &mut Self { self.sink.push(0xFD); 0xEFu32.encode(self.sink); self } /// Encode [`Instruction::F64x2Add`]. pub fn f64x2_add(&mut self) -> &mut Self { self.sink.push(0xFD); 0xF0u32.encode(self.sink); self } /// Encode [`Instruction::F64x2Sub`]. pub fn f64x2_sub(&mut self) -> &mut Self { self.sink.push(0xFD); 0xF1u32.encode(self.sink); self } /// Encode [`Instruction::F64x2Mul`]. pub fn f64x2_mul(&mut self) -> &mut Self { self.sink.push(0xFD); 0xF2u32.encode(self.sink); self } /// Encode [`Instruction::F64x2Div`]. pub fn f64x2_div(&mut self) -> &mut Self { self.sink.push(0xFD); 0xF3u32.encode(self.sink); self } /// Encode [`Instruction::F64x2Min`]. pub fn f64x2_min(&mut self) -> &mut Self { self.sink.push(0xFD); 0xF4u32.encode(self.sink); self } /// Encode [`Instruction::F64x2Max`]. pub fn f64x2_max(&mut self) -> &mut Self { self.sink.push(0xFD); 0xF5u32.encode(self.sink); self } /// Encode [`Instruction::F64x2PMin`]. pub fn f64x2_pmin(&mut self) -> &mut Self { self.sink.push(0xFD); 0xF6u32.encode(self.sink); self } /// Encode [`Instruction::F64x2PMax`]. pub fn f64x2_pmax(&mut self) -> &mut Self { self.sink.push(0xFD); 0xF7u32.encode(self.sink); self } /// Encode [`Instruction::I32x4TruncSatF32x4S`]. pub fn i32x4_trunc_sat_f32x4_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xF8u32.encode(self.sink); self } /// Encode [`Instruction::I32x4TruncSatF32x4U`]. pub fn i32x4_trunc_sat_f32x4_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xF9u32.encode(self.sink); self } /// Encode [`Instruction::F32x4ConvertI32x4S`]. pub fn f32x4_convert_i32x4_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xFAu32.encode(self.sink); self } /// Encode [`Instruction::F32x4ConvertI32x4U`]. pub fn f32x4_convert_i32x4_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xFBu32.encode(self.sink); self } /// Encode [`Instruction::I32x4TruncSatF64x2SZero`]. pub fn i32x4_trunc_sat_f64x2_s_zero(&mut self) -> &mut Self { self.sink.push(0xFD); 0xFCu32.encode(self.sink); self } /// Encode [`Instruction::I32x4TruncSatF64x2UZero`]. pub fn i32x4_trunc_sat_f64x2_u_zero(&mut self) -> &mut Self { self.sink.push(0xFD); 0xFDu32.encode(self.sink); self } /// Encode [`Instruction::F64x2ConvertLowI32x4S`]. pub fn f64x2_convert_low_i32x4_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0xFEu32.encode(self.sink); self } /// Encode [`Instruction::F64x2ConvertLowI32x4U`]. pub fn f64x2_convert_low_i32x4_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0xFFu32.encode(self.sink); self } /// Encode [`Instruction::F32x4DemoteF64x2Zero`]. pub fn f32x4_demote_f64x2_zero(&mut self) -> &mut Self { self.sink.push(0xFD); 0x5Eu32.encode(self.sink); self } /// Encode [`Instruction::F64x2PromoteLowF32x4`]. pub fn f64x2_promote_low_f32x4(&mut self) -> &mut Self { self.sink.push(0xFD); 0x5Fu32.encode(self.sink); self } // Relaxed simd proposal /// Encode [`Instruction::I8x16RelaxedSwizzle`]. pub fn i8x16_relaxed_swizzle(&mut self) -> &mut Self { self.sink.push(0xFD); 0x100u32.encode(self.sink); self } /// Encode [`Instruction::I32x4RelaxedTruncF32x4S`]. pub fn i32x4_relaxed_trunc_f32x4_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x101u32.encode(self.sink); self } /// Encode [`Instruction::I32x4RelaxedTruncF32x4U`]. pub fn i32x4_relaxed_trunc_f32x4_u(&mut self) -> &mut Self { self.sink.push(0xFD); 0x102u32.encode(self.sink); self } /// Encode [`Instruction::I32x4RelaxedTruncF64x2SZero`]. pub fn i32x4_relaxed_trunc_f64x2_s_zero(&mut self) -> &mut Self { self.sink.push(0xFD); 0x103u32.encode(self.sink); self } /// Encode [`Instruction::I32x4RelaxedTruncF64x2UZero`]. pub fn i32x4_relaxed_trunc_f64x2_u_zero(&mut self) -> &mut Self { self.sink.push(0xFD); 0x104u32.encode(self.sink); self } /// Encode [`Instruction::F32x4RelaxedMadd`]. pub fn f32x4_relaxed_madd(&mut self) -> &mut Self { self.sink.push(0xFD); 0x105u32.encode(self.sink); self } /// Encode [`Instruction::F32x4RelaxedNmadd`]. pub fn f32x4_relaxed_nmadd(&mut self) -> &mut Self { self.sink.push(0xFD); 0x106u32.encode(self.sink); self } /// Encode [`Instruction::F64x2RelaxedMadd`]. pub fn f64x2_relaxed_madd(&mut self) -> &mut Self { self.sink.push(0xFD); 0x107u32.encode(self.sink); self } /// Encode [`Instruction::F64x2RelaxedNmadd`]. pub fn f64x2_relaxed_nmadd(&mut self) -> &mut Self { self.sink.push(0xFD); 0x108u32.encode(self.sink); self } /// Encode [`Instruction::I8x16RelaxedLaneselect`]. pub fn i8x16_relaxed_laneselect(&mut self) -> &mut Self { self.sink.push(0xFD); 0x109u32.encode(self.sink); self } /// Encode [`Instruction::I16x8RelaxedLaneselect`]. pub fn i16x8_relaxed_laneselect(&mut self) -> &mut Self { self.sink.push(0xFD); 0x10Au32.encode(self.sink); self } /// Encode [`Instruction::I32x4RelaxedLaneselect`]. pub fn i32x4_relaxed_laneselect(&mut self) -> &mut Self { self.sink.push(0xFD); 0x10Bu32.encode(self.sink); self } /// Encode [`Instruction::I64x2RelaxedLaneselect`]. pub fn i64x2_relaxed_laneselect(&mut self) -> &mut Self { self.sink.push(0xFD); 0x10Cu32.encode(self.sink); self } /// Encode [`Instruction::F32x4RelaxedMin`]. pub fn f32x4_relaxed_min(&mut self) -> &mut Self { self.sink.push(0xFD); 0x10Du32.encode(self.sink); self } /// Encode [`Instruction::F32x4RelaxedMax`]. pub fn f32x4_relaxed_max(&mut self) -> &mut Self { self.sink.push(0xFD); 0x10Eu32.encode(self.sink); self } /// Encode [`Instruction::F64x2RelaxedMin`]. pub fn f64x2_relaxed_min(&mut self) -> &mut Self { self.sink.push(0xFD); 0x10Fu32.encode(self.sink); self } /// Encode [`Instruction::F64x2RelaxedMax`]. pub fn f64x2_relaxed_max(&mut self) -> &mut Self { self.sink.push(0xFD); 0x110u32.encode(self.sink); self } /// Encode [`Instruction::I16x8RelaxedQ15mulrS`]. pub fn i16x8_relaxed_q15mulr_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x111u32.encode(self.sink); self } /// Encode [`Instruction::I16x8RelaxedDotI8x16I7x16S`]. pub fn i16x8_relaxed_dot_i8x16_i7x16_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x112u32.encode(self.sink); self } /// Encode [`Instruction::I32x4RelaxedDotI8x16I7x16AddS`]. pub fn i32x4_relaxed_dot_i8x16_i7x16_add_s(&mut self) -> &mut Self { self.sink.push(0xFD); 0x113u32.encode(self.sink); self } // Atomic instructions (the threads proposal) /// Encode [`Instruction::MemoryAtomicNotify`]. pub fn memory_atomic_notify(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x00); memarg.encode(self.sink); self } /// Encode [`Instruction::MemoryAtomicWait32`]. pub fn memory_atomic_wait32(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x01); memarg.encode(self.sink); self } /// Encode [`Instruction::MemoryAtomicWait64`]. pub fn memory_atomic_wait64(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x02); memarg.encode(self.sink); self } /// Encode [`Instruction::AtomicFence`]. pub fn atomic_fence(&mut self) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x03); self.sink.push(0x00); self } /// Encode [`Instruction::I32AtomicLoad`]. pub fn i32_atomic_load(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x10); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicLoad`]. pub fn i64_atomic_load(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x11); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicLoad8U`]. pub fn i32_atomic_load8_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x12); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicLoad16U`]. pub fn i32_atomic_load16_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x13); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicLoad8U`]. pub fn i64_atomic_load8_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x14); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicLoad16U`]. pub fn i64_atomic_load16_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x15); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicLoad32U`]. pub fn i64_atomic_load32_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x16); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicStore`]. pub fn i32_atomic_store(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x17); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicStore`]. pub fn i64_atomic_store(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x18); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicStore8`]. pub fn i32_atomic_store8(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x19); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicStore16`]. pub fn i32_atomic_store16(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x1A); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicStore8`]. pub fn i64_atomic_store8(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x1B); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicStore16`]. pub fn i64_atomic_store16(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x1C); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicStore32`]. pub fn i64_atomic_store32(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x1D); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmwAdd`]. pub fn i32_atomic_rmw_add(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x1E); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmwAdd`]. pub fn i64_atomic_rmw_add(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x1F); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw8AddU`]. pub fn i32_atomic_rmw8_add_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x20); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw16AddU`]. pub fn i32_atomic_rmw16_add_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x21); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw8AddU`]. pub fn i64_atomic_rmw8_add_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x22); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw16AddU`]. pub fn i64_atomic_rmw16_add_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x23); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw32AddU`]. pub fn i64_atomic_rmw32_add_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x24); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmwSub`]. pub fn i32_atomic_rmw_sub(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x25); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmwSub`]. pub fn i64_atomic_rmw_sub(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x26); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw8SubU`]. pub fn i32_atomic_rmw8_sub_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x27); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw16SubU`]. pub fn i32_atomic_rmw16_sub_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x28); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw8SubU`]. pub fn i64_atomic_rmw8_sub_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x29); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw16SubU`]. pub fn i64_atomic_rmw16_sub_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x2A); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw32SubU`]. pub fn i64_atomic_rmw32_sub_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x2B); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmwAnd`]. pub fn i32_atomic_rmw_and(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x2C); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmwAnd`]. pub fn i64_atomic_rmw_and(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x2D); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw8AndU`]. pub fn i32_atomic_rmw8_and_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x2E); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw16AndU`]. pub fn i32_atomic_rmw16_and_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x2F); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw8AndU`]. pub fn i64_atomic_rmw8_and_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x30); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw16AndU`]. pub fn i64_atomic_rmw16_and_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x31); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw32AndU`]. pub fn i64_atomic_rmw32_and_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x32); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmwOr`]. pub fn i32_atomic_rmw_or(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x33); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmwOr`]. pub fn i64_atomic_rmw_or(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x34); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw8OrU`]. pub fn i32_atomic_rmw8_or_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x35); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw16OrU`]. pub fn i32_atomic_rmw16_or_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x36); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw8OrU`]. pub fn i64_atomic_rmw8_or_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x37); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw16OrU`]. pub fn i64_atomic_rmw16_or_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x38); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw32OrU`]. pub fn i64_atomic_rmw32_or_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x39); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmwXor`]. pub fn i32_atomic_rmw_xor(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x3A); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmwXor`]. pub fn i64_atomic_rmw_xor(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x3B); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw8XorU`]. pub fn i32_atomic_rmw8_xor_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x3C); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw16XorU`]. pub fn i32_atomic_rmw16_xor_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x3D); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw8XorU`]. pub fn i64_atomic_rmw8_xor_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x3E); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw16XorU`]. pub fn i64_atomic_rmw16_xor_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x3F); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw32XorU`]. pub fn i64_atomic_rmw32_xor_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x40); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmwXchg`]. pub fn i32_atomic_rmw_xchg(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x41); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmwXchg`]. pub fn i64_atomic_rmw_xchg(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x42); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw8XchgU`]. pub fn i32_atomic_rmw8_xchg_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x43); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw16XchgU`]. pub fn i32_atomic_rmw16_xchg_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x44); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw8XchgU`]. pub fn i64_atomic_rmw8_xchg_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x45); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw16XchgU`]. pub fn i64_atomic_rmw16_xchg_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x46); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw32XchgU`]. pub fn i64_atomic_rmw32_xchg_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x47); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmwCmpxchg`]. pub fn i32_atomic_rmw_cmpxchg(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x48); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmwCmpxchg`]. pub fn i64_atomic_rmw_cmpxchg(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x49); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw8CmpxchgU`]. pub fn i32_atomic_rmw8_cmpxchg_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x4A); memarg.encode(self.sink); self } /// Encode [`Instruction::I32AtomicRmw16CmpxchgU`]. pub fn i32_atomic_rmw16_cmpxchg_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x4B); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw8CmpxchgU`]. pub fn i64_atomic_rmw8_cmpxchg_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x4C); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw16CmpxchgU`]. pub fn i64_atomic_rmw16_cmpxchg_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x4D); memarg.encode(self.sink); self } /// Encode [`Instruction::I64AtomicRmw32CmpxchgU`]. pub fn i64_atomic_rmw32_cmpxchg_u(&mut self, memarg: MemArg) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x4E); memarg.encode(self.sink); self } // More atomic instructions (the shared-everything-threads proposal) /// Encode [`Instruction::GlobalAtomicGet`]. pub fn global_atomic_get(&mut self, ordering: Ordering, global_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x4F); ordering.encode(self.sink); global_index.encode(self.sink); self } /// Encode [`Instruction::GlobalAtomicSet`]. pub fn global_atomic_set(&mut self, ordering: Ordering, global_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x50); ordering.encode(self.sink); global_index.encode(self.sink); self } /// Encode [`Instruction::GlobalAtomicRmwAdd`]. pub fn global_atomic_rmw_add(&mut self, ordering: Ordering, global_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x51); ordering.encode(self.sink); global_index.encode(self.sink); self } /// Encode [`Instruction::GlobalAtomicRmwSub`]. pub fn global_atomic_rmw_sub(&mut self, ordering: Ordering, global_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x52); ordering.encode(self.sink); global_index.encode(self.sink); self } /// Encode [`Instruction::GlobalAtomicRmwAnd`]. pub fn global_atomic_rmw_and(&mut self, ordering: Ordering, global_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x53); ordering.encode(self.sink); global_index.encode(self.sink); self } /// Encode [`Instruction::GlobalAtomicRmwOr`]. pub fn global_atomic_rmw_or(&mut self, ordering: Ordering, global_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x54); ordering.encode(self.sink); global_index.encode(self.sink); self } /// Encode [`Instruction::GlobalAtomicRmwXor`]. pub fn global_atomic_rmw_xor(&mut self, ordering: Ordering, global_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x55); ordering.encode(self.sink); global_index.encode(self.sink); self } /// Encode [`Instruction::GlobalAtomicRmwXchg`]. pub fn global_atomic_rmw_xchg(&mut self, ordering: Ordering, global_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x56); ordering.encode(self.sink); global_index.encode(self.sink); self } /// Encode [`Instruction::GlobalAtomicRmwCmpxchg`]. pub fn global_atomic_rmw_cmpxchg( &mut self, ordering: Ordering, global_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x57); ordering.encode(self.sink); global_index.encode(self.sink); self } /// Encode [`Instruction::TableAtomicGet`]. pub fn table_atomic_get(&mut self, ordering: Ordering, table_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x58); ordering.encode(self.sink); table_index.encode(self.sink); self } /// Encode [`Instruction::TableAtomicSet`]. pub fn table_atomic_set(&mut self, ordering: Ordering, table_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x59); ordering.encode(self.sink); table_index.encode(self.sink); self } /// Encode [`Instruction::TableAtomicRmwXchg`]. pub fn table_atomic_rmw_xchg(&mut self, ordering: Ordering, table_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x5A); ordering.encode(self.sink); table_index.encode(self.sink); self } /// Encode [`Instruction::TableAtomicRmwCmpxchg`]. pub fn table_atomic_rmw_cmpxchg(&mut self, ordering: Ordering, table_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x5B); ordering.encode(self.sink); table_index.encode(self.sink); self } /// Encode [`Instruction::StructAtomicGet`]. pub fn struct_atomic_get( &mut self, ordering: Ordering, struct_type_index: u32, field_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x5C); ordering.encode(self.sink); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructAtomicGetS`]. pub fn struct_atomic_get_s( &mut self, ordering: Ordering, struct_type_index: u32, field_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x5D); ordering.encode(self.sink); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructAtomicGetU`]. pub fn struct_atomic_get_u( &mut self, ordering: Ordering, struct_type_index: u32, field_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x5E); ordering.encode(self.sink); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructAtomicSet`]. pub fn struct_atomic_set( &mut self, ordering: Ordering, struct_type_index: u32, field_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x5F); ordering.encode(self.sink); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructAtomicRmwAdd`]. pub fn struct_atomic_rmw_add( &mut self, ordering: Ordering, struct_type_index: u32, field_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x60); ordering.encode(self.sink); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructAtomicRmwSub`]. pub fn struct_atomic_rmw_sub( &mut self, ordering: Ordering, struct_type_index: u32, field_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x61); ordering.encode(self.sink); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructAtomicRmwAnd`]. pub fn struct_atomic_rmw_and( &mut self, ordering: Ordering, struct_type_index: u32, field_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x62); ordering.encode(self.sink); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructAtomicRmwOr`]. pub fn struct_atomic_rmw_or( &mut self, ordering: Ordering, struct_type_index: u32, field_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x63); ordering.encode(self.sink); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructAtomicRmwXor`]. pub fn struct_atomic_rmw_xor( &mut self, ordering: Ordering, struct_type_index: u32, field_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x64); ordering.encode(self.sink); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructAtomicRmwXchg`]. pub fn struct_atomic_rmw_xchg( &mut self, ordering: Ordering, struct_type_index: u32, field_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x65); ordering.encode(self.sink); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::StructAtomicRmwCmpxchg`]. pub fn struct_atomic_rmw_cmpxchg( &mut self, ordering: Ordering, struct_type_index: u32, field_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x66); ordering.encode(self.sink); struct_type_index.encode(self.sink); field_index.encode(self.sink); self } /// Encode [`Instruction::ArrayAtomicGet`]. pub fn array_atomic_get(&mut self, ordering: Ordering, array_type_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x67); ordering.encode(self.sink); array_type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayAtomicGetS`]. pub fn array_atomic_get_s(&mut self, ordering: Ordering, array_type_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x68); ordering.encode(self.sink); array_type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayAtomicGetU`]. pub fn array_atomic_get_u(&mut self, ordering: Ordering, array_type_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x69); ordering.encode(self.sink); array_type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayAtomicSet`]. pub fn array_atomic_set(&mut self, ordering: Ordering, array_type_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x6A); ordering.encode(self.sink); array_type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayAtomicRmwAdd`]. pub fn array_atomic_rmw_add(&mut self, ordering: Ordering, array_type_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x6B); ordering.encode(self.sink); array_type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayAtomicRmwSub`]. pub fn array_atomic_rmw_sub(&mut self, ordering: Ordering, array_type_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x6C); ordering.encode(self.sink); array_type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayAtomicRmwAnd`]. pub fn array_atomic_rmw_and(&mut self, ordering: Ordering, array_type_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x6D); ordering.encode(self.sink); array_type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayAtomicRmwOr`]. pub fn array_atomic_rmw_or(&mut self, ordering: Ordering, array_type_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x6E); ordering.encode(self.sink); array_type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayAtomicRmwXor`]. pub fn array_atomic_rmw_xor(&mut self, ordering: Ordering, array_type_index: u32) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x6F); ordering.encode(self.sink); array_type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayAtomicRmwXchg`]. pub fn array_atomic_rmw_xchg( &mut self, ordering: Ordering, array_type_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x70); ordering.encode(self.sink); array_type_index.encode(self.sink); self } /// Encode [`Instruction::ArrayAtomicRmwCmpxchg`]. pub fn array_atomic_rmw_cmpxchg( &mut self, ordering: Ordering, array_type_index: u32, ) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x71); ordering.encode(self.sink); array_type_index.encode(self.sink); self } /// Encode [`Instruction::RefI31Shared`]. pub fn ref_i31_shared(&mut self) -> &mut Self { self.sink.push(0xFE); self.sink.push(0x72); self } // Stack switching /// Encode [`Instruction::ContNew`]. pub fn cont_new(&mut self, type_index: u32) -> &mut Self { self.sink.push(0xE0); type_index.encode(self.sink); self } /// Encode [`Instruction::ContBind`]. pub fn cont_bind(&mut self, argument_index: u32, result_index: u32) -> &mut Self { self.sink.push(0xE1); argument_index.encode(self.sink); result_index.encode(self.sink); self } /// Encode [`Instruction::Suspend`]. pub fn suspend(&mut self, tag_index: u32) -> &mut Self { self.sink.push(0xE2); tag_index.encode(self.sink); self } /// Encode [`Instruction::Resume`]. pub fn resume>( &mut self, cont_type_index: u32, resume_table: V, ) -> &mut Self where V::IntoIter: ExactSizeIterator, { self.sink.push(0xE3); cont_type_index.encode(self.sink); encode_vec(resume_table, self.sink); self } /// Encode [`Instruction::ResumeThrow`]. pub fn resume_throw>( &mut self, cont_type_index: u32, tag_index: u32, resume_table: V, ) -> &mut Self where V::IntoIter: ExactSizeIterator, { self.sink.push(0xE4); cont_type_index.encode(self.sink); tag_index.encode(self.sink); encode_vec(resume_table, self.sink); self } /// Encode [`Instruction::Switch`]. pub fn switch(&mut self, cont_type_index: u32, tag_index: u32) -> &mut Self { self.sink.push(0xE5); cont_type_index.encode(self.sink); tag_index.encode(self.sink); self } // Wide Arithmetic /// Encode [`Instruction::I64Add128`]. pub fn i64_add128(&mut self) -> &mut Self { self.sink.push(0xFC); 19u32.encode(self.sink); self } /// Encode [`Instruction::I64Sub128`]. pub fn i64_sub128(&mut self) -> &mut Self { self.sink.push(0xFC); 20u32.encode(self.sink); self } /// Encode [`Instruction::I64MulWideS`]. pub fn i64_mul_wide_s(&mut self) -> &mut Self { self.sink.push(0xFC); 21u32.encode(self.sink); self } /// Encode [`Instruction::I64MulWideU`]. pub fn i64_mul_wide_u(&mut self) -> &mut Self { self.sink.push(0xFC); 22u32.encode(self.sink); self } /// Encode [`Instruction::RefGetDesc`]. pub fn ref_get_desc(&mut self, type_index: u32) -> &mut Self { self.sink.push(0xFB); 34u32.encode(self.sink); type_index.encode(self.sink); self } /// Encode [`Instruction::RefCastDescNonNull`]. pub fn ref_cast_desc_non_null(&mut self, ht: HeapType) -> &mut Self { self.sink.push(0xFB); 35u32.encode(self.sink); ht.encode(self.sink); self } /// Encode [`Instruction::RefCastDescNullable`]. pub fn ref_cast_desc_nullable(&mut self, ht: HeapType) -> &mut Self { self.sink.push(0xFB); 36u32.encode(self.sink); ht.encode(self.sink); self } /// Encode [`Instruction::BrOnCastDesc`]. pub fn br_on_cast_desc( &mut self, relative_depth: u32, from_ref_type: RefType, to_ref_type: RefType, ) -> &mut Self { self.sink.push(0xFB); 37u32.encode(self.sink); let cast_flags = (from_ref_type.nullable as u8) | ((to_ref_type.nullable as u8) << 1); self.sink.push(cast_flags); relative_depth.encode(self.sink); from_ref_type.heap_type.encode(self.sink); to_ref_type.heap_type.encode(self.sink); self } /// Encode [`Instruction::BrOnCastDescFail`]. pub fn br_on_cast_desc_fail( &mut self, relative_depth: u32, from_ref_type: RefType, to_ref_type: RefType, ) -> &mut Self { self.sink.push(0xFB); 38u32.encode(self.sink); let cast_flags = (from_ref_type.nullable as u8) | ((to_ref_type.nullable as u8) << 1); self.sink.push(cast_flags); relative_depth.encode(self.sink); from_ref_type.heap_type.encode(self.sink); to_ref_type.heap_type.encode(self.sink); self } }