diff options
| author | MerryMage <MerryMage@users.noreply.github.com> | 2020-12-28 12:55:39 +0000 |
|---|---|---|
| committer | MerryMage <MerryMage@users.noreply.github.com> | 2020-12-28 12:55:39 +0000 |
| commit | 4a102186c7bf8e2e4e6a594e14f0e0dbe32cb9b2 (patch) | |
| tree | 74af2ce6c5163bceced9768619de1188e0766e4a /Source | |
| parent | c20bb81071e9fb5ae168817cf065895d1e3a318c (diff) | |
Jit_Integer: rlwimix: Handle all gpr.IsImm(a) cases
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp index ec62bf169d..72faecef27 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp @@ -1690,15 +1690,20 @@ void Jit64::rlwimix(UGeckoInstruction inst) AndWithMask(Ra, ~mask); OR(32, Ra, Imm32(Common::RotateLeft(gpr.Imm32(s), inst.SH) & mask)); } - else if (inst.SH && gpr.IsImm(a)) + else if (gpr.IsImm(a)) { - u32 maskA = gpr.Imm32(a) & ~mask; + const u32 maskA = gpr.Imm32(a) & ~mask; RCOpArg Rs = gpr.Use(s, RCMode::Read); RCX64Reg Ra = gpr.Bind(a, RCMode::Write); RegCache::Realize(Rs, Ra); - if (left_shift) + if (inst.SH == 0) + { + MOV(32, Ra, Rs); + AndWithMask(Ra, mask); + } + else if (left_shift) { MOV(32, Ra, Rs); SHL(32, Ra, Imm8(inst.SH)); @@ -1713,7 +1718,11 @@ void Jit64::rlwimix(UGeckoInstruction inst) RotateLeft(32, Ra, Rs, inst.SH); AndWithMask(Ra, mask); } - OR(32, Ra, Imm32(maskA)); + + if (maskA) + OR(32, Ra, Imm32(maskA)); + else + needs_test = true; } else if (inst.SH) { |
