diff options
Diffstat (limited to 'src/mem/cache/prefetch')
-rw-r--r-- | src/mem/cache/prefetch/base.cc | 35 | ||||
-rw-r--r-- | src/mem/cache/prefetch/base.hh | 14 |
2 files changed, 47 insertions, 2 deletions
diff --git a/src/mem/cache/prefetch/base.cc b/src/mem/cache/prefetch/base.cc index de4eaca01..0b296144c 100644 --- a/src/mem/cache/prefetch/base.cc +++ b/src/mem/cache/prefetch/base.cc @@ -48,13 +48,14 @@ #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); +} diff --git a/src/mem/cache/prefetch/base.hh b/src/mem/cache/prefetch/base.hh index dd768e0b4..683c59f1f 100644 --- a/src/mem/cache/prefetch/base.hh +++ b/src/mem/cache/prefetch/base.hh @@ -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; |