From c9a4021537bf9846b8c5e051399563a018e066ac Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 25 Jul 2021 19:18:43 +0200 Subject: [PATCH] JitArm64: Implement mtfsb1x Part 4 of implementing the FPSCR system register instructions. --- Source/Core/Core/PowerPC/JitArm64/Jit.h | 1 + .../JitArm64/JitArm64_SystemRegisters.cpp | 28 +++++++++++++++++++ .../Core/PowerPC/JitArm64/JitArm64_Tables.cpp | 2 +- 3 files changed, 30 insertions(+), 1 deletion(-) 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 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 }};