PowerPC: Move lwarx/stwcxd. reservation into PowerPCState
This commit is contained in:
parent
462af20cdd
commit
d763d693e8
|
@ -104,7 +104,6 @@ void Interpreter::RunTable63(UGeckoInstruction inst)
|
||||||
void Interpreter::Init()
|
void Interpreter::Init()
|
||||||
{
|
{
|
||||||
InitializeInstructionTables();
|
InitializeInstructionTables();
|
||||||
m_reserve = false;
|
|
||||||
m_end_block = false;
|
m_end_block = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -298,9 +298,4 @@ private:
|
||||||
UGeckoInstruction m_prev_inst{};
|
UGeckoInstruction m_prev_inst{};
|
||||||
|
|
||||||
static bool m_end_block;
|
static bool m_end_block;
|
||||||
|
|
||||||
// TODO: These should really be in the save state, although it's unlikely to matter much.
|
|
||||||
// They are for lwarx and its friend stwcxd.
|
|
||||||
static bool m_reserve;
|
|
||||||
static u32 m_reserve_address;
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -15,9 +15,6 @@
|
||||||
#include "Core/PowerPC/MMU.h"
|
#include "Core/PowerPC/MMU.h"
|
||||||
#include "Core/PowerPC/PowerPC.h"
|
#include "Core/PowerPC/PowerPC.h"
|
||||||
|
|
||||||
bool Interpreter::m_reserve;
|
|
||||||
u32 Interpreter::m_reserve_address;
|
|
||||||
|
|
||||||
static u32 Helper_Get_EA(const PowerPC::PowerPCState& ppcs, const UGeckoInstruction inst)
|
static u32 Helper_Get_EA(const PowerPC::PowerPCState& ppcs, const UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
return inst.RA ? (ppcs.gpr[inst.RA] + inst.SIMM_16) : (u32)inst.SIMM_16;
|
return inst.RA ? (ppcs.gpr[inst.RA] + inst.SIMM_16) : (u32)inst.SIMM_16;
|
||||||
|
@ -992,8 +989,8 @@ void Interpreter::lwarx(UGeckoInstruction inst)
|
||||||
if (!(PowerPC::ppcState.Exceptions & EXCEPTION_DSI))
|
if (!(PowerPC::ppcState.Exceptions & EXCEPTION_DSI))
|
||||||
{
|
{
|
||||||
rGPR[inst.RD] = temp;
|
rGPR[inst.RD] = temp;
|
||||||
m_reserve = true;
|
PowerPC::ppcState.reserve = true;
|
||||||
m_reserve_address = address;
|
PowerPC::ppcState.reserve_address = address;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1008,14 +1005,14 @@ void Interpreter::stwcxd(UGeckoInstruction inst)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_reserve)
|
if (PowerPC::ppcState.reserve)
|
||||||
{
|
{
|
||||||
if (address == m_reserve_address)
|
if (address == PowerPC::ppcState.reserve_address)
|
||||||
{
|
{
|
||||||
PowerPC::Write_U32(rGPR[inst.RS], address);
|
PowerPC::Write_U32(rGPR[inst.RS], address);
|
||||||
if (!(PowerPC::ppcState.Exceptions & EXCEPTION_DSI))
|
if (!(PowerPC::ppcState.Exceptions & EXCEPTION_DSI))
|
||||||
{
|
{
|
||||||
m_reserve = false;
|
PowerPC::ppcState.reserve = false;
|
||||||
PowerPC::ppcState.cr.SetField(0, 2 | PowerPC::GetXER_SO());
|
PowerPC::ppcState.cr.SetField(0, 2 | PowerPC::GetXER_SO());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -175,6 +175,10 @@ static void ResetRegisters()
|
||||||
ppcState.pc = 0;
|
ppcState.pc = 0;
|
||||||
ppcState.npc = 0;
|
ppcState.npc = 0;
|
||||||
ppcState.Exceptions = 0;
|
ppcState.Exceptions = 0;
|
||||||
|
|
||||||
|
ppcState.reserve = false;
|
||||||
|
ppcState.reserve_address = 0;
|
||||||
|
|
||||||
for (auto& v : ppcState.cr.fields)
|
for (auto& v : ppcState.cr.fields)
|
||||||
{
|
{
|
||||||
v = 0x8000000000000001;
|
v = 0x8000000000000001;
|
||||||
|
|
|
@ -167,6 +167,11 @@ struct PowerPCState
|
||||||
|
|
||||||
InstructionCache iCache;
|
InstructionCache iCache;
|
||||||
|
|
||||||
|
// TODO: These should really be in the save state, although it's unlikely to matter much.
|
||||||
|
// They are for lwarx and its friend stwcxd.
|
||||||
|
bool reserve;
|
||||||
|
u32 reserve_address;
|
||||||
|
|
||||||
void UpdateCR1()
|
void UpdateCR1()
|
||||||
{
|
{
|
||||||
cr.SetField(1, (fpscr.FX << 3) | (fpscr.FEX << 2) | (fpscr.VX << 1) | fpscr.OX);
|
cr.SetField(1, (fpscr.FX << 3) | (fpscr.FEX << 2) | (fpscr.VX << 1) | fpscr.OX);
|
||||||
|
|
Loading…
Reference in New Issue