Asembler x86/Instrukcje/SSE4
SSE4.1
edytujBLENDPS, BLENDPD
edytujDziałają na wektorach — odpowiednio — słów 32- i 64-bitowych. Nadpisują w wektorze docelowym tylko te elementy z wektora źródłowego, dla których odpowiadające im bity w masce bitowe są ustawione. Maska bitowa jest trzecim argumentem rozkazów, 8-bitową stałą natychmiastową i w zależności od długości wektorów obejmuje — odpowiednio — 4 albo 2 najmłodsze bity.
Rozkazowi BLENDPS xmm1, xmm2, imm8 odpowiada:
for i:=0 to 3 do
if imm8[i] = 1 then { bit ustawiony? }
xmm1[i] := xmm2[i]
BLENDVPS, BLENDVPD
edytujDziałają na wektorach — odpowiednio — liczb zmiennoprzecinkowych pojedynczej oraz podwójnej precyzji. Wykonują dokładnie to samo działanie, co inne wymienione wcześniej rozkazy BLENDPx, różnica polega na sposobie zapisu maski bitowej. Rozkazy BLENVPx jako domyślny argument przyjmują rejestr XMM0, a o tym, czy dany element ma zostać przepisany, decydują najstarsze bity kolejnych słów XMM0.
Np. rozkazowi BLENDVPS xmm1, xmm2 odpowiada:
for i:=0 to 3 do
if (XMM0[i] AND 0x80000000) = 0x80000000 then { najstarszy bit 32-bitowego słowa ustawiony? }
xmm1[i] := xmm2[i]
PBLENDVB
edytujDziała na wektorach bajtów. Wykonuje dokładnie to samo działanie, co inne wymienione wcześniej rozkazy BLENDPx, różnica polega na sposobie zapisu maski bitowej. Rozkaz PBLENDVB jako domyślny argument przyjmują rejestr XMM0, a o tym, czy dany element ma zostać przepisany, decydują najstarsze bity kolejnych elementów XMM0.
Rozkazowi PBLENDVB xmm1, xmm2 odpowiada:
for i:=0 to 15 do
if (XMM0[i] AND 10000000b) = 10000000b then { najstarszy bit ustawiony? }
xmm1[i] := xmm2[i]
PBLENDW
edytujdziała na wektorach słów 16--bitowych. Nadpisuje w wektorze docelowym tylko te elementy z wektora źródłowego, dla których odpowiadające im bity w masce bitowe są ustawione. Maska bitowa jest trzecim argumentem rozkazów, 8-bitową stałą natychmiastową.
Rozkazowi PBLENDW xmm1, xmm2, imm8 odpowiada:
for i:=0 to 7 do
if imm8[i] = 1 then { bit ustawiony? }
xmm1[i] := xmm2[i]
DPPS
edytujDziała na dwóch wektorach liczb zmiennoprzecinkowych pojedynczej precyzji (każdy po 4 liczby), obliczając iloczyn skalarny dla wybranych elementów argumentu źródłowego. W argumencie docelowym na wskazanych pozycjach zapisywany jest albo wynik, albo wartość 0.
Trzeci argument rozkazu, 8-bitowa stała natychmiastowa, przechowuje dwie maski bitowe:
- na bitach 4..7 maskę określającą które elementy wchodzą w skład iloczynu skalarnego,
- na bitach 0..3 maskę określającą które elementy docelowego maja zostać wyzerowane, a które zawierać wynik.
Rozkaz DPPS xmm1, xmm2, imm8 wykonuje:
{ obliczenie iloczynu skalarnego wybranych elementów } dot := 0.0 for i:= 0 to 3 do if imm8[i+4] = 1 then dot := dot + (xmm1[i] * xmm2[i]) { zapisanie wyników } for i:= 0 to 3 do if imm8[i] = 1 then xmm1[i] := dot else xmm1[i] := 0.0
DPPD
edytujAsembler X86/Instrukcje/SSE4/PEXTRx
Asembler X86/Instrukcje/SSE4/PINSRx
Asembler X86/Instrukcje/SSE4/PMAX PMIN
Asembler X86/Instrukcje/SSE4/PMULx
Asembler X86/Instrukcje/SSE4/PMOVSXx
Asembler X86/Instrukcje/SSE4/PMOVZXx
Asembler X86/Instrukcje/SSE4/PACKUSDW
Asembler X86/Instrukcje/SSE4/PCMPEQQ
Asembler X86/Instrukcje/SSE4/ROUNDx
Asembler X86/Instrukcje/SSE4/PHMINPOSUW
PTEST działa na liczbach 128-bitowych, wykonuje dwie operacje AND i stosownie do wyników ustawia dwie flagi procesora: CF (przeniesienia) i ZF (zera), natomiast zeruje pozostałe (tj. AF, OF, PF oraz SF). Żaden z argumentów rozkazu nie jest modyfikowany.
Działanie PTEST xmm1, xmm2:
{ zerowanie } CF := 0; ZF := 0 AF := 0; SF := 0; PF := 0; OF := 0; { działania AND } if (xmm1 AND xmm2) = 0 then ZF := 1 if (NOT xmm1 AND xmm2) = 0 then CF := 1
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])
SSE4.2
edytujAsembler X86/Instrukcje/SSE4/CRC32
Asembler X86/Instrukcje/SSE4/POPCNT