mem: Handful extra features for BasePrefetcher
authorRekai Gonzalez Alberquilla <Rekai.GonzalezAlberquilla@arm.com>
Thu, 7 Apr 2016 16:32:38 +0000 (11:32 -0500)
committerRekai Gonzalez Alberquilla <Rekai.GonzalezAlberquilla@arm.com>
Thu, 7 Apr 2016 16:32:38 +0000 (11:32 -0500)
Some common functionality added to the base prefetcher, mainly dealing with
extracting the block address, page address, block index inside the page and
some other information that can be inferred from the block address. This is
used for some prefetching algorithms, and having the methods in the base,
as well as the block size and other information is the sensible way.

src/mem/cache/prefetch/base.cc
src/mem/cache/prefetch/base.hh

index de4eaca01597251632b38ac6b1354526c4b337be..0b296144c36e56cf25f0a8a340bbfd207ed2386c 100644 (file)
 
 #include <list>
 
+#include "base/intmath.hh"
 #include "mem/cache/prefetch/base.hh"
 #include "mem/cache/base.hh"
 #include "sim/system.hh"
 
 BasePrefetcher::BasePrefetcher(const BasePrefetcherParams *p)
-    : ClockedObject(p), cache(nullptr), blkSize(0), system(p->sys),
-      onMiss(p->on_miss), onRead(p->on_read),
+    : ClockedObject(p), cache(nullptr), blkSize(0), lBlkSize(0),
+      system(p->sys), onMiss(p->on_miss), onRead(p->on_read),
       onWrite(p->on_write), onData(p->on_data), onInst(p->on_inst),
       masterId(system->getMasterId(name())),
       pageBytes(system->getPageBytes())
@@ -67,6 +68,7 @@ BasePrefetcher::setCache(BaseCache *_cache)
     assert(!cache);
     cache = _cache;
     blkSize = cache->getBlockSize();
+    lBlkSize = floorLog2(blkSize);
 }
 
 void
@@ -76,6 +78,7 @@ BasePrefetcher::regStats()
         .name(name() + ".num_hwpf_issued")
         .desc("number of hwpf issued")
         ;
+
 }
 
 bool
@@ -127,4 +130,32 @@ BasePrefetcher::samePage(Addr a, Addr b) const
     return roundDown(a, pageBytes) == roundDown(b, pageBytes);
 }
 
+Addr
+BasePrefetcher::blockAddress(Addr a) const
+{
+    return a & ~(blkSize-1);
+}
+
+Addr
+BasePrefetcher::blockIndex(Addr a) const
+{
+    return a >> lBlkSize;
+}
+
+Addr
+BasePrefetcher::pageAddress(Addr a) const
+{
+    return roundDown(a, pageBytes);
+}
 
+Addr
+BasePrefetcher::pageOffset(Addr a) const
+{
+    return a & (pageBytes - 1);
+}
+
+Addr
+BasePrefetcher::pageIthBlockAddress(Addr page, uint32_t blockIndex) const
+{
+    return page + (blockIndex << lBlkSize);
+}
index dd768e0b4a111e82b5e8b98cae345793de20425d..683c59f1f2a75f5ab986be959e46cfcb340665c6 100644 (file)
@@ -68,6 +68,9 @@ class BasePrefetcher : public ClockedObject
     /** The block size of the parent cache. */
     unsigned blkSize;
 
+    /** log_2(block size of the parent cache). */
+    unsigned lBlkSize;
+
     /** System we belong to */
     System* system;
 
@@ -102,6 +105,17 @@ class BasePrefetcher : public ClockedObject
 
     /** Determine if addresses are on the same page */
     bool samePage(Addr a, Addr b) const;
+    /** Determine the address of the block in which a lays */
+    Addr blockAddress(Addr a) const;
+    /** Determine the address of a at block granularity */
+    Addr blockIndex(Addr a) const;
+    /** Determine the address of the page in which a lays */
+    Addr pageAddress(Addr a) const;
+    /** Determine the page-offset of a  */
+    Addr pageOffset(Addr a) const;
+    /** Build the address of the i-th block inside the page */
+    Addr pageIthBlockAddress(Addr page, uint32_t i) const;
+
 
     Stats::Scalar pfIssued;