fib: Refetech the adj after the walk in case the pool realloc'd
[vpp.git] / src / vppinfra / clib.h
index 22377c6..1b6ab41 100644 (file)
 #define included_clib_h
 
 #include <stddef.h>
+
+#if __has_include(<vppinfra/config.h>)
 #include <vppinfra/config.h>
+#endif
 
 #ifdef  __x86_64__
 #include <x86intrin.h>
 #define __clib_packed __attribute__ ((packed))
 #define __clib_constructor __attribute__ ((constructor))
 #define __clib_noinline __attribute__ ((noinline))
+#ifdef __clang__
+#define __clib_noclone
+#else
+#define __clib_noclone           __attribute__ ((noclone))
+#endif
 #define __clib_aligned(x) __attribute__ ((aligned(x)))
 #define __clib_section(s) __attribute__ ((section(s)))
 #define __clib_warn_unused_result __attribute__ ((warn_unused_result))
 /* Hints to compiler about hot/cold code. */
 #define PREDICT_FALSE(x) __builtin_expect((x),0)
 #define PREDICT_TRUE(x) __builtin_expect((x),1)
+#define COMPILE_TIME_CONST(x) __builtin_constant_p (x)
+#define CLIB_ASSUME(x)                                                        \
+  do                                                                          \
+    {                                                                         \
+      if (!(x))                                                               \
+       __builtin_unreachable ();                                             \
+    }                                                                         \
+  while (0)
 
 /*
  * Compiler barrier
- *   prevent compiler to reorder memory access accross this boundary
+ *   prevent compiler to reorder memory access across this boundary
  *   prevent compiler to cache values in register (force reload)
  * Not to be confused with CPU memory barrier below
  */
 #endif
 
 #if defined (count_leading_zeros)
+always_inline uword
+clear_lowest_set_bit (uword x)
+{
+#ifdef __BMI2__
+  return _blsr_u64 (x);
+#else
+  return x ^ (1ULL << count_trailing_zeros (x));
+#endif
+}
+
 always_inline uword
 min_log2 (uword x)
 {
@@ -237,6 +263,9 @@ min_log2_u64 (u64 x)
 always_inline uword
 pow2_mask (uword x)
 {
+#ifdef __BMI2__
+  return _bzhi_u64 (-1ULL, x);
+#endif
   return ((uword) 1 << x) - (uword) 1;
 }
 
@@ -358,6 +387,7 @@ void qsort (void *base, uword n, uword size,
 uword
 clib_backtrace (uword * callers, uword max_callers, uword n_frames_to_skip);
 
+#include <vppinfra/byte_order.h>
 #endif /* included_clib_h */
 
 /*