summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorMarkus Wick <markus@selfnet.de>2015-08-13 12:43:29 +0200
committerMarkus Wick <markus@selfnet.de>2015-08-13 12:43:29 +0200
commit63480da4ee80acc651bdf8f781f4a356f00e0cc2 (patch)
tree8f6b8fa2392cb6b9c2797be6da5591fee941e67a /Source/Core
parent4c5fec477272b24416cc6f9d5a3ac86d589a34b4 (diff)
parentde3ce74b48d0a2f2de4cf89cb3aa4d49f9b37237 (diff)
Merge pull request #2792 from degasus/arm
JitArm64: fix cmpli and disable addzex
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/Jit.h4
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp30
2 files changed, 22 insertions, 12 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.h b/Source/Core/Core/PowerPC/JitArm64/Jit.h
index 476af4c3d8..20d3b8a4de 100644
--- a/Source/Core/Core/PowerPC/JitArm64/Jit.h
+++ b/Source/Core/Core/PowerPC/JitArm64/Jit.h
@@ -240,8 +240,8 @@ private:
FixupBranch JumpIfCRFieldBit(int field, int bit, bool jump_if_set);
- void ComputeRC(Arm64Gen::ARM64Reg reg, int crf = 0);
- void ComputeRC(u32 imm, int crf = 0);
+ void ComputeRC(Arm64Gen::ARM64Reg reg, int crf = 0, bool needs_sext = true);
+ void ComputeRC(u64 imm, int crf = 0, bool needs_sext = true);
void ComputeCarry(bool Carry);
void ComputeCarry();
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
index 99782a03f0..dd367d17f1 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
@@ -15,24 +15,31 @@
using namespace Arm64Gen;
-void JitArm64::ComputeRC(ARM64Reg reg, int crf)
+void JitArm64::ComputeRC(ARM64Reg reg, int crf, bool needs_sext)
{
- ARM64Reg WA = gpr.GetReg();
- ARM64Reg XA = EncodeRegTo64(WA);
+ if (needs_sext)
+ {
+ ARM64Reg WA = gpr.GetReg();
+ ARM64Reg XA = EncodeRegTo64(WA);
- SXTW(XA, reg);
+ SXTW(XA, reg);
- STR(INDEX_UNSIGNED, XA, X29, PPCSTATE_OFF(cr_val[crf]));
- gpr.Unlock(WA);
+ STR(INDEX_UNSIGNED, XA, X29, PPCSTATE_OFF(cr_val[crf]));
+ gpr.Unlock(WA);
+ }
+ else
+ {
+ STR(INDEX_UNSIGNED, EncodeRegTo64(reg), X29, PPCSTATE_OFF(cr_val[crf]));
+ }
}
-void JitArm64::ComputeRC(u32 imm, int crf)
+void JitArm64::ComputeRC(u64 imm, int crf, bool needs_sext)
{
ARM64Reg WA = gpr.GetReg();
ARM64Reg XA = EncodeRegTo64(WA);
MOVI2R(XA, imm);
- if (imm & 0x80000000)
+ if (imm & 0x80000000 && needs_sext)
SXTW(XA, WA);
STR(INDEX_UNSIGNED, XA, X29, PPCSTATE_OFF(cr_val[crf]));
@@ -472,13 +479,13 @@ void JitArm64::cmpli(UGeckoInstruction inst)
if (gpr.IsImm(a))
{
- ComputeRC(gpr.GetImm(a) - inst.UIMM, crf);
+ ComputeRC((u64)gpr.GetImm(a) - inst.UIMM, crf, false);
return;
}
if (!inst.UIMM)
{
- ComputeRC(gpr.R(a), crf);
+ ComputeRC(gpr.R(a), crf, false);
return;
}
@@ -671,6 +678,9 @@ void JitArm64::addzex(UGeckoInstruction inst)
JITDISABLE(bJITIntegerOff);
FALLBACK_IF(inst.OE);
+ // breaks Kirby
+ FALLBACK_IF(1);
+
int a = inst.RA, d = inst.RD;
gpr.BindToRegister(d, d == a);