summaryrefslogtreecommitdiff
path: root/src/mem/cache/replacement_policies/fifo_rp.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/cache/replacement_policies/fifo_rp.cc')
-rw-r--r--src/mem/cache/replacement_policies/fifo_rp.cc53
1 files changed, 39 insertions, 14 deletions
diff --git a/src/mem/cache/replacement_policies/fifo_rp.cc b/src/mem/cache/replacement_policies/fifo_rp.cc
index fd320be83..731945a0a 100644
--- a/src/mem/cache/replacement_policies/fifo_rp.cc
+++ b/src/mem/cache/replacement_policies/fifo_rp.cc
@@ -30,36 +30,61 @@
#include "mem/cache/replacement_policies/fifo_rp.hh"
-#include "debug/CacheRepl.hh"
+#include <memory>
FIFORP::FIFORP(const Params *p)
: BaseReplacementPolicy(p)
{
}
-CacheBlk*
-FIFORP::getVictim(const ReplacementCandidates& candidates)
+void
+FIFORP::invalidate(const std::shared_ptr<ReplacementData>& replacement_data)
+const
+{
+ // Reset insertion tick
+ std::static_pointer_cast<FIFOReplData>(
+ replacement_data)->tickInserted = Tick(0);
+}
+
+void
+FIFORP::touch(const std::shared_ptr<ReplacementData>& replacement_data) const
+{
+ // A touch does not modify the insertion tick
+}
+
+void
+FIFORP::reset(const std::shared_ptr<ReplacementData>& replacement_data) const
+{
+ // Set insertion tick
+ std::static_pointer_cast<FIFOReplData>(
+ replacement_data)->tickInserted = curTick();
+}
+
+ReplaceableEntry*
+FIFORP::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->tickInserted < blk->tickInserted) {
- blk = candidate;
+ // Update victim entry if necessary
+ if (std::static_pointer_cast<FIFOReplData>(
+ candidate->replacementData)->tickInserted <
+ std::static_pointer_cast<FIFOReplData>(
+ victim->replacementData)->tickInserted) {
+ 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>
+FIFORP::instantiateEntry()
+{
+ return std::shared_ptr<ReplacementData>(new FIFOReplData());
}
FIFORP*