use crate::ir::id::{DataSegmentID, ElementID, FieldID, FunctionID, GlobalID, LocalID, TypeID};
use crate::ir::module::module_types::HeapType;
use crate::ir::types::{BlockType, FuncInstrMode, InstrumentationMode};
use crate::Location;
use wasmparser::MemArg;
use wasmparser::Operator;
use wasmparser::V128;
pub trait Instrumenter<'a> {
fn finish_instr(&mut self);
fn curr_instrument_mode(&self) -> Option<InstrumentationMode>;
fn set_instrument_mode_at(&mut self, mode: InstrumentationMode, loc: Location);
fn curr_func_instrument_mode(&self) -> &Option<FuncInstrMode>;
fn set_func_instrument_mode(&mut self, mode: FuncInstrMode);
fn curr_instr_len(&self) -> usize;
fn func_entry(&mut self) -> &mut Self {
self.set_func_instrument_mode(FuncInstrMode::Entry);
self
}
fn func_exit(&mut self) -> &mut Self {
self.set_func_instrument_mode(FuncInstrMode::Exit);
self
}
fn clear_instr_at(&mut self, loc: Location, mode: InstrumentationMode);
fn add_instr_at(&mut self, loc: Location, instr: Operator<'a>);
fn before_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::Before, loc);
self
}
fn after_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::After, loc);
self
}
fn alternate_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::Alternate, loc);
self
}
fn empty_alternate_at(&mut self, loc: Location) -> &mut Self;
fn semantic_after_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::SemanticAfter, loc);
self
}
fn block_entry_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::BlockEntry, loc);
self
}
fn block_exit_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::BlockExit, loc);
self
}
fn block_alt_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::BlockAlt, loc);
self
}
fn empty_block_alt_at(&mut self, loc: Location) -> &mut Self;
fn append_tag_at(&mut self, data: Vec<u8>, loc: Location) -> &mut Self;
}
pub trait Inject<'a> {
fn inject(&mut self, instr: Operator<'a>);
fn inject_all(&mut self, instrs: &[Operator<'a>]) -> &mut Self {
instrs.iter().for_each(|instr| {
self.inject(instr.to_owned());
});
self
}
}
pub trait InjectAt<'a> {
fn inject_at(&mut self, idx: usize, mode: InstrumentationMode, instr: Operator<'a>);
}
#[allow(dead_code)]
pub trait Opcode<'a>: Inject<'a> {
fn call(&mut self, idx: FunctionID) -> &mut Self {
self.inject(Operator::Call {
function_index: *idx,
});
self
}
fn return_stmt(&mut self) -> &mut Self {
self.inject(Operator::Return);
self
}
fn nop(&mut self) -> &mut Self {
self.inject(Operator::Nop);
self
}
fn unreachable(&mut self) -> &mut Self {
self.inject(Operator::Unreachable);
self
}
fn select(&mut self) -> &mut Self {
self.inject(Operator::Select);
self
}
fn if_stmt(&mut self, block_type: BlockType) -> &mut Self {
self.inject(Operator::If {
blockty: wasmparser::BlockType::from(block_type),
});
self
}
fn else_stmt(&mut self) -> &mut Self {
self.inject(Operator::Else);
self
}
fn end(&mut self) -> &mut Self {
self.inject(Operator::End);
self
}
fn block(&mut self, block_type: BlockType) -> &mut Self {
self.inject(Operator::Block {
blockty: wasmparser::BlockType::from(block_type),
});
self
}
fn loop_stmt(&mut self, block_type: BlockType) -> &mut Self {
self.inject(Operator::Loop {
blockty: wasmparser::BlockType::from(block_type),
});
self
}
fn br(&mut self, relative_depth: u32) -> &mut Self {
self.inject(Operator::Br { relative_depth });
self
}
fn br_if(&mut self, relative_depth: u32) -> &mut Self {
self.inject(Operator::BrIf { relative_depth });
self
}
fn local_get(&mut self, idx: LocalID) -> &mut Self {
self.inject(Operator::LocalGet { local_index: *idx });
self
}
fn local_set(&mut self, idx: LocalID) -> &mut Self {
self.inject(Operator::LocalSet { local_index: *idx });
self
}
fn local_tee(&mut self, idx: LocalID) -> &mut Self {
self.inject(Operator::LocalTee { local_index: *idx });
self
}
fn i32_const(&mut self, value: i32) -> &mut Self {
self.inject(Operator::I32Const { value });
self
}
fn i32_add(&mut self) -> &mut Self {
self.inject(Operator::I32Add);
self
}
fn i32_sub(&mut self) -> &mut Self {
self.inject(Operator::I32Sub);
self
}
fn i32_mul(&mut self) -> &mut Self {
self.inject(Operator::I32Mul);
self
}
fn i32_div_signed(&mut self) -> &mut Self {
self.inject(Operator::I32DivS);
self
}
fn i32_div_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32DivU);
self
}
fn i32_rem_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32RemU);
self
}
fn i32_rem_signed(&mut self) -> &mut Self {
self.inject(Operator::I32RemS);
self
}
fn i32_and(&mut self) -> &mut Self {
self.inject(Operator::I32And);
self
}
fn i32_or(&mut self) -> &mut Self {
self.inject(Operator::I32Or);
self
}
fn i32_xor(&mut self) -> &mut Self {
self.inject(Operator::I32Xor);
self
}
fn i32_shl(&mut self) -> &mut Self {
self.inject(Operator::I32Shl);
self
}
fn i32_shr_signed(&mut self) -> &mut Self {
self.inject(Operator::I32ShrS);
self
}
fn i32_shr_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32ShrU);
self
}
fn i32_rotl(&mut self) -> &mut Self {
self.inject(Operator::I32Rotl);
self
}
fn i32_rotr(&mut self) -> &mut Self {
self.inject(Operator::I32Rotr);
self
}
fn i32_eq(&mut self) -> &mut Self {
self.inject(Operator::I32Eq);
self
}
fn i32_eqz(&mut self) -> &mut Self {
self.inject(Operator::I32Eqz);
self
}
fn i32_ne(&mut self) -> &mut Self {
self.inject(Operator::I32Ne);
self
}
fn i32_lt_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32LtU);
self
}
fn i32_lt_signed(&mut self) -> &mut Self {
self.inject(Operator::I32LtS);
self
}
fn i32_gt_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32GtU);
self
}
fn i32_gt_signed(&mut self) -> &mut Self {
self.inject(Operator::I32GtS);
self
}
fn i32_lte_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32LeU);
self
}
fn i32_lte_signed(&mut self) -> &mut Self {
self.inject(Operator::I32LeS);
self
}
fn i32_gte_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32GeU);
self
}
fn i32_gte_signed(&mut self) -> &mut Self {
self.inject(Operator::I32GeS);
self
}
fn i32_wrap_i64(&mut self) -> &mut Self {
self.inject(Operator::I32WrapI64);
self
}
fn i32_extend_8s(&mut self) -> &mut Self {
self.inject(Operator::I32Extend8S);
self
}
fn i32_extend_16s(&mut self) -> &mut Self {
self.inject(Operator::I32Extend16S);
self
}
fn i32_trunc_f32s(&mut self) -> &mut Self {
self.inject(Operator::I32TruncF32S);
self
}
fn i32_trunc_f32u(&mut self) -> &mut Self {
self.inject(Operator::I32TruncF32U);
self
}
fn i32_trunc_f64s(&mut self) -> &mut Self {
self.inject(Operator::I32TruncF64S);
self
}
fn i32_trunc_f64u(&mut self) -> &mut Self {
self.inject(Operator::I32TruncF64U);
self
}
fn i32_reinterpret_f32(&mut self) -> &mut Self {
self.inject(Operator::I32ReinterpretF32);
self
}
fn i64_const(&mut self, value: i64) -> &mut Self {
self.inject(Operator::I64Const { value });
self
}
fn i64_add(&mut self) -> &mut Self {
self.inject(Operator::I64Add);
self
}
fn i64_sub(&mut self) -> &mut Self {
self.inject(Operator::I64Sub);
self
}
fn i64_mul(&mut self) -> &mut Self {
self.inject(Operator::I64Mul);
self
}
fn i64_div_signed(&mut self) -> &mut Self {
self.inject(Operator::I64DivS);
self
}
fn i64_div_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64DivU);
self
}
fn i64_rem_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64RemU);
self
}
fn i64_rem_signed(&mut self) -> &mut Self {
self.inject(Operator::I64RemS);
self
}
fn i64_and(&mut self) -> &mut Self {
self.inject(Operator::I64And);
self
}
fn i64_or(&mut self) -> &mut Self {
self.inject(Operator::I64Or);
self
}
fn i64_xor(&mut self) -> &mut Self {
self.inject(Operator::I64Xor);
self
}
fn i64_shl(&mut self) -> &mut Self {
self.inject(Operator::I64Shl);
self
}
fn i64_shr_signed(&mut self) -> &mut Self {
self.inject(Operator::I64ShrS);
self
}
fn i64_shr_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64ShrU);
self
}
fn i64_rotl(&mut self) -> &mut Self {
self.inject(Operator::I64Rotl);
self
}
fn i64_rotr(&mut self) -> &mut Self {
self.inject(Operator::I64Rotr);
self
}
fn i64_eq(&mut self) -> &mut Self {
self.inject(Operator::I64Eq);
self
}
fn i64_eqz(&mut self) -> &mut Self {
self.inject(Operator::I64Eqz);
self
}
fn i64_ne(&mut self) -> &mut Self {
self.inject(Operator::I64Ne);
self
}
fn i64_lt_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64LtU);
self
}
fn i64_lt_signed(&mut self) -> &mut Self {
self.inject(Operator::I64LtS);
self
}
fn i64_gt_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64GtU);
self
}
fn i64_gt_signed(&mut self) -> &mut Self {
self.inject(Operator::I64GtS);
self
}
fn i64_lte_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64LeU);
self
}
fn i64_lte_signed(&mut self) -> &mut Self {
self.inject(Operator::I64LeS);
self
}
fn i64_gte_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64GeU);
self
}
fn i64_gte_signed(&mut self) -> &mut Self {
self.inject(Operator::I64GeS);
self
}
fn i64_extend_i32u(&mut self) -> &mut Self {
self.inject(Operator::I64ExtendI32U);
self
}
fn i64_extend_i32s(&mut self) -> &mut Self {
self.inject(Operator::I64ExtendI32S);
self
}
fn i64_trunc_f32s(&mut self) -> &mut Self {
self.inject(Operator::I64TruncF32S);
self
}
fn i64_trunc_f32u(&mut self) -> &mut Self {
self.inject(Operator::I64TruncF32U);
self
}
fn i64_trunc_f64s(&mut self) -> &mut Self {
self.inject(Operator::I64TruncF64S);
self
}
fn i64_trunc_f64u(&mut self) -> &mut Self {
self.inject(Operator::I64TruncF64U);
self
}
fn i64_reinterpret_f64(&mut self) -> &mut Self {
self.inject(Operator::I64ReinterpretF64);
self
}
fn f32_const(&mut self, val: f32) -> &mut Self {
self.inject(Operator::F32Const {
value: wasmparser::Ieee32::from(val),
});
self
}
fn f32_abs(&mut self) -> &mut Self {
self.inject(Operator::F32Abs);
self
}
fn f32_ceil(&mut self) -> &mut Self {
self.inject(Operator::F32Ceil);
self
}
fn f32_floor(&mut self) -> &mut Self {
self.inject(Operator::F32Floor);
self
}
fn f32_trunc(&mut self) -> &mut Self {
self.inject(Operator::F32Trunc);
self
}
fn f32_sqrt(&mut self) -> &mut Self {
self.inject(Operator::F32Sqrt);
self
}
fn f32_add(&mut self) -> &mut Self {
self.inject(Operator::F32Add);
self
}
fn f32_sub(&mut self) -> &mut Self {
self.inject(Operator::F32Sub);
self
}
fn f32_mul(&mut self) -> &mut Self {
self.inject(Operator::F32Mul);
self
}
fn f32_div(&mut self) -> &mut Self {
self.inject(Operator::F32Div);
self
}
fn f32_min(&mut self) -> &mut Self {
self.inject(Operator::F32Min);
self
}
fn f32_max(&mut self) -> &mut Self {
self.inject(Operator::F32Max);
self
}
fn f32_eq(&mut self) -> &mut Self {
self.inject(Operator::F32Eq);
self
}
fn f32_ne(&mut self) -> &mut Self {
self.inject(Operator::F32Ne);
self
}
fn f32_gt(&mut self) -> &mut Self {
self.inject(Operator::F32Gt);
self
}
fn f32_ge(&mut self) -> &mut Self {
self.inject(Operator::F32Ge);
self
}
fn f32_lt(&mut self) -> &mut Self {
self.inject(Operator::F32Lt);
self
}
fn f32_le(&mut self) -> &mut Self {
self.inject(Operator::F32Le);
self
}
fn f32_convert_i32s(&mut self) -> &mut Self {
self.inject(Operator::F32ConvertI32S);
self
}
fn f32_convert_i32u(&mut self) -> &mut Self {
self.inject(Operator::F32ConvertI32U);
self
}
fn f32_convert_i64s(&mut self) -> &mut Self {
self.inject(Operator::F32ConvertI64S);
self
}
fn f32_convert_i64u(&mut self) -> &mut Self {
self.inject(Operator::F32ConvertI64U);
self
}
fn f32_demote_f64(&mut self) -> &mut Self {
self.inject(Operator::F32DemoteF64);
self
}
fn f32_reinterpret_i32(&mut self) -> &mut Self {
self.inject(Operator::F32ReinterpretI32);
self
}
fn f32_copysign(&mut self) -> &mut Self {
self.inject(Operator::F32Copysign);
self
}
fn f64_const(&mut self, val: f64) -> &mut Self {
self.inject(Operator::F64Const {
value: wasmparser::Ieee64::from(val),
});
self
}
fn f64_abs(&mut self) -> &mut Self {
self.inject(Operator::F64Abs);
self
}
fn f64_ceil(&mut self) -> &mut Self {
self.inject(Operator::F64Ceil);
self
}
fn f64_floor(&mut self) -> &mut Self {
self.inject(Operator::F64Floor);
self
}
fn f64_trunc(&mut self) -> &mut Self {
self.inject(Operator::F64Trunc);
self
}
fn f64_sqrt(&mut self) -> &mut Self {
self.inject(Operator::F64Sqrt);
self
}
fn f64_add(&mut self) -> &mut Self {
self.inject(Operator::F64Add);
self
}
fn f64_sub(&mut self) -> &mut Self {
self.inject(Operator::F64Sub);
self
}
fn f64_mul(&mut self) -> &mut Self {
self.inject(Operator::F64Mul);
self
}
fn f64_div(&mut self) -> &mut Self {
self.inject(Operator::F64Div);
self
}
fn f64_min(&mut self) -> &mut Self {
self.inject(Operator::F64Min);
self
}
fn f64_max(&mut self) -> &mut Self {
self.inject(Operator::F64Max);
self
}
fn f64_eq(&mut self) -> &mut Self {
self.inject(Operator::F64Eq);
self
}
fn f64_ne(&mut self) -> &mut Self {
self.inject(Operator::F64Ne);
self
}
fn f64_gt(&mut self) -> &mut Self {
self.inject(Operator::F64Gt);
self
}
fn f64_ge(&mut self) -> &mut Self {
self.inject(Operator::F64Ge);
self
}
fn f64_lt(&mut self) -> &mut Self {
self.inject(Operator::F64Lt);
self
}
fn f64_le(&mut self) -> &mut Self {
self.inject(Operator::F64Le);
self
}
fn f64_reinterpret_i64(&mut self) -> &mut Self {
self.inject(Operator::F64ReinterpretI64);
self
}
fn f64_promote_f32(&mut self) -> &mut Self {
self.inject(Operator::F64PromoteF32);
self
}
fn f64_convert_i32s(&mut self) -> &mut Self {
self.inject(Operator::F64ConvertI32S);
self
}
fn f64_convert_i32u(&mut self) -> &mut Self {
self.inject(Operator::F64ConvertI32U);
self
}
fn f64_convert_i64s(&mut self) -> &mut Self {
self.inject(Operator::F64ConvertI64S);
self
}
fn f64_convert_i64u(&mut self) -> &mut Self {
self.inject(Operator::F64ConvertI64U);
self
}
fn f64_copysign(&mut self) -> &mut Self {
self.inject(Operator::F64Copysign);
self
}
fn memory_init(&mut self, data_index: u32, mem: u32) -> &mut Self {
self.inject(Operator::MemoryInit { data_index, mem });
self
}
fn memory_size(&mut self, mem: u32) -> &mut Self {
self.inject(Operator::MemorySize { mem });
self
}
fn memory_grow(&mut self, mem: u32) -> &mut Self {
self.inject(Operator::MemoryGrow { mem });
self
}
fn memory_fill(&mut self, mem: u32) -> &mut Self {
self.inject(Operator::MemoryFill { mem });
self
}
fn memory_copy(&mut self, dst_mem: u32, src_mem: u32) -> &mut Self {
self.inject(Operator::MemoryCopy { dst_mem, src_mem });
self
}
fn memory_discard(&mut self, mem: u32) -> &mut Self {
self.inject(Operator::MemoryDiscard { mem });
self
}
fn data_drop(&mut self, data_index: u32) -> &mut Self {
self.inject(Operator::DataDrop { data_index });
self
}
fn drop(&mut self) -> &mut Self {
self.inject(Operator::Drop);
self
}
fn i32_load8_s(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Load8S { memarg });
self
}
fn i32_load8_u(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Load8U { memarg });
self
}
fn i32_load16_s(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Load16S { memarg });
self
}
fn i32_load16_u(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Load16U { memarg });
self
}
fn i32_load(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Load { memarg });
self
}
fn i32_store(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Store { memarg });
self
}
fn i32_store8(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Store8 { memarg });
self
}
fn i32_store16(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Store16 { memarg });
self
}
fn i64_load8_s(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load8S { memarg });
self
}
fn i64_load8_u(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load8U { memarg });
self
}
fn i64_load16_s(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load16S { memarg });
self
}
fn i64_load16_u(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load16U { memarg });
self
}
fn i64_load32_s(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load32S { memarg });
self
}
fn i64_load32_u(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load32U { memarg });
self
}
fn i64_load(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load { memarg });
self
}
fn i64_store(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Store { memarg });
self
}
fn f32_load(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::F32Load { memarg });
self
}
fn f32_store(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::F32Store { memarg });
self
}
fn f64_load(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::F64Load { memarg });
self
}
fn f64_store(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::F64Store { memarg });
self
}
fn global_get(&mut self, idx: GlobalID) -> &mut Self {
self.inject(Operator::GlobalGet { global_index: *idx });
self
}
fn global_set(&mut self, idx: GlobalID) -> &mut Self {
self.inject(Operator::GlobalSet { global_index: *idx });
self
}
fn ref_null(&mut self, heap_type: HeapType) -> &mut Self {
self.inject(Operator::RefNull {
hty: wasmparser::HeapType::from(heap_type),
});
self
}
fn ref_is_null(&mut self) -> &mut Self {
self.inject(Operator::RefIsNull);
self
}
fn ref_func(&mut self, function_index: u32) -> &mut Self {
self.inject(Operator::RefFunc { function_index });
self
}
fn ref_eq(&mut self) -> &mut Self {
self.inject(Operator::RefEq);
self
}
fn ref_as_non_null(&mut self) -> &mut Self {
self.inject(Operator::RefAsNonNull);
self
}
fn struct_new(&mut self, struct_type_index: TypeID) -> &mut Self {
self.inject(Operator::StructNew {
struct_type_index: *struct_type_index,
});
self
}
fn struct_new_default(&mut self, struct_type_index: TypeID) -> &mut Self {
self.inject(Operator::StructNewDefault {
struct_type_index: *struct_type_index,
});
self
}
fn struct_get(&mut self, struct_type_index: TypeID, field_index: FieldID) -> &mut Self {
self.inject(Operator::StructGet {
struct_type_index: *struct_type_index,
field_index: *field_index,
});
self
}
fn struct_get_s(&mut self, struct_type_index: TypeID, field_index: FieldID) -> &mut Self {
self.inject(Operator::StructGetS {
struct_type_index: *struct_type_index,
field_index: *field_index,
});
self
}
fn struct_get_u(&mut self, struct_type_index: TypeID, field_index: FieldID) -> &mut Self {
self.inject(Operator::StructGetU {
struct_type_index: *struct_type_index,
field_index: *field_index,
});
self
}
fn struct_set(&mut self, struct_type_index: TypeID, field_index: FieldID) -> &mut Self {
self.inject(Operator::StructSet {
struct_type_index: *struct_type_index,
field_index: *field_index,
});
self
}
fn array_new(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArrayNew {
array_type_index: *array_type_index,
});
self
}
fn array_new_default(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArrayNewDefault {
array_type_index: *array_type_index,
});
self
}
fn array_new_fixed(&mut self, array_type_index: TypeID, array_size: u32) -> &mut Self {
self.inject(Operator::ArrayNewFixed {
array_type_index: *array_type_index,
array_size,
});
self
}
fn array_new_data(
&mut self,
array_type_index: TypeID,
array_data_index: DataSegmentID,
) -> &mut Self {
self.inject(Operator::ArrayNewData {
array_type_index: *array_type_index,
array_data_index: *array_data_index,
});
self
}
fn array_new_elem(
&mut self,
array_type_index: TypeID,
array_elem_index: ElementID,
) -> &mut Self {
self.inject(Operator::ArrayNewElem {
array_type_index: *array_type_index,
array_elem_index: *array_elem_index,
});
self
}
fn array_get(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArrayGet {
array_type_index: *array_type_index,
});
self
}
fn array_get_s(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArrayGetS {
array_type_index: *array_type_index,
});
self
}
fn array_get_u(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArrayGetU {
array_type_index: *array_type_index,
});
self
}
fn array_set(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArraySet {
array_type_index: *array_type_index,
});
self
}
fn array_len(&mut self) -> &mut Self {
self.inject(Operator::ArrayLen);
self
}
fn array_fill(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArrayFill {
array_type_index: *array_type_index,
});
self
}
fn array_copy(
&mut self,
array_type_index_dest: TypeID,
array_type_index_src: TypeID,
) -> &mut Self {
self.inject(Operator::ArrayCopy {
array_type_index_dst: *array_type_index_dest,
array_type_index_src: *array_type_index_src,
});
self
}
fn array_init_data(
&mut self,
array_type_index: TypeID,
array_data_index: DataSegmentID,
) -> &mut Self {
self.inject(Operator::ArrayInitData {
array_type_index: *array_type_index,
array_data_index: *array_data_index,
});
self
}
fn array_init_elem(
&mut self,
array_type_index: TypeID,
array_elem_index: ElementID,
) -> &mut Self {
self.inject(Operator::ArrayInitElem {
array_type_index: *array_type_index,
array_elem_index: *array_elem_index,
});
self
}
fn ref_test(&mut self, heap_type: HeapType) -> &mut Self {
self.inject(Operator::RefTestNonNull {
hty: wasmparser::HeapType::from(heap_type),
});
self
}
fn ref_test_null(&mut self, heap_type: HeapType) -> &mut Self {
self.inject(Operator::RefTestNullable {
hty: wasmparser::HeapType::from(heap_type),
});
self
}
fn ref_cast(&mut self, heap_type: HeapType) -> &mut Self {
self.inject(Operator::RefCastNonNull {
hty: wasmparser::HeapType::from(heap_type),
});
self
}
fn ref_cast_null(&mut self, heap_type: HeapType) -> &mut Self {
self.inject(Operator::RefCastNullable {
hty: wasmparser::HeapType::from(heap_type),
});
self
}
fn any_convert_extern(&mut self) -> &mut Self {
self.inject(Operator::AnyConvertExtern);
self
}
fn extern_convert_any(&mut self) -> &mut Self {
self.inject(Operator::ExternConvertAny);
self
}
fn ref_i31(&mut self) -> &mut Self {
self.inject(Operator::RefI31);
self
}
fn i31_get_s(&mut self) -> &mut Self {
self.inject(Operator::I31GetS);
self
}
fn i31_get_u(&mut self) -> &mut Self {
self.inject(Operator::I31GetU);
self
}
fn v128_load(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Load { memarg });
self
}
fn v128_load8x8_s(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Load8x8S { memarg });
self
}
fn v128_load8x8_u(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Load8x8U { memarg });
self
}
fn v128_load16x4_s(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Load16x4S { memarg });
self
}
fn v128_load16x4_u(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Load16x4U { memarg });
self
}
fn v128_load32x2_s(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Load32x2S { memarg });
self
}
fn v128_load32x2_u(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Load32x2U { memarg });
self
}
fn v128_load8_splat(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Load8Splat { memarg });
self
}
fn v128_load16_splat(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Load16Splat { memarg });
self
}
fn v128_load32_splat(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Load32Splat { memarg });
self
}
fn v128_load64_splat(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Load64Splat { memarg });
self
}
fn v128_load32_zero(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Load32Zero { memarg });
self
}
fn v128_load64_zero(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Load64Zero { memarg });
self
}
fn v128_store(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::V128Store { memarg });
self
}
fn v128_load8_lane(&mut self, memarg: MemArg, lane: u8) -> &mut Self {
self.inject(Operator::V128Load8Lane { memarg, lane });
self
}
fn v128_load16_lane(&mut self, memarg: MemArg, lane: u8) -> &mut Self {
self.inject(Operator::V128Load16Lane { memarg, lane });
self
}
fn v128_load32_lane(&mut self, memarg: MemArg, lane: u8) -> &mut Self {
self.inject(Operator::V128Load32Lane { memarg, lane });
self
}
fn v128_load64_lane(&mut self, memarg: MemArg, lane: u8) -> &mut Self {
self.inject(Operator::V128Load64Lane { memarg, lane });
self
}
fn v128_store8_lane(&mut self, memarg: MemArg, lane: u8) -> &mut Self {
self.inject(Operator::V128Store8Lane { memarg, lane });
self
}
fn v128_store16_lane(&mut self, memarg: MemArg, lane: u8) -> &mut Self {
self.inject(Operator::V128Store16Lane { memarg, lane });
self
}
fn v128_store32_lane(&mut self, memarg: MemArg, lane: u8) -> &mut Self {
self.inject(Operator::V128Store32Lane { memarg, lane });
self
}
fn v128_store64_lane(&mut self, memarg: MemArg, lane: u8) -> &mut Self {
self.inject(Operator::V128Store64Lane { memarg, lane });
self
}
fn v128_const(&mut self, value: V128) -> &mut Self {
self.inject(Operator::V128Const { value });
self
}
fn i8x16_shuffle(&mut self, lanes: [u8; 16]) -> &mut Self {
self.inject(Operator::I8x16Shuffle { lanes });
self
}
fn i8x16_extract_lane_s(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::I8x16ExtractLaneS { lane });
self
}
fn i8x16_extract_lane_u(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::I8x16ExtractLaneU { lane });
self
}
fn i8x16_replace_lane(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::I8x16ReplaceLane { lane });
self
}
fn i16x8_extract_lane_s(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::I16x8ExtractLaneS { lane });
self
}
fn i16x8_extract_lane_u(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::I16x8ExtractLaneU { lane });
self
}
fn i16x8_replace_lane(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::I16x8ReplaceLane { lane });
self
}
fn i32x4_extract_lane(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::I32x4ExtractLane { lane });
self
}
fn i32x4_replace_lane(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::I32x4ReplaceLane { lane });
self
}
fn i64x2_extract_lane(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::I64x2ExtractLane { lane });
self
}
fn i64x2_replace_lane(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::I64x2ReplaceLane { lane });
self
}
fn f32x4_extract_lane(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::F32x4ExtractLane { lane });
self
}
fn f32x4_replace_lane(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::F32x4ReplaceLane { lane });
self
}
fn f64x2_extract_lane(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::F64x2ExtractLane { lane });
self
}
fn f64x2_replace_lane(&mut self, lane: u8) -> &mut Self {
self.inject(Operator::F64x2ReplaceLane { lane });
self
}
fn i8x16_swizzle(&mut self) -> &mut Self {
self.inject(Operator::I8x16Swizzle);
self
}
fn i8x16_splat(&mut self) -> &mut Self {
self.inject(Operator::I8x16Splat);
self
}
fn i16x8_splat(&mut self) -> &mut Self {
self.inject(Operator::I16x8Splat);
self
}
fn i32x4_splat(&mut self) -> &mut Self {
self.inject(Operator::I32x4Splat);
self
}
fn i64x2_splat(&mut self) -> &mut Self {
self.inject(Operator::I64x2Splat);
self
}
fn f32x4_splat(&mut self) -> &mut Self {
self.inject(Operator::F32x4Splat);
self
}
fn f64x2_splat(&mut self) -> &mut Self {
self.inject(Operator::F64x2Splat);
self
}
fn i8x16_eq(&mut self) -> &mut Self {
self.inject(Operator::I8x16Eq);
self
}
fn i8x16_ne(&mut self) -> &mut Self {
self.inject(Operator::I8x16Ne);
self
}
fn i8x16_lt_s(&mut self) -> &mut Self {
self.inject(Operator::I8x16LtS);
self
}
fn i8x16_lt_u(&mut self) -> &mut Self {
self.inject(Operator::I8x16LtU);
self
}
fn i8x16_gt_s(&mut self) -> &mut Self {
self.inject(Operator::I8x16GtS);
self
}
fn i8x16_gt_u(&mut self) -> &mut Self {
self.inject(Operator::I8x16GtU);
self
}
fn i8x16_le_s(&mut self) -> &mut Self {
self.inject(Operator::I8x16LeS);
self
}
fn i8x16_le_u(&mut self) -> &mut Self {
self.inject(Operator::I8x16LeU);
self
}
fn i8x16_ge_s(&mut self) -> &mut Self {
self.inject(Operator::I8x16GeS);
self
}
fn i8x16_ge_u(&mut self) -> &mut Self {
self.inject(Operator::I8x16GeU);
self
}
fn i16x8_eq(&mut self) -> &mut Self {
self.inject(Operator::I16x8Eq);
self
}
fn i16x8_ne(&mut self) -> &mut Self {
self.inject(Operator::I16x8Ne);
self
}
fn i16x8_lt_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8LtS);
self
}
fn i16x8_lt_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8LtU);
self
}
fn i16x8_gt_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8GtS);
self
}
fn i16x8_gt_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8GtU);
self
}
fn i16x8_le_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8LeS);
self
}
fn i16x8_le_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8LeU);
self
}
fn i16x8_ge_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8GeS);
self
}
fn i16x8_ge_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8GeU);
self
}
fn i32x4_eq(&mut self) -> &mut Self {
self.inject(Operator::I32x4Eq);
self
}
fn i32x4_ne(&mut self) -> &mut Self {
self.inject(Operator::I32x4Ne);
self
}
fn i32x4_lt_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4LtS);
self
}
fn i32x4_lt_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4LtU);
self
}
fn i32x4_gt_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4GtS);
self
}
fn i32x4_gt_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4GtU);
self
}
fn i32x4_le_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4LeS);
self
}
fn i32x4_le_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4LeU);
self
}
fn i32x4_ge_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4GeS);
self
}
fn i32x4_ge_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4GeU);
self
}
fn i64x2_eq(&mut self) -> &mut Self {
self.inject(Operator::I64x2Eq);
self
}
fn i64x2_ne(&mut self) -> &mut Self {
self.inject(Operator::I64x2Ne);
self
}
fn i64x2_lt_s(&mut self) -> &mut Self {
self.inject(Operator::I64x2LtS);
self
}
fn i64x2_gt_s(&mut self) -> &mut Self {
self.inject(Operator::I64x2GtS);
self
}
fn i64x2_le_s(&mut self) -> &mut Self {
self.inject(Operator::I64x2LeS);
self
}
fn i64x2_ge_s(&mut self) -> &mut Self {
self.inject(Operator::I64x2GeS);
self
}
fn f32x4_eq(&mut self) -> &mut Self {
self.inject(Operator::F32x4Eq);
self
}
fn f32x4_ne(&mut self) -> &mut Self {
self.inject(Operator::F32x4Ne);
self
}
fn f32x4_lt(&mut self) -> &mut Self {
self.inject(Operator::F32x4Lt);
self
}
fn f32x4_gt(&mut self) -> &mut Self {
self.inject(Operator::F32x4Gt);
self
}
fn f32x4_le(&mut self) -> &mut Self {
self.inject(Operator::F32x4Le);
self
}
fn f32x4_ge(&mut self) -> &mut Self {
self.inject(Operator::F32x4Ge);
self
}
fn f64x2_eq(&mut self) -> &mut Self {
self.inject(Operator::F64x2Eq);
self
}
fn f64x2_ne(&mut self) -> &mut Self {
self.inject(Operator::F64x2Ne);
self
}
fn f64x2_lt(&mut self) -> &mut Self {
self.inject(Operator::F64x2Lt);
self
}
fn f64x2_gt(&mut self) -> &mut Self {
self.inject(Operator::F64x2Gt);
self
}
fn f64x2_le(&mut self) -> &mut Self {
self.inject(Operator::F64x2Le);
self
}
fn f64x2_ge(&mut self) -> &mut Self {
self.inject(Operator::F64x2Ge);
self
}
fn v128_not(&mut self) -> &mut Self {
self.inject(Operator::V128Not);
self
}
fn v128_and(&mut self) -> &mut Self {
self.inject(Operator::V128And);
self
}
fn v128_andnot(&mut self) -> &mut Self {
self.inject(Operator::V128AndNot);
self
}
fn v128_or(&mut self) -> &mut Self {
self.inject(Operator::V128Or);
self
}
fn v128_xor(&mut self) -> &mut Self {
self.inject(Operator::V128Xor);
self
}
fn v128_bitselect(&mut self) -> &mut Self {
self.inject(Operator::V128Bitselect);
self
}
fn v128_any_true(&mut self) -> &mut Self {
self.inject(Operator::V128AnyTrue);
self
}
fn i8x16_abs(&mut self) -> &mut Self {
self.inject(Operator::I8x16Abs);
self
}
fn i8x16_neg(&mut self) -> &mut Self {
self.inject(Operator::I8x16Neg);
self
}
fn i8x16_popcnt(&mut self) -> &mut Self {
self.inject(Operator::I8x16Popcnt);
self
}
fn i8x16_all_true(&mut self) -> &mut Self {
self.inject(Operator::I8x16AllTrue);
self
}
fn i8x16_bitmask(&mut self) -> &mut Self {
self.inject(Operator::I8x16Bitmask);
self
}
fn i8x16_narrow_i16x8_s(&mut self) -> &mut Self {
self.inject(Operator::I8x16NarrowI16x8S);
self
}
fn i8x16_narrow_i16x8_u(&mut self) -> &mut Self {
self.inject(Operator::I8x16NarrowI16x8U);
self
}
fn i8x16_shl(&mut self) -> &mut Self {
self.inject(Operator::I8x16Shl);
self
}
fn i8x16_shr_s(&mut self) -> &mut Self {
self.inject(Operator::I8x16ShrS);
self
}
fn i8x16_shr_u(&mut self) -> &mut Self {
self.inject(Operator::I8x16ShrU);
self
}
fn i8x16_add(&mut self) -> &mut Self {
self.inject(Operator::I8x16Add);
self
}
fn i8x16_add_sat_s(&mut self) -> &mut Self {
self.inject(Operator::I8x16AddSatS);
self
}
fn i8x16_add_sat_u(&mut self) -> &mut Self {
self.inject(Operator::I8x16AddSatU);
self
}
fn i8x16_sub(&mut self) -> &mut Self {
self.inject(Operator::I8x16Sub);
self
}
fn i8x16_sub_sat_s(&mut self) -> &mut Self {
self.inject(Operator::I8x16SubSatS);
self
}
fn i8x16_sub_sat_u(&mut self) -> &mut Self {
self.inject(Operator::I8x16SubSatU);
self
}
fn i8x16_min_s(&mut self) -> &mut Self {
self.inject(Operator::I8x16MinS);
self
}
fn i8x16_min_u(&mut self) -> &mut Self {
self.inject(Operator::I8x16MinU);
self
}
fn i8x16_max_s(&mut self) -> &mut Self {
self.inject(Operator::I8x16MaxS);
self
}
fn i8x16_max_u(&mut self) -> &mut Self {
self.inject(Operator::I8x16MaxU);
self
}
fn i8x16_avgr_u(&mut self) -> &mut Self {
self.inject(Operator::I8x16AvgrU);
self
}
fn i16x8_extadd_pairwise_i8x16_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8ExtAddPairwiseI8x16S);
self
}
fn i16x8_extadd_pairwise_i8x16_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8ExtAddPairwiseI8x16U);
self
}
fn i16x8_abs(&mut self) -> &mut Self {
self.inject(Operator::I16x8Abs);
self
}
fn i16x8_neg(&mut self) -> &mut Self {
self.inject(Operator::I16x8Neg);
self
}
fn i16x8_q15mulr_sat_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8Q15MulrSatS);
self
}
fn i16x8_all_true(&mut self) -> &mut Self {
self.inject(Operator::I16x8AllTrue);
self
}
fn i16x8_bitmask(&mut self) -> &mut Self {
self.inject(Operator::I16x8Bitmask);
self
}
fn i16x8_narrow_i32x4_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8NarrowI32x4S);
self
}
fn i16x8_narrow_i32x4_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8NarrowI32x4U);
self
}
fn i16x8_extend_low_i8x16_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8ExtendLowI8x16S);
self
}
fn i16x8_extend_high_i8x16_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8ExtendHighI8x16S);
self
}
fn i16x8_extend_low_i8x16_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8ExtendLowI8x16U);
self
}
fn i16x8_extend_high_i8x16_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8ExtendHighI8x16U);
self
}
fn i16x8_shl(&mut self) -> &mut Self {
self.inject(Operator::I16x8Shl);
self
}
fn i16x8_shr_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8ShrS);
self
}
fn i16x8_shr_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8ShrU);
self
}
fn i16x8_add(&mut self) -> &mut Self {
self.inject(Operator::I16x8Add);
self
}
fn i16x8_add_sat_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8AddSatS);
self
}
fn i16x8_add_sat_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8AddSatU);
self
}
fn i16x8_sub(&mut self) -> &mut Self {
self.inject(Operator::I16x8Sub);
self
}
fn i16x8_sub_sat_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8SubSatS);
self
}
fn i16x8_sub_sat_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8SubSatU);
self
}
fn i16x8_mul(&mut self) -> &mut Self {
self.inject(Operator::I16x8Mul);
self
}
fn i16x8_min_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8MinS);
self
}
fn i16x8_min_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8MinU);
self
}
fn i16x8_max_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8MaxS);
self
}
fn i16x8_max_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8MaxU);
self
}
fn i16x8_avgr_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8AvgrU);
self
}
fn i16x8_extmul_low_i8x16_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8ExtMulLowI8x16S);
self
}
fn i16x8_extmul_high_i8x16_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8ExtMulHighI8x16S);
self
}
fn i16x8_extmul_low_i8x16_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8ExtMulLowI8x16U);
self
}
fn i16x8_extmul_high_i8x16_u(&mut self) -> &mut Self {
self.inject(Operator::I16x8ExtMulHighI8x16U);
self
}
fn i32x4_extadd_pairwise_i16x8_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4ExtAddPairwiseI16x8S);
self
}
fn i32x4_extadd_pairwise_i16x8_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4ExtAddPairwiseI16x8U);
self
}
fn i32x4_abs(&mut self) -> &mut Self {
self.inject(Operator::I32x4Abs);
self
}
fn i32x4_neg(&mut self) -> &mut Self {
self.inject(Operator::I32x4Neg);
self
}
fn i32x4_all_true(&mut self) -> &mut Self {
self.inject(Operator::I32x4AllTrue);
self
}
fn i32x4_bitmask(&mut self) -> &mut Self {
self.inject(Operator::I32x4Bitmask);
self
}
fn i32x4_extend_low_i16x8_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4ExtendLowI16x8S);
self
}
fn i32x4_extend_high_i16x8_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4ExtendHighI16x8S);
self
}
fn i32x4_extend_low_i16x8_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4ExtendLowI16x8U);
self
}
fn i32x4_extend_high_i16x8_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4ExtendHighI16x8U);
self
}
fn i32x4_shl(&mut self) -> &mut Self {
self.inject(Operator::I32x4Shl);
self
}
fn i32x4_shr_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4ShrS);
self
}
fn i32x4_shr_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4ShrU);
self
}
fn i32x4_add(&mut self) -> &mut Self {
self.inject(Operator::I32x4Add);
self
}
fn i32x4_sub(&mut self) -> &mut Self {
self.inject(Operator::I32x4Sub);
self
}
fn i32x4_mul(&mut self) -> &mut Self {
self.inject(Operator::I32x4Mul);
self
}
fn i32x4_min_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4MinS);
self
}
fn i32x4_min_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4MinU);
self
}
fn i32x4_max_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4MaxS);
self
}
fn i32x4_max_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4MaxU);
self
}
fn i32x4_dot_i16x8_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4DotI16x8S);
self
}
fn i32x4_extmul_low_i16x8_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4ExtMulLowI16x8S);
self
}
fn i32x4_extmul_high_i16x8_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4ExtMulHighI16x8S);
self
}
fn i32x4_extmul_low_i16x8_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4ExtMulLowI16x8U);
self
}
fn i32x4_extmul_high_i16x8_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4ExtMulHighI16x8U);
self
}
fn i64x2_abs(&mut self) -> &mut Self {
self.inject(Operator::I64x2Abs);
self
}
fn i64x2_neg(&mut self) -> &mut Self {
self.inject(Operator::I64x2Neg);
self
}
fn i64x2_all_true(&mut self) -> &mut Self {
self.inject(Operator::I64x2AllTrue);
self
}
fn i64x2_bitmask(&mut self) -> &mut Self {
self.inject(Operator::I64x2Bitmask);
self
}
fn i64x2_extend_low_i32x4_s(&mut self) -> &mut Self {
self.inject(Operator::I64x2ExtendLowI32x4S);
self
}
fn i64x2_extend_high_i32x4_s(&mut self) -> &mut Self {
self.inject(Operator::I64x2ExtendHighI32x4S);
self
}
fn i64x2_extend_low_i32x4_u(&mut self) -> &mut Self {
self.inject(Operator::I64x2ExtendLowI32x4U);
self
}
fn i64x2_extend_high_i32x4_u(&mut self) -> &mut Self {
self.inject(Operator::I64x2ExtendHighI32x4U);
self
}
fn i64x2_shl(&mut self) -> &mut Self {
self.inject(Operator::I64x2Shl);
self
}
fn i64x2_shr_s(&mut self) -> &mut Self {
self.inject(Operator::I64x2ShrS);
self
}
fn i64x2_shr_u(&mut self) -> &mut Self {
self.inject(Operator::I64x2ShrU);
self
}
fn i64x2_add(&mut self) -> &mut Self {
self.inject(Operator::I64x2Add);
self
}
fn i64x2_sub(&mut self) -> &mut Self {
self.inject(Operator::I64x2Sub);
self
}
fn i64x2_mul(&mut self) -> &mut Self {
self.inject(Operator::I64x2Mul);
self
}
fn i64x2_extmul_low_i32x4_s(&mut self) -> &mut Self {
self.inject(Operator::I64x2ExtMulLowI32x4S);
self
}
fn i64x2_extmul_high_i32x4_s(&mut self) -> &mut Self {
self.inject(Operator::I64x2ExtMulHighI32x4S);
self
}
fn i64x2_extmul_low_i32x4_u(&mut self) -> &mut Self {
self.inject(Operator::I64x2ExtMulLowI32x4U);
self
}
fn i64x2_extmul_high_i32x4_u(&mut self) -> &mut Self {
self.inject(Operator::I64x2ExtMulHighI32x4U);
self
}
fn f32x4_ceil(&mut self) -> &mut Self {
self.inject(Operator::F32x4Ceil);
self
}
fn f32x4_floor(&mut self) -> &mut Self {
self.inject(Operator::F32x4Floor);
self
}
fn f32x4_trunc(&mut self) -> &mut Self {
self.inject(Operator::F32x4Trunc);
self
}
fn f32x4_nearest(&mut self) -> &mut Self {
self.inject(Operator::F32x4Nearest);
self
}
fn f32x4_abs(&mut self) -> &mut Self {
self.inject(Operator::F32x4Abs);
self
}
fn f32x4_neg(&mut self) -> &mut Self {
self.inject(Operator::F32x4Neg);
self
}
fn f32x4_sqrt(&mut self) -> &mut Self {
self.inject(Operator::F32x4Sqrt);
self
}
fn f32x4_add(&mut self) -> &mut Self {
self.inject(Operator::F32x4Add);
self
}
fn f32x4_sub(&mut self) -> &mut Self {
self.inject(Operator::F32x4Sub);
self
}
fn f32x4_mul(&mut self) -> &mut Self {
self.inject(Operator::F32x4Mul);
self
}
fn f32x4_div(&mut self) -> &mut Self {
self.inject(Operator::F32x4Div);
self
}
fn f32x4_min(&mut self) -> &mut Self {
self.inject(Operator::F32x4Min);
self
}
fn f32x4_max(&mut self) -> &mut Self {
self.inject(Operator::F32x4Max);
self
}
fn f32x4_pmin(&mut self) -> &mut Self {
self.inject(Operator::F32x4PMin);
self
}
fn f32x4_pmax(&mut self) -> &mut Self {
self.inject(Operator::F32x4PMax);
self
}
fn f64x2_ceil(&mut self) -> &mut Self {
self.inject(Operator::F64x2Ceil);
self
}
fn f64x2_floor(&mut self) -> &mut Self {
self.inject(Operator::F64x2Floor);
self
}
fn f64x2_trunc(&mut self) -> &mut Self {
self.inject(Operator::F64x2Trunc);
self
}
fn f64x2_nearest(&mut self) -> &mut Self {
self.inject(Operator::F64x2Nearest);
self
}
fn f64x2_abs(&mut self) -> &mut Self {
self.inject(Operator::F64x2Abs);
self
}
fn f64x2_neg(&mut self) -> &mut Self {
self.inject(Operator::F64x2Neg);
self
}
fn f64x2_sqrt(&mut self) -> &mut Self {
self.inject(Operator::F64x2Sqrt);
self
}
fn f64x2_add(&mut self) -> &mut Self {
self.inject(Operator::F64x2Add);
self
}
fn f64x2_sub(&mut self) -> &mut Self {
self.inject(Operator::F64x2Sub);
self
}
fn f64x2_mul(&mut self) -> &mut Self {
self.inject(Operator::F64x2Mul);
self
}
fn f64x2_div(&mut self) -> &mut Self {
self.inject(Operator::F64x2Div);
self
}
fn f64x2_min(&mut self) -> &mut Self {
self.inject(Operator::F64x2Min);
self
}
fn f64x2_max(&mut self) -> &mut Self {
self.inject(Operator::F64x2Max);
self
}
fn f64x2_pmin(&mut self) -> &mut Self {
self.inject(Operator::F64x2PMin);
self
}
fn f64x2_pmax(&mut self) -> &mut Self {
self.inject(Operator::F64x2PMax);
self
}
fn i32x4_trunc_sat_f32x4_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4TruncSatF32x4S);
self
}
fn i32x4_trunc_sat_f32x4_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4TruncSatF32x4U);
self
}
fn f32x4_convert_i32x4_s(&mut self) -> &mut Self {
self.inject(Operator::F32x4ConvertI32x4S);
self
}
fn f32x4_convert_i32x4_u(&mut self) -> &mut Self {
self.inject(Operator::F32x4ConvertI32x4U);
self
}
fn i32x4_trunc_sat_f64x2_s_zero(&mut self) -> &mut Self {
self.inject(Operator::I32x4TruncSatF64x2SZero);
self
}
fn i32x4_trunc_sat_f64x2_u_zero(&mut self) -> &mut Self {
self.inject(Operator::I32x4TruncSatF64x2UZero);
self
}
fn f64x2_convert_low_i32x4_s(&mut self) -> &mut Self {
self.inject(Operator::F64x2ConvertLowI32x4S);
self
}
fn f64x2_convert_low_i32x4_u(&mut self) -> &mut Self {
self.inject(Operator::F64x2ConvertLowI32x4U);
self
}
fn f32x4_demote_f64x2_zero(&mut self) -> &mut Self {
self.inject(Operator::F32x4DemoteF64x2Zero);
self
}
fn f64x2_promote_low_f32x4(&mut self) -> &mut Self {
self.inject(Operator::F64x2PromoteLowF32x4);
self
}
fn i8x16_relaxed_swizzle(&mut self) -> &mut Self {
self.inject(Operator::I8x16RelaxedSwizzle);
self
}
fn i32x4_relaxed_trunc_f32x4_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4RelaxedTruncF32x4S);
self
}
fn i32x4_relaxed_trunc_f32x4_u(&mut self) -> &mut Self {
self.inject(Operator::I32x4RelaxedTruncF32x4U);
self
}
fn i32x4_relaxed_trunc_f64x2_s_zero(&mut self) -> &mut Self {
self.inject(Operator::I32x4RelaxedTruncF64x2SZero);
self
}
fn i32x4_relaxed_trunc_f64x2_u_zero(&mut self) -> &mut Self {
self.inject(Operator::I32x4RelaxedTruncF64x2UZero);
self
}
fn f32x4_relaxed_madd(&mut self) -> &mut Self {
self.inject(Operator::F32x4RelaxedMadd);
self
}
fn f32x4_relaxed_nmadd(&mut self) -> &mut Self {
self.inject(Operator::F32x4RelaxedNmadd);
self
}
fn f64x2_relaxed_madd(&mut self) -> &mut Self {
self.inject(Operator::F64x2RelaxedMadd);
self
}
fn f64x2_relaxed_nmadd(&mut self) -> &mut Self {
self.inject(Operator::F64x2RelaxedNmadd);
self
}
fn i8x16_relaxed_laneselect(&mut self) -> &mut Self {
self.inject(Operator::I8x16RelaxedLaneselect);
self
}
fn i16x8_relaxed_laneselect(&mut self) -> &mut Self {
self.inject(Operator::I16x8RelaxedLaneselect);
self
}
fn i32x4_relaxed_laneselect(&mut self) -> &mut Self {
self.inject(Operator::I32x4RelaxedLaneselect);
self
}
fn i64x2_relaxed_laneselect(&mut self) -> &mut Self {
self.inject(Operator::I64x2RelaxedLaneselect);
self
}
fn f32x4_relaxed_min(&mut self) -> &mut Self {
self.inject(Operator::F32x4RelaxedMin);
self
}
fn f32x4_relaxed_max(&mut self) -> &mut Self {
self.inject(Operator::F32x4RelaxedMax);
self
}
fn f64x2_relaxed_min(&mut self) -> &mut Self {
self.inject(Operator::F64x2RelaxedMin);
self
}
fn f64x2_relaxed_max(&mut self) -> &mut Self {
self.inject(Operator::F64x2RelaxedMax);
self
}
fn i16x8_relaxed_q15mulr_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8RelaxedQ15mulrS);
self
}
fn i16x8_relaxed_dot_i8x16_i7x16_s(&mut self) -> &mut Self {
self.inject(Operator::I16x8RelaxedDotI8x16I7x16S);
self
}
fn i32x4_relaxed_dot_i8x16_i7x16_add_s(&mut self) -> &mut Self {
self.inject(Operator::I32x4RelaxedDotI8x16I7x16AddS);
self
}
}
#[allow(dead_code)]
pub trait MacroOpcode<'a>: Inject<'a> {
fn u32_const(&mut self, value: u32) -> &mut Self {
let i32_val = value as i32;
self.inject(Operator::I32Const { value: i32_val });
self
}
fn u64_const(&mut self, value: u64) -> &mut Self {
let i64_val = value as i64;
self.inject(Operator::I64Const { value: i64_val });
self
}
}