2015-07-22 3 views
-2

ce code est memcpy() sur les plates-formes x86. mais j'ai besoin de memcpy() sur la plate-forme x64.convertir le code memcpy() de la plate-forme x86 en x64

_asm { 
     mov esi, src 
     mov edi, dest 
     mov ecx, nbytes 
     shr ecx, 6 // 64 bytes per iteration 

loop1: 
    movq mm1, 0[ESI] // Read in source data 
    movq mm2, 8[ESI] 
    movq mm3, 16[ESI] 
    movq mm4, 24[ESI] 
    movq mm5, 32[ESI] 
    movq mm6, 40[ESI] 
    movq mm7, 48[ESI] 
    movq mm0, 56[ESI] 

    movq 0[EDI], mm1 // Write to destination 
    movq 8[EDI], mm2 
    movq 16[EDI], mm3 
    movq 24[EDI], mm4 
    movq 32[EDI], mm5 
    movq 40[EDI], mm6 
    movq 48[EDI], mm7 
    movq 56[EDI], mm0 

    add esi, 64 
    add edi, 64 
    dec ecx 
    jnz loop1 

    emms 
} 

Je n'ai aucune connaissance du langage d'assemblage x64. comment convertir ce code de x86 en x64?

+4

Avez-vous des raisons de penser que vous feriez mieux que l'implémentation dans 'libc'? N'hésitez pas à regarder [ce que les autres ont fait] (https://android.googlesource.com/platform/bionic/+/master/libc/arch-x86_64/string/sse2-memcpy-slm.S). – Michael

+1

J'ai de bonnes raisons de penser que c'est beaucoup plus lent qu'une bonne implémentation, car elle utilise des registres MMX. – gnasher729

+0

Je soupçonne fortement que si vous comprenez l'assemblage x86 vous pouvez très facilement traduire cela en X64 en faisant peut-être une recherche google. –

Répondre

1

Je suppose que remplacer esi et edi par rsi et rdi devrait faire l'affaire. Bien que cela ne devienne pas plus rapide (ou rapide). À l'exception des pointeurs, x64 est rétrocompatible avec x86.

En général, mieux vaut créer une boucle C ou utiliser la memcpy par défaut. Cela générera beaucoup mieux le code.

+0

C boucle est susceptible d'être plus lent, mais sinon je suis d'accord. –

+0

Le lien Laybrary que la vitesse est meilleure que le C++: http://agner.org/optimize/#asmlib – abbas