mirror of https://github.com/PCSX2/pcsx2.git
pcsx2: Fix stall on branch .. in delay slot.
Fixes stall when loading a stage in WRC 3. Original pr https://github.com/PCSX2/pcsx2/pull/1783 Collaborator: lightningterror
This commit is contained in:
parent
73e3072715
commit
17ac536116
|
@ -1311,21 +1311,32 @@ void recompileNextInstruction(int delayslot)
|
||||||
//Console.Warning("opcode name = %s, it's cycles = %d\n",opcode.Name,opcode.cycles);
|
//Console.Warning("opcode name = %s, it's cycles = %d\n",opcode.Name,opcode.cycles);
|
||||||
// if this instruction is a jump or a branch, exit right away
|
// if this instruction is a jump or a branch, exit right away
|
||||||
if( delayslot ) {
|
if( delayslot ) {
|
||||||
|
bool check_branch_delay = false;
|
||||||
switch(_Opcode_) {
|
switch(_Opcode_) {
|
||||||
case 1:
|
case 1:
|
||||||
switch(_Rt_) {
|
switch(_Rt_) {
|
||||||
case 0: case 1: case 2: case 3: case 0x10: case 0x11: case 0x12: case 0x13:
|
case 0: case 1: case 2: case 3: case 0x10: case 0x11: case 0x12: case 0x13:
|
||||||
Console.Warning("branch %x in delay slot!", cpuRegs.code);
|
check_branch_delay = true;
|
||||||
_clearNeededX86regs();
|
|
||||||
_clearNeededXMMregs();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2: case 3: case 4: case 5: case 6: case 7: case 0x14: case 0x15: case 0x16: case 0x17:
|
case 2: case 3: case 4: case 5: case 6: case 7: case 0x14: case 0x15: case 0x16: case 0x17:
|
||||||
Console.Warning("branch %x in delay slot!", cpuRegs.code);
|
check_branch_delay = true;
|
||||||
|
}
|
||||||
|
// Check for branch in delay slot, new code by FlatOut.
|
||||||
|
// Gregory tested this in 2017 using the ps2autotests suite and remarked "So far we return 1 (even with this PR), and the HW 2.
|
||||||
|
// Original PR and discussion at https://github.com/PCSX2/pcsx2/pull/1783 so we don't forget this information.
|
||||||
|
if (check_branch_delay) {
|
||||||
|
DevCon.Warning("Branch %x in delay slot!", cpuRegs.code);
|
||||||
_clearNeededX86regs();
|
_clearNeededX86regs();
|
||||||
_clearNeededXMMregs();
|
_clearNeededXMMregs();
|
||||||
|
pc += 4;
|
||||||
|
g_cpuFlushedPC = false;
|
||||||
|
g_cpuFlushedCode = false;
|
||||||
|
if (g_maySignalException)
|
||||||
|
xAND(ptr32[&cpuRegs.CP0.n.Cause], ~(1 << 31)); // BD
|
||||||
|
|
||||||
|
g_recompilingDelaySlot = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue