diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp index 6e262a209d..47e410b2e9 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp @@ -338,31 +338,20 @@ void Jit64::WriteRfiExitDestInEAX() { MOV(32, M(&PC), R(EAX)); MOV(32, M(&NPC), R(EAX)); - Cleanup(); - ABI_CallFunction(reinterpret_cast(&PowerPC::CheckExceptions)); SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); - TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF)); - J_CC(CC_Z, asm_routines.outerLoop, true); - - ABI_PopAllCalleeSavedRegsAndAdjustStack(); - RET(); + JMP(asm_routines.dispatcher, true); } void Jit64::WriteExceptionExit() { Cleanup(); - MOV(32, R(EAX), M(&PC)); MOV(32, M(&NPC), R(EAX)); ABI_CallFunction(reinterpret_cast(&PowerPC::CheckExceptions)); SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); - TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF)); - J_CC(CC_Z, asm_routines.outerLoop, true); - - ABI_PopAllCalleeSavedRegsAndAdjustStack(); - RET(); + JMP(asm_routines.dispatcher, true); } void Jit64::WriteExternalExceptionExit() @@ -372,12 +361,7 @@ void Jit64::WriteExternalExceptionExit() MOV(32, M(&NPC), R(EAX)); ABI_CallFunction(reinterpret_cast(&PowerPC::CheckExternalExceptions)); SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); - TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF)); - J_CC(CC_Z, asm_routines.outerLoop, true); - - //Landing pad for drec space - ABI_PopAllCalleeSavedRegsAndAdjustStack(); - RET(); + JMP(asm_routines.dispatcher, true); } void STACKALIGN Jit64::Run() diff --git a/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp b/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp index 120ee8e48f..f7082cd1cc 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp @@ -198,11 +198,12 @@ void Jit64AsmRoutineManager::Generate() doTiming = GetCodePtr(); testExternalExceptions = GetCodePtr(); + TEST(32, M((void *)&PowerPC::ppcState.Exceptions), Imm32(EXCEPTION_EXTERNAL_INT | EXCEPTION_PERFORMANCE_MONITOR | EXCEPTION_DECREMENTER)); + FixupBranch noExtException = J_CC(CC_Z); MOV(32, R(EAX), M(&PC)); MOV(32, M(&NPC), R(EAX)); ABI_CallFunction(reinterpret_cast(&PowerPC::CheckExternalExceptions)); - MOV(32, R(EAX), M(&NPC)); - MOV(32, M(&PC), R(EAX)); + SetJumpTarget(noExtException); TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF)); J_CC(CC_Z, outerLoop, true); diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp b/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp index 8b48626112..333f0cdc05 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp +++ b/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp @@ -254,7 +254,7 @@ void EmuCodeBlock::SafeWriteRegToReg(X64Reg reg_value, X64Reg reg_addr, int acce TEST(32, R(reg_addr), Imm32(mem_mask)); FixupBranch fast = J_CC(CC_Z); - + MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write switch (accessSize) { case 32: ABI_CallFunctionRR(thunks.ProtectFunction(swap ? ((void *)&Memory::Write_U32) : ((void *)&Memory::Write_U32_Swap), 2), reg_value, reg_addr); break; @@ -290,6 +290,7 @@ void EmuCodeBlock::SafeWriteFloatToReg(X64Reg xmm_value, X64Reg reg_addr) MOVSS(M(&float_buffer), xmm_value); MOV(32, R(EAX), M(&float_buffer)); BSWAP(32, EAX); + MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write ABI_CallFunctionRR(thunks.ProtectFunction(((void *)&Memory::Write_U32), 2), EAX, reg_addr); FixupBranch arg2 = J(); SetJumpTarget(argh); diff --git a/Source/Core/Core/Src/PowerPC/PowerPC.cpp b/Source/Core/Core/Src/PowerPC/PowerPC.cpp index 59a79d0e9e..8a7b817212 100644 --- a/Source/Core/Core/Src/PowerPC/PowerPC.cpp +++ b/Source/Core/Core/Src/PowerPC/PowerPC.cpp @@ -491,21 +491,6 @@ void CheckExternalExceptions() // Read volatile data once u32 exceptions = ppcState.Exceptions; - if (!exceptions) - return; - - // Example procedure: - // set SRR0 to either PC or NPC - //SRR0 = NPC; - // save specified MSR bits - //SRR1 = MSR & 0x87C0FFFF; - // copy ILE bit to LE - //MSR |= (MSR >> 16) & 1; - // clear MSR as specified - //MSR &= ~0x04EF36; // 0x04FF36 also clears ME (only for machine check exception) - // set to exception type entry point - //NPC = 0x00000x00; - // EXTERNAL INTERRUPT if (MSR & 0x0008000) //hacky...the exception shouldn't be generated if EE isn't set... {