Optimize invalidate_cache_range() for short ranges.

This commit is contained in:
gbeauche
2007-07-21 10:25:51 +00:00
parent ff172bd87d
commit efa32be9ec
2 changed files with 32 additions and 13 deletions

View File

@@ -82,7 +82,7 @@ block_cache< block_info, block_allocator >::block_cache()
} }
template< class block_info, template<class T> class block_allocator > template< class block_info, template<class T> class block_allocator >
inline block_cache< block_info, block_allocator >::~block_cache() block_cache< block_info, block_allocator >::~block_cache()
{ {
clear(); clear();
} }
@@ -117,13 +117,31 @@ void block_cache< block_info, block_allocator >::clear()
} }
template< class block_info, template<class T> class block_allocator > template< class block_info, template<class T> class block_allocator >
inline void block_cache< block_info, block_allocator >::clear_range(uintptr start, uintptr end) void block_cache< block_info, block_allocator >::clear_range(uintptr start, uintptr end)
{ {
if (!active) if (!active)
return; return;
entry *q; entry *p, *q;
entry *p = active; if (cacheline(start) < cacheline(end - 1)) {
// Optimize for short ranges flush
const int end_cl = cacheline(end - 1);
for (int cl = cacheline(start); cl <= end_cl; cl++) {
p = cache_tags[cl];
while (p) {
q = p;
p = p->next_same_cl;
if (q->intersect(start, end)) {
q->invalidate();
remove_from_cl_list(q);
remove_from_list(q);
delete_blockinfo(q);
}
}
}
}
else {
p = active;
while (p) { while (p) {
q = p; q = p;
p = p->next; p = p->next;
@@ -134,6 +152,7 @@ inline void block_cache< block_info, block_allocator >::clear_range(uintptr star
delete_blockinfo(q); delete_blockinfo(q);
} }
} }
}
} }
template< class block_info, template<class T> class block_allocator > template< class block_info, template<class T> class block_allocator >

View File

@@ -790,7 +790,7 @@ void powerpc_cpu::invalidate_cache()
#endif #endif
} }
inline void powerpc_block_info::invalidate() void powerpc_block_info::invalidate()
{ {
#if PPC_DECODE_CACHE #if PPC_DECODE_CACHE
// Don't do anything if this is a predecoded block // Don't do anything if this is a predecoded block