diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp index e38c9e63c31..d0d29b5e816 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp @@ -2204,12 +2204,7 @@ void Jit64::srwx(UGeckoInstruction inst) int b = inst.RB; int s = inst.RS; - if (gpr.IsImm(b, s)) - { - u32 amount = gpr.Imm32(b); - gpr.SetImmediate32(a, (amount & 0x20) ? 0 : (gpr.Imm32(s) >> (amount & 0x1f))); - } - else if (gpr.IsImm(b)) + if (gpr.IsImm(b)) { u32 amount = gpr.Imm32(b); if (amount & 0x20) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp index 6ee99a898cb..8bed1f548be 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -1836,15 +1836,7 @@ void JitArm64::srwx(UGeckoInstruction inst) int a = inst.RA, b = inst.RB, s = inst.RS; - if (gpr.IsImm(b) && gpr.IsImm(s)) - { - u32 i = gpr.GetImm(s), amount = gpr.GetImm(b); - gpr.SetImmediate(a, (amount & 0x20) ? 0 : i >> (amount & 0x1F)); - - if (inst.Rc) - ComputeRC0(gpr.GetImm(a)); - } - else if (gpr.IsImm(b)) + if (gpr.IsImm(b)) { u32 amount = gpr.GetImm(b); if (amount & 0x20) diff --git a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp index 615141273ed..2aea6c887e1 100644 --- a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp +++ b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp @@ -398,6 +398,9 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31SB(UGeckoInstructi case 476: // nandx a = ~(s & b); break; + case 536: // srwx + a = u32(u64(s) >> (b & 0x3f)); + break; default: return {}; } @@ -413,7 +416,8 @@ ConstantPropagation::EvaluateTable31SBOneRegisterKnown(UGeckoInstruction inst, u switch (inst.SUBOP10) { - case 24: // slwx + case 24: // slwx + case 536: // srwx if (!known_reg_is_b && value == 0) a = 0; else if (known_reg_is_b && (value & 0x20))