summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2016-05-14 10:30:17 +0200
committerdegasus <wickmarkus@web.de>2016-05-19 19:20:44 +0200
commit782c68cf004c23dff5d1479a2ebcfe00041ccdde (patch)
treea90f37a22abbd7bbea36d42ef71db644b11e72dd /Source
parentd2db329a42e8a61665f39e9d212d5ca5c35efc8a (diff)
JitArm64: Clean up LWZ idle skipping.
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/Jit.cpp1
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp10
2 files changed, 6 insertions, 5 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp
index 31031ef70c..903cfe9067 100644
--- a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp
@@ -467,6 +467,7 @@ const u8* JitArm64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitB
js.compilerPC = ops[i].address;
js.op = &ops[i];
js.instructionNumber = i;
+ js.instructionsLeft = (code_block.m_num_instructions - 1) - i;
const GekkoOPInfo *opinfo = ops[i].opinfo;
js.downcountAmount += opinfo->numCycles;
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp
index b5ba689d21..7bdb250c20 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp
@@ -446,11 +446,11 @@ void JitArm64::lXX(UGeckoInstruction inst)
// LWZ idle skipping
if (SConfig::GetInstance().bSkipIdle &&
- inst.OPCD == 32 &&
- (inst.hex & 0xFFFF0000) == 0x800D0000 &&
- (PowerPC::HostRead_U32(js.compilerPC + 4) == 0x28000000 ||
- (SConfig::GetInstance().bWii && PowerPC::HostRead_U32(js.compilerPC + 4) == 0x2C000000)) &&
- PowerPC::HostRead_U32(js.compilerPC + 8) == 0x4182fff8)
+ inst.OPCD == 32 && MergeAllowedNextInstructions(2) &&
+ (inst.hex & 0xFFFF0000) == 0x800D0000 && // lwz r0, XXXX(r13)
+ (js.op[1].inst.hex == 0x28000000 ||
+ (SConfig::GetInstance().bWii && js.op[1].inst.hex == 0x2C000000)) && // cmpXwi r0,0
+ js.op[2].inst.hex == 0x4182fff8) // beq -8
{
// if it's still 0, we can wait until the next event
FixupBranch noIdle = CBNZ(gpr.R(d));