diff options
author | Andi Kleen <ak@suse.de> | 2006-06-26 13:57:10 +0200 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-26 10:48:16 -0700 |
commit | 08cd36570e47176c7b6bd3e80125aa46c4638097 (patch) | |
tree | 02c9cb3be4a2b520772e9b66bb57901401dd2666 /include | |
parent | 5282aab87a8be3f5e6c36a4c2ee4b71852def1bb (diff) | |
download | blackbird-op-linux-08cd36570e47176c7b6bd3e80125aa46c4638097.tar.gz blackbird-op-linux-08cd36570e47176c7b6bd3e80125aa46c4638097.zip |
[PATCH] x86_64: Optimize bitmap_weight for small bitmaps
Use inline code bitmaps <= BITS_PER_LONG in bitmap_weight. This
gives _much_ better code.
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/bitmap.h | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index d9ed27969855..dcc5de7cc487 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h @@ -24,6 +24,9 @@ * The available bitmap operations and their rough meaning in the * case that the bitmap is a single unsigned long are thus: * + * Note that nbits should be always a compile time evaluable constant. + * Otherwise many inlines will generate horrible code. + * * bitmap_zero(dst, nbits) *dst = 0UL * bitmap_fill(dst, nbits) *dst = ~0UL * bitmap_copy(dst, src, nbits) *dst = *src @@ -244,6 +247,8 @@ static inline int bitmap_full(const unsigned long *src, int nbits) static inline int bitmap_weight(const unsigned long *src, int nbits) { + if (nbits <= BITS_PER_LONG) + return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits)); return __bitmap_weight(src, nbits); } |