summaryrefslogtreecommitdiff
path: root/src/mem/cache/tags/lru.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/cache/tags/lru.cc')
-rw-r--r--src/mem/cache/tags/lru.cc12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/mem/cache/tags/lru.cc b/src/mem/cache/tags/lru.cc
index f3a286602..31423f994 100644
--- a/src/mem/cache/tags/lru.cc
+++ b/src/mem/cache/tags/lru.cc
@@ -75,9 +75,17 @@ LRU::findVictim(Addr addr)
{
int set = extractSet(addr);
// grab a replacement candidate
- BlkType *blk = sets[set].blks[assoc - 1];
+ BlkType *blk = NULL;
+ for (int i = assoc - 1; i >= 0; i--) {
+ BlkType *b = sets[set].blks[i];
+ if (b->way < allocAssoc) {
+ blk = b;
+ break;
+ }
+ }
+ assert(!blk || blk->way < allocAssoc);
- if (blk->isValid()) {
+ if (blk && blk->isValid()) {
DPRINTF(CacheRepl, "set %x: selecting blk %x for replacement\n",
set, regenerateBlkAddr(blk->tag, set));
}