From 21b4e337b67c8de9f1b7f59a86f1ec4e5f02372b Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Tue, 12 Oct 2021 15:34:31 +0200 Subject: vppinfra: use unaligned non-vector load/stores in x86 memcpy Type: fix Change-Id: I54ef23a52f05cc95210a736f84b927dd69b8a6f7 Signed-off-by: Damjan Marion --- src/vppinfra/memcpy_avx2.h | 14 +++++++------- src/vppinfra/memcpy_avx512.h | 14 +++++++------- src/vppinfra/memcpy_sse3.h | 14 +++++++------- src/vppinfra/types.h | 7 +++++++ 4 files changed, 28 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/vppinfra/memcpy_avx2.h b/src/vppinfra/memcpy_avx2.h index f7a36f0e5cb..ac29d2590a7 100644 --- a/src/vppinfra/memcpy_avx2.h +++ b/src/vppinfra/memcpy_avx2.h @@ -135,19 +135,19 @@ clib_memcpy_fast_avx2 (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; } diff --git a/src/vppinfra/memcpy_avx512.h b/src/vppinfra/memcpy_avx512.h index 98dac75beac..2025070272e 100644 --- a/src/vppinfra/memcpy_avx512.h +++ b/src/vppinfra/memcpy_avx512.h @@ -165,18 +165,18 @@ clib_memcpy_fast_avx512 (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; } diff --git a/src/vppinfra/memcpy_sse3.h b/src/vppinfra/memcpy_sse3.h index aea2005d95a..2ad3648a52a 100644 --- a/src/vppinfra/memcpy_sse3.h +++ b/src/vppinfra/memcpy_sse3.h @@ -210,19 +210,19 @@ clib_memcpy_fast_sse3 (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; } diff --git a/src/vppinfra/types.h b/src/vppinfra/types.h index c5e7f09ef23..b52d6034ae9 100644 --- a/src/vppinfra/types.h +++ b/src/vppinfra/types.h @@ -163,6 +163,13 @@ typedef f64 fword; __attribute__ ((aligned (align), packed)); \ } *) (addr))->_data) +typedef u16 u16u __attribute__ ((aligned (1))); +typedef u32 u32u __attribute__ ((aligned (1))); +typedef u64 u64u __attribute__ ((aligned (1))); +typedef i16 i16u __attribute__ ((aligned (1))); +typedef i32 i32u __attribute__ ((aligned (1))); +typedef i64 i64u __attribute__ ((aligned (1))); + #endif /* included_clib_types_h */ /* -- cgit 1.2.3-korg