Skip to content

Commit f9534a9

Browse files
committed
Add RISC-V inline asm support
1 parent 31e7fa5 commit f9534a9

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
@@ -497,6 +497,18 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
497497
generated_asm.push_str(" push rbp\n");
498498
generated_asm.push_str(" mov rbp,rdi\n");
499499
}
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+
}
500512
_ => unimplemented!("prologue for {:?}", arch),
501513
}
502514
}
@@ -511,6 +523,18 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
511523
generated_asm.push_str(" pop rbp\n");
512524
generated_asm.push_str(" ret\n");
513525
}
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+
}
514538
_ => unimplemented!("epilogue for {:?}", arch),
515539
}
516540
}
@@ -520,6 +544,9 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
520544
InlineAsmArch::X86 | InlineAsmArch::X86_64 => {
521545
generated_asm.push_str(" ud2\n");
522546
}
547+
InlineAsmArch::RiscV32 | InlineAsmArch::RiscV64 => {
548+
generated_asm.push_str(" ebreak\n");
549+
}
523550
_ => unimplemented!("epilogue_noreturn for {:?}", arch),
524551
}
525552
}
@@ -541,6 +568,16 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
541568
reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap();
542569
generated_asm.push('\n');
543570
}
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+
}
544581
_ => unimplemented!("save_register for {:?}", arch),
545582
}
546583
}
@@ -562,6 +599,16 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
562599
reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap();
563600
writeln!(generated_asm, ", [rbp+0x{:x}]", offset.bytes()).unwrap();
564601
}
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+
}
565612
_ => unimplemented!("restore_register for {:?}", arch),
566613
}
567614
}

0 commit comments

Comments
 (0)