summaryrefslogtreecommitdiff
path: root/src/mem/cache/replacement_policies/mru_rp.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/cache/replacement_policies/mru_rp.cc')
-rw-r--r--src/mem/cache/replacement_policies/mru_rp.cc51
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*