vppinfra: add SSE4.2 version of u8x16_shuffle
[vpp.git] / src / vppinfra / vector_sse42.h
index 053826d..5134855 100644 (file)
@@ -69,8 +69,8 @@ t##s##x##c##_is_all_zero (t##s##x##c x)                                       \
 { return _mm_testz_si128 ((__m128i) x, (__m128i) x); }                 \
 \
 static_always_inline int                                               \
-t##s##x##c##_is_equal (t##s##x##c x, t##s##x##c y)                     \
-{ return _mm_testc_si128 ((__m128i) x, (__m128i) y); }                 \
+t##s##x##c##_is_equal (t##s##x##c a, t##s##x##c b)                     \
+{ return t##s##x##c##_is_all_zero (a ^ b); }                           \
 \
 static_always_inline int                                               \
 t##s##x##c##_is_all_equal (t##s##x##c v, t##s x)                       \
@@ -592,6 +592,27 @@ u8x16_msb_mask (u8x16 v)
 
 #undef _signed_binop
 
+static_always_inline u16x8
+u16x8_byte_swap (u16x8 v)
+{
+  u8x16 swap = {
+    1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14,
+  };
+  return (u16x8) _mm_shuffle_epi8 ((__m128i) v, (__m128i) swap);
+}
+
+static_always_inline u32x4
+u32x4_hadd (u32x4 v1, u32x4 v2)
+{
+  return (u32x4) _mm_hadd_epi32 ((__m128i) v1, (__m128i) v2);
+}
+
+static_always_inline u8x16
+u8x16_shuffle (u8x16 v, u8x16 m)
+{
+  return (u8x16) _mm_shuffle_epi8 ((__m128i) v, (__m128i) m);
+}
+
 #endif /* included_vector_sse2_h */
 
 /*