mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-10 22:49:00 +01:00
Interpreter_LoadStore: Generate alignment exceptions if lmw, lswi, lswx, stmw, stswi, or stswx is executed when the MSR[LE] bit is set
Improves exception accuracy regarding an admittedly very unlikely scenario.
This commit is contained in:
parent
88853551e6
commit
3ea0a37d72
@ -213,7 +213,7 @@ void Interpreter::lmw(UGeckoInstruction inst)
|
|||||||
{
|
{
|
||||||
u32 address = Helper_Get_EA(inst);
|
u32 address = Helper_Get_EA(inst);
|
||||||
|
|
||||||
if ((address & 0b11) != 0)
|
if ((address & 0b11) != 0 || UReg_MSR{MSR}.LE)
|
||||||
{
|
{
|
||||||
GenerateAlignmentException(address);
|
GenerateAlignmentException(address);
|
||||||
return;
|
return;
|
||||||
@ -241,7 +241,7 @@ void Interpreter::stmw(UGeckoInstruction inst)
|
|||||||
{
|
{
|
||||||
u32 address = Helper_Get_EA(inst);
|
u32 address = Helper_Get_EA(inst);
|
||||||
|
|
||||||
if ((address & 0b11) != 0)
|
if ((address & 0b11) != 0 || UReg_MSR{MSR}.LE)
|
||||||
{
|
{
|
||||||
GenerateAlignmentException(address);
|
GenerateAlignmentException(address);
|
||||||
return;
|
return;
|
||||||
@ -565,6 +565,12 @@ void Interpreter::lswx(UGeckoInstruction inst)
|
|||||||
{
|
{
|
||||||
u32 EA = Helper_Get_EA_X(inst);
|
u32 EA = Helper_Get_EA_X(inst);
|
||||||
|
|
||||||
|
if (UReg_MSR{MSR}.LE)
|
||||||
|
{
|
||||||
|
GenerateAlignmentException(EA);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Confirmed by hardware test that the zero case doesn't zero rGPR[r]
|
// Confirmed by hardware test that the zero case doesn't zero rGPR[r]
|
||||||
for (u32 n = 0; n < static_cast<u8>(PowerPC::ppcState.xer_stringctrl); n++)
|
for (u32 n = 0; n < static_cast<u8>(PowerPC::ppcState.xer_stringctrl); n++)
|
||||||
{
|
{
|
||||||
@ -707,6 +713,12 @@ void Interpreter::lswi(UGeckoInstruction inst)
|
|||||||
else
|
else
|
||||||
EA = rGPR[inst.RA];
|
EA = rGPR[inst.RA];
|
||||||
|
|
||||||
|
if (UReg_MSR{MSR}.LE)
|
||||||
|
{
|
||||||
|
GenerateAlignmentException(EA);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
u32 n;
|
u32 n;
|
||||||
if (inst.NB == 0)
|
if (inst.NB == 0)
|
||||||
n = 32;
|
n = 32;
|
||||||
@ -752,6 +764,12 @@ void Interpreter::stswi(UGeckoInstruction inst)
|
|||||||
else
|
else
|
||||||
EA = rGPR[inst.RA];
|
EA = rGPR[inst.RA];
|
||||||
|
|
||||||
|
if (UReg_MSR{MSR}.LE)
|
||||||
|
{
|
||||||
|
GenerateAlignmentException(EA);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
u32 n;
|
u32 n;
|
||||||
if (inst.NB == 0)
|
if (inst.NB == 0)
|
||||||
n = 32;
|
n = 32;
|
||||||
@ -785,6 +803,13 @@ void Interpreter::stswi(UGeckoInstruction inst)
|
|||||||
void Interpreter::stswx(UGeckoInstruction inst)
|
void Interpreter::stswx(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
u32 EA = Helper_Get_EA_X(inst);
|
u32 EA = Helper_Get_EA_X(inst);
|
||||||
|
|
||||||
|
if (UReg_MSR{MSR}.LE)
|
||||||
|
{
|
||||||
|
GenerateAlignmentException(EA);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
u32 n = (u8)PowerPC::ppcState.xer_stringctrl;
|
u32 n = (u8)PowerPC::ppcState.xer_stringctrl;
|
||||||
int r = inst.RS;
|
int r = inst.RS;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user