X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fvppinfra%2Fclib.h;h=1b6ab4157d7c7552e212b318afca3fe0d155f7c8;hb=e3aeb38fa82b77ae84643f5140d9674056b6b5ca;hp=22377c61440ef5dc309d56f89059101fb67a483e;hpb=7808df2e2fd0fd61a27e5a5322dc6dafe40924e5;p=vpp.git diff --git a/src/vppinfra/clib.h b/src/vppinfra/clib.h index 22377c61440..1b6ab4157d7 100644 --- a/src/vppinfra/clib.h +++ b/src/vppinfra/clib.h @@ -39,7 +39,10 @@ #define included_clib_h #include + +#if __has_include() #include +#endif #ifdef __x86_64__ #include @@ -97,6 +100,11 @@ #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)) @@ -120,10 +128,18 @@ /* 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 */ @@ -158,6 +174,16 @@ #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 #endif /* included_clib_h */ /*