summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2016-03-04 09:23:55 +0100
committerdegasus <wickmarkus@web.de>2016-03-04 22:49:01 +0100
commiteaa0e275db7391e5dcb54047b40c2a69df653d0d (patch)
treec6f27f5e82dbb5560947eb89462cbb37d0783303 /Source/Core
parent689205f0a4020dcf4192e56bc8fd480d756621b0 (diff)
JitArm64: Use immediate WriteExceptionExit more often.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/Jit.cpp39
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/Jit.h1
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp11
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp6
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp6
5 files changed, 43 insertions, 20 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp
index 7f639221d0..ee7e44b39c 100644
--- a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp
@@ -217,6 +217,33 @@ void JitArm64::WriteExit(ARM64Reg Reg)
BR(X30);
}
+void JitArm64::WriteExceptionExit(u32 destination, bool only_external)
+{
+ Cleanup();
+ DoDownCount();
+
+ LDR(INDEX_UNSIGNED, W30, PPC_REG, PPCSTATE_OFF(Exceptions));
+ MOVI2R(DISPATCHER_PC, destination);
+ FixupBranch no_exceptions = CBZ(W30);
+
+ STR(INDEX_UNSIGNED, DISPATCHER_PC, PPC_REG, PPCSTATE_OFF(pc));
+ STR(INDEX_UNSIGNED, DISPATCHER_PC, PPC_REG, PPCSTATE_OFF(npc));
+ if (only_external)
+ MOVI2R(X30, (u64)&PowerPC::CheckExternalExceptions);
+ else
+ MOVI2R(X30, (u64)&PowerPC::CheckExceptions);
+ BLR(X30);
+ LDR(INDEX_UNSIGNED, DISPATCHER_PC, PPC_REG, PPCSTATE_OFF(npc));
+
+ SetJumpTarget(no_exceptions);
+
+ if (Profiler::g_ProfileBlocks)
+ EndTimeProfile(js.curBlock);
+
+ MOVI2R(X30, (u64)asm_routines.dispatcher);
+ BR(X30);
+}
+
void JitArm64::WriteExceptionExit(ARM64Reg dest, bool only_external)
{
Cleanup();
@@ -490,8 +517,7 @@ const u8* JitArm64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitB
gpr.Flush(FLUSH_MAINTAIN_STATE);
fpr.Flush(FLUSH_MAINTAIN_STATE);
- MOVI2R(W30, js.compilerPC);
- WriteExceptionExit(W30, true);
+ WriteExceptionExit(js.compilerPC, true);
SwitchToNearCode();
SetJumpTarget(exit);
gpr.Unlock(W30);
@@ -519,11 +545,11 @@ const u8* JitArm64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitB
LDR(INDEX_UNSIGNED, WA, XA, 0);
TST(WA, 23, 2);
B(CC_EQ, done_here);
+ gpr.Unlock(WA);
gpr.Flush(FLUSH_MAINTAIN_STATE);
fpr.Flush(FLUSH_MAINTAIN_STATE);
- MOVI2R(WA, js.compilerPC);
- WriteExceptionExit(WA, true);
+ WriteExceptionExit(js.compilerPC, true);
SwitchToNearCode();
SetJumpTarget(NoExtException);
SetJumpTarget(exit);
@@ -549,8 +575,9 @@ const u8* JitArm64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitB
ORR(WA, WA, 26, 0); // EXCEPTION_FPU_UNAVAILABLE
STR(INDEX_UNSIGNED, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
- MOVI2R(WA, js.compilerPC);
- WriteExceptionExit(WA);
+ gpr.Unlock(WA);
+
+ WriteExceptionExit(js.compilerPC);
SwitchToNearCode();
diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.h b/Source/Core/Core/PowerPC/JitArm64/Jit.h
index c84cddee93..4ebc33adaf 100644
--- a/Source/Core/Core/PowerPC/JitArm64/Jit.h
+++ b/Source/Core/Core/PowerPC/JitArm64/Jit.h
@@ -230,6 +230,7 @@ private:
// Exits
void WriteExit(u32 destination);
void WriteExit(Arm64Gen::ARM64Reg dest);
+ void WriteExceptionExit(u32 destination, bool only_external = false);
void WriteExceptionExit(Arm64Gen::ARM64Reg dest, bool only_external = false);
FixupBranch JumpIfCRFieldBit(int field, int bit, bool jump_if_set);
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp
index 04e8bfcf9d..bda767d056 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp
@@ -30,11 +30,9 @@ void JitArm64::sc(UGeckoInstruction inst)
ORR(WA, WA, 31, 0); // Same as WA | EXCEPTION_SYSCALL
STR(INDEX_UNSIGNED, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
- MOVI2R(WA, js.compilerPC + 4);
- STR(INDEX_UNSIGNED, WA, PPC_REG, PPCSTATE_OFF(pc));
+ gpr.Unlock(WA);
- // WA is unlocked in this function
- WriteExceptionExit(WA);
+ WriteExceptionExit(js.compilerPC + 4);
}
void JitArm64::rfi(UGeckoInstruction inst)
@@ -108,8 +106,9 @@ void JitArm64::bx(UGeckoInstruction inst)
MOVI2R(XA, (u64)&CoreTiming::Idle);
BLR(XA);
- MOVI2R(WA, js.compilerPC);
- WriteExceptionExit(WA);
+ gpr.Unlock(WA);
+
+ WriteExceptionExit(js.compilerPC);
}
WriteExit(destination);
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp
index b4abe3b15f..d122170b85 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp
@@ -463,13 +463,11 @@ void JitArm64::lXX(UGeckoInstruction inst)
ARM64Reg WA = gpr.GetReg();
ARM64Reg XA = EncodeRegTo64(WA);
-
MOVI2R(XA, (u64)&CoreTiming::Idle);
BLR(XA);
+ gpr.Unlock(WA);
- MOVI2R(WA, js.compilerPC);
-
- WriteExceptionExit(WA);
+ WriteExceptionExit(js.compilerPC);
SwitchToNearCode();
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp
index 5411bf3459..d275bdab3b 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp
@@ -196,11 +196,9 @@ void JitArm64::twx(UGeckoInstruction inst)
LDR(INDEX_UNSIGNED, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
ORR(WA, WA, 24, 0); // Same as WA | EXCEPTION_PROGRAM
STR(INDEX_UNSIGNED, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
+ gpr.Unlock(WA);
- MOVI2R(WA, js.compilerPC);
-
- // WA is unlocked in this function
- WriteExceptionExit(WA);
+ WriteExceptionExit(js.compilerPC);
SwitchToNearCode();