@@ -745,6 +745,13 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
745
745
// x19 is reserved by LLVM for the "base pointer", so rustc doesn't allow using it
746
746
generated_asm. push_str ( " mov x19, x0\n " ) ;
747
747
}
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
+ }
748
755
_ => unimplemented ! ( "prologue for {:?}" , arch) ,
749
756
}
750
757
}
@@ -761,6 +768,12 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
761
768
generated_asm. push_str ( " ldp fp, lr, [sp], #32\n " ) ;
762
769
generated_asm. push_str ( " ret\n " ) ;
763
770
}
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
+ }
764
777
_ => unimplemented ! ( "epilogue for {:?}" , arch) ,
765
778
}
766
779
}
@@ -773,6 +786,9 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
773
786
InlineAsmArch :: AArch64 => {
774
787
generated_asm. push_str ( " brk #0x1" ) ;
775
788
}
789
+ InlineAsmArch :: RiscV64 => {
790
+ generated_asm. push_str ( " ebreak\n " ) ;
791
+ }
776
792
_ => unimplemented ! ( "epilogue_noreturn for {:?}" , arch) ,
777
793
}
778
794
}
@@ -794,6 +810,11 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
794
810
reg. emit ( generated_asm, InlineAsmArch :: AArch64 , None ) . unwrap ( ) ;
795
811
writeln ! ( generated_asm, ", [x19, 0x{:x}]" , offset. bytes( ) ) . unwrap ( ) ;
796
812
}
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
+ }
797
818
_ => unimplemented ! ( "save_register for {:?}" , arch) ,
798
819
}
799
820
}
@@ -815,6 +836,11 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
815
836
reg. emit ( generated_asm, InlineAsmArch :: AArch64 , None ) . unwrap ( ) ;
816
837
writeln ! ( generated_asm, ", [x19, 0x{:x}]" , offset. bytes( ) ) . unwrap ( ) ;
817
838
}
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
+ }
818
844
_ => unimplemented ! ( "restore_register for {:?}" , arch) ,
819
845
}
820
846
}
0 commit comments