JitCache: Use a pointer in start_block_map.
This commit is contained in:
parent
2d5288dc10
commit
74a27d9742
|
@ -139,14 +139,13 @@ void JitBaseBlockCache::FinalizeBlock(JitBlock& b, bool block_link, const u8* co
|
||||||
// This should be very rare. This will only happen if the same block
|
// This should be very rare. This will only happen if the same block
|
||||||
// is called both with DR/IR enabled or disabled.
|
// is called both with DR/IR enabled or disabled.
|
||||||
WARN_LOG(DYNA_REC, "Invalidating compiled block at same address %08x", b.physicalAddress);
|
WARN_LOG(DYNA_REC, "Invalidating compiled block at same address %08x", b.physicalAddress);
|
||||||
int old_block_num = start_block_map[b.physicalAddress];
|
JitBlock& old_b = *start_block_map[b.physicalAddress];
|
||||||
JitBlock& old_b = blocks[old_block_num];
|
|
||||||
block_map.erase(
|
block_map.erase(
|
||||||
std::make_pair(old_b.physicalAddress + 4 * old_b.originalSize - 1, old_b.physicalAddress));
|
std::make_pair(old_b.physicalAddress + 4 * old_b.originalSize - 1, old_b.physicalAddress));
|
||||||
DestroyBlock(old_b, true);
|
DestroyBlock(old_b, true);
|
||||||
}
|
}
|
||||||
const int block_num = static_cast<int>(&b - &blocks[0]);
|
const int block_num = static_cast<int>(&b - &blocks[0]);
|
||||||
start_block_map[b.physicalAddress] = block_num;
|
start_block_map[b.physicalAddress] = &b;
|
||||||
FastLookupEntryForAddress(b.effectiveAddress) = block_num;
|
FastLookupEntryForAddress(b.effectiveAddress) = block_num;
|
||||||
|
|
||||||
u32 pAddr = b.physicalAddress;
|
u32 pAddr = b.physicalAddress;
|
||||||
|
@ -185,8 +184,7 @@ JitBlock* JitBaseBlockCache::GetBlockFromStartAddress(u32 addr, u32 msr)
|
||||||
auto map_result = start_block_map.find(translated_addr);
|
auto map_result = start_block_map.find(translated_addr);
|
||||||
if (map_result == start_block_map.end())
|
if (map_result == start_block_map.end())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
int block_num = map_result->second;
|
JitBlock& b = *map_result->second;
|
||||||
JitBlock& b = blocks[block_num];
|
|
||||||
if (b.invalid)
|
if (b.invalid)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
if (b.effectiveAddress != addr)
|
if (b.effectiveAddress != addr)
|
||||||
|
|
|
@ -182,7 +182,7 @@ private:
|
||||||
// Map indexed by the physical address of the entry point.
|
// Map indexed by the physical address of the entry point.
|
||||||
// This is used to query the block based on the current PC in a slow way.
|
// This is used to query the block based on the current PC in a slow way.
|
||||||
// TODO: This is redundant with block_map, and both should be a multimap.
|
// TODO: This is redundant with block_map, and both should be a multimap.
|
||||||
std::map<u32, u32> start_block_map; // start_addr -> number
|
std::map<u32, JitBlock*> start_block_map; // start_addr -> block
|
||||||
|
|
||||||
// This bitsets shows which cachelines overlap with any blocks.
|
// This bitsets shows which cachelines overlap with any blocks.
|
||||||
// It is used to provide a fast way to query if no icache invalidation is needed.
|
// It is used to provide a fast way to query if no icache invalidation is needed.
|
||||||
|
|
Loading…
Reference in New Issue