vppinfra: use unaligned non-vector load/stores in x86 memcpy
[vpp.git] / src / vppinfra / memcpy_avx2.h
index caff4f6..ac29d25 100644 (file)
 
 #include <stdint.h>
 #include <x86intrin.h>
+#include <vppinfra/warnings.h>
+
+/* *INDENT-OFF* */
+WARN_OFF (stringop-overflow)
+/* *INDENT-ON* */
 
 static inline void
 clib_mov16 (u8 * dst, const u8 * src)
@@ -109,7 +114,7 @@ clib_mov128blocks (u8 * dst, const u8 * src, size_t n)
 }
 
 static inline void *
-clib_memcpy_fast (void *dst, const void *src, size_t n)
+clib_memcpy_fast_avx2 (void *dst, const void *src, size_t n)
 {
   uword dstu = (uword) dst;
   uword srcu = (uword) src;
@@ -130,19 +135,19 @@ clib_memcpy_fast (void *dst, const void *src, size_t n)
        }
       if (n & 0x02)
        {
-         *(u16 *) dstu = *(const u16 *) srcu;
-         srcu = (uword) ((const u16 *) srcu + 1);
-         dstu = (uword) ((u16 *) dstu + 1);
+         *(u16u *) dstu = *(const u16u *) srcu;
+         srcu = (uword) ((const u16u *) srcu + 1);
+         dstu = (uword) ((u16u *) dstu + 1);
        }
       if (n & 0x04)
        {
-         *(u32 *) dstu = *(const u32 *) srcu;
-         srcu = (uword) ((const u32 *) srcu + 1);
-         dstu = (uword) ((u32 *) dstu + 1);
+         *(u32u *) dstu = *(const u32u *) srcu;
+         srcu = (uword) ((const u32u *) srcu + 1);
+         dstu = (uword) ((u32u *) dstu + 1);
        }
       if (n & 0x08)
        {
-         *(u64 *) dstu = *(const u64 *) srcu;
+         *(u64u *) dstu = *(const u64u *) srcu;
        }
       return ret;
     }
@@ -228,6 +233,9 @@ clib_memcpy_fast (void *dst, const void *src, size_t n)
   goto COPY_BLOCK_128_BACK31;
 }
 
+/* *INDENT-OFF* */
+WARN_ON (stringop-overflow)
+/* *INDENT-ON* */
 
 #endif /* included_clib_memcpy_avx2_h */