#ifndef TVV_UTIL_H #define TVV_UTIL_H /* Invariant len is multiple of 64 */ __inline static void* special_memcpy_mmxext(uint8_t *to, const uint8_t *from, size_t len) { int i; len >>= 6; for (i = 0; i < len; i++) { __asm__ __volatile__( " prefetchnta 200(%0)\n" " movq (%0), %%mm0\n" " movq 8(%0), %%mm1\n" " movq 16(%0), %%mm2\n" " movq 24(%0), %%mm3\n" " movq 32(%0), %%mm4\n" " movq 40(%0), %%mm5\n" " movq 48(%0), %%mm6\n" " movq 56(%0), %%mm7\n" " movntq %%mm0, (%1)\n" " movntq %%mm1, 8(%1)\n" " movntq %%mm2, 16(%1)\n" " movntq %%mm3, 24(%1)\n" " movntq %%mm4, 32(%1)\n" " movntq %%mm5, 40(%1)\n" " movntq %%mm6, 48(%1)\n" " movntq %%mm7, 56(%1)\n" :: "r"(from), "r"(to):"memory"); from += 64; to += 64; } return to; } /* Invariant len is multiple of 64 */ static __inline void special_memcpy(uint8_t *to, const uint8_t *from, size_t len) { int i; len >>= 6; for (i = 0; i < len; i++) { __asm__ __volatile__( " movq (%0), %%mm0\n" " movq 8(%0), %%mm1\n" " movq 16(%0), %%mm2\n" " movq 24(%0), %%mm3\n" " movq 32(%0), %%mm4\n" " movq 40(%0), %%mm5\n" " movq 48(%0), %%mm6\n" " movq 56(%0), %%mm7\n" " movq %%mm0, (%1)\n" " movq %%mm1, 8(%1)\n" " movq %%mm2, 16(%1)\n" " movq %%mm3, 24(%1)\n" " movq %%mm4, 32(%1)\n" " movq %%mm5, 40(%1)\n" " movq %%mm6, 48(%1)\n" " movq %%mm7, 56(%1)\n" :: "r"(from), "r"(to):"memory"); from += 64; to += 64; } } #endif