Asembler x86/Instrukcje/SSE4

SSE4.1

edytuj

BLENDPS, BLENDPD

edytuj

Dział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

edytuj

Dział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

edytuj

Dział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

edytuj

dział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]

Dział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


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

Asembler X86/Instrukcje/SSE4/MOVNTDQA

SSE4.2

edytuj

Asembler X86/Instrukcje/SSE4/CRC32

Asembler X86/Instrukcje/SSE4/POPCNT

Asembler X86/Instrukcje/SSE4/PCMPGTQ

Asembler X86/Instrukcje/SSE4/PCMPESTRx