⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qmemcpy.cpp

📁 利用MMX指令实现快速内存拷贝
💻 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 + -