JitArm64: Implement mtfsb0x
Part 3 of implementing the FPSCR system register instructions.
This commit is contained in:
parent
46f7074bf7
commit
b2d87c49b6
|
@ -119,6 +119,7 @@ public:
|
||||||
void mtcrf(UGeckoInstruction inst);
|
void mtcrf(UGeckoInstruction inst);
|
||||||
void mcrfs(UGeckoInstruction inst);
|
void mcrfs(UGeckoInstruction inst);
|
||||||
void mffsx(UGeckoInstruction inst);
|
void mffsx(UGeckoInstruction inst);
|
||||||
|
void mtfsb0x(UGeckoInstruction inst);
|
||||||
|
|
||||||
// LoadStore
|
// LoadStore
|
||||||
void lXX(UGeckoInstruction inst);
|
void lXX(UGeckoInstruction inst);
|
||||||
|
@ -261,8 +262,9 @@ protected:
|
||||||
void FakeLKExit(u32 exit_address_after_return);
|
void FakeLKExit(u32 exit_address_after_return);
|
||||||
void WriteBLRExit(Arm64Gen::ARM64Reg dest);
|
void WriteBLRExit(Arm64Gen::ARM64Reg dest);
|
||||||
|
|
||||||
void FixGTBeforeSettingCRFieldBit(Arm64Gen::ARM64Reg reg);
|
|
||||||
Arm64Gen::FixupBranch JumpIfCRFieldBit(int field, int bit, bool jump_if_set);
|
Arm64Gen::FixupBranch JumpIfCRFieldBit(int field, int bit, bool jump_if_set);
|
||||||
|
void FixGTBeforeSettingCRFieldBit(Arm64Gen::ARM64Reg reg);
|
||||||
|
void UpdateRoundingMode();
|
||||||
|
|
||||||
void ComputeRC0(Arm64Gen::ARM64Reg reg);
|
void ComputeRC0(Arm64Gen::ARM64Reg reg);
|
||||||
void ComputeRC0(u64 imm);
|
void ComputeRC0(u64 imm);
|
||||||
|
|
|
@ -48,6 +48,19 @@ void JitArm64::FixGTBeforeSettingCRFieldBit(Arm64Gen::ARM64Reg reg)
|
||||||
gpr.Unlock(WA);
|
gpr.Unlock(WA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JitArm64::UpdateRoundingMode()
|
||||||
|
{
|
||||||
|
const BitSet32 gprs_to_save = gpr.GetCallerSavedUsed();
|
||||||
|
const BitSet32 fprs_to_save = fpr.GetCallerSavedUsed();
|
||||||
|
|
||||||
|
ABI_PushRegisters(gprs_to_save);
|
||||||
|
m_float_emit.ABI_PushRegisters(fprs_to_save, ARM64Reg::X8);
|
||||||
|
MOVP2R(ARM64Reg::X8, &PowerPC::RoundingModeUpdated);
|
||||||
|
BLR(ARM64Reg::X8);
|
||||||
|
m_float_emit.ABI_PopRegisters(fprs_to_save, ARM64Reg::X8);
|
||||||
|
ABI_PopRegisters(gprs_to_save);
|
||||||
|
}
|
||||||
|
|
||||||
void JitArm64::mtmsr(UGeckoInstruction inst)
|
void JitArm64::mtmsr(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
INSTRUCTION_START
|
INSTRUCTION_START
|
||||||
|
@ -754,3 +767,23 @@ void JitArm64::mffsx(UGeckoInstruction inst)
|
||||||
gpr.Unlock(WA);
|
gpr.Unlock(WA);
|
||||||
gpr.Unlock(WB);
|
gpr.Unlock(WB);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JitArm64::mtfsb0x(UGeckoInstruction inst)
|
||||||
|
{
|
||||||
|
INSTRUCTION_START
|
||||||
|
JITDISABLE(bJITSystemRegistersOff);
|
||||||
|
FALLBACK_IF(inst.Rc);
|
||||||
|
|
||||||
|
u32 mask = ~(0x80000000 >> inst.CRBD);
|
||||||
|
|
||||||
|
ARM64Reg WA = gpr.GetReg();
|
||||||
|
|
||||||
|
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(fpscr));
|
||||||
|
AND(WA, WA, LogicalImm(mask, 32));
|
||||||
|
STR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(fpscr));
|
||||||
|
|
||||||
|
gpr.Unlock(WA);
|
||||||
|
|
||||||
|
if (inst.CRBD >= 29)
|
||||||
|
UpdateRoundingMode();
|
||||||
|
}
|
||||||
|
|
|
@ -316,7 +316,7 @@ constexpr std::array<GekkoOPTemplate, 15> table63{{
|
||||||
|
|
||||||
{64, &JitArm64::mcrfs}, // mcrfs
|
{64, &JitArm64::mcrfs}, // mcrfs
|
||||||
{583, &JitArm64::mffsx}, // mffsx
|
{583, &JitArm64::mffsx}, // mffsx
|
||||||
{70, &JitArm64::FallBackToInterpreter}, // mtfsb0x
|
{70, &JitArm64::mtfsb0x}, // mtfsb0x
|
||||||
{38, &JitArm64::FallBackToInterpreter}, // mtfsb1x
|
{38, &JitArm64::FallBackToInterpreter}, // mtfsb1x
|
||||||
{134, &JitArm64::FallBackToInterpreter}, // mtfsfix
|
{134, &JitArm64::FallBackToInterpreter}, // mtfsfix
|
||||||
{711, &JitArm64::FallBackToInterpreter}, // mtfsfx
|
{711, &JitArm64::FallBackToInterpreter}, // mtfsfx
|
||||||
|
|
Loading…
Reference in New Issue