use super::{FuncAddr, GlobalAddr, LabelAddr, LocalAddr, TableAddr, TypeAddr, ValType};
use crate::{DataAddr, ElemAddr, MemAddr};
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "archive", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize), archive(check_bytes))]
pub enum BlockArgs {
Empty,
Type(ValType),
FuncType(u32),
}
#[derive(Debug, Copy, Clone, PartialEq)]
#[cfg_attr(feature = "archive", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize), archive(check_bytes))]
pub struct MemoryArg {
pub mem_addr: MemAddr,
pub align: u8,
pub align_max: u8,
pub offset: u64,
}
type BrTableDefault = u32;
type BrTableLen = usize;
type EndOffset = usize;
type ElseOffset = usize;
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "archive", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize), archive(check_bytes))]
pub enum ConstInstruction {
I32Const(i32),
I64Const(i64),
F32Const(f32),
F64Const(f64),
GlobalGet(GlobalAddr),
RefNull(ValType),
RefFunc(FuncAddr),
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "archive", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize), archive(check_bytes))]
pub enum Instruction {
BrLabel(LabelAddr),
Unreachable,
Nop,
Block(BlockArgs, EndOffset),
Loop(BlockArgs, EndOffset),
If(BlockArgs, Option<ElseOffset>, EndOffset),
Else(EndOffset),
EndBlockFrame,
EndFunc,
Br(LabelAddr),
BrIf(LabelAddr),
BrTable(BrTableDefault, BrTableLen), Return,
Call(FuncAddr),
CallIndirect(TypeAddr, TableAddr),
Drop,
Select(Option<ValType>),
LocalGet(LocalAddr),
LocalSet(LocalAddr),
LocalTee(LocalAddr),
GlobalGet(GlobalAddr),
GlobalSet(GlobalAddr),
I32Load(MemoryArg),
I64Load(MemoryArg),
F32Load(MemoryArg),
F64Load(MemoryArg),
I32Load8S(MemoryArg),
I32Load8U(MemoryArg),
I32Load16S(MemoryArg),
I32Load16U(MemoryArg),
I64Load8S(MemoryArg),
I64Load8U(MemoryArg),
I64Load16S(MemoryArg),
I64Load16U(MemoryArg),
I64Load32S(MemoryArg),
I64Load32U(MemoryArg),
I32Store(MemoryArg),
I64Store(MemoryArg),
F32Store(MemoryArg),
F64Store(MemoryArg),
I32Store8(MemoryArg),
I32Store16(MemoryArg),
I64Store8(MemoryArg),
I64Store16(MemoryArg),
I64Store32(MemoryArg),
MemorySize(MemAddr, u8),
MemoryGrow(MemAddr, u8),
I32Const(i32),
I64Const(i64),
F32Const(f32),
F64Const(f64),
RefNull(ValType),
RefFunc(FuncAddr),
RefIsNull,
I32Eqz,
I32Eq,
I32Ne,
I32LtS,
I32LtU,
I32GtS,
I32GtU,
I32LeS,
I32LeU,
I32GeS,
I32GeU,
I64Eqz,
I64Eq,
I64Ne,
I64LtS,
I64LtU,
I64GtS,
I64GtU,
I64LeS,
I64LeU,
I64GeS,
I64GeU,
F32Eq,
F32Ne,
F32Lt,
F32Gt,
F32Le,
F32Ge,
F64Eq,
F64Ne,
F64Lt,
F64Gt,
F64Le,
F64Ge,
I32Clz,
I32Ctz,
I32Popcnt,
I32Add,
I32Sub,
I32Mul,
I32DivS,
I32DivU,
I32RemS,
I32RemU,
I32And,
I32Or,
I32Xor,
I32Shl,
I32ShrS,
I32ShrU,
I32Rotl,
I32Rotr,
I64Clz,
I64Ctz,
I64Popcnt,
I64Add,
I64Sub,
I64Mul,
I64DivS,
I64DivU,
I64RemS,
I64RemU,
I64And,
I64Or,
I64Xor,
I64Shl,
I64ShrS,
I64ShrU,
I64Rotl,
I64Rotr,
F32Abs,
F32Neg,
F32Ceil,
F32Floor,
F32Trunc,
F32Nearest,
F32Sqrt,
F32Add,
F32Sub,
F32Mul,
F32Div,
F32Min,
F32Max,
F32Copysign,
F64Abs,
F64Neg,
F64Ceil,
F64Floor,
F64Trunc,
F64Nearest,
F64Sqrt,
F64Add,
F64Sub,
F64Mul,
F64Div,
F64Min,
F64Max,
F64Copysign,
I32WrapI64,
I32TruncF32S,
I32TruncF32U,
I32TruncF64S,
I32TruncF64U,
I32Extend8S,
I32Extend16S,
I64Extend8S,
I64Extend16S,
I64Extend32S,
I64ExtendI32S,
I64ExtendI32U,
I64TruncF32S,
I64TruncF32U,
I64TruncF64S,
I64TruncF64U,
F32ConvertI32S,
F32ConvertI32U,
F32ConvertI64S,
F32ConvertI64U,
F32DemoteF64,
F64ConvertI32S,
F64ConvertI32U,
F64ConvertI64S,
F64ConvertI64U,
F64PromoteF32,
I32ReinterpretF32,
I64ReinterpretF64,
F32ReinterpretI32,
F64ReinterpretI64,
I32TruncSatF32S,
I32TruncSatF32U,
I32TruncSatF64S,
I32TruncSatF64U,
I64TruncSatF32S,
I64TruncSatF32U,
I64TruncSatF64S,
I64TruncSatF64U,
TableInit(TableAddr, ElemAddr),
TableGet(TableAddr),
TableSet(TableAddr),
TableCopy { from: TableAddr, to: TableAddr },
TableGrow(TableAddr),
TableSize(TableAddr),
TableFill(TableAddr),
MemoryInit(MemAddr, DataAddr),
MemoryCopy(MemAddr, MemAddr),
MemoryFill(MemAddr),
DataDrop(DataAddr),
}