util.h declares this when needed, make sure the definition is compiled in only in that case.
Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com> --- lib/util.c | 2 +- lib/util.h | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/util.c b/lib/util.c index 13d41a7..000504c 100644 --- a/lib/util.c +++ b/lib/util.c @@ -901,7 +901,7 @@ raw_clz64(uint64_t n) } #endif -#if !(__GNUC__ >= 4 && defined(__corei7)) +#if NEED_COUNT_1BITS_8 #define INIT1(X) \ ((((X) & (1 << 0)) != 0) + \ (((X) & (1 << 1)) != 0) + \ diff --git a/lib/util.h b/lib/util.h index 8d810c2..264cdca 100644 --- a/lib/util.h +++ b/lib/util.h @@ -371,8 +371,7 @@ log_2_ceil(uint64_t n) return log_2_floor(n) + !is_pow2(n); } -extern const uint8_t count_1bits_8[256]; - +#if INTPTR_MAX == INT32_MAX /* Returns the number of 1-bits in 'x', between 0 and 32 inclusive. */ static inline unsigned int count_1bits_32(uint32_t x) @@ -381,6 +380,9 @@ count_1bits_32(uint32_t x) /* __builtin_popcount() is fast only when supported by the CPU. */ return __builtin_popcount(x); #else +#define NEED_COUNT_1BITS_8 1 + extern const uint8_t count_1bits_8[256]; + /* This portable implementation is the fastest one we know of for 32 bits, * and faster than GCC __builtin_popcount(). */ return (count_1bits_8[x & 0xff] + @@ -394,7 +396,13 @@ count_1bits_32(uint32_t x) static inline unsigned int count_1bits(uint64_t x) { - if (sizeof(void *) == 8) { /* 64-bit CPU */ + return count_1bits_32(x) + count_1bits_32(x >> 32); +} +#else +/* Returns the number of 1-bits in 'x', between 0 and 64 inclusive. */ +static inline unsigned int +count_1bits(uint64_t x) +{ #if __GNUC__ >= 4 && defined(__corei7) /* __builtin_popcountll() is fast only when supported by the CPU. */ return __builtin_popcountll(x); @@ -410,10 +418,8 @@ count_1bits(uint64_t x) x = (x + (x >> 4)) & h0F; /* Count of each 8 bits in-place. */ return (x * h01) >> 56; /* Sum of all bytes. */ #endif - } else { /* 32-bit CPU */ - return count_1bits_32(x) + count_1bits_32(x >> 32); - } } +#endif /* Returns the rightmost 1-bit in 'x' (e.g. 01011000 => 00001000), or 0 if 'x' * is 0. */ -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev