eal: new common macros added
authorBruce Richardson <bruce.richardson@intel.com>
Tue, 11 Feb 2014 10:08:43 +0000 (10:08 +0000)
committerDavid Marchand <david.marchand@6wind.com>
Tue, 25 Feb 2014 20:29:18 +0000 (21:29 +0100)
Added the following new macros/inline functions, which are both
generally useful and needed for later functionality:
* rte_align64pow2: aligns a 64bit parameter to next power of 2
* RTE_LEN2MASK: create mask of type <tp> with the first <ln> bits
* RTE_DIM: return the number of elements in an array.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
lib/librte_eal/common/include/rte_common.h

index 2d0c794..0cf328e 100644 (file)
@@ -49,6 +49,7 @@ extern "C" {
 #include <stdlib.h>
 #include <ctype.h>
 #include <errno.h>
+#include <limits.h>
 
 /*********** Macros to eliminate unused variable warnings ********/
 
@@ -68,7 +69,7 @@ extern "C" {
 /**
  * add a byte-value offset from a pointer
  */
-#define RTE_PTR_ADD(ptr, x) ((typeof(ptr))((uintptr_t)ptr + (x)))
+#define RTE_PTR_ADD(ptr, x) ((typeof(ptr))((uintptr_t)(ptr) + (x)))
 
 /**
  * subtract a byte-value offset from a pointer
@@ -227,6 +228,29 @@ rte_align32pow2(uint32_t x)
        return x + 1;
 }
 
+/**
+ * Aligns 64b input parameter to the next power of 2
+ *
+ * @param x
+ *   The 64b value to algin
+ *
+ * @return
+ *   Input parameter aligned to the next power of 2
+ */
+static inline uint64_t
+rte_align64pow2(uint64_t v)
+{
+       v--;
+       v |= v >> 1;
+       v |= v >> 2;
+       v |= v >> 4;
+       v |= v >> 8;
+       v |= v >> 16;
+       v |= v >> 32;
+
+       return v + 1;
+}
+
 /*********** Macros for calculating min and max **********/
 
 /**
@@ -290,6 +314,13 @@ rte_bsf32(uint32_t v)
 /** Take a macro value and get a string version of it */
 #define RTE_STR(x) _RTE_STR(x)
 
+/** Mask value of type <tp> for the first <ln> bit set. */
+#define        RTE_LEN2MASK(ln, tp)    \
+       ((tp)((uint64_t)-1 >> (sizeof(uint64_t) * CHAR_BIT - (ln))))
+
+/** Number of elements in the array. */
+#define        RTE_DIM(a)      (sizeof (a) / sizeof ((a)[0]))
+
 /**
  * Converts a numeric string to the equivalent uint64_t value.
  * As well as straight number conversion, also recognises the suffixes