@@ -497,6 +497,18 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
497
497
generated_asm. push_str ( " push rbp\n " ) ;
498
498
generated_asm. push_str ( " mov rbp,rdi\n " ) ;
499
499
}
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
+ }
500
512
_ => unimplemented ! ( "prologue for {:?}" , arch) ,
501
513
}
502
514
}
@@ -511,6 +523,18 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
511
523
generated_asm. push_str ( " pop rbp\n " ) ;
512
524
generated_asm. push_str ( " ret\n " ) ;
513
525
}
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
+ }
514
538
_ => unimplemented ! ( "epilogue for {:?}" , arch) ,
515
539
}
516
540
}
@@ -520,6 +544,9 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
520
544
InlineAsmArch :: X86 | InlineAsmArch :: X86_64 => {
521
545
generated_asm. push_str ( " ud2\n " ) ;
522
546
}
547
+ InlineAsmArch :: RiscV32 | InlineAsmArch :: RiscV64 => {
548
+ generated_asm. push_str ( " ebreak\n " ) ;
549
+ }
523
550
_ => unimplemented ! ( "epilogue_noreturn for {:?}" , arch) ,
524
551
}
525
552
}
@@ -541,6 +568,16 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
541
568
reg. emit ( generated_asm, InlineAsmArch :: X86_64 , None ) . unwrap ( ) ;
542
569
generated_asm. push ( '\n' ) ;
543
570
}
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
+ }
544
581
_ => unimplemented ! ( "save_register for {:?}" , arch) ,
545
582
}
546
583
}
@@ -562,6 +599,16 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
562
599
reg. emit ( generated_asm, InlineAsmArch :: X86_64 , None ) . unwrap ( ) ;
563
600
writeln ! ( generated_asm, ", [rbp+0x{:x}]" , offset. bytes( ) ) . unwrap ( ) ;
564
601
}
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
+ }
565
612
_ => unimplemented ! ( "restore_register for {:?}" , arch) ,
566
613
}
567
614
}
0 commit comments