Skip to content

Commit 83f296b

Browse files
committed
Add RISC-V inline asm support
1 parent 1089f2d commit 83f296b

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
@@ -500,6 +500,18 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
500500
generated_asm.push_str(" push rbp\n");
501501
generated_asm.push_str(" mov rbp,rdi\n");
502502
}
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+
}
503515
_ => unimplemented!("prologue for {:?}", arch),
504516
}
505517
}
@@ -514,6 +526,18 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
514526
generated_asm.push_str(" pop rbp\n");
515527
generated_asm.push_str(" ret\n");
516528
}
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+
}
517541
_ => unimplemented!("epilogue for {:?}", arch),
518542
}
519543
}
@@ -523,6 +547,9 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
523547
InlineAsmArch::X86 | InlineAsmArch::X86_64 => {
524548
generated_asm.push_str(" ud2\n");
525549
}
550+
InlineAsmArch::RiscV32 | InlineAsmArch::RiscV64 => {
551+
generated_asm.push_str(" ebreak\n");
552+
}
526553
_ => unimplemented!("epilogue_noreturn for {:?}", arch),
527554
}
528555
}
@@ -544,6 +571,16 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
544571
reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap();
545572
generated_asm.push('\n');
546573
}
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+
}
547584
_ => unimplemented!("save_register for {:?}", arch),
548585
}
549586
}
@@ -565,6 +602,16 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
565602
reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap();
566603
writeln!(generated_asm, ", [rbp+0x{:x}]", offset.bytes()).unwrap();
567604
}
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+
}
568615
_ => unimplemented!("restore_register for {:?}", arch),
569616
}
570617
}

0 commit comments

Comments
 (0)