@@ -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