diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.h b/Source/Core/Core/PowerPC/JitArm64/Jit.h index 5225ab339c..e2039a30bc 100644 --- a/Source/Core/Core/PowerPC/JitArm64/Jit.h +++ b/Source/Core/Core/PowerPC/JitArm64/Jit.h @@ -89,6 +89,7 @@ public: void srawx(UGeckoInstruction inst); void rlwimix(UGeckoInstruction inst); void subfex(UGeckoInstruction inst); + void subfzex(UGeckoInstruction inst); void subfcx(UGeckoInstruction inst); void subfic(UGeckoInstruction inst); void addex(UGeckoInstruction inst); diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp index 1ba3ca5ad5..4882f82176 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -869,6 +869,28 @@ void JitArm64::subfcx(UGeckoInstruction inst) } } +void JitArm64::subfzex(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITIntegerOff); + FALLBACK_IF(inst.OE); + + int a = inst.RA, d = inst.RD; + + gpr.BindToRegister(d, d == a); + + ARM64Reg WA = gpr.GetReg(); + LDRB(INDEX_UNSIGNED, WA, PPC_REG, PPCSTATE_OFF(xer_ca)); + MVN(gpr.R(d), gpr.R(a)); + ADDS(gpr.R(d), gpr.R(d), WA); + gpr.Unlock(WA); + + ComputeCarry(); + + if (inst.Rc) + ComputeRC(gpr.R(d)); +} + void JitArm64::subfic(UGeckoInstruction inst) { INSTRUCTION_START diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp index b928c831ee..b6b162b934 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp @@ -206,8 +206,8 @@ static GekkoOPTemplate table31[] = { {648, &JitArm64::subfex}, // subfeox {232, &JitArm64::FallBackToInterpreter}, // subfmex {744, &JitArm64::FallBackToInterpreter}, // subfmeox - {200, &JitArm64::FallBackToInterpreter}, // subfzex - {712, &JitArm64::FallBackToInterpreter}, // subfzeox + {200, &JitArm64::subfzex}, // subfzex + {712, &JitArm64::subfzex}, // subfzeox {28, &JitArm64::boolX}, // andx {60, &JitArm64::boolX}, // andcx