mirror of https://github.com/PCSX2/pcsx2.git
R5900: track the program counter correctly for exception handling and debugging on instructions in delay slots and set the BD bit of the Cause register appropriately.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2768 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
5a6a1d5a01
commit
d4bc1a6275
|
@ -50,7 +50,7 @@ int branch; // set for branch
|
|||
|
||||
__aligned16 GPR_reg64 g_cpuConstRegs[32] = {0};
|
||||
u32 g_cpuHasConstReg = 0, g_cpuFlushedConstReg = 0;
|
||||
bool g_cpuFlushedPC;
|
||||
bool g_cpuFlushedPC, g_recompilingDelaySlot, g_maySignalException;
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
// Static Private Variables - R5900 Dynarec
|
||||
|
@ -1018,8 +1018,11 @@ void iFlushCall(int flushtype)
|
|||
}
|
||||
if (flushtype & FLUSH_CODE)
|
||||
xMOV(ptr32[&cpuRegs.code], cpuRegs.code);
|
||||
if (flushtype & FLUSH_CAUSE)
|
||||
; // TODO
|
||||
if (flushtype & FLUSH_CAUSE) {
|
||||
if (g_recompilingDelaySlot)
|
||||
xOR(ptr32[&cpuRegs.CP0.n.Cause], 1 << 31); // BD
|
||||
g_maySignalException = true;
|
||||
}
|
||||
|
||||
if( flushtype & FLUSH_FREE_XMM )
|
||||
_freeXMMregs();
|
||||
|
@ -1202,8 +1205,13 @@ void recompileNextInstruction(int delayslot)
|
|||
MOV32ItoR(EAX, pc); // acts as a tag for delimiting recompiled instructions when viewing x86 disasm.
|
||||
|
||||
cpuRegs.code = *(int *)s_pCode;
|
||||
if (!delayslot) {
|
||||
pc += 4;
|
||||
g_cpuFlushedPC = false;
|
||||
} else {
|
||||
// increment after recompiling so that pc points to the branch during recompilation
|
||||
g_recompilingDelaySlot = true;
|
||||
}
|
||||
|
||||
g_pCurInstInfo++;
|
||||
|
||||
|
@ -1285,6 +1293,16 @@ void recompileNextInstruction(int delayslot)
|
|||
// _flushCachedRegs();
|
||||
// g_cpuHasConstReg = 1;
|
||||
|
||||
if (delayslot) {
|
||||
pc += 4;
|
||||
g_cpuFlushedPC = false;
|
||||
if (g_maySignalException)
|
||||
xAND(ptr32[&cpuRegs.CP0.n.Cause], ~(1 << 31)); // BD
|
||||
g_recompilingDelaySlot = false;
|
||||
}
|
||||
|
||||
g_maySignalException = false;
|
||||
|
||||
if (!delayslot && (xGetPtr() - recPtr > 0x1000) )
|
||||
s_nEndBlock = pc;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue