X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fclib.h;h=bdea43b3fe08b17d4b75f71cd1a7c5696b7ce008;hb=a66971f980187efd03a84d340b80a7d3cf39deac;hp=33db3b203f91a62be70af1347bc89c9d714cbac6;hpb=04f3db3847d242857b9d9d858bcdca538a1be7d7;p=vpp.git diff --git a/src/vppinfra/clib.h b/src/vppinfra/clib.h index 33db3b203f9..bdea43b3fe0 100644 --- a/src/vppinfra/clib.h +++ b/src/vppinfra/clib.h @@ -38,12 +38,19 @@ #ifndef included_clib_h #define included_clib_h +#include + +#ifdef __x86_64__ +#include +#endif + /* Standalone means to not assume we are running on a Unix box. */ #if ! defined (CLIB_STANDALONE) && ! defined (CLIB_LINUX_KERNEL) #define CLIB_UNIX #endif #include +#include /* Global DEBUG flag. Setting this to 1 or 0 turns off ASSERT (see vppinfra/error.h) & other debugging code. */ @@ -78,6 +85,12 @@ #define CLIB_PACKED(x) x __attribute__ ((packed)) #define CLIB_UNUSED(x) x __attribute__ ((unused)) +/* similar to CLIB_CACHE_LINE_ALIGN_MARK() but with arbitrary alignment */ +#define CLIB_ALIGN_MARK(name, alignment) u8 name[0] __attribute__((aligned(alignment))) + +/* Make a string from the macro's argument */ +#define CLIB_STRING_MACRO(x) #x + #define __clib_unused __attribute__ ((unused)) #define __clib_weak __attribute__ ((weak)) #define __clib_packed __attribute__ ((packed)) @@ -102,6 +115,14 @@ #define PREDICT_FALSE(x) __builtin_expect((x),0) #define PREDICT_TRUE(x) __builtin_expect((x),1) +/* + * Compiler barrier + * prevent compiler to reorder memory access accross this boundary + * prevent compiler to cache values in register (force reload) + * Not to be confused with CPU memory barrier below + */ +#define CLIB_COMPILER_BARRIER() asm volatile ("":::"memory") + /* Full memory barrier (read and write). */ #define CLIB_MEMORY_BARRIER() __sync_synchronize () @@ -122,71 +143,20 @@ decl /* Use __builtin_clz if available. */ -#ifdef __GNUC__ -#include -#if __GNUC_PREREQ(3, 4) #if uword_bits == 64 -#define count_leading_zeros(count,x) count = __builtin_clzll (x) -#define count_trailing_zeros(count,x) count = __builtin_ctzll (x) -#else -#define count_leading_zeros(count,x) count = __builtin_clzl (x) -#define count_trailing_zeros(count,x) count = __builtin_ctzl (x) -#endif -#endif -#endif - -#ifndef count_leading_zeros - -/* Misc. integer arithmetic functions. */ -#if defined (i386) -#define count_leading_zeros(count, x) \ - do { \ - word _clz; \ - __asm__ ("bsrl %1,%0" \ - : "=r" (_clz) : "rm" ((word) (x)));\ - (count) = _clz ^ 31; \ - } while (0) - -#define count_trailing_zeros(count, x) \ - __asm__ ("bsfl %1,%0" : "=r" (count) : "rm" ((word)(x))) -#endif /* i386 */ - -#if defined (__alpha__) && defined (HAVE_CIX) -#define count_leading_zeros(count, x) \ - __asm__ ("ctlz %1,%0" \ - : "=r" ((word) (count)) \ - : "r" ((word) (x))) -#define count_trailing_zeros(count, x) \ - __asm__ ("cttz %1,%0" \ - : "=r" ((word) (count)) \ - : "r" ((word) (x))) -#endif /* alpha && HAVE_CIX */ - -#if __mips >= 4 - -/* Select between 32/64 opcodes. */ -#if uword_bits == 32 -#define count_leading_zeros(_count, _x) \ - __asm__ ("clz %[count],%[x]" \ - : [count] "=r" ((word) (_count)) \ - : [x] "r" ((word) (_x))) +#define count_leading_zeros(x) __builtin_clzll (x) +#define count_trailing_zeros(x) __builtin_ctzll (x) #else -#define count_leading_zeros(_count, _x) \ - __asm__ ("dclz %[count],%[x]" \ - : [count] "=r" ((word) (_count)) \ - : [x] "r" ((word) (_x))) +#define count_leading_zeros(x) __builtin_clzl (x) +#define count_trailing_zeros(x) __builtin_ctzl (x) #endif -#endif /* __mips >= 4 */ - -#endif /* count_leading_zeros */ - #if defined (count_leading_zeros) always_inline uword min_log2 (uword x) { uword n; - count_leading_zeros (n, x); + n = count_leading_zeros (x); return BITS (uword) - n - 1; } #else @@ -302,7 +272,7 @@ log2_first_set (uword x) { uword result; #ifdef count_trailing_zeros - count_trailing_zeros (result, x); + result = count_trailing_zeros (x); #else result = min_log2 (first_set (x)); #endif @@ -327,6 +297,15 @@ flt_round_to_multiple (f64 x, f64 f) return f * flt_round_nearest (x / f); } +always_inline uword +extract_bits (uword x, int start, int count) +{ +#ifdef __BMI__ + return _bextr_u64 (x, start, count); +#endif + return (x >> start) & pow2_mask (count); +} + #define clib_max(x,y) \ ({ \ __typeof__ (x) _x = (x); \