summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2024-08-31 09:55:26 +0200
committerJosJuice <josjuice@gmail.com>2025-11-16 09:50:31 +0100
commita3797778ffac9c6be5780e0cebc976239fbca74f (patch)
treee3ac2723523096d81a119a3747ca6f7b43183bdf /Source/Core
parent1a22bda0a7bb3a0cc5a7335ce3756d7eed346851 (diff)
Jit: Move srawix to ConstantPropagation
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp8
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp12
-rw-r--r--Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp9
3 files changed, 10 insertions, 19 deletions
diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
index 206e62cc48..935c212bbc 100644
--- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
+++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
@@ -2561,13 +2561,7 @@ void Jit64::srawix(UGeckoInstruction inst)
int s = inst.RS;
int amount = inst.SH;
- if (gpr.IsImm(s))
- {
- s32 imm = gpr.SImm32(s);
- gpr.SetImmediate32(a, imm >> amount);
- FinalizeCarry(amount != 0 && imm < 0 && (u32(imm) << (32 - amount)));
- }
- else if (amount != 0)
+ if (amount != 0)
{
RCX64Reg Ra = gpr.Bind(a, RCMode::Write);
RCOpArg Rs = gpr.Use(s, RCMode::Read);
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
index b1d1994ac4..229bb9c471 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
@@ -810,17 +810,7 @@ void JitArm64::srawix(UGeckoInstruction inst)
int amount = inst.SH;
bool inplace_carry = CanMergeNextInstructions(1) && js.op[1].wantsCAInFlags;
- if (gpr.IsImm(s))
- {
- s32 imm = (s32)gpr.GetImm(s);
- gpr.SetImmediate(a, imm >> amount);
-
- ComputeCarry(amount != 0 && (imm < 0) && (u32(imm) << (32 - amount)));
-
- if (inst.Rc)
- ComputeRC0(gpr.GetImm(a));
- }
- else if (amount == 0)
+ if (amount == 0)
{
gpr.BindToRegister(a, a == s);
ARM64Reg RA = gpr.R(a);
diff --git a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp
index 833ff1b040..cffa4f7790 100644
--- a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp
+++ b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp
@@ -144,6 +144,7 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31S(UGeckoInstructio
if (!HasGPR(inst.RS))
return {};
+ std::optional<bool> carry;
u32 a;
const u32 s = GetGPR(inst.RS);
@@ -152,6 +153,10 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31S(UGeckoInstructio
case 26: // cntlzwx
a = std::countl_zero(s);
break;
+ case 824: // srawix
+ a = s32(s) >> inst.SH;
+ carry = inst.SH != 0 && s32(s) < 0 && (s << (32 - inst.SH));
+ break;
case 922: // extshx
a = s32(s16(s));
break;
@@ -162,7 +167,9 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31S(UGeckoInstructio
return {};
}
- return ConstantPropagationResult(inst.RA, a, inst.Rc);
+ ConstantPropagationResult result(ConstantPropagationResult(inst.RA, a, inst.Rc));
+ result.carry = carry;
+ return result;
}
ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstruction inst,