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