diff --git a/PowerRecomp/main.cpp b/PowerRecomp/main.cpp index 3701204..06b9cab 100644 --- a/PowerRecomp/main.cpp +++ b/PowerRecomp/main.cpp @@ -233,14 +233,14 @@ int main() break; case PPC_INST_CMPLWI: - std::println(f, "\tctx.cr{}.compare(ctx.r{}.u32, {});", insn.operands[0], insn.operands[1], insn.operands[2]); + std::println(f, "\tctx.cr{}.compare(ctx.r{}.u32, {}, ctx.xer);", insn.operands[0], insn.operands[1], insn.operands[2]); break; case PPC_INST_CMPW: break; case PPC_INST_CMPWI: - std::println(f, "\tctx.cr{}.compare(ctx.r{}.s32, {});", insn.operands[0], insn.operands[1], int32_t(insn.operands[2])); + std::println(f, "\tctx.cr{}.compare(ctx.r{}.s32, {}, ctx.xer);", insn.operands[0], insn.operands[1], int32_t(insn.operands[2])); break; case PPC_INST_CNTLZD: diff --git a/PowerUtils/ppc_context.h b/PowerUtils/ppc_context.h index d89c949..c619f40 100644 --- a/PowerUtils/ppc_context.h +++ b/PowerUtils/ppc_context.h @@ -39,6 +39,13 @@ struct PPCRegister }; }; +struct PPCXERRegister +{ + uint8_t so; + uint8_t ov; + uint8_t ca; +}; + struct PPCCRRegister { uint8_t lt; @@ -47,11 +54,12 @@ struct PPCCRRegister uint8_t so; template - void compare(T left, T right) + void compare(T left, T right, const PPCXERRegister& xer) { lt = left < right; gt = left > right; eq = left == right; + so = xer.so; } }; @@ -61,6 +69,7 @@ struct PPCContext { uint64_t lr; uint64_t ctr; + PPCXERRegister xer; union {