感谢William Chan和Google。在Microsoft Visual Studio 2005中比memcpy快30-70%。
void X_aligned_memcpy_sse2(void* dest, const void* src, const unsigned long size)
{
__asm
{
mov esi, src
mov edi, dest
mov ebx, size
shr ebx, 7
loop_copy:
prefetchnta 128[ESI]
prefetchnta 160[ESI]
prefetchnta 192[ESI]
prefetchnta 224[ESI]
movdqa xmm0, 0[ESI]
movdqa xmm1, 16[ESI]
movdqa xmm2, 32[ESI]
movdqa xmm3, 48[ESI]
movdqa xmm4, 64[ESI]
movdqa xmm5, 80[ESI]
movdqa xmm6, 96[ESI]
movdqa xmm7, 112[ESI]
movntdq 0[EDI], xmm0
movntdq 16[EDI], xmm1
movntdq 32[EDI], xmm2
movntdq 48[EDI], xmm3
movntdq 64[EDI], xmm4
movntdq 80[EDI], xmm5
movntdq 96[EDI], xmm6
movntdq 112[EDI], xmm7
add esi, 128
add edi, 128
dec ebx
jnz loop_copy
loop_copy_end:
}
}
根据您的具体情况和您能够做出的任何假设,您可能能够进一步优化它。
您还可以查看memcpy源代码(memcpy.asm)并剥离其特殊情况处理。这可能有进一步的优化空间!