38 #ifndef included_clib_h 39 #define included_clib_h 42 #if ! defined (CLIB_STANDALONE) && ! defined (CLIB_LINUX_KERNEL) 55 #define NULL ((void *) 0) 58 #define BITS(x) (8*sizeof(x)) 59 #define ARRAY_LEN(x) (sizeof (x)/sizeof (x[0])) 61 #define _STRUCT_FIELD(t,f) (((t *) 0)->f) 62 #define STRUCT_OFFSET_OF(t,f) ((uword) & _STRUCT_FIELD (t, f)) 63 #define STRUCT_BIT_OFFSET_OF(t,f) (BITS(u8) * (uword) & _STRUCT_FIELD (t, f)) 64 #define STRUCT_SIZE_OF(t,f) (sizeof (_STRUCT_FIELD (t, f))) 65 #define STRUCT_BITS_OF(t,f) (BITS (_STRUCT_FIELD (t, f))) 66 #define STRUCT_ARRAY_LEN(t,f) ARRAY_LEN (_STRUCT_FIELD (t, f)) 67 #define STRUCT_MARK(mark) u8 mark[0] 68 #define STRUCT_MARK_PTR(v, f) &(v)->f 71 #define STRUCT_STRIDE_OF(t,f) \ 72 ( ((uword) & (((t *) 0)[1].f)) \ 73 - ((uword) & (((t *) 0)[0].f))) 75 #define STRUCT_OFFSET_OF_VAR(v,f) ((uword) (&(v)->f) - (uword) (v)) 78 #define CLIB_PACKED(x) x __attribute__ ((packed)) 79 #define CLIB_UNUSED(x) x __attribute__ ((unused)) 81 #define never_inline __attribute__ ((__noinline__)) 84 #define always_inline static inline 85 #define static_always_inline static inline 87 #define always_inline static inline __attribute__ ((__always_inline__)) 88 #define static_always_inline static inline __attribute__ ((__always_inline__)) 94 #define CLIB_PAD_FROM_TO(from,to) u8 pad_##from[(to) - (from)] 97 #define PREDICT_FALSE(x) __builtin_expect((x),0) 98 #define PREDICT_TRUE(x) __builtin_expect((x),1) 101 #define CLIB_MEMORY_BARRIER() __sync_synchronize () 104 #define CLIB_MEMORY_STORE_BARRIER() __builtin_ia32_sfence () 106 #define CLIB_MEMORY_STORE_BARRIER() __sync_synchronize () 110 #define INIT_FUNCTION(decl) \ 111 decl __attribute ((constructor)); \ 115 #define EXIT_FUNCTION(decl) \ 116 decl __attribute ((destructor)); \ 121 #include <features.h> 122 #if __GNUC_PREREQ(3, 4) 124 #define count_leading_zeros(count,x) count = __builtin_clzll (x) 125 #define count_trailing_zeros(count,x) count = __builtin_ctzll (x) 127 #define count_leading_zeros(count,x) count = __builtin_clzl (x) 128 #define count_trailing_zeros(count,x) count = __builtin_ctzl (x) 133 #ifndef count_leading_zeros 137 #define count_leading_zeros(count, x) \ 140 __asm__ ("bsrl %1,%0" \ 141 : "=r" (_clz) : "rm" ((word) (x)));\ 142 (count) = _clz ^ 31; \ 145 #define count_trailing_zeros(count, x) \ 146 __asm__ ("bsfl %1,%0" : "=r" (count) : "rm" ((word)(x))) 149 #if defined (__alpha__) && defined (HAVE_CIX) 150 #define count_leading_zeros(count, x) \ 151 __asm__ ("ctlz %1,%0" \ 152 : "=r" ((word) (count)) \ 154 #define count_trailing_zeros(count, x) \ 155 __asm__ ("cttz %1,%0" \ 156 : "=r" ((word) (count)) \ 164 #define count_leading_zeros(_count, _x) \ 165 __asm__ ("clz %[count],%[x]" \ 166 : [count] "=r" ((word) (_count)) \ 167 : [x] "r" ((word) (_x))) 169 #define count_leading_zeros(_count, _x) \ 170 __asm__ ("dclz %[count],%[x]" \ 171 : [count] "=r" ((word) (_count)) \ 172 : [x] "r" ((word) (_x))) 179 #if defined (count_leading_zeros) 184 count_leading_zeros (n, x);
212 const u64 table = 0x3333333322221104LL;
213 uword t = (table >> (4 *
a)) & 0xf;
214 r = t < 4 ? r + t : ~0;
218 const u32 table = 0x22221104;
219 uword t = (a & 8) ? 3 : ((table >> (4 * a)) & 0xf);
220 r = t < 4 ? r + t : ~0;
231 if (x > ((
uword) 1 << l))
274 return 0 == (x & (x - 1));
280 return (x + pow2 - 1) & ~(pow2 - 1);
286 return (x + pow2 - 1) & ~(pow2 - 1);
299 #ifdef count_trailing_zeros 300 count_trailing_zeros (result, x);
316 return (
word) (x + .5);
325 #define clib_max(x,y) \ 327 __typeof__ (x) _x = (x); \ 328 __typeof__ (y) _y = (y); \ 332 #define clib_min(x,y) \ 334 __typeof__ (x) _x = (x); \ 335 __typeof__ (y) _y = (y); \ 339 #define clib_abs(x) \ 341 __typeof__ (x) _x = (x); \ 347 void clib_standalone_init (
void *
memory,
uword memory_bytes);
350 int (*)(
const void *,
const void *));
static uword log2_first_set(uword x)
add_epi add_epi sub_epi sub_epi adds_epu subs_epu i16x8 y
static uword min_log2(uword x)
vhost_user_memory_t memory
static uword pow2_mask(uword x)
static u64 min_log2_u64(u64 x)
uword clib_backtrace(uword *callers, uword max_callers, uword n_frames_to_skip)
static f64 flt_round_to_multiple(f64 x, f64 f)
static uword max_pow2(uword x)
static u64 round_pow2_u64(u64 x, u64 pow2)
static uword round_pow2(uword x, uword pow2)
static uword first_set(uword x)
static uword is_pow2(uword x)
static word flt_round_nearest(f64 x)
void qsort(void *base, uword n, uword size, int(*compar)(const void *, const void *))
static uword max_log2(uword x)
static f64 flt_round_down(f64 x)