From 98cf0b3286fa50a42f713636027588735173b4a8 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Mon, 15 Oct 2018 21:01:39 +0100 Subject: [PATCH] Jit_LoadStore: lmw --- .../Core/Core/PowerPC/Jit64/Jit_LoadStore.cpp | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_LoadStore.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_LoadStore.cpp index 3376c6f566..417d8f8b93 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_LoadStore.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_LoadStore.cpp @@ -510,18 +510,22 @@ void Jit64::lmw(UGeckoInstruction inst) INSTRUCTION_START JITDISABLE(bJITLoadStoreOff); + int a = inst.RA, d = inst.RD; + // TODO: This doesn't handle rollback on DSI correctly - MOV(32, R(RSCRATCH2), Imm32((u32)(s32)inst.SIMM_16)); - if (inst.RA) - ADD(32, R(RSCRATCH2), gpr.R(inst.RA)); - for (int i = inst.RD; i < 32; i++) { - SafeLoadToReg(RSCRATCH, R(RSCRATCH2), 32, (i - inst.RD) * 4, - CallerSavedRegistersInUse() | BitSet32{RSCRATCH2}, false); - gpr.BindToRegister(i, false, true); - MOV(32, gpr.R(i), R(RSCRATCH)); + RCOpArg Ra = a ? gpr.Use(a, RCMode::Read) : RCOpArg::Imm32(0); + RegCache::Realize(Ra); + MOV_sum(32, RSCRATCH2, Ra, Imm32((u32)(s32)inst.SIMM_16)); + } + for (int i = d; i < 32; i++) + { + SafeLoadToReg(RSCRATCH, R(RSCRATCH2), 32, (i - d) * 4, + CallerSavedRegistersInUse() | BitSet32{RSCRATCH2}, false); + RCOpArg Ri = gpr.Bind(i, RCMode::Write); + RegCache::Realize(Ri); + MOV(32, Ri, R(RSCRATCH)); } - gpr.UnlockAllX(); } void Jit64::stmw(UGeckoInstruction inst)