64,650
社区成员
发帖
与我相关
我的任务
分享
void Memory::memcpy(Object dest, Object source, size_t dwsize)
{
if (dwsize < 64)
{
goto next;//小于64字节直接调用库函数拷贝
}
register int byte_copy = (dwsize /64) * 64;//取64的整数倍
__asm//拷贝byte_copy个字节
{
mov esi, source
mov edi, dest
mov ecx, byte_copy
shr ecx, 6
mainloop:
movq mm0, [esi]
movq mm1, 8[esi]
movq mm2, 16[esi]
movq mm3, 24[esi]
movq mm4, 32[esi]
movq mm5, 40[esi]
movq mm6, 48[esi]
movq mm7, 56[esi]
movntq [edi], mm0
movntq 8[edi], mm1
movntq 16[edi], mm2
movntq 24[edi], mm3
movntq 32[edi], mm4
movntq 40[edi], mm5
movntq 48[edi], mm6
movntq 56[edi], mm7
add esi, 64
add edi, 64
dec ecx
jnz mainloop
sfence ; flush write buffer
emms
}
dwsize -= byte_copy;//剩下没有拷贝的不足64的字节数
if (dwsize == 0)//刚好满足64倍数,说明拷贝完了。
{
goto nothing;
}
dest = (char *)dest + byte_copy;
source = (char *)source + byte_copy;
next:
memcpy_inline((char *)dest, (char *)source, dwsize);
nothing:
return;
}