diff options
Diffstat (limited to 'src/mem/cache/tags/lru.cc')
-rw-r--r-- | src/mem/cache/tags/lru.cc | 12 |
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)); } |