[SIZE=1]#ifndef SAD_SSE_H
#define SAD_SSE_H
#ifndef WIN32
inline int SADsse(const unsigned int *p1, const unsigned int *p2, unsigned int ws, unsigned int skip)
{
int sum;
asm volatile(
".intel_syntax noprefix \n" // normalen x86-Assembler-Syntax einschalten
// in mm0 wird aufsummiert
"pxor xmm0, xmm0 \n" // mm0 auf 0 setzen
//cl zählt zeilen
//ch zählt spalten
//Fenstergröße ws ist in dl
"mov cl, dl \n"
"shr dl, 1 \n" // da wir 2 Pixel gleichzeitg bearbeiten, brauchen wir
// nur halbsoviele durchläufe in der innersten schleife
"nextrow: \n" // BEGIN schleife für zeilen
" mov ch, dl \n"
" nextcol: \n" // BEGIN schleife für spalten
" movq xmm1, [eax] \n" // *p1 in mm1 (2 pixel)
" movq xmm2, [ebx] \n" // *p2 in mm2 (2 pixel)
" psadbw xmm1, xmm2 \n" // summe der absoluten differenzen (erg in mm1)
" paddd xmm0, xmm1 \n" // in mm0 aufsummieren
" add eax, 8 \n" // 2 pixel weiter
" add ebx, 8 \n"
" dec ch \n" // ENDE schleife für spalten
" jnz nextcol \n"
"add eax, edi \n" // p1+=skip;
"add ebx, edi \n" // p2+=skip;
"dec cl \n" // ENDE schleife für zeilen
"jnz nextrow \n"
"movd edx, xmm0 \n" // summe aus mm0 in edx speichern
".att_syntax \n" // gnu-assebler-syntax wiederherstellen
:"=d"(sum) // ergebnis aus edx in sum
:"d"(ws), // ws in dl
"D"(skip), // skip in edi
"a"(p1),"b"(p2) // zeiger p1 in eax und zeiger p2 in ebx
:"ecx","xmm0","xmm1","xmm2"); // ecx register wird verändert*/
return sum;
}
#else
__forceinline int SADsse(const unsigned int *p1, const unsigned int *p2, unsigned int ws, unsigned int skip)
{
int sum;
__asm
{
mov edx, ws
mov edi, skip
mov eax, p1
mov ebx, p2
// in mm0 wird aufsummiert
pxor mm0, mm0 // mm0 auf 0 setzen
//cl zählt zeilen
//ch zählt spalten
//Fenstergröße ws ist in dl
mov cl, dl
shr dl, 1 // da wir 2 Pixel gleichzeitg bearbeiten, brauchen wir
// nur halbsoviele durchläufe in der innersten schleife
nextrow: // BEGIN schleife für zeilen
mov ch, dl
nextcol: // BEGIN schleife für spalten
movq mm1, [eax] // *p1 in mm1 (2 pixel)
movq mm2, [ebx] // *p2 in mm2 (2 pixel)
psadbw mm1, mm2 // summe der absoluten differenzen (erg in mm1)
paddd mm0, mm1 // in mm0 aufsummieren
add eax, 8 // 2 pixel weiter
add ebx, 8
dec ch // ENDE schleife für spalten
jnz nextcol
add eax, edi // p1+=skip;
add ebx, edi // p2+=skip;
dec cl // ENDE schleife für zeilen
jnz nextrow
movd edx, mm0 // summe aus mm0 in edx speichern
emms // wir sind fertig mit mmx
mov sum, edx
}
return sum;
}
#endif
#endif[/SIZE]