vppinfra: revert clib_memcpy optimization 28/7428/2
authorDamjan Marion <damarion@cisco.com>
Wed, 5 Jul 2017 16:15:08 +0000 (18:15 +0200)
committerJohn Lo <loj@cisco.com>
Thu, 6 Jul 2017 13:25:46 +0000 (13:25 +0000)
Looks like some compiler versions are producing wrong code when we are
copying 9-16 bytes so reverting back to the original code.

Change-Id: I74b5fa54a3b01f6288648f1cb0926030edd3b26f
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/vppinfra/memcpy_avx.h
src/vppinfra/memcpy_sse3.h

index e3feb76..e987d04 100644 (file)
 #include <stdint.h>
 #include <x86intrin.h>
 
-typedef u8 u8x16u __attribute__ ((vector_size (16), aligned (1)));
-typedef u8 u8x32u __attribute__ ((vector_size (32), aligned (1)));
-
 static inline void
 clib_mov16 (u8 * dst, const u8 * src)
 {
-  *(u8x16u *) dst = *(u8x16u *) src;
+  __m128i xmm0;
+
+  xmm0 = _mm_loadu_si128 ((const __m128i *) src);
+  _mm_storeu_si128 ((__m128i *) dst, xmm0);
 }
 
 static inline void
 clib_mov32 (u8 * dst, const u8 * src)
 {
-  *(u8x32u *) dst = *(u8x32u *) src;
+  __m256i ymm0;
+
+  ymm0 = _mm256_loadu_si256 ((const __m256i *) src);
+  _mm256_storeu_si256 ((__m256i *) dst, ymm0);
 }
 
 static inline void
index 4fc48c8..f61396c 100644 (file)
 #include <stdint.h>
 #include <x86intrin.h>
 
-typedef u8 u8x16u __attribute__ ((vector_size (16), aligned (1)));
-typedef u8 u8x32u __attribute__ ((vector_size (32), aligned (1)));
-
 static inline void
 clib_mov16 (u8 * dst, const u8 * src)
 {
-  *(u8x16u *) dst = *(u8x16u *) src;
+  __m128i xmm0;
+
+  xmm0 = _mm_loadu_si128 ((const __m128i *) src);
+  _mm_storeu_si128 ((__m128i *) dst, xmm0);
 }
 
 static inline void
 clib_mov32 (u8 * dst, const u8 * src)
 {
-  *(u8x32u *) dst = *(u8x32u *) src;
+  clib_mov16 ((u8 *) dst + 0 * 16, (const u8 *) src + 0 * 16);
+  clib_mov16 ((u8 *) dst + 1 * 16, (const u8 *) src + 1 * 16);
 }
 
 static inline void