diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp index d0d29b5e816..eb0a6086a01 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp @@ -2338,22 +2338,7 @@ void Jit64::srawx(UGeckoInstruction inst) int b = inst.RB; int s = inst.RS; - if (gpr.IsImm(b, s)) - { - s32 i = gpr.SImm32(s), amount = gpr.SImm32(b); - if (amount & 0x20) - { - gpr.SetImmediate32(a, i & 0x80000000 ? 0xFFFFFFFF : 0); - FinalizeCarry(i & 0x80000000 ? true : false); - } - else - { - amount &= 0x1F; - gpr.SetImmediate32(a, i >> amount); - FinalizeCarry(amount != 0 && i < 0 && (u32(i) << (32 - amount))); - } - } - else if (gpr.IsImm(b)) + if (gpr.IsImm(b)) { u32 amount = gpr.Imm32(b); RCX64Reg Ra = gpr.Bind(a, RCMode::Write); @@ -2389,11 +2374,6 @@ void Jit64::srawx(UGeckoInstruction inst) FinalizeCarry(CC_NZ); } } - else if (gpr.IsImm(s) && gpr.Imm32(s) == 0) - { - gpr.SetImmediate32(a, 0); - FinalizeCarry(false); - } else if (cpu_info.bBMI2) { RCX64Reg Ra = gpr.Bind(a, RCMode::Write); diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp index 8bed1f548be..55eddf11c03 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -1871,34 +1871,7 @@ void JitArm64::srawx(UGeckoInstruction inst) int a = inst.RA, b = inst.RB, s = inst.RS; - if (gpr.IsImm(b) && gpr.IsImm(s)) - { - s32 i = gpr.GetImm(s), amount = gpr.GetImm(b); - if (amount & 0x20) - { - gpr.SetImmediate(a, i & 0x80000000 ? 0xFFFFFFFF : 0); - ComputeCarry(i & 0x80000000 ? true : false); - } - else - { - amount &= 0x1F; - gpr.SetImmediate(a, i >> amount); - ComputeCarry(amount != 0 && i < 0 && (u32(i) << (32 - amount))); - } - - if (inst.Rc) - ComputeRC0(gpr.GetImm(a)); - return; - } - else if (gpr.IsImm(s, 0)) - { - gpr.SetImmediate(a, 0); - ComputeCarry(false); - if (inst.Rc) - ComputeRC0(0); - return; - } - else if (gpr.IsImm(b)) + if (gpr.IsImm(b)) { int amount = gpr.GetImm(b); diff --git a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp index 2aea6c887e1..5efd3b55e14 100644 --- a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp +++ b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp @@ -401,6 +401,15 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31SB(UGeckoInstructi case 536: // srwx a = u32(u64(s) >> (b & 0x3f)); break; + case 792: // srawx + { + const u64 temp = (s64(s32(s)) << 32) >> (b & 0x3f); + a = u32(temp >> 32); + + ConstantPropagationResult result(inst.RA, a, inst.Rc); + result.carry = (temp & a) != 0; + return result; + } default: return {}; } @@ -457,6 +466,18 @@ ConstantPropagation::EvaluateTable31SBOneRegisterKnown(UGeckoInstruction inst, u else return {}; break; + case 792: // srawx + if (!known_reg_is_b && value == 0) + { + ConstantPropagationResult result(inst.RA, 0, inst.Rc); + result.carry = false; + return result; + } + else + { + return {}; + } + break; default: return {}; }