From 4a701c11e4c071ba0f196b376a73123a1ab952e7 Mon Sep 17 00:00:00 2001 From: "Daniel R. Carvalho" Date: Sat, 7 Sep 2019 11:45:25 +0200 Subject: [PATCH] mem-ruby: Fix maskLowOrderBits The function was wrong when number = 63. Also, use the more reliable src/base/bitfield.hh's mbits when posible. maskLowOrderBits has only been kept because SLICC does not accept a templated function. Change-Id: I8dd680da02ceb9e614e2f9cbf8f1ac52cead8d45 Signed-off-by: Daniel R. Carvalho Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/21084 Reviewed-by: Nikos Nikoleris Reviewed-by: Jason Lowe-Power Reviewed-by: Anthony Gutierrez Maintainer: Jason Lowe-Power Tested-by: kokoro --- src/mem/ruby/common/Address.cc | 18 +++++------------- src/mem/ruby/profiler/AddressProfiler.cc | 3 ++- src/mem/ruby/structures/Prefetcher.cc | 3 ++- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/mem/ruby/common/Address.cc b/src/mem/ruby/common/Address.cc index 1afefc236..5c89d31cc 100644 --- a/src/mem/ruby/common/Address.cc +++ b/src/mem/ruby/common/Address.cc @@ -28,6 +28,7 @@ #include "mem/ruby/common/Address.hh" +#include "base/bitfield.hh" #include "mem/ruby/system/RubySystem.hh" Addr @@ -48,14 +49,7 @@ bitSelect(Addr addr, unsigned int small, unsigned int big) Addr maskLowOrderBits(Addr addr, unsigned int number) { - Addr mask; - - if (number >= ADDRESS_WIDTH - 1) { - mask = ~0; - } else { - mask = (Addr)~0 << number; - } - return (addr & mask); + return mbits(addr, 63, number); } Addr @@ -67,15 +61,14 @@ getOffset(Addr addr) Addr makeLineAddress(Addr addr) { - return maskLowOrderBits(addr, RubySystem::getBlockSizeBits()); + return mbits(addr, 63, RubySystem::getBlockSizeBits()); } // returns the next stride address based on line address Addr makeNextStrideAddress(Addr addr, int stride) { - return maskLowOrderBits(addr, RubySystem::getBlockSizeBits()) - + RubySystem::getBlockSizeBytes() * stride; + return makeLineAddress(addr) + RubySystem::getBlockSizeBytes() * stride; } std::string @@ -83,7 +76,6 @@ printAddress(Addr addr) { std::stringstream out; out << "[" << std::hex << "0x" << addr << "," << " line 0x" - << maskLowOrderBits(addr, RubySystem::getBlockSizeBits()) - << std::dec << "]"; + << makeLineAddress(addr) << std::dec << "]"; return out.str(); } diff --git a/src/mem/ruby/profiler/AddressProfiler.cc b/src/mem/ruby/profiler/AddressProfiler.cc index acdc86023..9d96de707 100644 --- a/src/mem/ruby/profiler/AddressProfiler.cc +++ b/src/mem/ruby/profiler/AddressProfiler.cc @@ -30,6 +30,7 @@ #include +#include "base/bitfield.hh" #include "base/stl_helpers.hh" #include "mem/ruby/profiler/Profiler.hh" #include "mem/ruby/protocol/RubyRequest.hh" @@ -298,7 +299,7 @@ AddressProfiler::addTraceSample(Addr data_addr, Addr pc_addr, // record macro data address trace info // 6 for datablock, 4 to make it 16x more coarse - Addr macro_addr = maskLowOrderBits(data_addr, 10); + Addr macro_addr = mbits(data_addr, 63, 10); lookupTraceForAddress(macro_addr, m_macroBlockAccessTrace). update(type, access_mode, id, sharing_miss); diff --git a/src/mem/ruby/structures/Prefetcher.cc b/src/mem/ruby/structures/Prefetcher.cc index df8fdfcba..70b30352e 100644 --- a/src/mem/ruby/structures/Prefetcher.cc +++ b/src/mem/ruby/structures/Prefetcher.cc @@ -28,6 +28,7 @@ #include "mem/ruby/structures/Prefetcher.hh" +#include "base/bitfield.hh" #include "debug/RubyPrefetcher.hh" #include "mem/ruby/slicc_interface/RubySlicc_ComponentMapping.hh" #include "mem/ruby/system/RubySystem.hh" @@ -475,5 +476,5 @@ Prefetcher::print(std::ostream& out) const Addr Prefetcher::pageAddress(Addr addr) const { - return maskLowOrderBits(addr, m_page_shift); + return mbits(addr, 63, m_page_shift); } -- 2.30.2