Skip to content

Commit 909e9ab

Browse files
committed
WIP
1 parent 53f23ac commit 909e9ab

File tree

5 files changed

+16
-13
lines changed

5 files changed

+16
-13
lines changed

src/jit/analyzer/asm_analyzer.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,17 @@ fn is_idle_loop(insts: &[InstInfo]) -> bool {
1818
let mut regs_disallowed_to_write = RegReserve::new();
1919
for (i, inst) in insts.iter().enumerate() {
2020
if (inst.is_branch() && i < insts.len() - 1)
21-
|| matches!(inst.op, Op::Swi | Op::SwiT | Op::Mcr | Op::Mrc | Op::MrsRc | Op::MrsRs | Op::MsrIc | Op::MsrIs | Op::MsrRc | Op::MsrRs)
21+
|| matches!(
22+
inst.op,
23+
Op::Swi | Op::SwiT | Op::Mcr | Op::Mrc | Op::MrsRc | Op::MrsRs | Op::MsrIc | Op::MsrIs | Op::MsrRc | Op::MsrRs | Op::Swp | Op::Swpb
24+
)
2225
|| inst.op.is_write_mem_transfer()
2326
{
2427
return false;
2528
}
2629

27-
let src_regs = inst.src_regs & !reg_reserve!(Reg::PC);
28-
let out_regs = inst.out_regs & !reg_reserve!(Reg::PC);
30+
let src_regs = inst.src_regs - reg_reserve!(Reg::PC, Reg::CPSR);
31+
let out_regs = inst.out_regs - reg_reserve!(Reg::PC);
2932
regs_disallowed_to_write |= src_regs & !regs_written_to;
3033

3134
if !(out_regs & regs_disallowed_to_write).is_empty() {

src/jit/emitter/emit.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,9 @@ impl<const CPU: CpuType> JitAsm<'_, CPU> {
140140
let inst = &self.jit_buf.insts[i];
141141
debug_println!("{:x}: block {basic_block_index}: emit {inst:?}", block_asm.current_pc);
142142

143-
// if block_asm.current_pc == 0x20076d4 {
144-
// block_asm.bkpt1(0);
145-
// }
143+
if block_asm.current_pc == 0x2001344 {
144+
block_asm.bkpt1(0);
145+
}
146146

147147
let mut label = Label::new();
148148
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();

src/jit/emitter/emit_transfer.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ impl<const CPU: CpuType> JitAsm<'_, CPU> {
132132
block_asm.nop0();
133133

134134
let block_offset = block_asm.guest_inst_metadata(self.jit_buf.insts_cycle_counts[inst_index], inst, RegReserve::new()) as u32;
135-
block_asm.mov4(FlagsUpdate_DontCare, Cond::AL, Reg::R12, &block_offset.into());
135+
block_asm.mov2(Reg::R12, &block_offset.into());
136136

137137
self.emit_fast_single_transfer(size, transfer.signed(), inst.op.is_write_mem_transfer(), block_asm);
138138

@@ -202,7 +202,7 @@ impl<const CPU: CpuType> JitAsm<'_, CPU> {
202202
}
203203

204204
let block_offset = block_asm.guest_inst_metadata(self.jit_buf.insts_cycle_counts[inst_index], inst, op1) as u32;
205-
block_asm.mov4(FlagsUpdate_DontCare, Cond::AL, Reg::R12, &block_offset.into());
205+
block_asm.mov2(Reg::R12, &block_offset.into());
206206

207207
if remaining_op1 == 1 {
208208
let usable_reg = USABLE_REGS.peek().unwrap();
@@ -222,7 +222,7 @@ impl<const CPU: CpuType> JitAsm<'_, CPU> {
222222
block_asm.restore_guest_regs_ptr();
223223
} else {
224224
let block_offset = block_asm.guest_inst_metadata(self.jit_buf.insts_cycle_counts[inst_index], inst, op1) as u32;
225-
block_asm.mov4(FlagsUpdate_DontCare, Cond::AL, Reg::R12, &block_offset.into());
225+
block_asm.mov2(Reg::R12, &block_offset.into());
226226

227227
if remaining_op1 == 1 {
228228
let usable_reg = USABLE_REGS.peek().unwrap();
@@ -317,7 +317,7 @@ impl<const CPU: CpuType> JitAsm<'_, CPU> {
317317
block_asm.nop0();
318318

319319
let block_offset = block_asm.guest_inst_metadata(self.jit_buf.insts_cycle_counts[inst_index], inst, RegReserve::new()) as u32;
320-
block_asm.mov4(FlagsUpdate_DontCare, Cond::AL, Reg::R12, &block_offset.into());
320+
block_asm.mov2(Reg::R12, &block_offset.into());
321321

322322
let size = if inst.op == Op::Swpb { 1 } else { 4 };
323323
self.emit_fast_single_transfer(size, false, false, block_asm);
@@ -330,7 +330,7 @@ impl<const CPU: CpuType> JitAsm<'_, CPU> {
330330

331331
let inst = &self.jit_buf.insts[inst_index];
332332
let block_offset = block_asm.guest_inst_metadata(self.jit_buf.insts_cycle_counts[inst_index], inst, reg_reserve!(Reg::R0)) as u32;
333-
block_asm.mov4(FlagsUpdate_DontCare, Cond::AL, Reg::R12, &block_offset.into());
333+
block_asm.mov2(Reg::R12, &block_offset.into());
334334

335335
self.emit_fast_single_transfer(size, false, true, block_asm);
336336
block_asm.nop0();

src/jit/emitter/thumb/emit_branch_thumb.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ impl<const CPU: CpuType> JitAsm<'_, CPU> {
2929
}
3030

3131
let pc_reg = block_asm.get_guest_map(Reg::PC);
32-
block_asm.ldr2(pc_reg, target_pc | 1);
32+
block_asm.ldr2(pc_reg, target_pc);
3333

3434
let lr_reg = block_asm.get_guest_map(Reg::LR);
3535
let pc = block_asm.current_pc;

src/jit/jit_memory.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,7 @@ impl JitMemory {
697697
}
698698

699699
let metadata_entry = arm_context.gp_regs[12];
700-
let jit_mem_offset = *host_pc - self.mem.as_mut_ptr() as usize;
700+
let jit_mem_offset = *host_pc - 4 - self.mem.as_mut_ptr() as usize;
701701
let metadata_block_page = jit_mem_offset >> PAGE_SHIFT;
702702
let thumb = self.guest_inst_metadata[metadata_block_page][metadata_entry].pc & 1 == 1;
703703

0 commit comments

Comments
 (0)