Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #9890 from JosJuice/jitarm64-mtfsb0x
JitArm64: Implement mtfsb0x
  • Loading branch information
lioncash committed Jul 23, 2021
2 parents 971f110 + b2d87c4 commit f380c23
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 2 deletions.
4 changes: 3 additions & 1 deletion Source/Core/Core/PowerPC/JitArm64/Jit.h
Expand Up @@ -119,6 +119,7 @@ class JitArm64 : public JitBase, public Arm64Gen::ARM64CodeBlock, public CommonA
void mtcrf(UGeckoInstruction inst);
void mcrfs(UGeckoInstruction inst);
void mffsx(UGeckoInstruction inst);
void mtfsb0x(UGeckoInstruction inst);

// LoadStore
void lXX(UGeckoInstruction inst);
Expand Down Expand Up @@ -261,8 +262,9 @@ class JitArm64 : public JitBase, public Arm64Gen::ARM64CodeBlock, public CommonA
void FakeLKExit(u32 exit_address_after_return);
void WriteBLRExit(Arm64Gen::ARM64Reg dest);

void FixGTBeforeSettingCRFieldBit(Arm64Gen::ARM64Reg reg);
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(u64 imm);
Expand Down
33 changes: 33 additions & 0 deletions Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp
Expand Up @@ -48,6 +48,19 @@ void JitArm64::FixGTBeforeSettingCRFieldBit(Arm64Gen::ARM64Reg reg)
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)
{
INSTRUCTION_START
Expand Down Expand Up @@ -755,3 +768,23 @@ void JitArm64::mffsx(UGeckoInstruction inst)
gpr.Unlock(WA);
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();
}
2 changes: 1 addition & 1 deletion Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp
Expand Up @@ -316,7 +316,7 @@ constexpr std::array<GekkoOPTemplate, 15> table63{{

{64, &JitArm64::mcrfs}, // mcrfs
{583, &JitArm64::mffsx}, // mffsx
{70, &JitArm64::FallBackToInterpreter}, // mtfsb0x
{70, &JitArm64::mtfsb0x}, // mtfsb0x
{38, &JitArm64::FallBackToInterpreter}, // mtfsb1x
{134, &JitArm64::FallBackToInterpreter}, // mtfsfix
{711, &JitArm64::FallBackToInterpreter}, // mtfsfx
Expand Down

0 comments on commit f380c23

Please sign in to comment.