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
This commit is contained in:
Jake.Stine committed 2009-06-06 10:05:40 +00:00
1 parent f7aae60371
commit cdd68f345e
4 files changed
+22 -10

No files matched your search

+2 -2
View File
@@ -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] );
}
}
}
+16 -3
View File
@@ -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);
+4 -4
View File
@@ -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);
-1
View File
@@ -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