mirror of https://github.com/PCSX2/pcsx2.git
minor microVU rec changes
note to pcsx2 users: for those that still don't know, these are new VU recompilers i'm working on. They're not working yet, and won't be for at least a few months. So don't expect noticeable changes when i update microVU stuff, since currently they're not being used (when they're in a semi-working/usable state, i'll be sure to put a note in the revision message ;p) git-svn-id: http://pcsx2.googlecode.com/svn/trunk@478 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
29fe1673ba
commit
0e9629b01e
|
@ -26,8 +26,8 @@
|
||||||
// VU Micro - Global Variables
|
// VU Micro - Global Variables
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
microVU microVU0;
|
PCSX2_ALIGNED16(microVU microVU0);
|
||||||
microVU microVU1;
|
PCSX2_ALIGNED16(microVU microVU1);
|
||||||
|
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
// Micro VU - Main Functions
|
// Micro VU - Main Functions
|
||||||
|
@ -91,21 +91,11 @@ microVUt(void) mVUclose() {
|
||||||
microVUt(void) mVUclear(u32 addr, u32 size) {
|
microVUt(void) mVUclear(u32 addr, u32 size) {
|
||||||
|
|
||||||
microVU* mVU = mVUx;
|
microVU* mVU = mVUx;
|
||||||
int i = addr/8;
|
mVU->prog.cleared = 1; // Next execution searches/creates a new microprogram
|
||||||
int end = i+((size+(8-(size&7)))/8); // ToDo: Can be simplified to addr+size if Size is always a multiple of 8
|
// Note: It might be better to copy old recompiled blocks to the new microprogram rec data
|
||||||
|
// however, if games primarily do big writes, its probably not worth it.
|
||||||
if (!mVU->prog.cleared) {
|
// The cost of invalidating bad blocks is also kind of expensive, which is another reason
|
||||||
for ( ; i < end; i++) {
|
// that its probably not worth it...
|
||||||
if ( mVU->prog.prog[mVU->prog.cur].block[i]->clear() ) {
|
|
||||||
mVU->prog.cleared = 1;
|
|
||||||
i++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( ; i < end; i++) {
|
|
||||||
mVU->prog.prog[mVU->prog.cur].block[i]->clearFast();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Executes for number of cycles
|
// Executes for number of cycles
|
||||||
|
@ -122,7 +112,7 @@ microVUt(void*) __fastcall mVUexecute(u32 startPC, u32 cycles) {
|
||||||
microVU* mVU = mVUx;
|
microVU* mVU = mVUx;
|
||||||
if ( mVUsearchProg(mVU) ) { // Found Program
|
if ( mVUsearchProg(mVU) ) { // Found Program
|
||||||
microBlock* block = mVU->prog.prog[mVU->prog.cur].block[startPC]->search(mVU->prog.lastPipelineState);
|
microBlock* block = mVU->prog.prog[mVU->prog.cur].block[startPC]->search(mVU->prog.lastPipelineState);
|
||||||
if (block) return block->x86ptrStart;
|
if (block) return block->x86ptrStart; // Found Block
|
||||||
}
|
}
|
||||||
// Recompile code
|
// Recompile code
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -178,7 +168,7 @@ __forceinline int mVUfindLeastUsedProg(microVU* mVU) {
|
||||||
__forceinline int mVUsearchProg(microVU* mVU) {
|
__forceinline int mVUsearchProg(microVU* mVU) {
|
||||||
if (mVU->prog.cleared) { // If cleared, we need to search for new program
|
if (mVU->prog.cleared) { // If cleared, we need to search for new program
|
||||||
for (int i = 0; i <= mVU->prog.total; i++) {
|
for (int i = 0; i <= mVU->prog.total; i++) {
|
||||||
if (i == mVU->prog.cur) continue; // We can skip the current program.
|
if (i == mVU->prog.cur) continue; // We can skip the current program. (ToDo: Verify that games don't clear, and send the same microprogram :/)
|
||||||
if (!memcmp_mmx(mVU->prog.prog[i].data, mVU->regs->Micro, mVU->microSize)) {
|
if (!memcmp_mmx(mVU->prog.prog[i].data, mVU->regs->Micro, mVU->microSize)) {
|
||||||
mVU->prog.cur = i;
|
mVU->prog.cur = i;
|
||||||
mVU->prog.cleared = 0;
|
mVU->prog.cleared = 0;
|
||||||
|
@ -194,6 +184,26 @@ __forceinline int mVUsearchProg(microVU* mVU) {
|
||||||
return 1; // If !cleared, then we're still on the same program as last-time ;)
|
return 1; // If !cleared, then we're still on the same program as last-time ;)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Block Invalidation
|
||||||
|
__forceinline void mVUinvalidateBlock(microVU* mVU, u32 addr, u32 size) {
|
||||||
|
|
||||||
|
int i = addr/8;
|
||||||
|
int end = i+((size+(8-(size&7)))/8); // ToDo: Can be simplified to addr+size if Size is always a multiple of 8
|
||||||
|
|
||||||
|
if (!mVU->prog.cleared) {
|
||||||
|
for ( ; i < end; i++) {
|
||||||
|
if ( mVU->prog.prog[mVU->prog.cur].block[i]->clear() ) {
|
||||||
|
mVU->prog.cleared = 1;
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for ( ; i < end; i++) {
|
||||||
|
mVU->prog.prog[mVU->prog.cur].block[i]->clearFast();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
// Dispatcher Functions
|
// Dispatcher Functions
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue