@@ -497,6 +497,18 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
497497 generated_asm. push_str ( " push rbp\n " ) ;
498498 generated_asm. push_str ( " mov rbp,rdi\n " ) ;
499499 }
500+ InlineAsmArch :: RiscV32 => {
501+ generated_asm. push_str ( " addi sp, sp, -8\n " ) ;
502+ generated_asm. push_str ( " sw ra, 4(sp)\n " ) ;
503+ generated_asm. push_str ( " sw s0, 0(sp)\n " ) ;
504+ generated_asm. push_str ( " mv s0, a0\n " ) ;
505+ }
506+ InlineAsmArch :: RiscV64 => {
507+ generated_asm. push_str ( " addi sp, sp, -16\n " ) ;
508+ generated_asm. push_str ( " sd ra, 8(sp)\n " ) ;
509+ generated_asm. push_str ( " sd s0, 0(sp)\n " ) ;
510+ generated_asm. push_str ( " mv s0, a0\n " ) ;
511+ }
500512 _ => unimplemented ! ( "prologue for {:?}" , arch) ,
501513 }
502514 }
@@ -511,6 +523,18 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
511523 generated_asm. push_str ( " pop rbp\n " ) ;
512524 generated_asm. push_str ( " ret\n " ) ;
513525 }
526+ InlineAsmArch :: RiscV32 => {
527+ generated_asm. push_str ( " lw s0, 0(sp)\n " ) ;
528+ generated_asm. push_str ( " lw ra, 4(sp)\n " ) ;
529+ generated_asm. push_str ( " addi sp, sp, 8\n " ) ;
530+ generated_asm. push_str ( " ret\n " ) ;
531+ }
532+ InlineAsmArch :: RiscV64 => {
533+ generated_asm. push_str ( " ld s0, 0(sp)\n " ) ;
534+ generated_asm. push_str ( " ld ra, 8(sp)\n " ) ;
535+ generated_asm. push_str ( " addi sp, sp, 16\n " ) ;
536+ generated_asm. push_str ( " ret\n " ) ;
537+ }
514538 _ => unimplemented ! ( "epilogue for {:?}" , arch) ,
515539 }
516540 }
@@ -520,6 +544,9 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
520544 InlineAsmArch :: X86 | InlineAsmArch :: X86_64 => {
521545 generated_asm. push_str ( " ud2\n " ) ;
522546 }
547+ InlineAsmArch :: RiscV32 | InlineAsmArch :: RiscV64 => {
548+ generated_asm. push_str ( " ebreak\n " ) ;
549+ }
523550 _ => unimplemented ! ( "epilogue_noreturn for {:?}" , arch) ,
524551 }
525552 }
@@ -541,6 +568,16 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
541568 reg. emit ( generated_asm, InlineAsmArch :: X86_64 , None ) . unwrap ( ) ;
542569 generated_asm. push ( '\n' ) ;
543570 }
571+ InlineAsmArch :: RiscV32 => {
572+ generated_asm. push_str ( " sw " ) ;
573+ reg. emit ( generated_asm, InlineAsmArch :: RiscV32 , None ) . unwrap ( ) ;
574+ writeln ! ( generated_asm, ", 0x{:x}(s0)" , offset. bytes( ) ) . unwrap ( ) ;
575+ }
576+ InlineAsmArch :: RiscV64 => {
577+ generated_asm. push_str ( " sd " ) ;
578+ reg. emit ( generated_asm, InlineAsmArch :: RiscV64 , None ) . unwrap ( ) ;
579+ writeln ! ( generated_asm, ", 0x{:x}(s0)" , offset. bytes( ) ) . unwrap ( ) ;
580+ }
544581 _ => unimplemented ! ( "save_register for {:?}" , arch) ,
545582 }
546583 }
@@ -562,6 +599,16 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
562599 reg. emit ( generated_asm, InlineAsmArch :: X86_64 , None ) . unwrap ( ) ;
563600 writeln ! ( generated_asm, ", [rbp+0x{:x}]" , offset. bytes( ) ) . unwrap ( ) ;
564601 }
602+ InlineAsmArch :: RiscV32 => {
603+ generated_asm. push_str ( " lw " ) ;
604+ reg. emit ( generated_asm, InlineAsmArch :: RiscV32 , None ) . unwrap ( ) ;
605+ writeln ! ( generated_asm, ", 0x{:x}(s0)" , offset. bytes( ) ) . unwrap ( ) ;
606+ }
607+ InlineAsmArch :: RiscV64 => {
608+ generated_asm. push_str ( " ld " ) ;
609+ reg. emit ( generated_asm, InlineAsmArch :: RiscV64 , None ) . unwrap ( ) ;
610+ writeln ! ( generated_asm, ", 0x{:x}(s0)" , offset. bytes( ) ) . unwrap ( ) ;
611+ }
565612 _ => unimplemented ! ( "restore_register for {:?}" , arch) ,
566613 }
567614 }
0 commit comments