use super::indices;
use super::types::{reftype::RefType, valtype::ValType};
#[derive(Debug, Clone, PartialEq)]
pub enum Instruction {
Unreachable,
Nop,
Block(BlockType, Vec<Instruction>),
Loop(BlockType, Vec<Instruction>),
If(BlockType, Vec<Instruction>, Option<Vec<Instruction>>),
Br(indices::LabelIdx),
BrIf(indices::LabelIdx),
BrTable(Vec<indices::LabelIdx>, indices::LabelIdx),
Return,
Call(indices::FuncIdx),
CallIndirect(indices::TableIdx, indices::TypeIdx),
RefNull(RefType),
RefIsNull,
RefFunc(indices::FuncIdx),
Drop,
Select(Option<Vec<ValType>>),
LocalGet(indices::LocalIdx),
LocalSet(indices::LocalIdx),
LocalTee(indices::LocalIdx),
GlobalGet(indices::GlobalIdx),
GlobalSet(indices::GlobalIdx),
TableGet(indices::TableIdx),
TableSet(indices::TableIdx),
TableInit(indices::TableIdx, indices::ElemIdx),
ElemDrop(indices::ElemIdx),
TableCopy(indices::TableIdx, indices::TableIdx),
TableGrow(indices::TableIdx),
TableSize(indices::TableIdx),
TableFill(indices::TableIdx),
I32Load(Memarg),
I64Load(Memarg),
F32Load(Memarg),
F64Load(Memarg),
I32Load8s(Memarg),
I32Load8u(Memarg),
I32Load16s(Memarg),
I32Load16u(Memarg),
I64Load8s(Memarg),
I64Load8u(Memarg),
I64Load16s(Memarg),
I64Load16u(Memarg),
I64Load32s(Memarg),
I64Load32u(Memarg),
I32Store(Memarg),
I64Store(Memarg),
F32Store(Memarg),
F64Store(Memarg),
I32Store8(Memarg),
I32Store16(Memarg),
I64Store8(Memarg),
I64Store16(Memarg),
I64Store32(Memarg),
MemorySize,
MemoryGrow,
MemoryInit(indices::DataIdx),
DataDrop(indices::DataIdx),
MemoryCopy,
MemoryFill,
I32Const(i32),
I64Const(i64),
F32Const(f32),
F64Const(f64),
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,
I64ExtendI32S,
I64ExtendI32U,
I64TruncF32S,
I64TruncF32U,
I64TruncF64S,
I64TruncF64U,
F32ConvertI32S,
F32ConvertI32U,
F32ConvertI64S,
F32ConvertI64U,
F32DemoteF64,
F64ConvertI32S,
F64ConvertI32U,
F64ConvertI64S,
F64ConvertI64U,
F64PromoteF32,
I32ReinterpretF32,
I64ReinterpretF64,
F32ReinterpretI32,
F64ReinterpretI64,
I32Extend8S,
I32Extend16S,
I64Extend8S,
I64Extend16S,
I64Extend32S,
I32TruncSatF32S,
I32TruncSatF32U,
I32TruncSatF64S,
I32TruncSatF64U,
I64TruncSatF32S,
I64TruncSatF32U,
I64TruncSatF64S,
I64TruncSatF64U,
V128Load(Memarg),
V128Load8x8S(Memarg),
V128Load8x8U(Memarg),
V128Load16x4S(Memarg),
V128Load16x4U(Memarg),
V128Load32x2S(Memarg),
V128Load32x2U(Memarg),
V128Load8Splat(Memarg),
V128Load16Splat(Memarg),
V128Load32Splat(Memarg),
V128Load64Splat(Memarg),
V128Load32Zero(Memarg),
V128Load64Zero(Memarg),
V128Store(Memarg),
V128Load8Lane(Memarg, LaneIdx),
V128Load16Lane(Memarg, LaneIdx),
V128Load32Lane(Memarg, LaneIdx),
V128Load64Lane(Memarg, LaneIdx),
V128Store8Lane(Memarg, LaneIdx),
V128Store16Lane(Memarg, LaneIdx),
V128Store32Lane(Memarg, LaneIdx),
V128Store64Lane(Memarg, LaneIdx),
V128Const([u8; 16]),
I8x16Shuffle([LaneIdx; 16]),
I8x16ExtractLaneS(LaneIdx),
I8x16ExtractLaneU(LaneIdx),
I8x16ReplaceLane(LaneIdx),
I16x8ExtractLaneS(LaneIdx),
I16x8ExtractLaneU(LaneIdx),
I16x8ReplaceLane(LaneIdx),
I32x4ExtractLane(LaneIdx),
I32x4ReplaceLane(LaneIdx),
I64x2ExtractLane(LaneIdx),
I64x2ReplaceLane(LaneIdx),
F32x4ExtractLane(LaneIdx),
F32x4ReplaceLane(LaneIdx),
F64x2ExtractLane(LaneIdx),
F64x2ReplaceLane(LaneIdx),
I8x16Swizzle,
I8x16Splat,
I16x8Splat,
I32x4Splat,
I64x2Splat,
F32x4Splat,
F64x2Splat,
I8x16Eq,
I8x16Ne,
I8x16LtS,
I8x16LtU,
I8x16GtS,
I8x16GtU,
I8x16LeS,
I8x16LeU,
I8x16GeS,
I8x16GeU,
I16x8Eq,
I16x8Ne,
I16x8LtS,
I16x8LtU,
I16x8GtS,
I16x8GtU,
I16x8LeS,
I16x8LeU,
I16x8GeS,
I16x8GeU,
I32x4Eq,
I32x4Ne,
I32x4LtS,
I32x4LtU,
I32x4GtS,
I32x4GtU,
I32x4LeS,
I32x4LeU,
I32x4GeS,
I32x4GeU,
I64x2Eq,
I64x2Ne,
I64x2LtS,
I64x2GtS,
I64x2LeS,
I64x2GeS,
F32x4Eq,
F32x4Ne,
F32x4Lt,
F32x4Gt,
F32x4Le,
F32x4Ge,
F64x2Eq,
F64x2Ne,
F64x2Lt,
F64x2Gt,
F64x2Le,
F64x2Ge,
V128Not,
V128And,
V128AndNot,
V128Or,
V128Xor,
V128Bitselect,
V128AnyTrue,
I8x16Abs,
I8x16Neg,
I8x16Popcnt,
I8x16AllTrue,
I8x16Bitmask,
I8x16NarrowI16x8S,
I8x16NarrowI16x8U,
I8x16Shl,
I8x16ShrS,
I8x16ShrU,
I8x16Add,
I8x16AddSatS,
I8x16AddSatU,
I8x16Sub,
I8x16SubSatS,
I8x16SubSatU,
I8x16MinS,
I8x16MinU,
I8x16MaxS,
I8x16MaxU,
I8x16AvgrU,
I16x8ExtaddPairwiseI8x16S,
I16x8ExtaddPairwiseI8x16U,
I16x8Abs,
I16x8Neg,
I16x8Q15MulrSatS,
I16x8AllTrue,
I16x8Bitmask,
I16x8NarrowI32x4S,
I16x8NarrowI32x4U,
I16x8ExtendLowI8x16S,
I16x8ExtendHighI8x16S,
I16x8ExtendLowI8x16U,
I16x8ExtendHighI8x16U,
I16x8Shl,
I16x8ShrS,
I16x8ShrU,
I16x8Add,
I16x8AddSatS,
I16x8AddSatU,
I16x8Sub,
I16x8SubSatS,
I16x8SubSatU,
I16x8Mul,
I16x8MinS,
I16x8MinU,
I16x8MaxS,
I16x8MaxU,
I16x8AvgrU,
I16x8ExtmulLowI8x16S,
I16x8ExtmulHighI8x16S,
I16x8ExtmulLowI8x16U,
I16x8ExtmulHighI8x16U,
I32x4ExtaddPairwiseI16x8S,
I32x4ExtaddPairwiseI16x8U,
I32x4Abs,
I32x4Neg,
I32x4AllTrue,
I32x4Bitmask,
I32x4ExtendLowI16x8S,
I32x4ExtendHighI16x8S,
I32x4ExtendLowI16x8U,
I32x4ExtendHighI16x8U,
I32x4Shl,
I32x4ShrS,
I32x4ShrU,
I32x4Add,
I32x4Sub,
I32x4Mul,
I32x4MinS,
I32x4MinU,
I32x4MaxS,
I32x4MaxU,
I32x4DotI16x8S,
I32x4ExtmulLowI16x8S,
I32x4ExtmulHighI16x8S,
I32x4ExtmulLowI16x8U,
I32x4ExtmulHighI16x8U,
I64x2Abs,
I64x2Neg,
I64x2AllTrue,
I64x2Bitmask,
I64x2ExtendLowI32x4S,
I64x2ExtendHighI32x4S,
I64x2ExtendLowI32x4U,
I64x2ExtendHighI32x4U,
I64x2Shl,
I64x2ShrS,
I64x2ShrU,
I64x2Add,
I64x2Sub,
I64x2Mul,
I64x2ExtmulLowI32x4S,
I64x2ExtmulHighI32x4S,
I64x2ExtmulLowI32x4U,
I64x2ExtmulHighI32x4U,
F32x4Ceil,
F32x4Floor,
F32x4Trunc,
F32x4Nearest,
F32x4Abs,
F32x4Neg,
F32x4Sqrt,
F32x4Add,
F32x4Sub,
F32x4Mul,
F32x4Div,
F32x4Min,
F32x4Max,
F32x4PMin,
F32x4PMax,
F64x2Ceil,
F64x2Floor,
F64x2Trunc,
F64x2Nearest,
F64x2Abs,
F64x2Neg,
F64x2Sqrt,
F64x2Add,
F64x2Sub,
F64x2Mul,
F64x2Div,
F64x2Min,
F64x2Max,
F64x2PMin,
F64x2PMax,
I32x4TruncSatF32x4S,
I32x4TruncSatF32x4U,
F32x4ConvertI32x4S,
F32x4ConvertI32x4U,
I32x4TruncSatF64x2SZero,
I32x4TruncSatF64x2UZero,
F64x2ConvertLowI32x4S,
F64x2ConvertLowI32x4U,
F32x4DemoteF64x2Zero,
F64x2PromoteLowF32x4,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Memarg {
pub align: u32,
pub offset: u32,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct LaneIdx(pub u8);
#[derive(Debug, Clone, PartialEq)]
pub enum BlockType {
Empty,
T(ValType),
X(u32),
}