mirror of
https://github.com/opnsense/src.git
synced 2026-02-18 18:20:26 -05:00
log2: move log2 functions from linuxkpi to libkern
Linux has a header file that defines an ilog2 function and some simple functions/macros that use it: roundup_pow_of_two, is_power_of_2, rounddown_pow_of_two, and order_base_2. This change moves three of those simple functions (all but is_power_of_2) from linuxkpi to libkern. It also deletes a few implementations of these functions that have previously been copied into code for various device drivers, so that they can use the libkern version. The is_power_of_2 macro was not moved because powerof2 in param.h provides almost the same service already (except that they disagree about whether 0 is a power of two). Since the linux definitions of these functions were copied into FreeBSD 11 years ago, linux has improved them, and this change provides those improvements. In particular, a giant table of log values for evaluating ilog2 for constant values is no longer necessary. Reviewed by: alc, markj (previous version) Differential Revision: https://reviews.freebsd.org/D45536 (cherry picked from commit c8b0c33b03ac072413b27bed2bdae2ae27426f3a)
This commit is contained in:
parent
7443532d5e
commit
6f309b9d56
5 changed files with 15 additions and 127 deletions
|
|
@ -33,24 +33,9 @@
|
|||
|
||||
#include <sys/libkern.h>
|
||||
|
||||
static inline unsigned long
|
||||
roundup_pow_of_two(unsigned long x)
|
||||
{
|
||||
return (1UL << flsl(x - 1));
|
||||
}
|
||||
|
||||
static inline int
|
||||
is_power_of_2(unsigned long n)
|
||||
{
|
||||
return (n == roundup_pow_of_two(n));
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
rounddown_pow_of_two(unsigned long x)
|
||||
{
|
||||
return (1UL << (flsl(x) - 1));
|
||||
}
|
||||
|
||||
#define order_base_2(x) ilog2(roundup_pow_of_two(x))
|
||||
#define is_power_of_2(n) ({ \
|
||||
__typeof(n) _n = (n); \
|
||||
_n != 0 && (_n & (_n - 1)) == 0; \
|
||||
})
|
||||
|
||||
#endif /* _LINUXKPI_LINUX_LOG2_H_ */
|
||||
|
|
|
|||
|
|
@ -234,13 +234,6 @@ typedef void irqreturn_t;
|
|||
#define div_u64(n, d) ((n) / (d))
|
||||
#define hweight32(i) bitcount32(i)
|
||||
|
||||
static inline unsigned long
|
||||
roundup_pow_of_two(unsigned long x)
|
||||
{
|
||||
|
||||
return (1UL << flsl(x - 1));
|
||||
}
|
||||
|
||||
/**
|
||||
* ror32 - rotate a 32-bit value right
|
||||
* @word: value to rotate
|
||||
|
|
|
|||
|
|
@ -170,18 +170,6 @@ find_first_zero_bit(const unsigned long *p, unsigned long max)
|
|||
return (max);
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
roundup_pow_of_two(unsigned long x)
|
||||
{
|
||||
return (1UL << flsl(x - 1));
|
||||
}
|
||||
|
||||
static inline int
|
||||
is_power_of_2(unsigned long n)
|
||||
{
|
||||
return (n == roundup_pow_of_two(n));
|
||||
}
|
||||
|
||||
struct completion {
|
||||
unsigned int done;
|
||||
struct mtx lock;
|
||||
|
|
|
|||
|
|
@ -102,24 +102,6 @@ extern void qlnx_vf_flr_update(void *p_hwfn);
|
|||
|
||||
#ifndef QLNX_RDMA
|
||||
|
||||
static __inline unsigned long
|
||||
roundup_pow_of_two(unsigned long x)
|
||||
{
|
||||
return (1UL << flsl(x - 1));
|
||||
}
|
||||
|
||||
static __inline int
|
||||
is_power_of_2(unsigned long n)
|
||||
{
|
||||
return (n == roundup_pow_of_two(n));
|
||||
}
|
||||
|
||||
static __inline unsigned long
|
||||
rounddown_pow_of_two(unsigned long x)
|
||||
{
|
||||
return (1UL << (flsl(x) - 1));
|
||||
}
|
||||
|
||||
#define max_t(type, val1, val2) \
|
||||
((type)(val1) > (type)(val2) ? (type)(val1) : (val2))
|
||||
#define min_t(type, val1, val2) \
|
||||
|
|
|
|||
|
|
@ -223,77 +223,17 @@ ilog2_long_long(long long n)
|
|||
unsigned long long: ilog2_long_long \
|
||||
)(n)
|
||||
|
||||
#define ilog2(n) \
|
||||
( \
|
||||
__builtin_constant_p(n) ? ( \
|
||||
(n) < 1 ? -1 : \
|
||||
(n) & (1ULL << 63) ? 63 : \
|
||||
(n) & (1ULL << 62) ? 62 : \
|
||||
(n) & (1ULL << 61) ? 61 : \
|
||||
(n) & (1ULL << 60) ? 60 : \
|
||||
(n) & (1ULL << 59) ? 59 : \
|
||||
(n) & (1ULL << 58) ? 58 : \
|
||||
(n) & (1ULL << 57) ? 57 : \
|
||||
(n) & (1ULL << 56) ? 56 : \
|
||||
(n) & (1ULL << 55) ? 55 : \
|
||||
(n) & (1ULL << 54) ? 54 : \
|
||||
(n) & (1ULL << 53) ? 53 : \
|
||||
(n) & (1ULL << 52) ? 52 : \
|
||||
(n) & (1ULL << 51) ? 51 : \
|
||||
(n) & (1ULL << 50) ? 50 : \
|
||||
(n) & (1ULL << 49) ? 49 : \
|
||||
(n) & (1ULL << 48) ? 48 : \
|
||||
(n) & (1ULL << 47) ? 47 : \
|
||||
(n) & (1ULL << 46) ? 46 : \
|
||||
(n) & (1ULL << 45) ? 45 : \
|
||||
(n) & (1ULL << 44) ? 44 : \
|
||||
(n) & (1ULL << 43) ? 43 : \
|
||||
(n) & (1ULL << 42) ? 42 : \
|
||||
(n) & (1ULL << 41) ? 41 : \
|
||||
(n) & (1ULL << 40) ? 40 : \
|
||||
(n) & (1ULL << 39) ? 39 : \
|
||||
(n) & (1ULL << 38) ? 38 : \
|
||||
(n) & (1ULL << 37) ? 37 : \
|
||||
(n) & (1ULL << 36) ? 36 : \
|
||||
(n) & (1ULL << 35) ? 35 : \
|
||||
(n) & (1ULL << 34) ? 34 : \
|
||||
(n) & (1ULL << 33) ? 33 : \
|
||||
(n) & (1ULL << 32) ? 32 : \
|
||||
(n) & (1ULL << 31) ? 31 : \
|
||||
(n) & (1ULL << 30) ? 30 : \
|
||||
(n) & (1ULL << 29) ? 29 : \
|
||||
(n) & (1ULL << 28) ? 28 : \
|
||||
(n) & (1ULL << 27) ? 27 : \
|
||||
(n) & (1ULL << 26) ? 26 : \
|
||||
(n) & (1ULL << 25) ? 25 : \
|
||||
(n) & (1ULL << 24) ? 24 : \
|
||||
(n) & (1ULL << 23) ? 23 : \
|
||||
(n) & (1ULL << 22) ? 22 : \
|
||||
(n) & (1ULL << 21) ? 21 : \
|
||||
(n) & (1ULL << 20) ? 20 : \
|
||||
(n) & (1ULL << 19) ? 19 : \
|
||||
(n) & (1ULL << 18) ? 18 : \
|
||||
(n) & (1ULL << 17) ? 17 : \
|
||||
(n) & (1ULL << 16) ? 16 : \
|
||||
(n) & (1ULL << 15) ? 15 : \
|
||||
(n) & (1ULL << 14) ? 14 : \
|
||||
(n) & (1ULL << 13) ? 13 : \
|
||||
(n) & (1ULL << 12) ? 12 : \
|
||||
(n) & (1ULL << 11) ? 11 : \
|
||||
(n) & (1ULL << 10) ? 10 : \
|
||||
(n) & (1ULL << 9) ? 9 : \
|
||||
(n) & (1ULL << 8) ? 8 : \
|
||||
(n) & (1ULL << 7) ? 7 : \
|
||||
(n) & (1ULL << 6) ? 6 : \
|
||||
(n) & (1ULL << 5) ? 5 : \
|
||||
(n) & (1ULL << 4) ? 4 : \
|
||||
(n) & (1ULL << 3) ? 3 : \
|
||||
(n) & (1ULL << 2) ? 2 : \
|
||||
(n) & (1ULL << 1) ? 1 : \
|
||||
(n) & (1ULL << 0) ? 0 : \
|
||||
-1) : \
|
||||
ilog2_var(n) \
|
||||
)
|
||||
#define ilog2_const(n) \
|
||||
(8 * (int)sizeof(unsigned long long) - 1 - \
|
||||
__builtin_clzll(n))
|
||||
|
||||
#define ilog2(n) (__builtin_constant_p(n) ? ilog2_const(n) : ilog2_var(n))
|
||||
#define rounddown_pow_of_two(n) ((__typeof(n))1 << ilog2(n))
|
||||
#define order_base_2(n) ({ \
|
||||
__typeof(n) _n = (n); \
|
||||
_n == 1 ? 0 : 1 + ilog2(_n - 1); \
|
||||
})
|
||||
#define roundup_pow_of_two(n) ((__typeof(n))1 << order_base_2(n))
|
||||
|
||||
#define bitcount64(x) __bitcount64((uint64_t)(x))
|
||||
#define bitcount32(x) __bitcount32((uint32_t)(x))
|
||||
|
|
|
|||
Loading…
Reference in a new issue