mod bin_op;
mod cmp;
mod inst_display;
mod unary_op;
pub use bin_op::{FloatBinOp, IntBinOp};
pub use cmp::{FloatCmp, IntCmp};
pub use unary_op::{FloatUnaryOp, IntUnaryOp};
use crate::{Block, Const, IRType, Offset, Value, Variable};
#[derive(Clone)]
pub enum Inst {
Alloc { size: u32, align: u32, dst: Value },
Load {
ty: IRType,
src_ptr: Value,
src_offset: Offset,
dst: Value,
},
Store {
src: Value,
dst_ptr: Value,
dst_offset: Offset,
},
Memcpy {
size: u32,
src_ptr: Value,
dst_ptr: Value,
},
Memset {
size: u32,
value: u8,
dst_ptr: Value,
},
Const { value: Const, dst: Value },
Assign { var: Variable, src: Value },
LoadVar { var: Variable, dst: Value },
Jump { block: Block, args: Vec<Value> },
Brif {
cond: Value,
then_block: Block,
then_args: Vec<Value>,
else_block: Block,
else_args: Vec<Value>,
},
Return { vals: Vec<Value> },
Select {
cond: Value,
then_val: Value,
else_val: Value,
dst: Value,
},
IResize {
src: Value,
dst_ty: IRType,
dst: Value,
},
FResize {
src: Value,
dst_ty: IRType,
dst: Value,
},
IToF {
src: Value,
dst_ty: IRType,
dst: Value,
},
FToI {
src: Value,
dst_ty: IRType,
dst: Value,
},
PtrAdd {
ptr: Value,
offset: Offset,
dst: Value,
},
IBinOp {
op: IntBinOp,
lhs: Value,
rhs: Value,
dst: Value,
},
FBinOp {
op: FloatBinOp,
lhs: Value,
rhs: Value,
dst: Value,
},
IUnaryOp {
op: IntUnaryOp,
operand: Value,
dst: Value,
},
FUnaryOp {
op: FloatUnaryOp,
operand: Value,
dst: Value,
},
ICmp {
cmp: IntCmp,
lhs: Value,
rhs: Value,
dst: Value,
},
FCmp {
cmp: FloatCmp,
lhs: Value,
rhs: Value,
dst: Value,
},
ICmpImm {
cmp: IntCmp,
lhs: Value,
rhs: i64,
dst: Value,
},
}
impl Inst {
pub(crate) fn successors(&self) -> Vec<Block> {
match self {
Inst::Jump { block, .. } => vec![*block],
Inst::Brif {
then_block,
else_block,
..
} => vec![*then_block, *else_block],
_ => vec![],
}
}
}