@@ -7,7 +7,7 @@ use crate::jit::inst_branch_handler::branch_any_reg;
7
7
use crate :: jit:: inst_thread_regs_handler:: { register_restore_spsr, restore_thumb_after_restore_spsr, set_pc_arm_mode, set_pc_thumb_mode} ;
8
8
use crate :: jit:: jit_asm:: { debug_after_exec_op, JitAsm , JitRuntimeData } ;
9
9
use crate :: jit:: op:: Op ;
10
- use crate :: jit:: reg:: Reg ;
10
+ use crate :: jit:: reg:: { reg_reserve , Reg } ;
11
11
use crate :: jit:: Cond ;
12
12
use crate :: logging:: debug_println;
13
13
use crate :: { DEBUG_LOG , IS_DEBUG } ;
@@ -127,23 +127,29 @@ impl<const CPU: CpuType> JitAsm<'_, CPU> {
127
127
block_asm. current_pc = start_pc + ( ( ( i - start_index) as u32 ) << pc_shift) ;
128
128
self . jit_buf . debug_info . record_inst_offset ( i, block_asm. get_cursor_offset ( ) as usize ) ;
129
129
130
- if !self . jit_buf . insts [ i] . op . is_multiple_mem_transfer ( ) {
130
+ let inst = & self . jit_buf . insts [ i] ;
131
+ if inst. op . is_multiple_mem_transfer ( ) {
132
+ let op0 = inst. operands ( ) [ 0 ] . as_reg_no_shift ( ) . unwrap ( ) ;
133
+ let op1 = inst. operands ( ) [ 1 ] . as_reg_list ( ) . unwrap ( ) ;
134
+ let next_live_regs = self . analyzer . get_next_live_regs ( basic_block_index, i) ;
135
+ block_asm. alloc_guest_regs ( reg_reserve ! ( op0) , op1 & Reg :: PC , next_live_regs) ;
136
+ } else {
131
137
self . emit_guest_regs_alloc ( i, basic_block_index, block_asm) ;
132
138
}
133
139
134
140
let inst = & self . jit_buf . insts [ i] ;
135
141
debug_println ! ( "{:x}: block {basic_block_index}: emit {inst:?}" , block_asm. current_pc) ;
136
142
143
+ // if block_asm.current_pc == 0x20076d4 {
144
+ // block_asm.bkpt1(0);
145
+ // }
146
+
137
147
let mut label = Label :: new ( ) ;
138
148
let needs_cond_jump = !matches ! ( inst. op, Op :: Clz | Op :: Qadd | Op :: Qsub | Op :: Qdadd | Op :: Qdsub ) && !inst. op . is_alu ( ) && !inst. op . is_mul ( ) ;
139
149
if inst. cond != Cond :: AL && needs_cond_jump {
140
150
block_asm. b3 ( !inst. cond , & mut label, BranchHint_kNear ) ;
141
151
}
142
152
143
- // if block_asm.current_pc == 0x20046c4 {
144
- // block_asm.bkpt1(0);
145
- // }
146
-
147
153
if thumb {
148
154
match inst. op {
149
155
Op :: BlSetupT => { }
@@ -163,10 +169,11 @@ impl<const CPU: CpuType> JitAsm<'_, CPU> {
163
169
Op :: Mcr | Op :: Mrc => self . emit_cp15 ( i, basic_block_index, block_asm) ,
164
170
Op :: MsrRc | Op :: MsrIc | Op :: MsrRs | Op :: MsrIs => self . emit_msr ( i, basic_block_index, block_asm) ,
165
171
Op :: MrsRc | Op :: MrsRs => self . emit_mrs ( i, block_asm) ,
166
- Op :: BlxReg => self . emit_blx ( i, basic_block_index, block_asm) ,
172
+ Op :: BlxReg => self . emit_blx_reg ( i, basic_block_index, block_asm) ,
167
173
Op :: Bl => self . emit_bl ( i, basic_block_index, block_asm) ,
168
174
Op :: B => self . emit_b ( i, basic_block_index, block_asm) ,
169
175
Op :: Bx => self . emit_bx ( i, basic_block_index, block_asm) ,
176
+ Op :: Blx => self . emit_blx ( i, basic_block_index, block_asm) ,
170
177
Op :: Swi => self . emit_swi ( i, basic_block_index, false , block_asm) ,
171
178
Op :: Swp | Op :: Swpb => self . emit_swp ( i, basic_block_index, block_asm) ,
172
179
Op :: Clz => self . emit_clz ( i, block_asm) ,
0 commit comments