base: Fix ctz32 for systems where unsigned int is not 32bit
authorNikos Nikoleris <nikos.nikoleris@arm.com>
Tue, 28 May 2019 20:23:50 +0000 (21:23 +0100)
committerNikos Nikoleris <nikos.nikoleris@arm.com>
Mon, 10 Jun 2019 17:36:55 +0000 (17:36 +0000)
The implementation of ctz32 uses __builtin_ctz to count the number of
trailing zeros and therefore makes the assumption that an unsigned int
is 32bit. This change checks whether that's the case and if not it
uses __builtin_ctzl instead.

Change-Id: Ic3ed3ada25fd0a93c7eb91d75b954e9924bdbb77
Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/19129
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
Maintainer: Jason Lowe-Power <jason@lowepower.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/base/bitfield.hh

index 59b239a88d79fe74fc4c84bc3d715e7e7a5830ac..f2893962c44f25afe95118fe343a13c61e0c9317 100644 (file)
@@ -285,12 +285,12 @@ inline uint64_t alignToPowerOfTwo(uint64_t val)
 /**
  * Count trailing zeros in a 32-bit value.
  *
- * Returns 32 if the value is zero. Note that the GCC builtin is
- * undefined if the value is zero.
+ * @param An input value
+ * @return The number of trailing zeros or 32 if the value is zero.
  */
 inline int ctz32(uint32_t value)
 {
-    return value ? __builtin_ctz(value) : 32;
+    return value ? __builtin_ctzl(value) : 32;
 }
 
 /**