JitArm64: Add function for setting constant overflow

This commit is contained in:
JosJuice 2023-08-23 22:41:03 +02:00
parent 2dead5009b
commit e8060bd169
2 changed files with 20 additions and 0 deletions

View File

@ -376,6 +376,7 @@ protected:
void ComputeRC0(Arm64Gen::ARM64Reg reg); void ComputeRC0(Arm64Gen::ARM64Reg reg);
void ComputeRC0(u32 imm); void ComputeRC0(u32 imm);
void GenerateConstantOverflow(bool overflow);
void ComputeCarry(Arm64Gen::ARM64Reg reg); // reg must contain 0 or 1 void ComputeCarry(Arm64Gen::ARM64Reg reg); // reg must contain 0 or 1
void ComputeCarry(bool carry); void ComputeCarry(bool carry);
void ComputeCarry(); void ComputeCarry();

View File

@ -39,6 +39,25 @@ void JitArm64::ComputeRC0(u32 imm)
MOVI2R(gpr.CR(0), s64(s32(imm))); MOVI2R(gpr.CR(0), s64(s32(imm)));
} }
void JitArm64::GenerateConstantOverflow(bool overflow)
{
ARM64Reg WA = gpr.GetReg();
if (overflow)
{
MOVI2R(WA, XER_OV_MASK | XER_SO_MASK);
STRB(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(xer_so_ov));
}
else
{
LDRB(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(xer_so_ov));
AND(WA, WA, LogicalImm(~XER_OV_MASK, GPRSize::B32));
STRB(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(xer_so_ov));
}
gpr.Unlock(WA);
}
void JitArm64::ComputeCarry(ARM64Reg reg) void JitArm64::ComputeCarry(ARM64Reg reg)
{ {
js.carryFlag = CarryFlag::InPPCState; js.carryFlag = CarryFlag::InPPCState;