diff options
Diffstat (limited to 'vppinfra/vppinfra/memcpy_sse3.h')
-rw-r--r-- | vppinfra/vppinfra/memcpy_sse3.h | 250 |
1 files changed, 138 insertions, 112 deletions
diff --git a/vppinfra/vppinfra/memcpy_sse3.h b/vppinfra/vppinfra/memcpy_sse3.h index 12748f78b48..f61396c8922 100644 --- a/vppinfra/vppinfra/memcpy_sse3.h +++ b/vppinfra/vppinfra/memcpy_sse3.h @@ -52,40 +52,40 @@ #include <x86intrin.h> static inline void -clib_mov16(u8 *dst, const u8 *src) +clib_mov16 (u8 * dst, const u8 * src) { - __m128i xmm0; + __m128i xmm0; - xmm0 = _mm_loadu_si128((const __m128i *)src); - _mm_storeu_si128((__m128i *)dst, xmm0); + xmm0 = _mm_loadu_si128 ((const __m128i *) src); + _mm_storeu_si128 ((__m128i *) dst, xmm0); } static inline void -clib_mov32(u8 *dst, const u8 *src) +clib_mov32 (u8 * dst, const u8 * src) { - clib_mov16((u8 *)dst + 0 * 16, (const u8 *)src + 0 * 16); - clib_mov16((u8 *)dst + 1 * 16, (const u8 *)src + 1 * 16); + 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 -clib_mov64(u8 *dst, const u8 *src) +clib_mov64 (u8 * dst, const u8 * src) { - clib_mov32((u8 *)dst + 0 * 32, (const u8 *)src + 0 * 32); - clib_mov32((u8 *)dst + 1 * 32, (const u8 *)src + 1 * 32); + clib_mov32 ((u8 *) dst + 0 * 32, (const u8 *) src + 0 * 32); + clib_mov32 ((u8 *) dst + 1 * 32, (const u8 *) src + 1 * 32); } static inline void -clib_mov128(u8 *dst, const u8 *src) +clib_mov128 (u8 * dst, const u8 * src) { - clib_mov64((u8 *)dst + 0 * 64, (const u8 *)src + 0 * 64); - clib_mov64((u8 *)dst + 1 * 64, (const u8 *)src + 1 * 64); + clib_mov64 ((u8 *) dst + 0 * 64, (const u8 *) src + 0 * 64); + clib_mov64 ((u8 *) dst + 1 * 64, (const u8 *) src + 1 * 64); } static inline void -clib_mov256(u8 *dst, const u8 *src) +clib_mov256 (u8 * dst, const u8 * src) { - clib_mov128((u8 *)dst + 0 * 128, (const u8 *)src + 0 * 128); - clib_mov128((u8 *)dst + 1 * 128, (const u8 *)src + 1 * 128); + clib_mov128 ((u8 *) dst + 0 * 128, (const u8 *) src + 0 * 128); + clib_mov128 ((u8 *) dst + 1 * 128, (const u8 *) src + 1 * 128); } /** @@ -183,101 +183,117 @@ clib_mov256(u8 *dst, const u8 *src) }) static inline void * -clib_memcpy(void *dst, const void *src, size_t n) +clib_memcpy (void *dst, const void *src, size_t n) { - __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8; - uword dstu = (uword)dst; - uword srcu = (uword)src; - void *ret = dst; - size_t dstofss; - size_t srcofs; + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8; + uword dstu = (uword) dst; + uword srcu = (uword) src; + void *ret = dst; + size_t dstofss; + size_t srcofs; /** * Copy less than 16 bytes */ - if (n < 16) { - if (n & 0x01) { - *(u8 *)dstu = *(const u8 *)srcu; - srcu = (uword)((const u8 *)srcu + 1); - dstu = (uword)((u8 *)dstu + 1); - } - if (n & 0x02) { - *(u16 *)dstu = *(const u16 *)srcu; - srcu = (uword)((const u16 *)srcu + 1); - dstu = (uword)((u16 *)dstu + 1); - } - if (n & 0x04) { - *(u32 *)dstu = *(const u32 *)srcu; - srcu = (uword)((const u32 *)srcu + 1); - dstu = (uword)((u32 *)dstu + 1); - } - if (n & 0x08) { - *(u64 *)dstu = *(const u64 *)srcu; - } - return ret; + if (n < 16) + { + if (n & 0x01) + { + *(u8 *) dstu = *(const u8 *) srcu; + srcu = (uword) ((const u8 *) srcu + 1); + dstu = (uword) ((u8 *) dstu + 1); } + if (n & 0x02) + { + *(u16 *) dstu = *(const u16 *) srcu; + srcu = (uword) ((const u16 *) srcu + 1); + dstu = (uword) ((u16 *) dstu + 1); + } + if (n & 0x04) + { + *(u32 *) dstu = *(const u32 *) srcu; + srcu = (uword) ((const u32 *) srcu + 1); + dstu = (uword) ((u32 *) dstu + 1); + } + if (n & 0x08) + { + *(u64 *) dstu = *(const u64 *) srcu; + } + return ret; + } /** * Fast way when copy size doesn't exceed 512 bytes */ - if (n <= 32) { - clib_mov16((u8 *)dst, (const u8 *)src); - clib_mov16((u8 *)dst - 16 + n, (const u8 *)src - 16 + n); - return ret; + if (n <= 32) + { + clib_mov16 ((u8 *) dst, (const u8 *) src); + clib_mov16 ((u8 *) dst - 16 + n, (const u8 *) src - 16 + n); + return ret; + } + if (n <= 48) + { + clib_mov32 ((u8 *) dst, (const u8 *) src); + clib_mov16 ((u8 *) dst - 16 + n, (const u8 *) src - 16 + n); + return ret; + } + if (n <= 64) + { + clib_mov32 ((u8 *) dst, (const u8 *) src); + clib_mov16 ((u8 *) dst + 32, (const u8 *) src + 32); + clib_mov16 ((u8 *) dst - 16 + n, (const u8 *) src - 16 + n); + return ret; + } + if (n <= 128) + { + goto COPY_BLOCK_128_BACK15; + } + if (n <= 512) + { + if (n >= 256) + { + n -= 256; + clib_mov128 ((u8 *) dst, (const u8 *) src); + clib_mov128 ((u8 *) dst + 128, (const u8 *) src + 128); + src = (const u8 *) src + 256; + dst = (u8 *) dst + 256; } - if (n <= 48) { - clib_mov32((u8 *)dst, (const u8 *)src); - clib_mov16((u8 *)dst - 16 + n, (const u8 *)src - 16 + n); - return ret; + COPY_BLOCK_255_BACK15: + if (n >= 128) + { + n -= 128; + clib_mov128 ((u8 *) dst, (const u8 *) src); + src = (const u8 *) src + 128; + dst = (u8 *) dst + 128; } - if (n <= 64) { - clib_mov32((u8 *)dst, (const u8 *)src); - clib_mov16((u8 *)dst + 32, (const u8 *)src + 32); - clib_mov16((u8 *)dst - 16 + n, (const u8 *)src - 16 + n); - return ret; + COPY_BLOCK_128_BACK15: + if (n >= 64) + { + n -= 64; + clib_mov64 ((u8 *) dst, (const u8 *) src); + src = (const u8 *) src + 64; + dst = (u8 *) dst + 64; } - if (n <= 128) { - goto COPY_BLOCK_128_BACK15; + COPY_BLOCK_64_BACK15: + if (n >= 32) + { + n -= 32; + clib_mov32 ((u8 *) dst, (const u8 *) src); + src = (const u8 *) src + 32; + dst = (u8 *) dst + 32; } - if (n <= 512) { - if (n >= 256) { - n -= 256; - clib_mov128((u8 *)dst, (const u8 *)src); - clib_mov128((u8 *)dst + 128, (const u8 *)src + 128); - src = (const u8 *)src + 256; - dst = (u8 *)dst + 256; - } -COPY_BLOCK_255_BACK15: - if (n >= 128) { - n -= 128; - clib_mov128((u8 *)dst, (const u8 *)src); - src = (const u8 *)src + 128; - dst = (u8 *)dst + 128; - } -COPY_BLOCK_128_BACK15: - if (n >= 64) { - n -= 64; - clib_mov64((u8 *)dst, (const u8 *)src); - src = (const u8 *)src + 64; - dst = (u8 *)dst + 64; - } -COPY_BLOCK_64_BACK15: - if (n >= 32) { - n -= 32; - clib_mov32((u8 *)dst, (const u8 *)src); - src = (const u8 *)src + 32; - dst = (u8 *)dst + 32; - } - if (n > 16) { - clib_mov16((u8 *)dst, (const u8 *)src); - clib_mov16((u8 *)dst - 16 + n, (const u8 *)src - 16 + n); - return ret; - } - if (n > 0) { - clib_mov16((u8 *)dst - 16 + n, (const u8 *)src - 16 + n); - } - return ret; + if (n > 16) + { + clib_mov16 ((u8 *) dst, (const u8 *) src); + clib_mov16 ((u8 *) dst - 16 + n, (const u8 *) src - 16 + n); + return ret; } + if (n > 0) + { + clib_mov16 ((u8 *) dst - 16 + n, (const u8 *) src - 16 + n); + } + return ret; + } /** * Make store aligned when copy size exceeds 512 bytes, @@ -285,41 +301,43 @@ COPY_BLOCK_64_BACK15: * unaligned copy functions require up to 15 bytes * backwards access. */ - dstofss = 16 - ((uword)dst & 0x0F) + 16; - n -= dstofss; - clib_mov32((u8 *)dst, (const u8 *)src); - src = (const u8 *)src + dstofss; - dst = (u8 *)dst + dstofss; - srcofs = ((uword)src & 0x0F); + dstofss = 16 - ((uword) dst & 0x0F) + 16; + n -= dstofss; + clib_mov32 ((u8 *) dst, (const u8 *) src); + src = (const u8 *) src + dstofss; + dst = (u8 *) dst + dstofss; + srcofs = ((uword) src & 0x0F); /** * For aligned copy */ - if (srcofs == 0) { + if (srcofs == 0) + { /** * Copy 256-byte blocks */ - for (; n >= 256; n -= 256) { - clib_mov256((u8 *)dst, (const u8 *)src); - dst = (u8 *)dst + 256; - src = (const u8 *)src + 256; - } + for (; n >= 256; n -= 256) + { + clib_mov256 ((u8 *) dst, (const u8 *) src); + dst = (u8 *) dst + 256; + src = (const u8 *) src + 256; + } /** * Copy whatever left */ - goto COPY_BLOCK_255_BACK15; - } + goto COPY_BLOCK_255_BACK15; + } /** * For copy with unaligned load */ - CLIB_MVUNALIGN_LEFT47(dst, src, n, srcofs); + CLIB_MVUNALIGN_LEFT47 (dst, src, n, srcofs); /** * Copy whatever left */ - goto COPY_BLOCK_64_BACK15; + goto COPY_BLOCK_64_BACK15; } @@ -328,3 +346,11 @@ COPY_BLOCK_64_BACK15: #endif /* included_clib_memcpy_sse3_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ |