Skip to content

Commit 8cecfcf

Browse files
committed
Align base addr of multiple io
1 parent 3b5de77 commit 8cecfcf

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

src/jit/emitter/emit_transfer.rs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -375,16 +375,21 @@ impl<const CPU: CpuType> JitAsm<'_, CPU> {
375375
block_asm.bfc(base_reg, mmu::MMU_PAGE_SHIFT as u8, 32 - mmu::MMU_PAGE_SHIFT as u8);
376376
block_asm.add(base_reg, mmu_offset_reg, base_reg);
377377
block_asm.add(base_reg, base_reg, shm_ptr as u32);
378+
block_asm.bic(base_reg, base_reg, 3);
378379

379380
for (guest_reg, fixed_reg) in non_gp_regs_mappings {
380381
block_asm.mov(BlockReg::Fixed(fixed_reg), guest_reg);
381382
}
382383

383-
block_asm.guest_transfer_write_multiple(base_reg, base_reg_out, gp_regs, fixed_regs, write_back, pre, !decrement);
384+
block_asm.guest_transfer_write_multiple(base_reg, base_reg_out, gp_regs, fixed_regs, false, pre, !decrement);
384385

385386
if write_back {
386-
block_asm.sub(base_reg, base_reg_out, base_reg);
387-
block_asm.add(op0, op0, base_reg);
387+
let len = gp_regs.len() + fixed_regs.len();
388+
if decrement {
389+
block_asm.sub(op0, op0, len as u32 * 4);
390+
} else {
391+
block_asm.add(op0, op0, len as u32 * 4);
392+
}
388393
}
389394

390395
block_asm.msr_cpsr(cpsr_backup_reg);
@@ -403,17 +408,22 @@ impl<const CPU: CpuType> JitAsm<'_, CPU> {
403408
let base_reg_out = block_asm.new_reg();
404409
let mmu = get_mmu!(self.emu, CPU);
405410
let base_ptr = mmu.get_base_tcm_ptr();
406-
block_asm.bic(base_reg, op0, 0xF0000000);
411+
block_asm.bic(base_reg, op0, 0xF0000003);
407412
block_asm.add(base_reg, base_reg, base_ptr as u32);
408-
block_asm.guest_transfer_read_multiple(base_reg, base_reg_out, gp_regs, fixed_regs, write_back, pre, !decrement);
413+
414+
block_asm.guest_transfer_read_multiple(base_reg, base_reg_out, gp_regs, fixed_regs, false, pre, !decrement);
409415

410416
for (guest_reg, fixed_reg) in non_gp_regs_mappings {
411417
block_asm.mov(guest_reg, BlockReg::Fixed(fixed_reg));
412418
}
413419

414420
if write_back {
415-
block_asm.sub(base_reg, base_reg_out, base_reg);
416-
block_asm.add(op0, base_reg, op0);
421+
let len = gp_regs.len() + fixed_regs.len();
422+
if decrement {
423+
block_asm.sub(op0, op0, len as u32 * 4);
424+
} else {
425+
block_asm.add(op0, op0, len as u32 * 4);
426+
}
417427
}
418428

419429
for guest_reg in rlist {

0 commit comments

Comments
 (0)