From 4722a69fd04e3c3ae6ee43e2c9c32473863735f3 Mon Sep 17 00:00:00 2001 From: degasus Date: Sun, 23 Aug 2015 12:11:21 +0200 Subject: [PATCH] JitArm64: Implement divwux --- Source/Core/Core/PowerPC/JitArm64/Jit.h | 1 + .../PowerPC/JitArm64/JitArm64_Integer.cpp | 28 +++++++++++++++++++ .../Core/PowerPC/JitArm64/JitArm64_Tables.cpp | 4 +-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.h b/Source/Core/Core/PowerPC/JitArm64/Jit.h index a7c75b24e5..22d515e32b 100644 --- a/Source/Core/Core/PowerPC/JitArm64/Jit.h +++ b/Source/Core/Core/PowerPC/JitArm64/Jit.h @@ -103,6 +103,7 @@ public: void subfcx(UGeckoInstruction inst); void subfic(UGeckoInstruction inst); void addex(UGeckoInstruction inst); + void divwux(UGeckoInstruction inst); // System Registers void mtmsr(UGeckoInstruction inst); diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp index fb3f1ec407..70bed8e6c3 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -935,6 +935,34 @@ void JitArm64::addcx(UGeckoInstruction inst) } } +void JitArm64::divwux(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITIntegerOff); + FALLBACK_IF(inst.OE); + + int a = inst.RA, b = inst.RB, d = inst.RD; + + if (gpr.IsImm(a) && gpr.IsImm(b)) + { + u32 i = gpr.GetImm(a), j = gpr.GetImm(b); + gpr.SetImmediate(d, j == 0 ? 0 : i / j); + + if (inst.Rc) + ComputeRC(gpr.GetImm(d), 0); + } + else + { + gpr.BindToRegister(d, d == a || d == b); + + // d = a / b + UDIV(gpr.R(d), gpr.R(a), gpr.R(b)); + + if (inst.Rc) + ComputeRC(gpr.R(d), 0); + } +} + void JitArm64::slwx(UGeckoInstruction inst) { INSTRUCTION_START diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp index a33cb9909c..80a8e9c22a 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp @@ -182,8 +182,8 @@ static GekkoOPTemplate table31[] = {714, &JitArm64::addzex}, // addzeox {491, &JitArm64::FallBackToInterpreter}, // divwx {1003, &JitArm64::FallBackToInterpreter}, // divwox - {459, &JitArm64::FallBackToInterpreter}, // divwux - {971, &JitArm64::FallBackToInterpreter}, // divwuox + {459, &JitArm64::divwux}, // divwux + {971, &JitArm64::divwux}, // divwuox {75, &JitArm64::FallBackToInterpreter}, // mulhwx {11, &JitArm64::FallBackToInterpreter}, // mulhwux {235, &JitArm64::mullwx}, // mullwx