Define XER register.

This commit is contained in:
Skyth 2024-09-12 17:41:39 +03:00
parent eaa8e7d482
commit 1ab19abed5
2 changed files with 12 additions and 3 deletions

View File

@ -233,14 +233,14 @@ int main()
break;
case PPC_INST_CMPLWI:
std::println(f, "\tctx.cr{}.compare<uint32_t>(ctx.r{}.u32, {});", insn.operands[0], insn.operands[1], insn.operands[2]);
std::println(f, "\tctx.cr{}.compare<uint32_t>(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<int32_t>(ctx.r{}.s32, {});", insn.operands[0], insn.operands[1], int32_t(insn.operands[2]));
std::println(f, "\tctx.cr{}.compare<int32_t>(ctx.r{}.s32, {}, ctx.xer);", insn.operands[0], insn.operands[1], int32_t(insn.operands[2]));
break;
case PPC_INST_CNTLZD:

View File

@ -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<typename T>
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
{