summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorMai M <mathew1800@gmail.com>2021-07-28 20:46:09 -0400
committerGitHub <noreply@github.com>2021-07-28 20:46:09 -0400
commitc86c02e46bbb1d1f5643e83a2c89f749b959991c (patch)
tree78128e535dc8c254db5095d9f2c25ef97eefb77b /Source/Core
parent28ee0af9a341e163b11ce4066388764d9d65cf24 (diff)
parentc9a4021537bf9846b8c5e051399563a018e066ac (diff)
Merge pull request #9960 from JosJuice/jitarm64-mtfsb1x
JitArm64: Implement mtfsb1x
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/Jit.h1
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp28
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp2
3 files changed, 30 insertions, 1 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.h b/Source/Core/Core/PowerPC/JitArm64/Jit.h
index f4ca4c0485..aead64de77 100644
--- a/Source/Core/Core/PowerPC/JitArm64/Jit.h
+++ b/Source/Core/Core/PowerPC/JitArm64/Jit.h
@@ -120,6 +120,7 @@ public:
void mcrfs(UGeckoInstruction inst);
void mffsx(UGeckoInstruction inst);
void mtfsb0x(UGeckoInstruction inst);
+ void mtfsb1x(UGeckoInstruction inst);
// LoadStore
void lXX(UGeckoInstruction inst);
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp
index 20e80ace96..4a40ee7450 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp
@@ -788,3 +788,31 @@ void JitArm64::mtfsb0x(UGeckoInstruction inst)
if (inst.CRBD >= 29)
UpdateRoundingMode();
}
+
+void JitArm64::mtfsb1x(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));
+ if (mask & FPSCR_ANY_X)
+ {
+ ARM64Reg WB = gpr.GetReg();
+ TST(WA, LogicalImm(mask, 32));
+ ORR(WB, WA, LogicalImm(1 << 31, 32));
+ CSEL(WA, WA, WB, CCFlags::CC_NEQ);
+ gpr.Unlock(WB);
+ }
+ ORR(WA, WA, LogicalImm(mask, 32));
+ STR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(fpscr));
+
+ gpr.Unlock(WA);
+
+ if (inst.CRBD >= 29)
+ UpdateRoundingMode();
+}
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp
index 00a563ad5c..4d44cce2dc 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp
@@ -317,7 +317,7 @@ constexpr std::array<GekkoOPTemplate, 15> table63{{
{64, &JitArm64::mcrfs}, // mcrfs
{583, &JitArm64::mffsx}, // mffsx
{70, &JitArm64::mtfsb0x}, // mtfsb0x
- {38, &JitArm64::FallBackToInterpreter}, // mtfsb1x
+ {38, &JitArm64::mtfsb1x}, // mtfsb1x
{134, &JitArm64::FallBackToInterpreter}, // mtfsfix
{711, &JitArm64::FallBackToInterpreter}, // mtfsfx
}};