aboutsummaryrefslogtreecommitdiff
path: root/lib/util.h
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2012-08-21 10:47:22 -0700
committerBen Pfaff <blp@nicira.com>2012-09-04 12:24:27 -0700
commit0ee140fb69ec924fe5280c1ceaa82c7a3d8f4223 (patch)
tree68095d156697e3114fb712053618cd09c7787944 /lib/util.h
parent3ca1de08b4d0374e4b9389d98351b2b0192c8189 (diff)
util: New function raw_ctz().
This will acquire a user in an upcoming commit. Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'lib/util.h')
-rw-r--r--lib/util.h25
1 files changed, 24 insertions, 1 deletions
diff --git a/lib/util.h b/lib/util.h
index a8d86657..a1f4bd74 100644
--- a/lib/util.h
+++ b/lib/util.h
@@ -242,9 +242,32 @@ char *xreadlink(const char *filename);
char *follow_symlinks(const char *filename);
void ignore(bool x OVS_UNUSED);
+
+/* Returns the number of trailing 0-bits in 'n'. Undefined if 'n' == 0.
+ *
+ * This compiles to a single machine instruction ("bsf") with GCC on x86. */
+#if !defined(UINT_MAX) || !defined(UINT32_MAX)
+#error "Someone screwed up the #includes."
+#elif __GNUC__ >= 4 && UINT_MAX == UINT32_MAX
+static inline int
+raw_ctz(uint32_t n)
+{
+ return __builtin_ctz(n);
+}
+#else
+/* Defined in util.c. */
+int raw_ctz(uint32_t n);
+#endif
+
+/* Returns the number of trailing 0-bits in 'n', or 32 if 'n' is 0. */
+static inline int
+ctz(uint32_t n)
+{
+ return n ? raw_ctz(n) : 32;
+}
+
int log_2_floor(uint32_t);
int log_2_ceil(uint32_t);
-int ctz(uint32_t);
int popcount(uint32_t);
bool is_all_zeros(const uint8_t *, size_t);