summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorRyan Houdek <Sonicadvance1@gmail.com>2015-07-06 21:43:56 -0500
committerRyan Houdek <Sonicadvance1@gmail.com>2015-07-06 21:43:56 -0500
commit48ac522b5cd51ceb94d1423ba2cf89d37efcb12a (patch)
tree050fbf9067871c9967925eff3e2890f6482c25f2 /Source/Core
parentaf854dfa0083d5b92944d4ded7ec0e74c1284bc6 (diff)
parenteffb626befdad919020e9e1655b68af692b16f76 (diff)
Merge pull request #2715 from degasus/aarch64
JitArm64: Implement EXCEPTION_FPU_UNAVAILABLE support.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/Jit.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp
index a658252043..c1bf82b05d 100644
--- a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp
@@ -303,6 +303,7 @@ const u8* JitArm64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitB
}
js.isLastInstruction = false;
+ js.firstFPInstructionFound = false;
js.blockStart = em_address;
js.fifoBytesThisBlock = 0;
js.downcountAmount = 0;
@@ -389,6 +390,28 @@ const u8* JitArm64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitB
if (!ops[i].skip)
{
+ if ((opinfo->flags & FL_USE_FPU) && !js.firstFPInstructionFound)
+ {
+ //This instruction uses FPU - needs to add FP exception bailout
+ ARM64Reg WA = gpr.GetReg();
+ LDR(INDEX_UNSIGNED, WA, X29, PPCSTATE_OFF(msr));
+ FixupBranch b1 = TBNZ(WA, 13); // Test FP enabled bit
+
+ gpr.Flush(FLUSH_MAINTAIN_STATE);
+ fpr.Flush(FLUSH_MAINTAIN_STATE);
+
+ LDR(INDEX_UNSIGNED, WA, X29, PPCSTATE_OFF(Exceptions));
+ ORR(WA, WA, 26, 0); // EXCEPTION_FPU_UNAVAILABLE
+ STR(INDEX_UNSIGNED, WA, X29, PPCSTATE_OFF(Exceptions));
+
+ MOVI2R(WA, js.compilerPC);
+ WriteExceptionExit(WA);
+
+ SetJumpTarget(b1);
+
+ js.firstFPInstructionFound = true;
+ }
+
if (jo.memcheck && (opinfo->flags & FL_USE_FPU))
{
// Don't do this yet