2
2
3
3
use super :: * ;
4
4
use crate :: ir:: { self , Endianness } ;
5
+ use crate :: isa;
5
6
use crate :: isa:: pulley_shared:: abi:: PulleyMachineDeps ;
6
7
use crate :: isa:: pulley_shared:: PointerWidth ;
7
8
use core:: marker:: PhantomData ;
@@ -10,19 +11,19 @@ use pulley_interpreter::encode as enc;
10
11
use pulley_interpreter:: regs:: BinaryOperands ;
11
12
12
13
pub struct EmitInfo {
13
- # [ allow ( dead_code ) ] // Will get used as we fill out this backend.
14
+ call_conv : isa :: CallConv ,
14
15
shared_flags : settings:: Flags ,
15
-
16
- #[ allow( dead_code) ] // Will get used as we fill out this backend.
17
16
isa_flags : crate :: isa:: pulley_shared:: settings:: Flags ,
18
17
}
19
18
20
19
impl EmitInfo {
21
20
pub ( crate ) fn new (
21
+ call_conv : isa:: CallConv ,
22
22
shared_flags : settings:: Flags ,
23
23
isa_flags : crate :: isa:: pulley_shared:: settings:: Flags ,
24
24
) -> Self {
25
25
Self {
26
+ call_conv,
26
27
shared_flags,
27
28
isa_flags,
28
29
}
@@ -644,46 +645,17 @@ fn return_call_emit_impl<T, P>(
644
645
) where
645
646
P : PulleyTargetKind ,
646
647
{
647
- let sp_to_fp_offset = {
648
- let frame_layout = state. frame_layout ( ) ;
649
- i64:: from (
650
- frame_layout. clobber_size
651
- + frame_layout. fixed_frame_storage_size
652
- + frame_layout. outgoing_args_size ,
653
- )
654
- } ;
655
-
656
- // Restore all clobbered registers before leaving the function.
657
- let mut clobber_offset = sp_to_fp_offset - 8 ;
658
- for reg in state. frame_layout ( ) . clobbered_callee_saves . clone ( ) {
659
- let rreg = reg. to_reg ( ) ;
660
- let ty = match rreg. class ( ) {
661
- RegClass :: Int => I64 ,
662
- RegClass :: Float => F64 ,
663
- RegClass :: Vector => unimplemented ! ( "Vector Clobber Restores" ) ,
664
- } ;
665
-
666
- <InstAndKind < P > >:: from ( Inst :: gen_load (
667
- reg. map ( Reg :: from) ,
668
- Amode :: SpOffset {
669
- offset : clobber_offset. try_into ( ) . unwrap ( ) ,
670
- } ,
671
- ty,
672
- MemFlags :: trusted ( ) ,
673
- ) )
674
- . emit ( sink, emit_info, state) ;
675
-
676
- clobber_offset -= 8
648
+ let epilogue = <PulleyMachineDeps < P > >:: gen_epilogue_frame_restore (
649
+ emit_info. call_conv ,
650
+ & emit_info. shared_flags ,
651
+ & emit_info. isa_flags ,
652
+ & state. frame_layout ,
653
+ ) ;
654
+
655
+ for inst in epilogue {
656
+ inst. emit ( sink, emit_info, state) ;
677
657
}
678
658
679
- // Restore the link register and frame pointer using a `pop_frame`
680
- // instruction. This will move `sp` to the current frame pointer and then
681
- // restore the old lr/fp, so this restores all of sp/fp/lr in one
682
- // instruction.
683
- let setup_area_size = i64:: from ( state. frame_layout ( ) . setup_area_size ) ;
684
- assert ! ( setup_area_size > 0 , "must have frame pointers enabled" ) ;
685
- <InstAndKind < P > >:: from ( RawInst :: PopFrame ) . emit ( sink, emit_info, state) ;
686
-
687
659
// Now that `sp` is restored to what it was on function entry it may need to
688
660
// be adjusted if the stack arguments of our own function differ from the
689
661
// stack arguments of the callee. Perform any necessary adjustment here.
0 commit comments