From d94e5b5d91c1a4f29264bee9c13edbdb70d0417e Mon Sep 17 00:00:00 2001 From: Giacomo Travaglini Date: Thu, 21 Mar 2019 15:41:04 +0000 Subject: [PATCH] base: Fix CircularQueue's operator-= when negative subtraction Using operator-= when the rhs is a negative value is equivalent to using += on -rhs. This is fixing rounding in that scenario. Change-Id: Ia22e51f81a6805d27fd6b2115d288bb23421d00f Signed-off-by: Giacomo Travaglini Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/17528 Reviewed-by: Daniel Carvalho Reviewed-by: Jason Lowe-Power Maintainer: Andreas Sandberg --- src/base/circular_queue.hh | 10 +++++----- src/base/circular_queue.test.cc | 3 +++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/base/circular_queue.hh b/src/base/circular_queue.hh index f368ed0d1..da3da8b28 100644 --- a/src/base/circular_queue.hh +++ b/src/base/circular_queue.hh @@ -323,12 +323,12 @@ class CircularQueue : private std::vector assert(_cq); /* C does not do euclidean division, so we have to adjust */ - if (t >= 0) + if (t >= 0) { _round += (-t + _idx) / _cq->capacity(); - else - _round += (-t + _idx - _cq->capacity() + 1) / _cq->capacity(); - - _idx = _cq->moduloSub(_idx, t); + _idx = _cq->moduloSub(_idx, t); + } else { + *this += -t; + } return *this; } diff --git a/src/base/circular_queue.test.cc b/src/base/circular_queue.test.cc index cce6cb0b6..fd63f7203 100644 --- a/src/base/circular_queue.test.cc +++ b/src/base/circular_queue.test.cc @@ -198,8 +198,10 @@ TEST(CircularQueueTest, IteratorsOp) cq.push_back(first_value); cq.push_back(second_value); + auto negative_offset = -(cq_size + 1); auto it_1 = cq.begin(); auto it_2 = cq.begin() + 1; + auto it_3 = cq.begin() - negative_offset; // Operators test ASSERT_TRUE(it_1 != it_2); @@ -213,6 +215,7 @@ TEST(CircularQueueTest, IteratorsOp) ASSERT_EQ(it_1, it_2 - 1); ASSERT_EQ(it_2 - it_1, 1); ASSERT_EQ(it_1 - it_2, -1); + ASSERT_EQ(it_3._round, 1); auto temp_it = it_1; ASSERT_EQ(++temp_it, it_2); -- 2.30.2