diff options
| author | Markus Wick <markus@selfnet.de> | 2015-08-13 12:43:29 +0200 |
|---|---|---|
| committer | Markus Wick <markus@selfnet.de> | 2015-08-13 12:43:29 +0200 |
| commit | 63480da4ee80acc651bdf8f781f4a356f00e0cc2 (patch) | |
| tree | 8f6b8fa2392cb6b9c2797be6da5591fee941e67a /Source/Core | |
| parent | 4c5fec477272b24416cc6f9d5a3ac86d589a34b4 (diff) | |
| parent | de3ce74b48d0a2f2de4cf89cb3aa4d49f9b37237 (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.h | 4 | ||||
| -rw-r--r-- | Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp | 30 |
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); |
