mirror of https://github.com/PCSX2/pcsx2.git
microVU: Move exception handler code to beginning of mVU rec execution instead of inside mVUsearchProg.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@3384 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
714ea3c94f
commit
28ae87c5f7
|
@ -17,7 +17,6 @@
|
|||
|
||||
#include "PrecompiledHeader.h"
|
||||
#include "Common.h"
|
||||
#include <deque>
|
||||
#include "microVU.h"
|
||||
|
||||
//------------------------------------------------------------------
|
||||
|
@ -280,11 +279,6 @@ _mVUt _f void* mVUsearchProg(u32 startPC, uptr pState) {
|
|||
}
|
||||
|
||||
// If cleared and program not found, make a new program instance
|
||||
// Exception note: It's bad news if the recompiler throws any exceptions, so we have a clause to
|
||||
// assert if an exception occurs. The rec should be pretty much exception safe, except for
|
||||
// critical errors that would result in a crash regardless.
|
||||
|
||||
try {
|
||||
mVU->prog.cleared = 0;
|
||||
mVU->prog.isSame = 1;
|
||||
mVU->prog.cur = mVUcreateProg<vuIndex>(startPC/8);
|
||||
|
@ -292,16 +286,7 @@ _mVUt _f void* mVUsearchProg(u32 startPC, uptr pState) {
|
|||
quick.block = mVU->prog.cur->block[startPC/8];
|
||||
quick.prog = mVU->prog.cur;
|
||||
list.list->push_front(mVU->prog.cur);
|
||||
|
||||
return entryPoint;
|
||||
|
||||
} catch( BaseException& pxDevelCode(ex) ) {
|
||||
pxFailDev( wxsFormat(L"microVU%d recompiler exception: " + ex.FormatDiagnosticMessage(), mVU->index) );
|
||||
} catch( std::exception& pxDevelCode(ex) ) {
|
||||
pxFailDev( wxsFormat(L"microVU%d recompiler exception: " + Exception::RuntimeError(ex).FormatDiagnosticMessage(), mVU->index) );
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
// If list.quick, then we've already found and recompiled the program ;)
|
||||
mVU->prog.isSame = -1;
|
||||
|
@ -366,10 +351,16 @@ void recMicroVU0::Execute(u32 cycles) {
|
|||
if(!(VU0.VI[REG_VPU_STAT].UL & 1)) return;
|
||||
|
||||
XMMRegisters::Freeze();
|
||||
// sometimes games spin on vu0, so be careful with this value
|
||||
// Sometimes games spin on vu0, so be careful with this value
|
||||
// woody hangs if too high on sVU (untested on mVU)
|
||||
// Edit: Need to test this again, if anyone ever has a "Woody" game :p
|
||||
try {
|
||||
((mVUrecCall)microVU0.startFunct)(VU0.VI[REG_TPC].UL, cycles);
|
||||
} catch (BaseException& pxDevelCode(ex)) {
|
||||
pxFailDev( wxsFormat(L"microVU0 recompiler exception: " + ex.FormatDiagnosticMessage()));
|
||||
} catch (std::exception& pxDevelCode(ex)) {
|
||||
pxFailDev( wxsFormat(L"microVU0 recompiler exception: " + Exception::RuntimeError(ex).FormatDiagnosticMessage()));
|
||||
}
|
||||
XMMRegisters::Thaw();
|
||||
}
|
||||
void recMicroVU1::Execute(u32 cycles) {
|
||||
|
@ -378,7 +369,16 @@ void recMicroVU1::Execute(u32 cycles) {
|
|||
if(!(VU0.VI[REG_VPU_STAT].UL & 0x100)) return;
|
||||
|
||||
XMMRegisters::Freeze();
|
||||
// Exception note: It's bad news if the recompiler throws any exceptions, so we have a clause to
|
||||
// assert if an exception occurs. The rec should be pretty much exception safe, except for
|
||||
// critical errors that would result in a crash regardless.
|
||||
try {
|
||||
((mVUrecCall)microVU1.startFunct)(VU1.VI[REG_TPC].UL, vu1RunCycles);
|
||||
} catch (BaseException& pxDevelCode(ex)) {
|
||||
pxFailDev( wxsFormat(L"microVU1 recompiler exception: " + ex.FormatDiagnosticMessage()));
|
||||
} catch (std::exception& pxDevelCode(ex)) {
|
||||
pxFailDev( wxsFormat(L"microVU1 recompiler exception: " + Exception::RuntimeError(ex).FormatDiagnosticMessage()));
|
||||
}
|
||||
XMMRegisters::Thaw();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue