#define CACHEBLOCK 400h // number of QWORDs in a chunk

mov esi, [src] // source array

mov edi, [dst] // destination array

mov ecx, [len] // total number of QWORDS (8 bytes)

// (assumes len / CACHEBLOCK = integer)

lea esi, [esi+ecx*8]

lea edi, [edi+ecx*8]

neg ecx

mainloop:

mov eax, CACHEBLOCK / 16 // note: prefetch loop is unrolled 2X

add ecx, CACHEBLOCK // move up to end of block

prefetchloop:

mov ebx, [esi+ecx*8-64] // read one address in this cache line...

mov ebx, [esi+ecx*8-128] // ... and one in the previous line

sub ecx, 16 // 16 QWORDS = 2 64-byte cache lines

dec eax

jnz prefetchloop

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  // if( ecx != 0 )

jnz mainloop // goto mainloop

sfence


인터넷에서 찾음