diff options
| author | Mai M <mathew1800@gmail.com> | 2021-07-28 20:46:09 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-07-28 20:46:09 -0400 |
| commit | c86c02e46bbb1d1f5643e83a2c89f749b959991c (patch) | |
| tree | 78128e535dc8c254db5095d9f2c25ef97eefb77b /Source/Core | |
| parent | 28ee0af9a341e163b11ce4066388764d9d65cf24 (diff) | |
| parent | c9a4021537bf9846b8c5e051399563a018e066ac (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.h | 1 | ||||
| -rw-r--r-- | Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp | 28 | ||||
| -rw-r--r-- | Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp | 2 |
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 }}; |
