summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorPierre Bourdon <delroth@gmail.com>2012-06-19 06:35:30 +0200
committerPierre Bourdon <delroth@gmail.com>2012-06-19 06:35:30 +0200
commit76a13604ef49b522281af75675f044d59a74e871 (patch)
tree6ac1ed41eeb8dd5f7f8e61c782f6195d6ac8d610 /Source/Core
parentbfc797ede1d616c3060a2545529087a0ad2af1b5 (diff)
Optimize mtmsr by going to an exception exit only if EE are enabled and some
exceptions are pending.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/PowerPC/Jit64/Jit_SystemRegisters.cpp20
-rw-r--r--Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp17
2 files changed, 33 insertions, 4 deletions
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_SystemRegisters.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_SystemRegisters.cpp
index 5cb7f0e13b..b977e82b28 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_SystemRegisters.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_SystemRegisters.cpp
@@ -123,10 +123,24 @@ void Jit64::mtmsr(UGeckoInstruction inst)
gpr.Flush(FLUSH_ALL);
fpr.Flush(FLUSH_ALL);
- // Force an external exception when going out of mtmsr in order to check
- // immediately for interrupts that were delayed because of MSR.EE=0.
+ // If some exceptions are pending and EE are now enabled, force checking
+ // external exceptions when going out of mtmsr in order to execute delayed
+ // interrupts as soon as possible.
+ MOV(32, R(EAX), M(&MSR));
+ TEST(32, R(EAX), Imm32(0x8000));
+ FixupBranch eeDisabled = J_CC(CC_Z);
+
+ MOV(32, R(EAX), M((void*)&PowerPC::ppcState.Exceptions));
+ TEST(32, R(EAX), R(EAX));
+ FixupBranch noExceptionsPending = J_CC(CC_Z);
+
MOV(32, M(&PC), Imm32(js.compilerPC + 4));
- WriteExceptionExit();
+ WriteExternalExceptionExit();
+
+ SetJumpTarget(eeDisabled);
+ SetJumpTarget(noExceptionsPending);
+ WriteExit(js.compilerPC + 4, 0);
+
js.firstFPInstructionFound = false;
}
diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp
index 448f51d1c6..d9aa46f6b5 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp
@@ -997,8 +997,23 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak
unsigned InstLoc = ibuild->GetImmValue(getOp2(I));
regStoreInstToConstLoc(RI, 32, getOp1(I), &MSR);
regNormalRegClear(RI, I);
+
+ // If some exceptions are pending and EE are now enabled, force checking
+ // external exceptions when going out of mtmsr in order to execute delayed
+ // interrupts as soon as possible.
+ Jit->MOV(32, R(EAX), M(&MSR));
+ Jit->TEST(32, R(EAX), Imm32(0x8000));
+ FixupBranch eeDisabled = Jit->J_CC(CC_Z);
+
+ Jit->MOV(32, R(EAX), M((void*)&PowerPC::ppcState.Exceptions));
+ Jit->TEST(32, R(EAX), R(EAX));
+ FixupBranch noExceptionsPending = Jit->J_CC(CC_Z);
+
Jit->MOV(32, M(&PC), Imm32(InstLoc + 4));
- Jit->WriteExceptionExit();
+ Jit->WriteExceptionExit(); // TODO: Implement WriteExternalExceptionExit for JitIL
+
+ Jit->SetJumpTarget(eeDisabled);
+ Jit->SetJumpTarget(noExceptionsPending);
break;
}
case StoreGQR: {