use crate::binemit::Stackmap;
use crate::ir::{ArgumentExtension, StackSlot};
use crate::machinst::*;
use crate::settings;
use regalloc::{Reg, Set, SpillSlot, Writable};
pub trait ABIBody {
type I: VCodeInst;
fn temp_needed(&self) -> bool;
fn init(&mut self, maybe_tmp: Option<Writable<Reg>>);
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_retval_area_setup(&self) -> Option<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 spillslots_to_stackmap(
&self,
slots: &[SpillSlot],
state: &<Self::I as MachInstEmit>::State,
) -> Stackmap;
fn gen_prologue(&mut self) -> Vec<Self::I>;
fn gen_epilogue(&self) -> Vec<Self::I>;
fn frame_size(&self) -> u32;
fn stack_args_size(&self) -> u32;
fn get_spillslot_size(&self, rc: RegClass, ty: Type) -> u32;
fn gen_spill(&self, to_slot: SpillSlot, from_reg: RealReg, ty: Option<Type>) -> Self::I;
fn gen_reload(
&self,
to_reg: Writable<RealReg>,
from_slot: SpillSlot,
ty: Option<Type>,
) -> Self::I;
}
pub trait ABICall {
type I: VCodeInst;
fn num_args(&self) -> usize;
fn emit_copy_reg_to_arg<C: LowerCtx<I = Self::I>>(
&self,
ctx: &mut C,
idx: usize,
from_reg: Reg,
);
fn emit_copy_retval_to_reg<C: LowerCtx<I = Self::I>>(
&self,
ctx: &mut C,
idx: usize,
into_reg: Writable<Reg>,
);
fn emit_stack_pre_adjust<C: LowerCtx<I = Self::I>>(&self, ctx: &mut C);
fn emit_stack_post_adjust<C: LowerCtx<I = Self::I>>(&self, ctx: &mut C);
fn emit_call<C: LowerCtx<I = Self::I>>(&mut self, ctx: &mut C);
}