Add support for multiple microarchitectures in single binary
[vpp.git] / vlib / vlib / node.h
index 2caede6..9b33a0a 100644 (file)
@@ -40,6 +40,7 @@
 #ifndef included_vlib_node_h
 #define included_vlib_node_h
 
+#include <vppinfra/cpu.h>
 #include <vppinfra/longjmp.h>
 #include <vppinfra/timing_wheel.h>
 #include <vlib/trace.h>                /* for vlib_trace_filter_t */
@@ -149,6 +150,32 @@ static void __vlib_add_node_registration_##x (void)                     \
 }                                                                       \
 __VA_ARGS__ vlib_node_registration_t x 
 
+#if CLIB_DEBUG > 0
+#define VLIB_NODE_FUNCTION_CLONE_TEMPLATE(arch, fn)
+#define VLIB_NODE_FUNCTION_MULTIARCH_CLONE(fn)
+#define VLIB_NODE_FUNCTION_MULTIARCH(node, fn)
+#else
+#define VLIB_NODE_FUNCTION_CLONE_TEMPLATE(arch, fn, tgt)               \
+  uword                                                                        \
+  __attribute__ ((flatten))                                            \
+  __attribute__ ((target (tgt)))                                       \
+  CLIB_CPU_OPTIMIZED                                                   \
+  fn ## _ ## arch ( struct vlib_main_t * vm,                           \
+                   struct vlib_node_runtime_t * node,                  \
+                   struct vlib_frame_t * frame)                                \
+  { return fn (vm, node, frame); }
+
+#define VLIB_NODE_FUNCTION_MULTIARCH_CLONE(fn)                         \
+  foreach_march_variant(VLIB_NODE_FUNCTION_CLONE_TEMPLATE, fn)
+
+#define VLIB_NODE_FUNCTION_MULTIARCH(node, fn)                         \
+  VLIB_NODE_FUNCTION_MULTIARCH_CLONE(fn)                               \
+  CLIB_MULTIARCH_SELECT_FN(fn, static inline)                          \
+  static void __attribute__((__constructor__))                         \
+  __vlib_node_function_multiarch_select_##node (void)                  \
+  { node.function = fn ## _multiarch_select(); }
+#endif
+
 always_inline vlib_node_registration_t *
 vlib_node_next_registered (vlib_node_registration_t * c)
 {