X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fclib.h;h=4629a7defb8e8b7e5af85bb57aefbcd334b4b819;hb=b14c49d2275f6348640572b7b481dad43f3a00d0;hp=9474350c6da198b6c20265958d8483e857ec7507;hpb=dae1c7ed38e9f7a86e66f3674de62778cc981331;p=vpp.git diff --git a/src/vppinfra/clib.h b/src/vppinfra/clib.h index 9474350c6da..4629a7defb8 100644 --- a/src/vppinfra/clib.h +++ b/src/vppinfra/clib.h @@ -120,6 +120,7 @@ /* 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) /* * Compiler barrier @@ -158,6 +159,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) { @@ -332,6 +343,14 @@ extract_bits (uword x, int start, int count) _x < _y ? _x : _y; \ }) +#define clib_clamp(x,lo,hi) \ +({ \ + __typeof__ (x) _x = (x); \ + __typeof__ (lo) _lo = (lo); \ + __typeof__ (hi) _hi = (hi); \ + _x < _lo ? _lo : (_x > _hi ? _hi : _x); \ +}) + #define clib_abs(x) \ ({ \ __typeof__ (x) _x = (x); \