@@ -501,6 +501,18 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
501
501
generated_asm. push_str ( " push rbp\n " ) ;
502
502
generated_asm. push_str ( " mov rbp,rdi\n " ) ;
503
503
}
504
+ InlineAsmArch :: RiscV32 => {
505
+ generated_asm. push_str ( " addi sp, sp, -8\n " ) ;
506
+ generated_asm. push_str ( " sw ra, 4(sp)\n " ) ;
507
+ generated_asm. push_str ( " sw s0, 0(sp)\n " ) ;
508
+ generated_asm. push_str ( " mv s0, a0\n " ) ;
509
+ }
510
+ InlineAsmArch :: RiscV64 => {
511
+ generated_asm. push_str ( " addi sp, sp, -16\n " ) ;
512
+ generated_asm. push_str ( " sd ra, 8(sp)\n " ) ;
513
+ generated_asm. push_str ( " sd s0, 0(sp)\n " ) ;
514
+ generated_asm. push_str ( " mv s0, a0\n " ) ;
515
+ }
504
516
_ => unimplemented ! ( "prologue for {:?}" , arch) ,
505
517
}
506
518
}
@@ -515,6 +527,18 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
515
527
generated_asm. push_str ( " pop rbp\n " ) ;
516
528
generated_asm. push_str ( " ret\n " ) ;
517
529
}
530
+ InlineAsmArch :: RiscV32 => {
531
+ generated_asm. push_str ( " lw s0, 0(sp)\n " ) ;
532
+ generated_asm. push_str ( " lw ra, 4(sp)\n " ) ;
533
+ generated_asm. push_str ( " addi sp, sp, 8\n " ) ;
534
+ generated_asm. push_str ( " ret\n " ) ;
535
+ }
536
+ InlineAsmArch :: RiscV64 => {
537
+ generated_asm. push_str ( " ld s0, 0(sp)\n " ) ;
538
+ generated_asm. push_str ( " ld ra, 8(sp)\n " ) ;
539
+ generated_asm. push_str ( " addi sp, sp, 16\n " ) ;
540
+ generated_asm. push_str ( " ret\n " ) ;
541
+ }
518
542
_ => unimplemented ! ( "epilogue for {:?}" , arch) ,
519
543
}
520
544
}
@@ -524,6 +548,9 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
524
548
InlineAsmArch :: X86 | InlineAsmArch :: X86_64 => {
525
549
generated_asm. push_str ( " ud2\n " ) ;
526
550
}
551
+ InlineAsmArch :: RiscV32 | InlineAsmArch :: RiscV64 => {
552
+ generated_asm. push_str ( " ebreak\n " ) ;
553
+ }
527
554
_ => unimplemented ! ( "epilogue_noreturn for {:?}" , arch) ,
528
555
}
529
556
}
@@ -545,6 +572,16 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
545
572
reg. emit ( generated_asm, InlineAsmArch :: X86_64 , None ) . unwrap ( ) ;
546
573
generated_asm. push ( '\n' ) ;
547
574
}
575
+ InlineAsmArch :: RiscV32 => {
576
+ generated_asm. push_str ( " sw " ) ;
577
+ reg. emit ( generated_asm, InlineAsmArch :: RiscV32 , None ) . unwrap ( ) ;
578
+ writeln ! ( generated_asm, ", 0x{:x}(s0)" , offset. bytes( ) ) . unwrap ( ) ;
579
+ }
580
+ InlineAsmArch :: RiscV64 => {
581
+ generated_asm. push_str ( " sd " ) ;
582
+ reg. emit ( generated_asm, InlineAsmArch :: RiscV64 , None ) . unwrap ( ) ;
583
+ writeln ! ( generated_asm, ", 0x{:x}(s0)" , offset. bytes( ) ) . unwrap ( ) ;
584
+ }
548
585
_ => unimplemented ! ( "save_register for {:?}" , arch) ,
549
586
}
550
587
}
@@ -566,6 +603,16 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
566
603
reg. emit ( generated_asm, InlineAsmArch :: X86_64 , None ) . unwrap ( ) ;
567
604
writeln ! ( generated_asm, ", [rbp+0x{:x}]" , offset. bytes( ) ) . unwrap ( ) ;
568
605
}
606
+ InlineAsmArch :: RiscV32 => {
607
+ generated_asm. push_str ( " lw " ) ;
608
+ reg. emit ( generated_asm, InlineAsmArch :: RiscV32 , None ) . unwrap ( ) ;
609
+ writeln ! ( generated_asm, ", 0x{:x}(s0)" , offset. bytes( ) ) . unwrap ( ) ;
610
+ }
611
+ InlineAsmArch :: RiscV64 => {
612
+ generated_asm. push_str ( " ld " ) ;
613
+ reg. emit ( generated_asm, InlineAsmArch :: RiscV64 , None ) . unwrap ( ) ;
614
+ writeln ! ( generated_asm, ", 0x{:x}(s0)" , offset. bytes( ) ) . unwrap ( ) ;
615
+ }
569
616
_ => unimplemented ! ( "restore_register for {:?}" , arch) ,
570
617
}
571
618
}
0 commit comments