From fc6c278007f4412cd14473dbea5e985e3f18d621 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 1 Sep 2024 09:31:34 +0200 Subject: [PATCH] Jit: Move divwux to ConstantPropagation --- .../Core/Core/PowerPC/Jit64/Jit_Integer.cpp | 17 +----------- .../PowerPC/JitArm64/JitArm64_Integer.cpp | 10 +------ .../PowerPC/JitCommon/ConstantPropagation.cpp | 26 ++++++++++++++++--- .../PowerPC/JitCommon/ConstantPropagation.h | 2 +- 4 files changed, 25 insertions(+), 30 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp index 4187e9f346..d73b20bc9e 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp @@ -1321,22 +1321,7 @@ void Jit64::divwux(UGeckoInstruction inst) JITDISABLE(bJITIntegerOff); int a = inst.RA, b = inst.RB, d = inst.RD; - if (gpr.IsImm(a, b)) - { - if (gpr.Imm32(b) == 0) - { - gpr.SetImmediate32(d, 0); - if (inst.OE) - GenerateConstantOverflow(true); - } - else - { - gpr.SetImmediate32(d, gpr.Imm32(a) / gpr.Imm32(b)); - if (inst.OE) - GenerateConstantOverflow(false); - } - } - else if (gpr.IsImm(b)) + if (gpr.IsImm(b)) { u32 divisor = gpr.Imm32(b); if (divisor == 0) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp index b36d35b206..129445fff9 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -1554,15 +1554,7 @@ void JitArm64::divwux(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, j == 0 ? 0 : i / j); - - if (inst.Rc) - ComputeRC0(gpr.GetImm(d)); - } - else if (gpr.IsImm(b)) + if (gpr.IsImm(b)) { const u32 divisor = gpr.GetImm(b); diff --git a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp index 1f65266796..e67e247b43 100644 --- a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp +++ b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp @@ -225,9 +225,9 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstructi if (!has_a || !has_b) { if (has_a) - return EvaluateTable31ABOneRegisterKnown(inst, flags, GetGPR(inst.RA)); + return EvaluateTable31ABOneRegisterKnown(inst, flags, GetGPR(inst.RA), false); else if (has_b) - return EvaluateTable31ABOneRegisterKnown(inst, flags, GetGPR(inst.RB)); + return EvaluateTable31ABOneRegisterKnown(inst, flags, GetGPR(inst.RB), true); else if (inst.RA == inst.RB) return EvaluateTable31ABIdenticalRegisters(inst, flags); else @@ -265,6 +265,10 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstructi case 747: // mullwox d = d_overflow = s64(s32(a)) * s64(s32(b)); break; + case 459: // divwux + case 971: // divwuox + d = d_overflow = b == 0 ? 0x1'0000'0000 : u64(a / b); + break; default: return {}; } @@ -278,8 +282,8 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstructi } ConstantPropagationResult -ConstantPropagation::EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u64 flags, - u32 value) const +ConstantPropagation::EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u64 flags, u32 value, + bool known_reg_is_b) const { switch (inst.SUBOP10) { @@ -295,6 +299,20 @@ ConstantPropagation::EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u return result; } break; + case 459: // divwux + case 971: // divwuox + if (known_reg_is_b && value == 0) + { + ConstantPropagationResult result(inst.RD, 0, inst.Rc); + if (flags & FL_SET_OE) + result.overflow = true; + return result; + } + if (!known_reg_is_b && value == 0 && !(flags & FL_SET_OE)) + { + return ConstantPropagationResult(inst.RD, 0, inst.Rc); + } + break; } return {}; diff --git a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.h b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.h index 50b1de58ae..467944a658 100644 --- a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.h +++ b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.h @@ -89,7 +89,7 @@ private: ConstantPropagationResult EvaluateTable31S(UGeckoInstruction inst) const; ConstantPropagationResult EvaluateTable31AB(UGeckoInstruction inst, u64 flags) const; ConstantPropagationResult EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u64 flags, - u32 value) const; + u32 value, bool known_reg_is_b) const; ConstantPropagationResult EvaluateTable31ABIdenticalRegisters(UGeckoInstruction inst, u64 flags) const; ConstantPropagationResult EvaluateTable31SB(UGeckoInstruction inst) const;