diff options
author | Damjan Marion <damarion@cisco.com> | 2018-05-10 13:40:44 +0200 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2018-05-10 17:16:56 +0000 |
commit | 1105600416e0560cb05120a22e0a2e7359a13665 (patch) | |
tree | acf1df08de42344c380473d81886864e662890cf /src/vppinfra/clib.h | |
parent | 132dc49ee847a3e3b644de8b36499d73e8a8d37e (diff) |
vppinfra: use count_trailing_zeros in sparse_vec_index
It is much cheaper to use ctzll than to do shift,subtract and mask
in likely case when we are looking for 1st set bit in the uword.
Change-Id: I31954081571978878c7098bafad0c85a91755fa2
Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/vppinfra/clib.h')
-rw-r--r-- | src/vppinfra/clib.h | 63 |
1 files changed, 6 insertions, 57 deletions
diff --git a/src/vppinfra/clib.h b/src/vppinfra/clib.h index 0d059a0778b..42748b0a34c 100644 --- a/src/vppinfra/clib.h +++ b/src/vppinfra/clib.h @@ -125,71 +125,20 @@ decl /* Use __builtin_clz if available. */ -#ifdef __GNUC__ -#include <features.h> -#if __GNUC_PREREQ(3, 4) #if uword_bits == 64 -#define count_leading_zeros(count,x) count = __builtin_clzll (x) -#define count_trailing_zeros(count,x) count = __builtin_ctzll (x) +#define count_leading_zeros(x) __builtin_clzll (x) +#define count_trailing_zeros(x) __builtin_ctzll (x) #else -#define count_leading_zeros(count,x) count = __builtin_clzl (x) -#define count_trailing_zeros(count,x) count = __builtin_ctzl (x) +#define count_leading_zeros(x) __builtin_clzl (x) +#define count_trailing_zeros(x) __builtin_ctzl (x) #endif -#endif -#endif - -#ifndef count_leading_zeros - -/* Misc. integer arithmetic functions. */ -#if defined (i386) -#define count_leading_zeros(count, x) \ - do { \ - word _clz; \ - __asm__ ("bsrl %1,%0" \ - : "=r" (_clz) : "rm" ((word) (x)));\ - (count) = _clz ^ 31; \ - } while (0) - -#define count_trailing_zeros(count, x) \ - __asm__ ("bsfl %1,%0" : "=r" (count) : "rm" ((word)(x))) -#endif /* i386 */ - -#if defined (__alpha__) && defined (HAVE_CIX) -#define count_leading_zeros(count, x) \ - __asm__ ("ctlz %1,%0" \ - : "=r" ((word) (count)) \ - : "r" ((word) (x))) -#define count_trailing_zeros(count, x) \ - __asm__ ("cttz %1,%0" \ - : "=r" ((word) (count)) \ - : "r" ((word) (x))) -#endif /* alpha && HAVE_CIX */ - -#if __mips >= 4 - -/* Select between 32/64 opcodes. */ -#if uword_bits == 32 -#define count_leading_zeros(_count, _x) \ - __asm__ ("clz %[count],%[x]" \ - : [count] "=r" ((word) (_count)) \ - : [x] "r" ((word) (_x))) -#else -#define count_leading_zeros(_count, _x) \ - __asm__ ("dclz %[count],%[x]" \ - : [count] "=r" ((word) (_count)) \ - : [x] "r" ((word) (_x))) -#endif - -#endif /* __mips >= 4 */ - -#endif /* count_leading_zeros */ #if defined (count_leading_zeros) always_inline uword min_log2 (uword x) { uword n; - count_leading_zeros (n, x); + n = count_leading_zeros (x); return BITS (uword) - n - 1; } #else @@ -305,7 +254,7 @@ log2_first_set (uword x) { uword result; #ifdef count_trailing_zeros - count_trailing_zeros (result, x); + result = count_trailing_zeros (x); #else result = min_log2 (first_set (x)); #endif |