Am 11.11.2013 08:44, schrieb Alexey Kardashevskiy: > This adds a macro to calculate the highest bit set.
Isn't that already available as ffs / clz GCC builtin with wrapper in qemu/bitops.h? What's the difference to your macro? CC'ing Paolo. Andreas > If used on constant > values, no code will be generated. > > Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> > --- > include/qemu/bitops.h | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/include/qemu/bitops.h b/include/qemu/bitops.h > index 304c90c..98ba42a 100644 > --- a/include/qemu/bitops.h > +++ b/include/qemu/bitops.h > @@ -23,6 +23,18 @@ > #define BIT_WORD(nr) ((nr) / BITS_PER_LONG) > #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) > > +#define __BITNR(m, n) ((m) == ((m) & (1<<(n)))) ? (n) : > +#define BITNR(m) \ > + __BITNR((m), 31) __BITNR((m), 30) __BITNR((m), 29) __BITNR((m), 28) \ > + __BITNR((m), 27) __BITNR((m), 26) __BITNR((m), 25) __BITNR((m), 24) \ > + __BITNR((m), 23) __BITNR((m), 22) __BITNR((m), 21) __BITNR((m), 20) \ > + __BITNR((m), 19) __BITNR((m), 18) __BITNR((m), 17) __BITNR((m), 16) \ > + __BITNR((m), 15) __BITNR((m), 14) __BITNR((m), 13) __BITNR((m), 12) \ > + __BITNR((m), 11) __BITNR((m), 10) __BITNR((m), 9) __BITNR((m), 8) \ > + __BITNR((m), 7) __BITNR((m), 6) __BITNR((m), 5) __BITNR((m), 4) \ > + __BITNR((m), 3) __BITNR((m), 2) __BITNR((m), 1) __BITNR((m), 0) \ > + -1 > + > /** > * set_bit - Set a bit in memory > * @nr: the bit to set > -- SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg