diff options
Diffstat (limited to 'src/mem/cache/replacement_policies/mru_rp.cc')
-rw-r--r-- | src/mem/cache/replacement_policies/mru_rp.cc | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/src/mem/cache/replacement_policies/mru_rp.cc b/src/mem/cache/replacement_policies/mru_rp.cc index f4cf014ae..ff84fc368 100644 --- a/src/mem/cache/replacement_policies/mru_rp.cc +++ b/src/mem/cache/replacement_policies/mru_rp.cc @@ -30,7 +30,7 @@ #include "mem/cache/replacement_policies/mru_rp.hh" -#include "debug/CacheRepl.hh" +#include <memory> MRURP::MRURP(const Params *p) : BaseReplacementPolicy(p) @@ -38,46 +38,55 @@ MRURP::MRURP(const Params *p) } void -MRURP::touch(CacheBlk *blk) +MRURP::invalidate(const std::shared_ptr<ReplacementData>& replacement_data) +const { - BaseReplacementPolicy::touch(blk); + // Reset last touch timestamp + std::static_pointer_cast<MRUReplData>( + replacement_data)->lastTouchTick = Tick(0); +} +void +MRURP::touch(const std::shared_ptr<ReplacementData>& replacement_data) const +{ // Update last touch timestamp - blk->lastTouchTick = curTick(); + std::static_pointer_cast<MRUReplData>( + replacement_data)->lastTouchTick = curTick(); } void -MRURP::reset(CacheBlk *blk) +MRURP::reset(const std::shared_ptr<ReplacementData>& replacement_data) const { - BaseReplacementPolicy::reset(blk); - // Set last touch timestamp - blk->lastTouchTick = blk->tickInserted; + std::static_pointer_cast<MRUReplData>( + replacement_data)->lastTouchTick = curTick(); } -CacheBlk* -MRURP::getVictim(const ReplacementCandidates& candidates) +ReplaceableEntry* +MRURP::getVictim(const ReplacementCandidates& candidates) const { // There must be at least one replacement candidate assert(candidates.size() > 0); // Visit all candidates to find victim - CacheBlk* blk = candidates[0]; + ReplaceableEntry* victim = candidates[0]; for (const auto& candidate : candidates) { - // Stop iteration if found an invalid block - if (!candidate->isValid()) { - blk = candidate; - break; - // Update victim block if necessary - } else if (candidate->lastTouchTick > blk->lastTouchTick) { - blk = candidate; + // Update victim entry if necessary + if (std::static_pointer_cast<MRUReplData>( + candidate->replacementData)->lastTouchTick > + std::static_pointer_cast<MRUReplData>( + victim->replacementData)->lastTouchTick) { + victim = candidate; } } - DPRINTF(CacheRepl, "set %x, way %x: selecting blk for replacement\n", - blk->set, blk->way); + return victim; +} - return blk; +std::shared_ptr<ReplacementData> +MRURP::instantiateEntry() +{ + return std::shared_ptr<ReplacementData>(new MRUReplData()); } MRURP* |