Asembler x86/Instrukcje/SSE4/MPSADBW

MPSADBW (Compute Multiple Packed Sums of Absolute Difference) oblicza osiem sum modułów różnic (SAD) 4-elementowych wektorów bajtów bez znaku (czyli odległości w metryce manhattan). Pojedyncza suma modułów różnic dana jest wzorem , gdzie , to wektory.

Instrukcja MPSADBW przyjmuje trzy argumenty: dwa 16-elementowe wektory bajtów, oraz 8-bitową stałą natychmiastową, która ustala:

  • 12-bajtowy zakres w pierwszym wektorze, obejmujący albo indeksy 0..11 albo 4..15;
  • 4-bajtowy wektor z drugiego wektora, obejmujący indeksy 0..3 lub 4..7 lub 8..11 albo 12..15.

Następnie obliczane są wartości wybranego wektora oraz 8 kolejnych wektorów z 12-bajtowego zakresu. Wynikiem jest wektor 8 liczb 16-bitowych bez znaku.

Rozkaz MPSADBW xmm1, xmm2, imm8 realizuje:

index1 := 4 * (imm8 AND 100b SHR 2)  { wybór zakresu }
index2 := 4 * (imm8 AND 011b)        { wybór wektora }

for i:=0 to 7 do
   temp[i] := 0
   for j:=0 to 3 do { obliczanie SAD4 }
      temp[i] := temp[i] + ABS(xmm1[index1 + i + j] + xmm2[index2 + j])

xmm1 := temp

Np. jeśli imm8 = 0 (czyli index1 = index2 = 0), wówczas kolejne elementy wyniku będą miały wartości:

  • SAD4(xmm1[0..3], xmm2[0..3])
  • SAD4(xmm1[1..4], xmm2[0..3])
  • SAD4(xmm1[2..5], xmm2[0..3])
  • SAD4(xmm1[3..6], xmm2[0..3])
  • SAD4(xmm1[4..7], xmm2[0..3])
  • SAD4(xmm1[5..8], xmm2[0..3])
  • SAD4(xmm1[6..9], xmm2[0..3])
  • SAD4(xmm1[7..10], xmm2[0..3])