vppinfra: add 128-bit and 512-bit a ^ b ^ c shortcut
[vpp.git] / src / vppinfra / vector_sse42.h
index a2d737a..e75580e 100644 (file)
@@ -617,6 +617,15 @@ u8x16_msb_mask (u8x16 v)
 
 #undef _signed_binop
 
+static_always_inline u32x4
+u32x4_byte_swap (u32x4 v)
+{
+  u8x16 swap = {
+    3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12
+  };
+  return (u32x4) _mm_shuffle_epi8 ((__m128i) v, (__m128i) swap);
+}
+
 static_always_inline u16x8
 u16x8_byte_swap (u16x8 v)
 {
@@ -626,6 +635,15 @@ u16x8_byte_swap (u16x8 v)
   return (u16x8) _mm_shuffle_epi8 ((__m128i) v, (__m128i) swap);
 }
 
+static_always_inline u8x16
+u8x16_reflect (u8x16 v)
+{
+  u8x16 mask = {
+    15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
+  };
+  return (u8x16) _mm_shuffle_epi8 ((__m128i) v, (__m128i) mask);
+}
+
 static_always_inline u32x4
 u32x4_hadd (u32x4 v1, u32x4 v2)
 {
@@ -728,6 +746,15 @@ u8x16_blend (u8x16 v1, u8x16 v2, u8x16 mask)
   return (u8x16) _mm_blendv_epi8 ((__m128i) v1, (__m128i) v2, (__m128i) mask);
 }
 
+static_always_inline u8x16
+u8x16_xor3 (u8x16 a, u8x16 b, u8x16 c)
+{
+#if __AVX512F__
+  return (u8x16) _mm_ternarylogic_epi32 ((__m128i) a, (__m128i) b,
+                                        (__m128i) c, 0x96);
+#endif
+  return a ^ b ^ c;
+}
 
 #endif /* included_vector_sse2_h */