Giacomo Travaglini has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/41494 )

Change subject: base: Add log2i to calculate log2 for integers
......................................................................

base: Add log2i to calculate log2 for integers

This is meant to evaluate the log2 for power of 2 integers

Change-Id: Iaa110cce4d36c578a201c8a45e9e2e3a369ffb30
Signed-off-by: Giacomo Travaglini <giacomo.travagl...@arm.com>
---
M src/base/bitfield.hh
M src/base/bitfield.test.cc
2 files changed, 62 insertions(+), 1 deletion(-)



diff --git a/src/base/bitfield.hh b/src/base/bitfield.hh
index 13282f2..79e14f5 100644
--- a/src/base/bitfield.hh
+++ b/src/base/bitfield.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2019 ARM Limited
+ * Copyright (c) 2017, 2019, 2021 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -356,4 +356,19 @@
     return value ? __builtin_ctzll(value) : 64;
 }

+/**
+ * Calculate the log2 of a power of 2 integer
+ *
+ * @param An input value
+ * @return The base 2 log of value
+ *
+ * @ingroup api_bitfield
+ */
+inline int
+log2i(int value)
+{
+    assert(isPow2(value) && value > 0);
+    return sizeof(int) * 8 - __builtin_clz(value) - 1;
+}
+
 #endif // __BASE_BITFIELD_HH__
diff --git a/src/base/bitfield.test.cc b/src/base/bitfield.test.cc
index 3d07e69..38acd15 100644
--- a/src/base/bitfield.test.cc
+++ b/src/base/bitfield.test.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2021 ARM Limited
  * Copyright (c) 2019 The Regents of the University of California
  * All rights reserved
  *
@@ -405,3 +406,48 @@
     uint64_t value = 0;
     EXPECT_EQ(64, ctz64(value));
 }
+
+/** This is testing the assertions: what if invalid arguments are
+ * provided to log2i:
+ *
+ * 1) value = 0
+ * 2) value < 0
+ * 3) value is not a poower of 2
+ */
+TEST(BitfieldTest, Log2iDeath)
+{
+    // 1) value = 0
+    EXPECT_DEATH({
+        const int value = 0;
+        log2i(value);
+    }, "value > 0.*failed");
+
+    // 2) value < 0
+    EXPECT_DEATH({
+        const int value = -1;
+        log2i(value);
+    }, "value > 0.*failed");
+
+    // 3) value is not a power of 2
+    EXPECT_DEATH({
+        const int pow2_value = 1 << 2;
+        const int value = pow2_value + 1;
+        log2i(value);
+    }, "isPow2");
+}
+
+/** This is testing if log2i actually works.
+ * at every iteration value is multiplied by 2 (left shift) and expected
+ * is incremented by one. This until value reaches becomes negative (by
+ * left shifting) which is when expected points to the MSB
+ */
+TEST(BitfieldTest, Log2i)
+{
+    int expected = 0;
+    for (int value = 1; value > 0; expected++, value <<= 1) {
+        EXPECT_EQ(expected, log2i(value));
+    }
+
+    // Just as a sanity check for expected to point to the MSB
+    EXPECT_EQ(expected, sizeof(int) * 8 - 1);
+}

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/41494
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Iaa110cce4d36c578a201c8a45e9e2e3a369ffb30
Gerrit-Change-Number: 41494
Gerrit-PatchSet: 1
Gerrit-Owner: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to