From de1e2127dca770c5256497bd56bb72f135df47b6 Mon Sep 17 00:00:00 2001 From: Yuriy O'Donnell Date: Fri, 23 May 2014 20:32:00 +0200 Subject: [PATCH] JIT: JitBaseBlockCache::valid_block is now std::vector This was previously a std::bitset, which resulted in generation of suboptimal code by VS2013 compiler. See https://gist.github.com/kayru/753db9607d680e26194b --- Source/Core/Core/PowerPC/JitCommon/JitCache.cpp | 9 ++++++--- Source/Core/Core/PowerPC/JitCommon/JitCache.h | 5 +++-- 2 files changed, 9 insertions(+), 5 deletions(-) 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;