Changed the detection of FIFO write addresses to writes at the gather pipe boundary. This speeds up games which frequently write to the gather pipe like the pre-rendered movies in The Last Story.
Added some code to unlink invalidated blocks so that the recompiled block can be linked (speed-up).
This commit is contained in:
parent
5de8366db2
commit
a53916ff5d
|
@ -98,7 +98,7 @@ void STACKALIGN CheckGatherPipe()
|
||||||
memmove(m_gatherPipe, m_gatherPipe + cnt, m_gatherPipeCount);
|
memmove(m_gatherPipe, m_gatherPipe + cnt, m_gatherPipeCount);
|
||||||
|
|
||||||
// Profile where the FIFO writes are occurring.
|
// Profile where the FIFO writes are occurring.
|
||||||
if (jit && (jit->js.fifoWriteAddresses.find(PC)) == (jit->js.fifoWriteAddresses.end()))
|
if (m_gatherPipeCount == 0 && jit && (jit->js.fifoWriteAddresses.find(PC)) == (jit->js.fifoWriteAddresses.end()))
|
||||||
{
|
{
|
||||||
jit->js.fifoWriteAddresses.insert(PC);
|
jit->js.fifoWriteAddresses.insert(PC);
|
||||||
|
|
||||||
|
|
|
@ -353,6 +353,24 @@ bool JitBlock::ContainsAddress(u32 em_address)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JitBlockCache::UnlinkBlock(int i)
|
||||||
|
{
|
||||||
|
JitBlock &b = blocks[i];
|
||||||
|
std::map<u32, int>::iterator iter;
|
||||||
|
pair<multimap<u32, int>::iterator, multimap<u32, int>::iterator> ppp;
|
||||||
|
ppp = links_to.equal_range(b.originalAddress);
|
||||||
|
if (ppp.first == ppp.second)
|
||||||
|
return;
|
||||||
|
for (multimap<u32, int>::iterator iter2 = ppp.first; iter2 != ppp.second; ++iter2) {
|
||||||
|
JitBlock &sourceBlock = blocks[iter2->second];
|
||||||
|
for (int e = 0; e < 2; e++)
|
||||||
|
{
|
||||||
|
if (sourceBlock.exitAddress[e] == b.originalAddress)
|
||||||
|
sourceBlock.linkStatus[e] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void JitBlockCache::DestroyBlock(int block_num, bool invalidate)
|
void JitBlockCache::DestroyBlock(int block_num, bool invalidate)
|
||||||
{
|
{
|
||||||
if (block_num < 0 || block_num >= num_blocks)
|
if (block_num < 0 || block_num >= num_blocks)
|
||||||
|
@ -375,7 +393,9 @@ bool JitBlock::ContainsAddress(u32 em_address)
|
||||||
Memory::WriteUnchecked_U32(b.originalFirstOpcode, b.originalAddress);
|
Memory::WriteUnchecked_U32(b.originalFirstOpcode, b.originalAddress);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// We don't unlink blocks, we just send anyone who tries to run them back to the dispatcher.
|
UnlinkBlock(block_num);
|
||||||
|
|
||||||
|
// Send anyone who tries to run this block back to the dispatcher.
|
||||||
// Not entirely ideal, but .. pretty good.
|
// Not entirely ideal, but .. pretty good.
|
||||||
// Spurious entrances from previously linked blocks can only come through checkedEntry
|
// Spurious entrances from previously linked blocks can only come through checkedEntry
|
||||||
XEmitter emit((u8 *)b.checkedEntry);
|
XEmitter emit((u8 *)b.checkedEntry);
|
||||||
|
|
|
@ -87,6 +87,7 @@ class JitBlockCache
|
||||||
bool RangeIntersect(int s1, int e1, int s2, int e2) const;
|
bool RangeIntersect(int s1, int e1, int s2, int e2) const;
|
||||||
void LinkBlockExits(int i);
|
void LinkBlockExits(int i);
|
||||||
void LinkBlock(int i);
|
void LinkBlock(int i);
|
||||||
|
void UnlinkBlock(int i);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
JitBlockCache() :
|
JitBlockCache() :
|
||||||
|
|
Loading…
Reference in New Issue