From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tim Deegan Subject: [PATCH 4/4] bitmaps/bitops: Clarify tests for small constant size. Date: Thu, 28 Nov 2013 16:37:45 +0000 Message-ID: <1385656665-12551-5-git-send-email-tim@xen.org> References: <1385656665-12551-1-git-send-email-tim@xen.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1385656665-12551-1-git-send-email-tim@xen.org> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org No semantic changes, just makes the control flow a bit clearer. I was looking at this bcause the (-!__builtin_constant_p(x) | x__) formula is too clever for Coverity, but in fact it always takes me a minute or two to understand it too. :) Signed-off-by: Tim Deegan --- xen/include/asm-x86/bitops.h | 60 +++++++++++++++++++------------------------- xen/include/xen/bitmap.h | 30 +++++++++++++--------- 2 files changed, 44 insertions(+), 46 deletions(-) diff --git a/xen/include/asm-x86/bitops.h b/xen/include/asm-x86/bitops.h index ab21d92..810beb1 100644 --- a/xen/include/asm-x86/bitops.h +++ b/xen/include/asm-x86/bitops.h @@ -335,23 +335,19 @@ static inline unsigned int __scanbit(unsigned long val, unsigned long max) * @offset: The bitnumber to start searching at * @size: The maximum size to search */ -#define find_next_bit(addr, size, off) ({ \ - unsigned int r__ = (size); \ - unsigned int o__ = (off); \ - switch ( -!__builtin_constant_p(size) | r__ ) \ - { \ - case 0: (void)(addr); break; \ - case 1 ... BITS_PER_LONG: \ - r__ = o__ + __scanbit(*(const unsigned long *)(addr) >> o__, r__); \ - break; \ - default: \ - if ( __builtin_constant_p(off) && !o__ ) \ - r__ = __find_first_bit(addr, r__); \ - else \ - r__ = __find_next_bit(addr, r__, o__); \ - break; \ - } \ - r__; \ +#define find_next_bit(addr, size, off) ({ \ + unsigned int r__; \ + unsigned int s__ = (size); \ + unsigned int o__ = (off); \ + if ( __builtin_constant_p(size) && s__ == 0 ) \ + r__ = s__; \ + else if ( __builtin_constant_p(size) && s__ <= BITS_PER_LONG ) \ + r__ = o__ + __scanbit(*(const unsigned long *)(addr) >> o__, s__); \ + else if ( __builtin_constant_p(off) && !o__ ) \ + r__ = __find_first_bit(addr, s__); \ + else \ + r__ = __find_next_bit(addr, s__, o__); \ + r__; \ }) /** @@ -370,23 +366,19 @@ static inline unsigned int __scanbit(unsigned long val, unsigned long max) * @offset: The bitnumber to start searching at * @size: The maximum size to search */ -#define find_next_zero_bit(addr, size, off) ({ \ - unsigned int r__ = (size); \ - unsigned int o__ = (off); \ - switch ( -!__builtin_constant_p(size) | r__ ) \ - { \ - case 0: (void)(addr); break; \ - case 1 ... BITS_PER_LONG: \ - r__ = o__ + __scanbit(~*(const unsigned long *)(addr) >> o__, r__); \ - break; \ - default: \ - if ( __builtin_constant_p(off) && !o__ ) \ - r__ = __find_first_zero_bit(addr, r__); \ - else \ - r__ = __find_next_zero_bit(addr, r__, o__); \ - break; \ - } \ - r__; \ +#define find_next_zero_bit(addr, size, off) ({ \ + unsigned int r__; \ + unsigned int s__ = (size); \ + unsigned int o__ = (off); \ + if ( __builtin_constant_p(size) && s__ == 0 ) \ + r__ = s__; \ + else if ( __builtin_constant_p(size) && s__ <= BITS_PER_LONG ) \ + r__ = o__ + __scanbit(~*(const unsigned long *)(addr) >> o__, s__); \ + else if ( __builtin_constant_p(off) && !o__ ) \ + r__ = __find_first_zero_bit(addr, s__); \ + else \ + r__ = __find_next_zero_bit(addr, s__, o__); \ + r__; \ }) /** diff --git a/xen/include/xen/bitmap.h b/xen/include/xen/bitmap.h index b5ec455..166e1a0 100644 --- a/xen/include/xen/bitmap.h +++ b/xen/include/xen/bitmap.h @@ -110,13 +110,14 @@ extern int bitmap_allocate_region(unsigned long *bitmap, int pos, int order); #define bitmap_bytes(nbits) (BITS_TO_LONGS(nbits) * sizeof(unsigned long)) -#define bitmap_switch(nbits, zero_ret, small, large) \ - switch (-!__builtin_constant_p(nbits) | (nbits)) { \ - case 0: return zero_ret; \ - case 1 ... BITS_PER_LONG: \ - small; break; \ - default: \ - large; break; \ +#define bitmap_switch(nbits, zero, small, large) \ + unsigned int n__ = (nbits); \ + if (__builtin_constant_p(nbits) && n__ == 0) { \ + zero; \ + } else if (__builtin_constant_p(nbits) && n__ <= BITS_PER_LONG) { \ + small; \ + } else { \ + large; \ } static inline void bitmap_zero(unsigned long *dst, int nbits) @@ -191,7 +192,8 @@ static inline void bitmap_complement(unsigned long *dst, const unsigned long *sr static inline int bitmap_equal(const unsigned long *src1, const unsigned long *src2, int nbits) { - bitmap_switch(nbits, -1, + bitmap_switch(nbits, + return -1, return !((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits)), return __bitmap_equal(src1, src2, nbits)); } @@ -199,7 +201,8 @@ static inline int bitmap_equal(const unsigned long *src1, static inline int bitmap_intersects(const unsigned long *src1, const unsigned long *src2, int nbits) { - bitmap_switch(nbits, -1, + bitmap_switch(nbits, + return -1, return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0, return __bitmap_intersects(src1, src2, nbits)); } @@ -207,21 +210,24 @@ static inline int bitmap_intersects(const unsigned long *src1, static inline int bitmap_subset(const unsigned long *src1, const unsigned long *src2, int nbits) { - bitmap_switch(nbits, -1, + bitmap_switch(nbits, + return -1, return !((*src1 & ~*src2) & BITMAP_LAST_WORD_MASK(nbits)), return __bitmap_subset(src1, src2, nbits)); } static inline int bitmap_empty(const unsigned long *src, int nbits) { - bitmap_switch(nbits, -1, + bitmap_switch(nbits, + return -1, return !(*src & BITMAP_LAST_WORD_MASK(nbits)), return __bitmap_empty(src, nbits)); } static inline int bitmap_full(const unsigned long *src, int nbits) { - bitmap_switch(nbits, -1, + bitmap_switch(nbits, + return -1, return !(~*src & BITMAP_LAST_WORD_MASK(nbits)), return __bitmap_full(src, nbits)); } -- 1.8.4.rc3