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])