diff --git a/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp b/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp index 49ffa7c69b..30856fb48f 100644 --- a/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp +++ b/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp @@ -108,7 +108,10 @@ using namespace Gen; } links_to.clear(); block_map.clear(); - valid_block.reset(); + + valid_block.clear(); + valid_block.resize(VALID_BLOCK_MASK_SIZE, false); + num_blocks = 0; memset(blockCodePointers, 0, sizeof(u8*)*MAX_NUM_BLOCKS); } @@ -349,7 +352,7 @@ using namespace Gen; // Optimize the common case of length == 32 which is used by Interpreter::dcb* bool destroy_block = true; if (length == 32) - { + { if (!valid_block[pAddr / 32]) destroy_block = false; else @@ -362,7 +365,7 @@ using namespace Gen; { std::map, u32>::iterator it1 = block_map.lower_bound(std::make_pair(pAddr, 0)), it2 = it1; while (it2 != block_map.end() && it2->first.second < pAddr + length) - { + { JitBlock &b = blocks[it2->second]; *GetICachePtr(b.originalAddress) = JIT_ICACHE_INVALID_WORD; DestroyBlock(it2->second, true); diff --git a/Source/Core/Core/PowerPC/JitCommon/JitCache.h b/Source/Core/Core/PowerPC/JitCommon/JitCache.h index 968cdaf142..0837dd371a 100644 --- a/Source/Core/Core/PowerPC/JitCommon/JitCache.h +++ b/Source/Core/Core/PowerPC/JitCommon/JitCache.h @@ -72,10 +72,11 @@ class JitBaseBlockCache int num_blocks; std::multimap links_to; std::map, u32> block_map; // (end_addr, start_addr) -> number - std::bitset<0x20000000 / 32> valid_block; + std::vector valid_block; enum { - MAX_NUM_BLOCKS = 65536*2 + MAX_NUM_BLOCKS = 65536*2, + VALID_BLOCK_MASK_SIZE = 0x20000000 / 32, }; bool RangeIntersect(int s1, int e1, int s2, int e2) const;