Skip to content

Commit 453ce49

Browse files
committed
Support inline asm on riscv64
1 parent 04a3850 commit 453ce49

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

src/inline_asm.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,13 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
745745
// x19 is reserved by LLVM for the "base pointer", so rustc doesn't allow using it
746746
generated_asm.push_str(" mov x19, x0\n");
747747
}
748+
InlineAsmArch::RiscV64 => {
749+
generated_asm.push_str(" addi sp, sp, -16\n");
750+
generated_asm.push_str(" sd ra, 8(sp)\n");
751+
generated_asm.push_str(" sd s1, 0(sp)\n"); // s1 is callee saved
752+
// s1/x9 is reserved by LLVM for the "base pointer", so rustc doesn't allow using it
753+
generated_asm.push_str(" mv s1, a0\n");
754+
}
748755
_ => unimplemented!("prologue for {:?}", arch),
749756
}
750757
}
@@ -761,6 +768,12 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
761768
generated_asm.push_str(" ldp fp, lr, [sp], #32\n");
762769
generated_asm.push_str(" ret\n");
763770
}
771+
InlineAsmArch::RiscV64 => {
772+
generated_asm.push_str(" ld s1, 0(sp)\n");
773+
generated_asm.push_str(" ld ra, 8(sp)\n");
774+
generated_asm.push_str(" addi sp, sp, 16\n");
775+
generated_asm.push_str(" ret\n");
776+
}
764777
_ => unimplemented!("epilogue for {:?}", arch),
765778
}
766779
}
@@ -773,6 +786,9 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
773786
InlineAsmArch::AArch64 => {
774787
generated_asm.push_str(" brk #0x1");
775788
}
789+
InlineAsmArch::RiscV64 => {
790+
generated_asm.push_str(" ebreak\n");
791+
}
776792
_ => unimplemented!("epilogue_noreturn for {:?}", arch),
777793
}
778794
}
@@ -794,6 +810,11 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
794810
reg.emit(generated_asm, InlineAsmArch::AArch64, None).unwrap();
795811
writeln!(generated_asm, ", [x19, 0x{:x}]", offset.bytes()).unwrap();
796812
}
813+
InlineAsmArch::RiscV64 => {
814+
generated_asm.push_str(" sd ");
815+
reg.emit(generated_asm, InlineAsmArch::RiscV64, None).unwrap();
816+
writeln!(generated_asm, ", 0x{:x}(s1)", offset.bytes()).unwrap();
817+
}
797818
_ => unimplemented!("save_register for {:?}", arch),
798819
}
799820
}
@@ -815,6 +836,11 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
815836
reg.emit(generated_asm, InlineAsmArch::AArch64, None).unwrap();
816837
writeln!(generated_asm, ", [x19, 0x{:x}]", offset.bytes()).unwrap();
817838
}
839+
InlineAsmArch::RiscV64 => {
840+
generated_asm.push_str(" ld ");
841+
reg.emit(generated_asm, InlineAsmArch::RiscV64, None).unwrap();
842+
writeln!(generated_asm, ", 0x{:x}(s1)", offset.bytes()).unwrap();
843+
}
818844
_ => unimplemented!("restore_register for {:?}", arch),
819845
}
820846
}

0 commit comments

Comments
 (0)