eal: introduce ymm type for AVX 256-bit
[dpdk.git] / lib / librte_eal / common / include / rte_common_vect.h
index 95bf4b1..617470b 100644 (file)
 #include <smmintrin.h>
 #endif
 
+#if defined(__AVX__)
+#include <immintrin.h>
+#endif
+
 #else
 
 #include <x86intrin.h>
@@ -70,7 +74,7 @@ typedef __m128i xmm_t;
 #define        XMM_MASK        (XMM_SIZE - 1)
 
 typedef union rte_xmm {
-       xmm_t    m;
+       xmm_t    x;
        uint8_t  u8[XMM_SIZE / sizeof(uint8_t)];
        uint16_t u16[XMM_SIZE / sizeof(uint16_t)];
        uint32_t u32[XMM_SIZE / sizeof(uint32_t)];
@@ -78,10 +82,29 @@ typedef union rte_xmm {
        double   pd[XMM_SIZE / sizeof(double)];
 } rte_xmm_t;
 
+#ifdef __AVX__
+
+typedef __m256i ymm_t;
+
+#define        YMM_SIZE        (sizeof(ymm_t))
+#define        YMM_MASK        (YMM_SIZE - 1)
+
+typedef union rte_ymm {
+       ymm_t    y;
+       xmm_t    x[YMM_SIZE / sizeof(xmm_t)];
+       uint8_t  u8[YMM_SIZE / sizeof(uint8_t)];
+       uint16_t u16[YMM_SIZE / sizeof(uint16_t)];
+       uint32_t u32[YMM_SIZE / sizeof(uint32_t)];
+       uint64_t u64[YMM_SIZE / sizeof(uint64_t)];
+       double   pd[YMM_SIZE / sizeof(double)];
+} rte_ymm_t;
+
+#endif /* __AVX__ */
+
 #ifdef RTE_ARCH_I686
 #define _mm_cvtsi128_si64(a) ({ \
        rte_xmm_t m;            \
-       m.m = (a);              \
+       m.x = (a);              \
        (m.u64[0]);             \
 })
 #endif