use crate::runtime::context::CpuContext;
pub struct CallingConvention;
impl CallingConvention {
pub fn setup_stack_frame(ctx: &mut CpuContext, frame_size: u32) {
let old_sp = ctx.get_register(1);
let new_sp = old_sp.wrapping_sub(frame_size);
ctx.set_register(1, new_sp);
}
pub fn teardown_stack_frame(ctx: &mut CpuContext, frame_size: u32) {
let current_sp = ctx.get_register(1);
let old_sp = current_sp.wrapping_add(frame_size);
ctx.set_register(1, old_sp);
}
pub fn get_argument(ctx: &CpuContext, arg_num: u8) -> u32 {
if arg_num < 8 {
ctx.get_register(3 + arg_num)
} else {
0
}
}
pub fn set_return_value(ctx: &mut CpuContext, value: u32) {
ctx.set_register(3, value);
}
pub fn get_return_value(ctx: &CpuContext) -> u32 {
ctx.get_register(3)
}
}