Il 22/12/2013 12:32, Aurelien Jarno ha scritto:
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.

If you mean by fully unrolling the loop, that's right.

However...

-    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;
 }

 /**


... you probably want to limit this to bitmaps that are of constant size, and small enough that the compiler will unroll them.

So it probably would be a good idea to add an

    if (!__builtin_constant_p(size) || size > 8 * BITS_PER_LONG)
        return find_next_bit(addr, size, 0);

Not urgent since TCG is the only user of find_first_bit right now, but worth considering.

Paolo

Reply via email to