From a9e0f21373d354cf6d9ab2882ca42a53a7002063 Mon Sep 17 00:00:00 2001 From: Sintendo Date: Fri, 17 Sep 2021 22:59:00 +0200 Subject: [PATCH] Jit64: Split arithcx into addcx and subfcx JitArm64 also opts to separate the two. The shared logic makes less sense once we start adding more optimizations. --- Source/Core/Core/PowerPC/Jit64/Jit.h | 3 +- .../Core/Core/PowerPC/Jit64/Jit64_Tables.cpp | 8 +-- .../Core/Core/PowerPC/Jit64/Jit_Integer.cpp | 54 ++++++++++++------- 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit.h b/Source/Core/Core/PowerPC/Jit64/Jit.h index 35f198dc6b..7da679b86c 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit.h +++ b/Source/Core/Core/PowerPC/Jit64/Jit.h @@ -150,7 +150,7 @@ public: void DynaRunTable63(UGeckoInstruction inst); void addx(UGeckoInstruction inst); - void arithcx(UGeckoInstruction inst); + void addcx(UGeckoInstruction inst); void mulli(UGeckoInstruction inst); void mulhwXx(UGeckoInstruction inst); void mullwx(UGeckoInstruction inst); @@ -233,6 +233,7 @@ public: void subfic(UGeckoInstruction inst); void subfx(UGeckoInstruction inst); + void subfcx(UGeckoInstruction inst); void twX(UGeckoInstruction inst); diff --git a/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp b/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp index 24f1398b73..35b17bcdb7 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp @@ -150,8 +150,8 @@ constexpr std::array s_table19{{ constexpr std::array s_table31{{ {266, &Jit64::addx}, // addx {778, &Jit64::addx}, // addox - {10, &Jit64::arithcx}, // addcx - {522, &Jit64::arithcx}, // addcox + {10, &Jit64::addcx}, // addcx + {522, &Jit64::addcx}, // addcox {138, &Jit64::arithXex}, // addex {650, &Jit64::arithXex}, // addeox {234, &Jit64::arithXex}, // addmex @@ -170,8 +170,8 @@ constexpr std::array s_table31{{ {616, &Jit64::negx}, // negox {40, &Jit64::subfx}, // subfx {552, &Jit64::subfx}, // subfox - {8, &Jit64::arithcx}, // subfcx - {520, &Jit64::arithcx}, // subfcox + {8, &Jit64::subfcx}, // subfcx + {520, &Jit64::subfcx}, // subfcox {136, &Jit64::arithXex}, // subfex {648, &Jit64::arithXex}, // subfeox {232, &Jit64::arithXex}, // subfmex diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp index be61b048cf..d85fd1a3a9 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp @@ -1806,11 +1806,39 @@ void Jit64::arithXex(UGeckoInstruction inst) ComputeRC(d); } -void Jit64::arithcx(UGeckoInstruction inst) +void Jit64::addcx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITIntegerOff); + int a = inst.RA, b = inst.RB, d = inst.RD; + + { + RCOpArg Ra = gpr.Use(a, RCMode::Read); + RCOpArg Rb = gpr.Use(b, RCMode::Read); + RCX64Reg Rd = gpr.Bind(d, RCMode::Write); + RegCache::Realize(Ra, Rb, Rd); + + if (d == a) + { + ADD(32, Rd, Rb); + } + else + { + if (d != b) + MOV(32, Rd, Rb); + ADD(32, Rd, Ra); + } + } + + FinalizeCarryOverflow(inst.OE); + if (inst.Rc) + ComputeRC(d); +} + +void Jit64::subfcx(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(bJITIntegerOff); - bool add = !!(inst.SUBOP10 & 2); // add or sub int a = inst.RA, b = inst.RB, d = inst.RD; { @@ -1821,30 +1849,20 @@ void Jit64::arithcx(UGeckoInstruction inst) if (d == a && d != b) { - if (add) - { - ADD(32, Rd, Rb); - } - else - { - // special case, because sub isn't reversible - MOV(32, R(RSCRATCH), Ra); - MOV(32, Rd, Rb); - SUB(32, Rd, R(RSCRATCH)); - } + // special case, because sub isn't reversible + MOV(32, R(RSCRATCH), Ra); + MOV(32, Rd, Rb); + SUB(32, Rd, R(RSCRATCH)); } else { if (d != b) MOV(32, Rd, Rb); - if (add) - ADD(32, Rd, Ra); - else - SUB(32, Rd, Ra); + SUB(32, Rd, Ra); } } - FinalizeCarryOverflow(inst.OE, !add); + FinalizeCarryOverflow(inst.OE, true); if (inst.Rc) ComputeRC(d); }