summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2024-08-31 11:33:23 +0200
committerJosJuice <josjuice@gmail.com>2025-11-16 09:50:31 +0100
commit7456ba3d3dacedf4e1f14775d08e3f09488d4731 (patch)
tree2ffca60a6a9857a3980346621a96a59717c4d3d3 /Source/Core
parentb469981c7259a84608b951ca36d064eca6392667 (diff)
Jit: Move mullwx, mulhwx, mulhwux to ConstantPropagation
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp18
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp51
-rw-r--r--Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp10
3 files changed, 24 insertions, 55 deletions
diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
index b4ac8df181..af6723c821 100644
--- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
+++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
@@ -1271,14 +1271,7 @@ void Jit64::mullwx(UGeckoInstruction inst)
JITDISABLE(bJITIntegerOff);
int a = inst.RA, b = inst.RB, d = inst.RD;
- if (gpr.IsImm(a, b))
- {
- s32 i = gpr.SImm32(a), j = gpr.SImm32(b);
- gpr.SetImmediate32(d, i * j);
- if (inst.OE)
- GenerateConstantOverflow((s64)i * (s64)j);
- }
- else if (gpr.IsImm(a) || gpr.IsImm(b))
+ if (gpr.IsImm(a) || gpr.IsImm(b))
{
u32 imm = gpr.IsImm(a) ? gpr.Imm32(a) : gpr.Imm32(b);
int src = gpr.IsImm(a) ? b : a;
@@ -1320,14 +1313,7 @@ void Jit64::mulhwXx(UGeckoInstruction inst)
int a = inst.RA, b = inst.RB, d = inst.RD;
bool sign = inst.SUBOP10 == 75;
- if (gpr.IsImm(a, b))
- {
- if (sign)
- gpr.SetImmediate32(d, (u32)((u64)(((s64)gpr.SImm32(a) * (s64)gpr.SImm32(b))) >> 32));
- else
- gpr.SetImmediate32(d, (u32)(((u64)gpr.Imm32(a) * (u64)gpr.Imm32(b)) >> 32));
- }
- else if (sign)
+ if (sign)
{
RCOpArg Ra = gpr.Use(a, RCMode::Read);
RCOpArg Rb = gpr.UseNoImm(b, RCMode::Read);
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
index 96dc459057..ebd3dd273a 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
@@ -984,15 +984,8 @@ void JitArm64::mullwx(UGeckoInstruction inst)
int a = inst.RA, b = inst.RB, d = inst.RD;
- if (gpr.IsImm(a) && gpr.IsImm(b))
- {
- s32 i = (s32)gpr.GetImm(a), j = (s32)gpr.GetImm(b);
- gpr.SetImmediate(d, i * j);
- if (inst.Rc)
- ComputeRC0(gpr.GetImm(d));
- }
- else if ((gpr.IsImm(a) && MultiplyImmediate(gpr.GetImm(a), b, d, inst.Rc)) ||
- (gpr.IsImm(b) && MultiplyImmediate(gpr.GetImm(b), a, d, inst.Rc)))
+ if ((gpr.IsImm(a) && MultiplyImmediate(gpr.GetImm(a), b, d, inst.Rc)) ||
+ (gpr.IsImm(b) && MultiplyImmediate(gpr.GetImm(b), a, d, inst.Rc)))
{
// Code is generated inside MultiplyImmediate, nothing to be done here.
}
@@ -1012,22 +1005,12 @@ void JitArm64::mulhwx(UGeckoInstruction inst)
int a = inst.RA, b = inst.RB, d = inst.RD;
- if (gpr.IsImm(a) && gpr.IsImm(b))
- {
- s32 i = (s32)gpr.GetImm(a), j = (s32)gpr.GetImm(b);
- gpr.SetImmediate(d, (u32)((u64)(((s64)i * (s64)j)) >> 32));
- if (inst.Rc)
- ComputeRC0(gpr.GetImm(d));
- }
- else
- {
- gpr.BindToRegister(d, d == a || d == b);
- SMULL(EncodeRegTo64(gpr.R(d)), gpr.R(a), gpr.R(b));
- LSR(EncodeRegTo64(gpr.R(d)), EncodeRegTo64(gpr.R(d)), 32);
+ gpr.BindToRegister(d, d == a || d == b);
+ SMULL(EncodeRegTo64(gpr.R(d)), gpr.R(a), gpr.R(b));
+ LSR(EncodeRegTo64(gpr.R(d)), EncodeRegTo64(gpr.R(d)), 32);
- if (inst.Rc)
- ComputeRC0(gpr.R(d));
- }
+ if (inst.Rc)
+ ComputeRC0(gpr.R(d));
}
void JitArm64::mulhwux(UGeckoInstruction inst)
@@ -1037,22 +1020,12 @@ void JitArm64::mulhwux(UGeckoInstruction inst)
int a = inst.RA, b = inst.RB, d = inst.RD;
- if (gpr.IsImm(a) && gpr.IsImm(b))
- {
- u32 i = gpr.GetImm(a), j = gpr.GetImm(b);
- gpr.SetImmediate(d, (u32)(((u64)i * (u64)j) >> 32));
- if (inst.Rc)
- ComputeRC0(gpr.GetImm(d));
- }
- else
- {
- gpr.BindToRegister(d, d == a || d == b);
- UMULL(EncodeRegTo64(gpr.R(d)), gpr.R(a), gpr.R(b));
- LSR(EncodeRegTo64(gpr.R(d)), EncodeRegTo64(gpr.R(d)), 32);
+ gpr.BindToRegister(d, d == a || d == b);
+ UMULL(EncodeRegTo64(gpr.R(d)), gpr.R(a), gpr.R(b));
+ LSR(EncodeRegTo64(gpr.R(d)), EncodeRegTo64(gpr.R(d)), 32);
- if (inst.Rc)
- ComputeRC0(gpr.R(d));
- }
+ if (inst.Rc)
+ ComputeRC0(gpr.R(d));
}
void JitArm64::addzex(UGeckoInstruction inst)
diff --git a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp
index f3de311dee..78facf40bd 100644
--- a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp
+++ b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp
@@ -219,6 +219,16 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstructi
d = u64(a) + u64(b);
d_overflow = s64(s32(a)) + s64(s32(b));
break;
+ case 11: // mulhwux
+ d = d_overflow = (u64(a) * u64(b)) >> 32;
+ break;
+ case 75: // mulhwx
+ d = d_overflow = u64(s64(s32(a)) * s64(s32(b))) >> 32;
+ break;
+ case 235: // mullwx
+ case 747: // mullwox
+ d = d_overflow = s64(s32(a)) * s64(s32(b));
+ break;
default:
return {};
}