eal: use pause only with SSE2
authorIntel <intel.com>
Wed, 18 Sep 2013 10:00:00 +0000 (12:00 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Wed, 9 Oct 2013 14:04:09 +0000 (16:04 +0200)
The pause instruction is part of SSE2 extensions.
Note that some compilers define _mm_pause as "rep; nop" instead of "pause".
For compatible processors, they are equivalent.

http://www.intel.com/Assets/PDF/manual/325383.pdf:
"
When executing a spin-wait loop, a Pentium 4 or Intel Xeon processor suffers
a severe performance penalty when exiting the loop because it detects a
possible memory order violation.
The PAUSE instruction provides a hint to the processor that the code sequence
is a spin-wait loop. The processor uses this hint to avoid the memory order
violation in most situations, which greatly improves processor performance.
"

Signed-off-by: Intel
lib/librte_eal/common/include/rte_common.h

index ca7e3aa..236f98a 100644 (file)
@@ -49,7 +49,6 @@ extern "C" {
 #include <stdlib.h>
 #include <ctype.h>
 #include <errno.h>
-#include <emmintrin.h>
 
 /*********** Macros to eliminate unused variable warnings ********/
 
@@ -250,6 +249,8 @@ rte_align32pow2(uint32_t x)
 
 /*********** Other general functions / macros ********/
 
+#ifdef __SSE2__
+#include <emmintrin.h>
 /**
  * PAUSE instruction for tight loops (avoid busy waiting)
  */
@@ -258,6 +259,10 @@ rte_pause (void)
 {
        _mm_pause();
 }
+#else
+static inline void
+rte_pause(void) {}
+#endif
 
 /**
  * Searches the input parameter for the least significant set bit