Skip to content

Commit 84a74eb

Browse files
committed
Add RISC-V inline asm support
1 parent 66772bc commit 84a74eb

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

src/inline_asm.rs

+47
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,18 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
501501
generated_asm.push_str(" push rbp\n");
502502
generated_asm.push_str(" mov rbp,rdi\n");
503503
}
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+
}
504516
_ => unimplemented!("prologue for {:?}", arch),
505517
}
506518
}
@@ -515,6 +527,18 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
515527
generated_asm.push_str(" pop rbp\n");
516528
generated_asm.push_str(" ret\n");
517529
}
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+
}
518542
_ => unimplemented!("epilogue for {:?}", arch),
519543
}
520544
}
@@ -524,6 +548,9 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
524548
InlineAsmArch::X86 | InlineAsmArch::X86_64 => {
525549
generated_asm.push_str(" ud2\n");
526550
}
551+
InlineAsmArch::RiscV32 | InlineAsmArch::RiscV64 => {
552+
generated_asm.push_str(" ebreak\n");
553+
}
527554
_ => unimplemented!("epilogue_noreturn for {:?}", arch),
528555
}
529556
}
@@ -545,6 +572,16 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
545572
reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap();
546573
generated_asm.push('\n');
547574
}
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+
}
548585
_ => unimplemented!("save_register for {:?}", arch),
549586
}
550587
}
@@ -566,6 +603,16 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
566603
reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap();
567604
writeln!(generated_asm, ", [rbp+0x{:x}]", offset.bytes()).unwrap();
568605
}
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+
}
569616
_ => unimplemented!("restore_register for {:?}", arch),
570617
}
571618
}

0 commit comments

Comments
 (0)