@@ -12,7 +12,7 @@ use crate::jit::{Cond, MemoryAmount, ShiftType};
1212use crate :: utils:: { NoHashMap , NoHashSet } ;
1313use crate :: IS_DEBUG ;
1414use std:: intrinsics:: unlikely;
15- use std:: { ptr , slice} ;
15+ use std:: slice;
1616
1717pub static mut BLOCK_LOG : bool = false ;
1818
@@ -58,7 +58,6 @@ pub struct BlockAsm<'a> {
5858
5959 cond_block_end_label_stack : Vec < ( BlockLabel , Cond , usize ) > ,
6060
61- guest_reg_init_offset : Option < usize > ,
6261 is_common_fun : bool ,
6362 host_sp_ptr : * mut usize ,
6463 block_start : usize ,
@@ -94,7 +93,6 @@ impl<'a> BlockAsm<'a> {
9493
9594 cond_block_end_label_stack : Vec :: new ( ) ,
9695
97- guest_reg_init_offset : None ,
9896 is_common_fun,
9997 host_sp_ptr,
10098 block_start : 0 ,
@@ -117,7 +115,9 @@ impl<'a> BlockAsm<'a> {
117115
118116 if !is_common_fun {
119117 instance. mov ( thread_regs_addr_reg, guest_regs_ptr as u32 ) ;
120- instance. guest_reg_init_offset = Some ( instance. buf . insts . len ( ) - 1 ) ;
118+ for guest_reg in RegReserve :: gp ( ) + Reg :: SP + Reg :: LR {
119+ instance. restore_reg ( guest_reg) ;
120+ }
121121 instance. restore_reg ( Reg :: CPSR ) ;
122122 }
123123
@@ -917,72 +917,14 @@ impl<'a> BlockAsm<'a> {
917917 basic_block. remove_dead_code ( self ) ;
918918 }
919919
920- if let Some ( guest_regs_init_offset) = self . guest_reg_init_offset {
921- let required_guest_regs = basic_blocks[ 0 ] . get_required_inputs ( ) . get_guests ( ) ;
922- if !required_guest_regs. is_empty ( ) {
923- let mut basic_block_i = 0 ;
924- let mut inst_i = 0 ;
925- let mut inst_entry = ptr:: null_mut ( ) ;
926-
927- ' basic_blocks_loop: for ( i, basic_block) in basic_blocks. iter_mut ( ) . enumerate ( ) {
928- if !reachable_blocks. contains ( & i) {
929- continue ;
930- }
931-
932- for ( j, entry) in basic_block. insts_link . iter ( ) . enumerate ( ) {
933- if entry. value == guest_regs_init_offset {
934- basic_block_i = i;
935- inst_i = j;
936- inst_entry = entry as * const _ as * mut _ ;
937- break ' basic_blocks_loop;
938- }
939- }
940- }
941-
942- let basic_block = & mut basic_blocks[ basic_block_i] ;
943- for i in 0 ..=inst_i {
944- basic_block. regs_live_ranges [ i] . remove_guests ( required_guest_regs) ;
945- }
946- let enter_blocks = unsafe { slice:: from_raw_parts ( basic_block. enter_blocks . as_ptr ( ) , basic_block. enter_blocks . len ( ) ) } ;
947- Self :: remove_guest_input_regs ( & mut basic_blocks, required_guest_regs, enter_blocks) ;
948- let basic_block = & mut basic_blocks[ basic_block_i] ;
949-
950- let mut previous_guest_reg = None ;
951- for ( j, guest_reg) in required_guest_regs. into_iter ( ) . enumerate ( ) {
952- inst_entry = basic_block. insts_link . insert_entry_end ( inst_entry, self . buf . insts . len ( ) ) ;
953- self . buf . insts . push (
954- BlockInstKind :: RestoreReg {
955- guest_reg,
956- reg_mapped : guest_reg. into ( ) ,
957- thread_regs_addr_reg : self . thread_regs_addr_reg ,
958- tmp_guest_cpsr_reg : self . tmp_guest_cpsr_reg ,
959- }
960- . into ( ) ,
961- ) ;
962- let inst_index = inst_i + j + 1 ;
963-
964- let ( inputs, outputs) = self . buf . insts . last ( ) . unwrap ( ) . get_io ( ) ;
965- basic_block. used_regs . insert ( inst_index, inputs + outputs) ;
966-
967- let mut previous_regs_live_range = basic_block. regs_live_ranges [ inst_index - 1 ] ;
968- if let Some ( previous_guest_reg) = previous_guest_reg {
969- previous_regs_live_range += BlockReg :: from ( previous_guest_reg) ;
970- }
971- previous_regs_live_range += inputs;
972- basic_block. regs_live_ranges . insert ( inst_index, previous_regs_live_range) ;
973-
974- previous_guest_reg = Some ( guest_reg) ;
975- }
976- }
977- }
978-
979920 ( basic_blocks, reachable_blocks)
980921 }
981922
982923 pub fn emit_opcodes ( & mut self , block_start_pc : u32 , thumb : bool ) -> usize {
983924 let ( mut basic_blocks, reachable_blocks) = self . assemble_basic_blocks ( block_start_pc, thumb) ;
984925
985926 if !basic_blocks[ 0 ] . get_required_inputs ( ) . get_guests ( ) . is_empty ( ) {
927+ println ! ( "inputs as requirement {:?}" , basic_blocks[ 0 ] . get_required_inputs( ) . get_guests( ) ) ;
986928 unsafe { BLOCK_LOG = true } ;
987929 }
988930
0 commit comments