pub struct RiscVFrame;
impl RiscVFrame {
pub fn generate_prologue<W: std::io::Write>(
writer: &mut W,
stack_size: usize,
) -> Result<(), std::io::Error> {
writeln!(writer, " addi sp, sp, -16")?;
writeln!(writer, " sd ra, 8(sp)")?;
writeln!(writer, " sd fp, 0(sp)")?;
writeln!(writer, " addi fp, sp, 16")?;
if stack_size > 0 {
writeln!(writer, " addi sp, sp, -{}", stack_size)?;
}
Ok(())
}
pub fn generate_epilogue<W: std::io::Write>(
writer: &mut W,
stack_size: usize,
) -> Result<(), std::io::Error> {
if stack_size > 0 {
writeln!(writer, " addi sp, sp, {}", stack_size)?;
}
writeln!(writer, " ld ra, -8(fp)")?;
writeln!(writer, " ld fp, -16(fp)")?;
writeln!(writer, " addi sp, sp, 16")?;
writeln!(writer, " ret")?;
Ok(())
}
pub fn calculate_stack_offset(slot_index: usize) -> i32 {
-((slot_index as i32 + 1) * 8)
}
}