use crate::ir::{ArgumentExtension, StackSlot};
use crate::machinst::*;
use crate::settings;
use regalloc::{Reg, Set, SpillSlot, Writable};
pub trait ABIBody {
type I: VCodeInst;
fn flags(&self) -> &settings::Flags;
fn liveins(&self) -> Set<RealReg>;
fn liveouts(&self) -> Set<RealReg>;
fn num_args(&self) -> usize;
fn num_retvals(&self) -> usize;
fn num_stackslots(&self) -> usize;
fn gen_copy_arg_to_reg(&self, idx: usize, into_reg: Writable<Reg>) -> Self::I;
fn gen_copy_reg_to_retval(
&self,
idx: usize,
from_reg: Writable<Reg>,
ext: ArgumentExtension,
) -> Vec<Self::I>;
fn gen_ret(&self) -> Self::I;
fn gen_epilogue_placeholder(&self) -> Self::I;
fn set_num_spillslots(&mut self, slots: usize);
fn set_clobbered(&mut self, clobbered: Set<Writable<RealReg>>);
fn stackslot_addr(&self, slot: StackSlot, offset: u32, into_reg: Writable<Reg>) -> Self::I;
fn load_stackslot(
&self,
slot: StackSlot,
offset: u32,
ty: Type,
into_reg: Writable<Reg>,
) -> Self::I;
fn store_stackslot(&self, slot: StackSlot, offset: u32, ty: Type, from_reg: Reg) -> Self::I;
fn load_spillslot(&self, slot: SpillSlot, ty: Type, into_reg: Writable<Reg>) -> Self::I;
fn store_spillslot(&self, slot: SpillSlot, ty: Type, from_reg: Reg) -> Self::I;
fn gen_prologue(&mut self) -> Vec<Self::I>;
fn gen_epilogue(&self) -> Vec<Self::I>;
fn frame_size(&self) -> u32;
fn get_spillslot_size(&self, rc: RegClass, ty: Type) -> u32;
fn gen_spill(&self, to_slot: SpillSlot, from_reg: RealReg, ty: Type) -> Self::I;
fn gen_reload(&self, to_reg: Writable<RealReg>, from_slot: SpillSlot, ty: Type) -> Self::I;
}
pub trait ABICall {
type I: VCodeInst;
fn num_args(&self) -> usize;
fn gen_copy_reg_to_arg<C: LowerCtx<I = Self::I>>(
&self,
ctx: &mut C,
idx: usize,
from_reg: Reg,
) -> Vec<Self::I>;
fn gen_copy_retval_to_reg(&self, idx: usize, into_reg: Writable<Reg>) -> Self::I;
fn gen_stack_pre_adjust(&self) -> Vec<Self::I>;
fn gen_stack_post_adjust(&self) -> Vec<Self::I>;
fn gen_call(&self) -> Vec<Self::I>;
}