@@ -699,50 +699,34 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
699
699
700
700
fn prologue ( generated_asm : & mut String , arch : InlineAsmArch ) {
701
701
match arch {
702
- InlineAsmArch :: X86 => {
703
- generated_asm. push_str ( " push ebp\n " ) ;
704
- generated_asm. push_str ( " mov ebp,[esp+8]\n " ) ;
705
- }
706
702
InlineAsmArch :: X86_64 => {
707
703
generated_asm. push_str ( " push rbp\n " ) ;
708
- generated_asm. push_str ( " mov rbp,rdi\n " ) ;
709
- }
710
- InlineAsmArch :: RiscV32 => {
711
- generated_asm. push_str ( " addi sp, sp, -8\n " ) ;
712
- generated_asm. push_str ( " sw ra, 4(sp)\n " ) ;
713
- generated_asm. push_str ( " sw s0, 0(sp)\n " ) ;
714
- generated_asm. push_str ( " mv s0, a0\n " ) ;
715
- }
716
- InlineAsmArch :: RiscV64 => {
717
- generated_asm. push_str ( " addi sp, sp, -16\n " ) ;
718
- generated_asm. push_str ( " sd ra, 8(sp)\n " ) ;
719
- generated_asm. push_str ( " sd s0, 0(sp)\n " ) ;
720
- generated_asm. push_str ( " mv s0, a0\n " ) ;
704
+ generated_asm. push_str ( " mov rbp,rsp\n " ) ;
705
+ generated_asm. push_str ( " push rbx\n " ) ; // rbx is callee saved
706
+ // rbx is reserved by LLVM for the "base pointer", so rustc doesn't allow using it
707
+ generated_asm. push_str ( " mov rbx,rdi\n " ) ;
708
+ }
709
+ InlineAsmArch :: AArch64 => {
710
+ generated_asm. push_str ( " stp fp, lr, [sp, #-32]!\n " ) ;
711
+ generated_asm. push_str ( " mov fp, sp\n " ) ;
712
+ generated_asm. push_str ( " str x19, [sp, #24]\n " ) ; // x19 is callee saved
713
+ // x19 is reserved by LLVM for the "base pointer", so rustc doesn't allow using it
714
+ generated_asm. push_str ( " mov x19, x0\n " ) ;
721
715
}
722
716
_ => unimplemented ! ( "prologue for {:?}" , arch) ,
723
717
}
724
718
}
725
719
726
720
fn epilogue ( generated_asm : & mut String , arch : InlineAsmArch ) {
727
721
match arch {
728
- InlineAsmArch :: X86 => {
729
- generated_asm. push_str ( " pop ebp\n " ) ;
730
- generated_asm. push_str ( " ret\n " ) ;
731
- }
732
722
InlineAsmArch :: X86_64 => {
723
+ generated_asm. push_str ( " pop rbx\n " ) ;
733
724
generated_asm. push_str ( " pop rbp\n " ) ;
734
725
generated_asm. push_str ( " ret\n " ) ;
735
726
}
736
- InlineAsmArch :: RiscV32 => {
737
- generated_asm. push_str ( " lw s0, 0(sp)\n " ) ;
738
- generated_asm. push_str ( " lw ra, 4(sp)\n " ) ;
739
- generated_asm. push_str ( " addi sp, sp, 8\n " ) ;
740
- generated_asm. push_str ( " ret\n " ) ;
741
- }
742
- InlineAsmArch :: RiscV64 => {
743
- generated_asm. push_str ( " ld s0, 0(sp)\n " ) ;
744
- generated_asm. push_str ( " ld ra, 8(sp)\n " ) ;
745
- generated_asm. push_str ( " addi sp, sp, 16\n " ) ;
727
+ InlineAsmArch :: AArch64 => {
728
+ generated_asm. push_str ( " ldr x19, [sp, #24]\n " ) ;
729
+ generated_asm. push_str ( " ldp fp, lr, [sp], #32\n " ) ;
746
730
generated_asm. push_str ( " ret\n " ) ;
747
731
}
748
732
_ => unimplemented ! ( "epilogue for {:?}" , arch) ,
@@ -751,11 +735,11 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
751
735
752
736
fn epilogue_noreturn ( generated_asm : & mut String , arch : InlineAsmArch ) {
753
737
match arch {
754
- InlineAsmArch :: X86 | InlineAsmArch :: X86_64 => {
738
+ InlineAsmArch :: X86_64 => {
755
739
generated_asm. push_str ( " ud2\n " ) ;
756
740
}
757
- InlineAsmArch :: RiscV32 | InlineAsmArch :: RiscV64 => {
758
- generated_asm. push_str ( " ebreak \n " ) ;
741
+ InlineAsmArch :: AArch64 => {
742
+ generated_asm. push_str ( " brk #0x1 " ) ;
759
743
}
760
744
_ => unimplemented ! ( "epilogue_noreturn for {:?}" , arch) ,
761
745
}
@@ -768,25 +752,15 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
768
752
offset : Size ,
769
753
) {
770
754
match arch {
771
- InlineAsmArch :: X86 => {
772
- write ! ( generated_asm, " mov [ebp+0x{:x}], " , offset. bytes( ) ) . unwrap ( ) ;
773
- reg. emit ( generated_asm, InlineAsmArch :: X86 , None ) . unwrap ( ) ;
774
- generated_asm. push ( '\n' ) ;
775
- }
776
755
InlineAsmArch :: X86_64 => {
777
- write ! ( generated_asm, " mov [rbp +0x{:x}], " , offset. bytes( ) ) . unwrap ( ) ;
756
+ write ! ( generated_asm, " mov [rbx +0x{:x}], " , offset. bytes( ) ) . unwrap ( ) ;
778
757
reg. emit ( generated_asm, InlineAsmArch :: X86_64 , None ) . unwrap ( ) ;
779
758
generated_asm. push ( '\n' ) ;
780
759
}
781
- InlineAsmArch :: RiscV32 => {
782
- generated_asm. push_str ( " sw " ) ;
783
- reg. emit ( generated_asm, InlineAsmArch :: RiscV32 , None ) . unwrap ( ) ;
784
- writeln ! ( generated_asm, ", 0x{:x}(s0)" , offset. bytes( ) ) . unwrap ( ) ;
785
- }
786
- InlineAsmArch :: RiscV64 => {
787
- generated_asm. push_str ( " sd " ) ;
788
- reg. emit ( generated_asm, InlineAsmArch :: RiscV64 , None ) . unwrap ( ) ;
789
- writeln ! ( generated_asm, ", 0x{:x}(s0)" , offset. bytes( ) ) . unwrap ( ) ;
760
+ InlineAsmArch :: AArch64 => {
761
+ generated_asm. push_str ( " str " ) ;
762
+ reg. emit ( generated_asm, InlineAsmArch :: AArch64 , None ) . unwrap ( ) ;
763
+ writeln ! ( generated_asm, ", [x19, 0x{:x}]" , offset. bytes( ) ) . unwrap ( ) ;
790
764
}
791
765
_ => unimplemented ! ( "save_register for {:?}" , arch) ,
792
766
}
@@ -799,25 +773,15 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
799
773
offset : Size ,
800
774
) {
801
775
match arch {
802
- InlineAsmArch :: X86 => {
803
- generated_asm. push_str ( " mov " ) ;
804
- reg. emit ( generated_asm, InlineAsmArch :: X86 , None ) . unwrap ( ) ;
805
- writeln ! ( generated_asm, ", [ebp+0x{:x}]" , offset. bytes( ) ) . unwrap ( ) ;
806
- }
807
776
InlineAsmArch :: X86_64 => {
808
777
generated_asm. push_str ( " mov " ) ;
809
778
reg. emit ( generated_asm, InlineAsmArch :: X86_64 , None ) . unwrap ( ) ;
810
- writeln ! ( generated_asm, ", [rbp+0x{:x}]" , offset. bytes( ) ) . unwrap ( ) ;
811
- }
812
- InlineAsmArch :: RiscV32 => {
813
- generated_asm. push_str ( " lw " ) ;
814
- reg. emit ( generated_asm, InlineAsmArch :: RiscV32 , None ) . unwrap ( ) ;
815
- writeln ! ( generated_asm, ", 0x{:x}(s0)" , offset. bytes( ) ) . unwrap ( ) ;
779
+ writeln ! ( generated_asm, ", [rbx+0x{:x}]" , offset. bytes( ) ) . unwrap ( ) ;
816
780
}
817
- InlineAsmArch :: RiscV64 => {
818
- generated_asm. push_str ( " ld " ) ;
819
- reg. emit ( generated_asm, InlineAsmArch :: RiscV64 , None ) . unwrap ( ) ;
820
- writeln ! ( generated_asm, ", 0x{:x}(s0) " , offset. bytes( ) ) . unwrap ( ) ;
781
+ InlineAsmArch :: AArch64 => {
782
+ generated_asm. push_str ( " ldr " ) ;
783
+ reg. emit ( generated_asm, InlineAsmArch :: AArch64 , None ) . unwrap ( ) ;
784
+ writeln ! ( generated_asm, ", [x19, 0x{:x}] " , offset. bytes( ) ) . unwrap ( ) ;
821
785
}
822
786
_ => unimplemented ! ( "restore_register for {:?}" , arch) ,
823
787
}
0 commit comments