11use crate :: core:: cpu_regs:: CpuRegs ;
22use crate :: core:: emu:: Emu ;
33use crate :: core:: CpuType ;
4- use crate :: jit:: assembler:: arm:: alu_assembler:: AluImm ;
5- use crate :: jit:: assembler:: arm:: transfer_assembler:: { LdmStm , LdrStrImm , Msr } ;
6- use crate :: jit:: reg:: { Reg , RegReserve } ;
7- use crate :: jit:: Cond ;
4+ use crate :: jit:: reg:: Reg ;
85use crate :: logging:: debug_println;
96use crate :: DEBUG_LOG ;
107use bilge:: prelude:: * ;
@@ -61,16 +58,12 @@ pub struct ThreadRegs {
6158 pub abt : OtherModeRegs ,
6259 pub irq : OtherModeRegs ,
6360 pub und : OtherModeRegs ,
64- pub restore_regs_opcodes : Vec < u32 > ,
65- pub save_regs_opcodes : Vec < u32 > ,
66- pub restore_regs_thumb_opcodes : Vec < u32 > ,
67- pub save_regs_thumb_opcodes : Vec < u32 > ,
6861 pub cpu : CpuRegs ,
6962}
7063
7164impl ThreadRegs {
72- pub fn new ( cpu_type : CpuType ) -> Box < Self > {
73- let mut instance = Box :: new ( ThreadRegs {
65+ pub fn new ( cpu_type : CpuType ) -> Self {
66+ ThreadRegs {
7467 gp_regs : [ 0u32 ; 13 ] ,
7568 sp : 0 ,
7669 lr : 0 ,
@@ -84,84 +77,8 @@ impl ThreadRegs {
8477 abt : OtherModeRegs :: default ( ) ,
8578 irq : OtherModeRegs :: default ( ) ,
8679 und : OtherModeRegs :: default ( ) ,
87- restore_regs_opcodes : Vec :: new ( ) ,
88- save_regs_opcodes : Vec :: new ( ) ,
89- restore_regs_thumb_opcodes : Vec :: new ( ) ,
90- save_regs_thumb_opcodes : Vec :: new ( ) ,
9180 cpu : CpuRegs :: new ( cpu_type) ,
92- } ) ;
93-
94- {
95- let gp_regs_addr = instance. gp_regs . as_ptr ( ) as u32 ;
96- let last_regs_addr = ptr:: addr_of!( instance. gp_regs[ instance. gp_regs. len( ) - 1 ] ) as u32 ;
97- let last_regs_thumb_addr = ptr:: addr_of!( instance. gp_regs[ 7 ] ) as u32 ;
98- let sp_addr = ptr:: addr_of!( instance. sp) as u32 ;
99- let cpsr_addr = ptr:: addr_of!( instance. cpsr) as u32 ;
100- assert_eq ! ( sp_addr - last_regs_addr, 4 ) ;
101-
102- {
103- let restore_regs_opcodes = & mut instance. restore_regs_opcodes ;
104- restore_regs_opcodes. extend ( AluImm :: mov32 ( Reg :: SP , gp_regs_addr) ) ;
105- restore_regs_opcodes. extend ( [
106- LdrStrImm :: ldr_offset_al ( Reg :: R0 , Reg :: SP , ( cpsr_addr - gp_regs_addr) as u16 ) ,
107- Msr :: cpsr_flags ( Reg :: R0 , Cond :: AL ) ,
108- LdmStm :: pop_post_al ( RegReserve :: gp ( ) ) ,
109- LdrStrImm :: ldr_al ( Reg :: SP , Reg :: SP ) ,
110- ] ) ;
111- restore_regs_opcodes. shrink_to_fit ( ) ;
112- }
113-
114- {
115- let save_regs_opcodes = & mut instance. save_regs_opcodes ;
116- save_regs_opcodes. extend ( AluImm :: mov32 ( Reg :: LR , sp_addr) ) ;
117- save_regs_opcodes. push ( LdmStm :: push_post ( RegReserve :: gp ( ) + Reg :: SP , Reg :: LR , Cond :: AL ) ) ;
118- save_regs_opcodes. shrink_to_fit ( ) ;
119- }
120-
121- {
122- let restore_regs_thumb_opcodes = & mut instance. restore_regs_thumb_opcodes ;
123- restore_regs_thumb_opcodes. extend ( AluImm :: mov32 ( Reg :: SP , gp_regs_addr) ) ;
124- restore_regs_thumb_opcodes. extend ( [
125- LdrStrImm :: ldr_offset_al ( Reg :: R0 , Reg :: SP , ( cpsr_addr - gp_regs_addr) as u16 ) ,
126- Msr :: cpsr_flags ( Reg :: R0 , Cond :: AL ) ,
127- LdmStm :: pop_post_al ( RegReserve :: gp_thumb ( ) ) ,
128- LdrStrImm :: ldr_offset_al ( Reg :: SP , Reg :: SP , ( sp_addr - last_regs_thumb_addr - 4 ) as u16 ) ,
129- ] ) ;
130- restore_regs_thumb_opcodes. shrink_to_fit ( ) ;
131- }
132-
133- {
134- let save_regs_thumb_opcodes = & mut instance. save_regs_thumb_opcodes ;
135- save_regs_thumb_opcodes. extend ( AluImm :: mov32 ( Reg :: LR , last_regs_thumb_addr) ) ;
136- save_regs_thumb_opcodes. extend ( [
137- LdrStrImm :: str_offset_al ( Reg :: SP , Reg :: LR , ( sp_addr - last_regs_thumb_addr) as u16 ) ,
138- LdmStm :: push_post ( RegReserve :: gp_thumb ( ) , Reg :: LR , Cond :: AL ) ,
139- ] ) ;
140- save_regs_thumb_opcodes. shrink_to_fit ( ) ;
141- }
14281 }
143-
144- instance
145- }
146-
147- pub fn emit_get_reg ( & self , dest_reg : Reg , src_reg : Reg ) -> Vec < u32 > {
148- let reg_addr = self . get_reg ( src_reg) as * const _ as u32 ;
149-
150- let mut opcodes = Vec :: new ( ) ;
151- opcodes. extend ( AluImm :: mov32 ( dest_reg, reg_addr) ) ;
152- opcodes. push ( LdrStrImm :: ldr_al ( dest_reg, dest_reg) ) ;
153- opcodes
154- }
155-
156- pub fn emit_set_reg ( & self , dest_reg : Reg , src_reg : Reg , tmp_reg : Reg ) -> Vec < u32 > {
157- debug_assert_ne ! ( src_reg, tmp_reg) ;
158-
159- let reg_addr = self . get_reg ( dest_reg) as * const _ as u32 ;
160-
161- let mut opcodes = Vec :: new ( ) ;
162- opcodes. extend ( AluImm :: mov32 ( tmp_reg, reg_addr) ) ;
163- opcodes. push ( LdrStrImm :: str_al ( src_reg, tmp_reg) ) ;
164- opcodes
16582 }
16683
16784 pub fn get_reg_mut_ptr ( & mut self ) -> * mut u32 {
0 commit comments