Sped up to the Dolphin debugger by not checking for breakpoints when stepping.

Fixed the JIT cache, invalidating one instruction length at a time.
Fixed a bug where the JIT cache did not get invalidated when stepping.
Disabled fused instructions in the debugger.
This commit is contained in:
skidau 2012-03-16 20:08:05 +11:00
parent 8ed6ea3b07
commit 05692b1e7e
6 changed files with 13 additions and 5 deletions

View File

@ -601,8 +601,8 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
MOV(32, M(&PC), Imm32(ops[i].address)); MOV(32, M(&PC), Imm32(ops[i].address));
ABI_CallFunction(reinterpret_cast<void *>(&PowerPC::CheckBreakPoints)); ABI_CallFunction(reinterpret_cast<void *>(&PowerPC::CheckBreakPoints));
TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF)); TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF));
FixupBranch noBreakpoint = J_CC(CC_Z); FixupBranch noBreakpoint = J_CC(CC_Z);
gpr.Flush(FLUSH_ALL); gpr.Flush(FLUSH_ALL);
fpr.Flush(FLUSH_ALL); fpr.Flush(FLUSH_ALL);

View File

@ -81,12 +81,15 @@ void Jit64AsmRoutineManager::Generate()
if (Core::g_CoreStartupParameter.bEnableDebugging) if (Core::g_CoreStartupParameter.bEnableDebugging)
{ {
TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(PowerPC::CPU_STEPPING));
FixupBranch notStepping = J_CC(CC_Z);
ABI_CallFunction(reinterpret_cast<void *>(&PowerPC::CheckBreakPoints)); ABI_CallFunction(reinterpret_cast<void *>(&PowerPC::CheckBreakPoints));
TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF)); TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF));
FixupBranch noBreakpoint = J_CC(CC_Z); FixupBranch noBreakpoint = J_CC(CC_Z);
ABI_PopAllCalleeSavedRegsAndAdjustStack(); ABI_PopAllCalleeSavedRegsAndAdjustStack();
RET(); RET();
SetJumpTarget(noBreakpoint); SetJumpTarget(noBreakpoint);
SetJumpTarget(notStepping);
} }
SetJumpTarget(skipToRealDispatch); SetJumpTarget(skipToRealDispatch);

View File

@ -266,7 +266,7 @@ void Jit64::reg_imm(UGeckoInstruction inst)
case 15: case 15:
if (a == 0) { // lis if (a == 0) { // lis
// Merge with next instruction if loading a 32-bits immediate value (lis + addi, lis + ori) // Merge with next instruction if loading a 32-bits immediate value (lis + addi, lis + ori)
if (!js.isLastInstruction) { if (!js.isLastInstruction && !Core::g_CoreStartupParameter.bEnableDebugging) {
if ((js.next_inst.OPCD == 14) && (js.next_inst.RD == d) && (js.next_inst.RA == d)) { // addi if ((js.next_inst.OPCD == 14) && (js.next_inst.RD == d) && (js.next_inst.RA == d)) { // addi
gpr.SetImmediate32(d, ((u32)inst.SIMM_16 << 16) + (u32)(s32)js.next_inst.SIMM_16); gpr.SetImmediate32(d, ((u32)inst.SIMM_16 << 16) + (u32)(s32)js.next_inst.SIMM_16);
js.downcountAmount++; js.downcountAmount++;

View File

@ -83,12 +83,15 @@ void JitILAsmRoutineManager::Generate()
if (Core::g_CoreStartupParameter.bEnableDebugging) if (Core::g_CoreStartupParameter.bEnableDebugging)
{ {
TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(PowerPC::CPU_STEPPING));
FixupBranch notStepping = J_CC(CC_Z);
ABI_CallFunction(reinterpret_cast<void *>(&PowerPC::CheckBreakPoints)); ABI_CallFunction(reinterpret_cast<void *>(&PowerPC::CheckBreakPoints));
TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF)); TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF));
FixupBranch noBreakpoint = J_CC(CC_Z); FixupBranch noBreakpoint = J_CC(CC_Z);
ABI_PopAllCalleeSavedRegsAndAdjustStack(); ABI_PopAllCalleeSavedRegsAndAdjustStack();
RET(); RET();
SetJumpTarget(noBreakpoint); SetJumpTarget(noBreakpoint);
SetJumpTarget(notStepping);
} }
SetJumpTarget(skipToRealDispatch); SetJumpTarget(skipToRealDispatch);

View File

@ -422,17 +422,17 @@ bool JitBlock::ContainsAddress(u32 em_address)
if (b.originalAddress & JIT_ICACHE_VMEM_BIT) if (b.originalAddress & JIT_ICACHE_VMEM_BIT)
{ {
u32 cacheaddr = b.originalAddress & JIT_ICACHE_MASK; u32 cacheaddr = b.originalAddress & JIT_ICACHE_MASK;
memset(iCacheVMEM + cacheaddr, JIT_ICACHE_INVALID_BYTE, length); memset(iCacheVMEM + cacheaddr, JIT_ICACHE_INVALID_BYTE, 4);
} }
else if (b.originalAddress & JIT_ICACHE_EXRAM_BIT) else if (b.originalAddress & JIT_ICACHE_EXRAM_BIT)
{ {
u32 cacheaddr = b.originalAddress & JIT_ICACHEEX_MASK; u32 cacheaddr = b.originalAddress & JIT_ICACHEEX_MASK;
memset(iCacheEx + cacheaddr, JIT_ICACHE_INVALID_BYTE, length); memset(iCacheEx + cacheaddr, JIT_ICACHE_INVALID_BYTE, 4);
} }
else else
{ {
u32 cacheaddr = b.originalAddress & JIT_ICACHE_MASK; u32 cacheaddr = b.originalAddress & JIT_ICACHE_MASK;
memset(iCache + cacheaddr, JIT_ICACHE_INVALID_BYTE, length); memset(iCache + cacheaddr, JIT_ICACHE_INVALID_BYTE, 4);
} }
#endif #endif
DestroyBlock(it2->second, true); DestroyBlock(it2->second, true);

View File

@ -263,6 +263,8 @@ void CCodeWindow::SingleStep()
{ {
if (CCPU::IsStepping()) if (CCPU::IsStepping())
{ {
if (jit)
jit->GetBlockCache()->InvalidateICache(PC, 4);
CCPU::StepOpcode(&sync_event); CCPU::StepOpcode(&sync_event);
wxThread::Sleep(20); wxThread::Sleep(20);
// need a short wait here // need a short wait here