summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorLioncash <mathew1800@gmail.com>2018-03-25 21:23:15 -0400
committerLioncash <mathew1800@gmail.com>2018-03-25 21:30:00 -0400
commitb0efcdc8ef6da6a934c1204b08a118bb302baadd (patch)
tree31ddc53badbcbfe3664f600503b258e7f9c76e0e /Source
parent5c83e18fbd3606587e71a7f1cc54e4cf6473609f (diff)
Interpreter: Get rid of static state within SingleStepInner()
Given how the hooking operates, we may not execute an instruction. Instead of making the state a static local to the function, just make it part of the lifecycle of the Interpreter class.
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Core/PowerPC/Interpreter/Interpreter.cpp15
-rw-r--r--Source/Core/Core/PowerPC/Interpreter/Interpreter.h2
2 files changed, 9 insertions, 8 deletions
diff --git a/Source/Core/Core/PowerPC/Interpreter/Interpreter.cpp b/Source/Core/Core/PowerPC/Interpreter/Interpreter.cpp
index a30c35247a..9d0014cc1a 100644
--- a/Source/Core/Core/PowerPC/Interpreter/Interpreter.cpp
+++ b/Source/Core/Core/PowerPC/Interpreter/Interpreter.cpp
@@ -101,7 +101,6 @@ static void Trace(UGeckoInstruction& inst)
int Interpreter::SingleStepInner()
{
- static UGeckoInstruction instCode;
u32 function = HLE::GetFirstFunctionIndex(PC);
if (function != 0)
{
@@ -138,7 +137,7 @@ int Interpreter::SingleStepInner()
#endif
NPC = PC + sizeof(UGeckoInstruction);
- instCode.hex = PowerPC::Read_Opcode(PC);
+ m_prev_inst.hex = PowerPC::Read_Opcode(PC);
// Uncomment to trace the interpreter
// if ((PC & 0xffffff)>=0x0ab54c && (PC & 0xffffff)<=0x0ab624)
@@ -148,15 +147,15 @@ int Interpreter::SingleStepInner()
if (startTrace)
{
- Trace(instCode);
+ Trace(m_prev_inst);
}
- if (instCode.hex != 0)
+ if (m_prev_inst.hex != 0)
{
UReg_MSR& msr = (UReg_MSR&)MSR;
if (msr.FP) // If FPU is enabled, just execute
{
- m_op_table[instCode.OPCD](instCode);
+ m_op_table[m_prev_inst.OPCD](m_prev_inst);
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
{
PowerPC::CheckExceptions();
@@ -166,9 +165,9 @@ int Interpreter::SingleStepInner()
else
{
// check if we have to generate a FPU unavailable exception
- if (!PPCTables::UsesFPU(instCode))
+ if (!PPCTables::UsesFPU(m_prev_inst))
{
- m_op_table[instCode.OPCD](instCode);
+ m_op_table[m_prev_inst.OPCD](m_prev_inst);
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
{
PowerPC::CheckExceptions();
@@ -193,7 +192,7 @@ int Interpreter::SingleStepInner()
last_pc = PC;
PC = NPC;
- const GekkoOPInfo* opinfo = PPCTables::GetOpInfo(instCode);
+ const GekkoOPInfo* opinfo = PPCTables::GetOpInfo(m_prev_inst);
return opinfo->numCycles;
}
diff --git a/Source/Core/Core/PowerPC/Interpreter/Interpreter.h b/Source/Core/Core/PowerPC/Interpreter/Interpreter.h
index b4135e3724..863dc0cb5b 100644
--- a/Source/Core/Core/PowerPC/Interpreter/Interpreter.h
+++ b/Source/Core/Core/PowerPC/Interpreter/Interpreter.h
@@ -304,6 +304,8 @@ private:
static void Helper_FloatCompareOrdered(UGeckoInstruction inst, double a, double b);
static void Helper_FloatCompareUnordered(UGeckoInstruction inst, double a, double b);
+ UGeckoInstruction m_prev_inst{};
+
static bool m_end_block;
// TODO: These should really be in the save state, although it's unlikely to matter much.