From cdd68f345e215dbe5c7c23ffe7965bb2f9b461d6 Mon Sep 17 00:00:00 2001 From: "Jake.Stine" Date: Sat, 6 Jun 2009 10:05:40 +0000 Subject: [PATCH] microVU: Improved struct alignment method using placement new syntax, reducing microBlockManager's heap allocation count from 2-per to 1-per. :) git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1337 96395faa-99c1-11dd-bbfe-3dabce05a288 --- pcsx2/x86/microVU.cpp | 4 ++-- pcsx2/x86/microVU.h | 19 ++++++++++++++++--- pcsx2/x86/microVU_Compile.inl | 8 ++++---- pcsx2/x86/microVU_IR.h | 1 - 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/pcsx2/x86/microVU.cpp b/pcsx2/x86/microVU.cpp index 33da63a585..8685e1e147 100644 --- a/pcsx2/x86/microVU.cpp +++ b/pcsx2/x86/microVU.cpp @@ -62,7 +62,7 @@ microVUx(void) mVUreset() { // Delete Block Managers for (int i = 0; i <= mVU->prog.max; i++) { for (u32 j = 0; j < (mVU->progSize / 2); j++) { - safe_delete( mVU->prog.prog[i].block[j] ); + microBlockManager::Delete( mVU->prog.prog[i].block[j] ); } } @@ -109,7 +109,7 @@ microVUf(void) mVUclose() { for (int i = 0; i <= mVU->prog.max; i++) { for (u32 j = 0; j < (mVU->progSize / 2); j++) { if (mVU->prog.prog[i].block[j]) { - safe_delete( mVU->prog.prog[i].block[j] ); + microBlockManager::Delete( mVU->prog.prog[i].block[j] ); } } } diff --git a/pcsx2/x86/microVU.h b/pcsx2/x86/microVU.h index febcfbefbf..a33cd8a5bf 100644 --- a/pcsx2/x86/microVU.h +++ b/pcsx2/x86/microVU.h @@ -32,13 +32,26 @@ class microBlockManager { private: static const int MaxBlocks = mMaxBlocks - 1; + microBlock blockList[mMaxBlocks]; // note: should always be first in the class to ensure xmm alignment int listSize; // Total Items - 1 int listI; // Index to Add new block - microBlock* blockList; public: - microBlockManager() { blockList = (microBlock*)_aligned_malloc(sizeof(microBlock)*mMaxBlocks, 16); reset(); } - ~microBlockManager() { if (blockList) { _aligned_free(blockList); } } + // our aligned replacement for 'new': + static microBlockManager* AlignedNew() { + microBlockManager* alloc = (microBlockManager*)_aligned_malloc(sizeof(microBlockManager), 16); + new (alloc) microBlockManager(); + return alloc; + } + + static void Delete( microBlockManager* dead ) { + if( dead == NULL ) return; + dead->~microBlockManager(); + _aligned_free( dead ); + } + + microBlockManager() { reset(); } + ~microBlockManager() { } void reset() { listSize = -1; listI = -1; }; microBlock* add(microBlock* pBlock) { microBlock* thisBlock = search(&pBlock->pState); diff --git a/pcsx2/x86/microVU_Compile.inl b/pcsx2/x86/microVU_Compile.inl index 7c1ff506c6..ee771e06ee 100644 --- a/pcsx2/x86/microVU_Compile.inl +++ b/pcsx2/x86/microVU_Compile.inl @@ -26,7 +26,7 @@ mVUsetupBranch(mVU, xStatus, xMac, xClip, xCycles); \ CMP16ItoM((uptr)&mVU->branch, 0); \ incPC2(1); \ - if (!mVUblocks[iPC/2]) { mVUblocks[iPC/2] = new microBlockManager(); } \ + if (!mVUblocks[iPC/2]) { mVUblocks[iPC/2] = microBlockManager::AlignedNew(); } \ bBlock = mVUblocks[iPC/2]->search((microRegInfo*)&mVUregs); \ incPC2(-1); \ if (bBlock) { nJMPcc((uptr)bBlock->x86ptrStart - ((uptr)x86Ptr + 6)); } \ @@ -266,7 +266,7 @@ microVUf(void*) __fastcall mVUcompile(u32 startPC, uptr pState) { startPC &= (vuIndex ? 0x3ff8 : 0xff8); if (mVUblocks[startPC/8] == NULL) { - mVUblocks[startPC/8] = new microBlockManager(); + mVUblocks[startPC/8] = microBlockManager::AlignedNew(); } // Searches for Existing Compiled Block (if found, then returns; else, compile) @@ -357,7 +357,7 @@ microVUf(void*) __fastcall mVUcompile(u32 startPC, uptr pState) { mVUsetupBranch(mVU, xStatus, xMac, xClip, xCycles); if (mVUblocks[branchAddr/8] == NULL) - mVUblocks[branchAddr/8] = new microBlockManager(); + mVUblocks[branchAddr/8] = microBlockManager::AlignedNew(); // Check if branch-block has already been compiled pBlock = mVUblocks[branchAddr/8]->search((microRegInfo*)&mVUregs); @@ -387,7 +387,7 @@ microVUf(void*) __fastcall mVUcompile(u32 startPC, uptr pState) { incPC(-3); // Go back to branch opcode (to get branch imm addr) if (mVUblocks[branchAddr/8] == NULL) - mVUblocks[branchAddr/8] = new microBlockManager(); + mVUblocks[branchAddr/8] = microBlockManager::AlignedNew(); // Check if branch-block has already been compiled pBlock = mVUblocks[branchAddr/8]->search((microRegInfo*)&mVUregs); diff --git a/pcsx2/x86/microVU_IR.h b/pcsx2/x86/microVU_IR.h index 740fd36bb5..2fb0623027 100644 --- a/pcsx2/x86/microVU_IR.h +++ b/pcsx2/x86/microVU_IR.h @@ -45,7 +45,6 @@ __declspec(align(16)) struct microRegInfo { // Ordered for Faster Compares #if defined(_MSC_VER) }; #pragma pack() -#pragma pack(show) #else } __attribute__((packed)); #endif