@@ -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