From 9530800fd03da486449d4259844cc5a028b0f197 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 20 Sep 2014 22:35:54 -0500 Subject: [PATCH] [AArch64] Implement mtsprin and mfsprin --- Source/Core/Core/PowerPC/JitArm64/Jit.h | 2 ++ .../JitArm64/JitArm64_SystemRegisters.cpp | 32 +++++++++++++++++++ .../Core/PowerPC/JitArm64/JitArm64_Tables.cpp | 4 +-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.h b/Source/Core/Core/PowerPC/JitArm64/Jit.h index bf7aeb8a5a..f320bf7c2d 100644 --- a/Source/Core/Core/PowerPC/JitArm64/Jit.h +++ b/Source/Core/Core/PowerPC/JitArm64/Jit.h @@ -89,6 +89,8 @@ public: void mcrf(UGeckoInstruction inst); void mfsr(UGeckoInstruction inst); void mtsr(UGeckoInstruction inst); + void mfsrin(UGeckoInstruction inst); + void mtsrin(UGeckoInstruction inst); // LoadStore void icbi(UGeckoInstruction inst); diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp index bc06d96c77..8683d94d0e 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp @@ -89,3 +89,35 @@ void JitArm64::mtsr(UGeckoInstruction inst) STR(INDEX_UNSIGNED, gpr.R(inst.RS), X29, PPCSTATE_OFF(sr[inst.SR])); } + +void JitArm64::mfsrin(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITSystemRegistersOff); + + ARM64Reg index = gpr.GetReg(); + ARM64Reg index64 = EncodeRegTo64(index); + ARM64Reg RB = gpr.R(inst.RB); + + UBFM(index, RB, 28, 31); + ADD(index64, X29, index64, ArithOption(index64, ST_LSL, 2)); + LDR(INDEX_UNSIGNED, gpr.R(inst.RD), index64, PPCSTATE_OFF(sr[0])); + + gpr.Unlock(index); +} + +void JitArm64::mtsrin(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITSystemRegistersOff); + + ARM64Reg index = gpr.GetReg(); + ARM64Reg index64 = EncodeRegTo64(index); + ARM64Reg RB = gpr.R(inst.RB); + + UBFM(index, RB, 28, 31); + ADD(index64, X29, index64, ArithOption(index64, ST_LSL, 2)); + STR(INDEX_UNSIGNED, gpr.R(inst.RD), index64, PPCSTATE_OFF(sr[0])); + + gpr.Unlock(index); +} diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp index 59413dc1e8..bd27be38cb 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp @@ -271,13 +271,13 @@ static GekkoOPTemplate table31[] = {144, &JitArm64::FallBackToInterpreter}, //"mtcrf", OPTYPE_SYSTEM, 0}}, {146, &JitArm64::mtmsr}, //"mtmsr", OPTYPE_SYSTEM, FL_ENDBLOCK}}, {210, &JitArm64::mtsr}, //"mtsr", OPTYPE_SYSTEM, 0}}, - {242, &JitArm64::FallBackToInterpreter}, //"mtsrin", OPTYPE_SYSTEM, 0}}, + {242, &JitArm64::mtsrin}, //"mtsrin", OPTYPE_SYSTEM, 0}}, {339, &JitArm64::FallBackToInterpreter}, //"mfspr", OPTYPE_SPR, FL_OUT_D}}, {467, &JitArm64::FallBackToInterpreter}, //"mtspr", OPTYPE_SPR, 0, 2}}, {371, &JitArm64::FallBackToInterpreter}, //"mftb", OPTYPE_SYSTEM, FL_OUT_D | FL_TIMER}}, {512, &JitArm64::FallBackToInterpreter}, //"mcrxr", OPTYPE_SYSTEM, 0}}, {595, &JitArm64::mfsr}, //"mfsr", OPTYPE_SYSTEM, FL_OUT_D, 2}}, - {659, &JitArm64::FallBackToInterpreter}, //"mfsrin", OPTYPE_SYSTEM, FL_OUT_D, 2}}, + {659, &JitArm64::mfsrin}, //"mfsrin", OPTYPE_SYSTEM, FL_OUT_D, 2}}, {4, &JitArm64::Break}, //"tw", OPTYPE_SYSTEM, FL_ENDBLOCK, 1}}, {598, &JitArm64::DoNothing}, //"sync", OPTYPE_SYSTEM, 0, 2}},