lamina_codegen/riscv/
frame.rs1pub struct RiscVFrame;
3
4impl RiscVFrame {
5 pub fn generate_prologue<W: std::io::Write>(
7 writer: &mut W,
8 stack_size: usize,
9 ) -> Result<(), std::io::Error> {
10 writeln!(writer, " addi sp, sp, -16")?;
12 writeln!(writer, " sd ra, 8(sp)")?;
13 writeln!(writer, " sd fp, 0(sp)")?;
14 writeln!(writer, " addi fp, sp, 16")?;
15
16 if stack_size > 0 {
18 writeln!(writer, " addi sp, sp, -{}", stack_size)?;
19 }
20 Ok(())
21 }
22
23 pub fn generate_epilogue<W: std::io::Write>(
25 writer: &mut W,
26 stack_size: usize,
27 ) -> Result<(), std::io::Error> {
28 if stack_size > 0 {
30 writeln!(writer, " addi sp, sp, {}", stack_size)?;
31 }
32
33 writeln!(writer, " ld ra, -8(fp)")?;
35 writeln!(writer, " ld fp, -16(fp)")?;
36 writeln!(writer, " addi sp, sp, 16")?;
37 writeln!(writer, " ret")?;
38 Ok(())
39 }
40
41 pub fn calculate_stack_offset(slot_index: usize) -> i32 {
43 -((slot_index as i32 + 1) * 8)
44 }
45}