summaryrefslogtreecommitdiffstats
path: root/vppinfra/vppinfra/memcpy_sse3.h
diff options
context:
space:
mode:
Diffstat (limited to 'vppinfra/vppinfra/memcpy_sse3.h')
-rw-r--r--vppinfra/vppinfra/memcpy_sse3.h250
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:
+ */