aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurelien Jarno <aurelien@aurel32.net>2013-12-21 01:15:21 +0100
committerAurelien Jarno <aurelien@aurel32.net>2014-06-18 18:10:47 +0200
commit739b7a90754924a0f023e8bb865d247ad0a60311 (patch)
tree7871c0a08bd717d08352984487a990c273761e09
parent2edaf21b939eb3b7f058fbc3cb7f7e14d6262486 (diff)
bitops: provide an inline implementation of find_first_bit
find_first_bit has started to be used heavily in TCG code. The current implementation based on find_next_bit is not optimal and can't be optimized be the compiler if the bit array has a fixed size, which is the case most of the time. This new implementation does not use find_next_bit and is yet small enough to be inlined. Cc: Corentin Chary <corentin.chary@gmail.com> Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
-rw-r--r--include/qemu/bitops.h12
1 files changed, 11 insertions, 1 deletions
diff --git a/include/qemu/bitops.h b/include/qemu/bitops.h
index 340b1e73bd..7e2d5c996e 100644
--- a/include/qemu/bitops.h
+++ b/include/qemu/bitops.h
@@ -157,7 +157,17 @@ unsigned long find_next_zero_bit(const unsigned long *addr,
static inline unsigned long find_first_bit(const unsigned long *addr,
unsigned long size)
{
- return find_next_bit(addr, size, 0);
+ unsigned long result, tmp;
+
+ for (result = 0; result < size; result += BITS_PER_LONG) {
+ tmp = *addr++;
+ if (tmp) {
+ result += ctzl(tmp);
+ return result < size ? result : size;
+ }
+ }
+ /* Not found */
+ return size;
}
/**