📄 qmemcpy.cpp
字号:
#define MMXFUNC_API _declspec(dllexport)
#include "mmxfunc.h"
#include "memory.h"
//用MMX指令实现的内存拷贝函数,相比于memcpy函数可以提高50%的效率
void qmemcpy(void *dst, void *src, int nBytes)
{
#define CACHEBLOCK 1024 //一个块中有多少QWORDs
#define SIZEOFQWORD 8 //一个QWORD几个字节
//修改此值有可能实现更高的速度
int nQWORDs = nBytes/SIZEOFQWORD;
int n=((int)(nQWORDs/CACHEBLOCK))*CACHEBLOCK;
int m= nBytes - n*SIZEOFQWORD; //还剩下多少个Bytes
if (n)
{
_asm //下面先拷贝整数个块
{
mov esi, src
mov edi, dst
mov ecx, n//要拷贝多少个块
lea esi, [esi+ecx*8]
lea edi, [edi+ecx*8]
neg ecx
mainloop:
mov eax, CACHEBLOCK/16
prefetchloop:
mov ebx, [esi+ecx*8] //预读此循环
mov ebx, [esi+ecx*8+64] //预读下循环
add ecx, 16
dec eax
jnz prefetchloop
sub ecx, CACHEBLOCK
mov eax, CACHEBLOCK/8
writeloop:
movq mm0, qword ptr[esi+ecx*8]
movq mm1, qword ptr[esi+ecx*8+8]
movq mm2, qword ptr[esi+ecx*8+16]
movq mm3, qword ptr[esi+ecx*8+24]
movq mm4, qword ptr[esi+ecx*8+32]
movq mm5, qword ptr[esi+ecx*8+40]
movq mm6, qword ptr[esi+ecx*8+48]
movq mm7, qword ptr[esi+ecx*8+56]
movntq qword ptr[edi+ecx*8], mm0
movntq qword ptr[edi+ecx*8+8], mm1
movntq qword ptr[edi+ecx*8+16], mm2
movntq qword ptr[edi+ecx*8+24], mm3
movntq qword ptr[edi+ecx*8+32], mm4
movntq qword ptr[edi+ecx*8+40], mm5
movntq qword ptr[edi+ecx*8+48], mm6
movntq qword ptr[edi+ecx*8+56], mm7
add ecx, 8
dec eax
jnz writeloop
or ecx, ecx
jnz mainloop
sfence
emms
}
}
//拷贝不足一个块的数据
memcpy( (char*)dst + nBytes - m, (char*)src + nBytes - m, m);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -