jit: Fix partial invalidation of larger blocks.

Fixes #7031.
This commit is contained in:
Unknown W. Brackets committed 2014-10-27 19:04:19 -07:00
1 parent ec4b11ab63
commit 5bb9d32eaa
4 files changed
+7 -3

No files matched your search

+1 -1
View File
@@ -317,7 +317,7 @@ const u8 *Jit::DoJit(u32 em_address, JitBlock *b)
#endif
// Safety check, in case we get a bunch of really large jit ops without a lot of branching.
if (GetSpaceLeft() < 0x800)
if (GetSpaceLeft() < 0x800 || js.numInstructions >= JitBlockCache::MAX_BLOCK_INSTRUCTIONS)
{
FlushAll();
WriteExit(js.compilerPC, js.nextExit++);
+1 -1
View File
@@ -600,7 +600,7 @@ void JitBlockCache::InvalidateICache(u32 address, const u32 length) {
do {
restart:
auto next = block_map_.lower_bound(std::make_pair(pAddr, 0));
auto last = block_map_.upper_bound(std::make_pair(pEnd, 0));
auto last = block_map_.upper_bound(std::make_pair(pAddr + MAX_BLOCK_INSTRUCTIONS, 0));
// Note that if next is end(), last will be end() too (equal.)
for (; next != last; ++next) {
const u32 blockStart = next->first.second;
+4
View File
@@ -143,6 +143,10 @@ public:
static int GetBlockExitSize();
enum {
MAX_BLOCK_INSTRUCTIONS = 0x4000,
};
private:
void LinkBlockExits(int i);
void LinkBlock(int i);
+1 -1
View File
@@ -455,7 +455,7 @@ const u8 *Jit::DoJit(u32 em_address, JitBlock *b)
js.numInstructions++;
// Safety check, in case we get a bunch of really large jit ops without a lot of branching.
if (GetSpaceLeft() < 0x800)
if (GetSpaceLeft() < 0x800 || js.numInstructions >= JitBlockCache::MAX_BLOCK_INSTRUCTIONS)
{
FlushAll();
WriteExit(js.compilerPC, js.nextExit++);