summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2024-09-01 10:49:25 +0200
committerJosJuice <josjuice@gmail.com>2025-11-16 09:50:31 +0100
commitbb645e6cbbeece0669e23f82872b1f0f0f36ecfd (patch)
tree0c65a9b086f32f0c98dec2282eeafb1a127eac90 /Source/Core
parent45760841b21f96fcedc325c6121b4446a55f5cb7 (diff)
Jit: Move slwx to ConstantPropagation
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp15
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp16
-rw-r--r--Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp11
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 458ecdc2e5..e38c9e63c3 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 a2b4297738..6ee99a898c 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 4484fd8c32..615141273e 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;