From da050eeddea5b3281d63e4f647a19c80880ebeae Mon Sep 17 00:00:00 2001 From: handsomeliu Date: Fri, 3 Mar 2023 16:32:01 +0800 Subject: [PATCH] base: support calculating the intersection of two AddrRange Change-Id: I2f089039c709fe4c3f7086263fb56470c7713bad Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/68617 Maintainer: Jason Lowe-Power Reviewed-by: Jason Lowe-Power Tested-by: kokoro Reviewed-by: Bobby Bruce --- src/base/addr_range.hh | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/base/addr_range.hh b/src/base/addr_range.hh index 07bd255d26..11fb1cd668 100644 --- a/src/base/addr_range.hh +++ b/src/base/addr_range.hh @@ -732,6 +732,22 @@ class AddrRange { return !(*this == r); } + + /** + * @ingroup api_addr_range + */ + AddrRange + operator&(const AddrRange& r) const + { + panic_if(this->interleaved() || r.interleaved(), + "Cannot calculate intersection of interleaved ranges."); + Addr start = std::max(this->_start, r._start); + Addr end = std::min(this->_end, r._end); + if (end <= start) { + return AddrRange(0, 0); + } + return AddrRange(start, end); + } }; static inline AddrRangeList