-/* Aligned copy routine. */
-void
-vlib_aligned_memcpy (void *_dst, void *_src, int n_bytes)
-{
- vlib_copy_unit_t *dst = _dst;
- vlib_copy_unit_t *src = _src;
-
- /* Arguments must be naturally aligned. */
- ASSERT (pointer_to_uword (dst) % sizeof (dst[0]) == 0);
- ASSERT (pointer_to_uword (src) % sizeof (src[0]) == 0);
- ASSERT (n_bytes % sizeof (dst[0]) == 0);
-
- if (4 * sizeof (dst[0]) == CLIB_CACHE_LINE_BYTES)
- {
- CLIB_PREFETCH (dst + 0, 4 * sizeof (dst[0]), WRITE);
- CLIB_PREFETCH (src + 0, 4 * sizeof (src[0]), READ);
-
- while (n_bytes >= 4 * sizeof (dst[0]))
- {
- dst += 4;
- src += 4;
- n_bytes -= 4 * sizeof (dst[0]);
- CLIB_PREFETCH (dst, 4 * sizeof (dst[0]), WRITE);
- CLIB_PREFETCH (src, 4 * sizeof (src[0]), READ);
- dst[-4] = src[-4];
- dst[-3] = src[-3];
- dst[-2] = src[-2];
- dst[-1] = src[-1];
- }
- }
- else if (8 * sizeof (dst[0]) == CLIB_CACHE_LINE_BYTES)
- {
- CLIB_PREFETCH (dst + 0, 8 * sizeof (dst[0]), WRITE);
- CLIB_PREFETCH (src + 0, 8 * sizeof (src[0]), READ);
-
- while (n_bytes >= 8 * sizeof (dst[0]))
- {
- dst += 8;
- src += 8;
- n_bytes -= 8 * sizeof (dst[0]);
- CLIB_PREFETCH (dst, 8 * sizeof (dst[0]), WRITE);
- CLIB_PREFETCH (src, 8 * sizeof (src[0]), READ);
- dst[-8] = src[-8];
- dst[-7] = src[-7];
- dst[-6] = src[-6];
- dst[-5] = src[-5];
- dst[-4] = src[-4];
- dst[-3] = src[-3];
- dst[-2] = src[-2];
- dst[-1] = src[-1];
- }
- }
- else
- /* Cache line size unknown: fall back to slow version. */ ;
-
- while (n_bytes > 0)
- {
- *dst++ = *src++;
- n_bytes -= 1 * sizeof (dst[0]);
- }
-}