From bb645e6cbbeece0669e23f82872b1f0f0f36ecfd Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 1 Sep 2024 10:49:25 +0200 Subject: [PATCH] Jit: Move slwx to ConstantPropagation --- Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp | 15 +-------------- .../Core/PowerPC/JitArm64/JitArm64_Integer.cpp | 16 +--------------- .../PowerPC/JitCommon/ConstantPropagation.cpp | 11 +++++++++++ 3 files changed, 13 insertions(+), 29 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp index 458ecdc2e55..e38c9e63c31 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp @@ -2266,14 +2266,7 @@ void Jit64::slwx(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)); - if (inst.Rc) - ComputeRC(a); - } - else if (gpr.IsImm(b)) + if (gpr.IsImm(b)) { u32 amount = gpr.Imm32(b); if (amount & 0x20) @@ -2297,12 +2290,6 @@ void Jit64::slwx(UGeckoInstruction inst) if (inst.Rc) ComputeRC(a); } - else if (gpr.IsImm(s) && gpr.Imm32(s) == 0) - { - gpr.SetImmediate32(a, 0); - if (inst.Rc) - ComputeRC(a); - } 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 a2b4297738b..6ee99a898cb 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -1799,21 +1799,7 @@ void JitArm64::slwx(UGeckoInstruction inst) int a = inst.RA, b = inst.RB, s = inst.RS; - if (gpr.IsImm(b) && gpr.IsImm(s)) - { - u32 i = gpr.GetImm(s), j = gpr.GetImm(b); - gpr.SetImmediate(a, (j & 0x20) ? 0 : i << (j & 0x1F)); - - if (inst.Rc) - ComputeRC0(gpr.GetImm(a)); - } - else if (gpr.IsImm(s, 0)) - { - gpr.SetImmediate(a, 0); - if (inst.Rc) - ComputeRC0(0); - } - else if (gpr.IsImm(b)) + if (gpr.IsImm(b)) { u32 i = gpr.GetImm(b); if (i & 0x20) diff --git a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp index 4484fd8c329..615141273ed 100644 --- a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp +++ b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp @@ -371,6 +371,9 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31SB(UGeckoInstructi switch (inst.SUBOP10) { + case 24: // slwx + a = u32(u64(s) << (b & 0x3f)); + break; case 28: // andx a = s & b; break; @@ -410,6 +413,14 @@ ConstantPropagation::EvaluateTable31SBOneRegisterKnown(UGeckoInstruction inst, u switch (inst.SUBOP10) { + case 24: // slwx + if (!known_reg_is_b && value == 0) + a = 0; + else if (known_reg_is_b && (value & 0x20)) + a = 0; + else + return {}; + break; case 60: // andcx if (known_reg_is_b) value = ~value;