From 7fb2fda841be0d61b00569c5a456fcdc0ab75bb1 Mon Sep 17 00:00:00 2001 From: "Daniel R. Carvalho" Date: Sun, 18 Dec 2022 10:33:10 -0300 Subject: [PATCH] base: Fix signature of SatCounter::saturate() The variants that use more than 8 bits were broken, since the size of the difference in those cases could be larger than 8 bits, and the return value was only 8-bits long. Change-Id: I8b75be48f924cc33ebf5e5aeff6d4045fac66bcc Signed-off-by: Daniel R. Carvalho Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/66791 Maintainer: Matt Sinclair Reviewed-by: Matt Sinclair Tested-by: kokoro --- src/base/sat_counter.hh | 4 ++-- src/base/sat_counter.test.cc | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/base/sat_counter.hh b/src/base/sat_counter.hh index a607c4ca85..ecb8df8b49 100644 --- a/src/base/sat_counter.hh +++ b/src/base/sat_counter.hh @@ -318,9 +318,9 @@ class GenericSatCounter * * @ingroup api_sat_counter */ - uint8_t saturate() + T saturate() { - const uint8_t diff = maxVal - counter; + const T diff = maxVal - counter; counter = maxVal; return diff; } diff --git a/src/base/sat_counter.test.cc b/src/base/sat_counter.test.cc index 07a01c7279..0a6459c23f 100644 --- a/src/base/sat_counter.test.cc +++ b/src/base/sat_counter.test.cc @@ -149,6 +149,20 @@ TEST(SatCounterTest, Saturate) ASSERT_TRUE(counter.isSaturated()); } +TEST(SatCounterTest, Saturate16) +{ + const unsigned bits = 14; + const unsigned max_value = (1 << bits) - 1; + SatCounter16 counter(bits); + counter++; + ASSERT_FALSE(counter.isSaturated()); + + // Make sure the value added is what was missing to saturate + const unsigned diff = counter.saturate(); + ASSERT_EQ(diff, max_value - 1); + ASSERT_TRUE(counter.isSaturated()); +} + /** * Test back and forth against an int. */