SSE4 — nowe rozkazy

Autor: Wojciech Muła
Dodany:4.09.2007

Intel przymierza się do SSE4 (a właściwie 4.1 i 4.2), już nawet opublikował na swoich stronach specyfikację (dopisek z 30.04.2008: już są procesory z SSE 4.1). Są to rozkazy stałoprzecinkowe stanowiące uzupełnienia dla istniejących rozkazów SSE3/SSSE3, ale jest także kilka specjalizowanych instrukcji:

  1. PCMPxSTRx — rozkazy działające na łańcuchach (i modyfikujące rejestr flag!), chyba najbardziej złożone; w dokumentacji są opisane w dość zagmatwany sposób, dlatego na własny użytek napisałem w miarę obszerne wprowadzenie i pokusiłem się o kilka, teoretycznie poprawnych, przykładów użycia.

  2. MPSADBW — oblicza 8 sum modułów różnic (SAD4) na 4-elementowych wektorach bajtów bez znaku, tj.:

    +--------+--------+--------+--------+
    |a b c d |e f g h |i h j k |m n o p |  xmm1
    +--------+--------+--------+--------+
        0         1       2        3       <-- nr podwójnego słowa
    +--------+--------+--------+--------+
    |w x y z |        |        |        |  xmm2
    +--------+--------+--------+--------+
    
    SAD4(x1,x2,x3,x4, y1,y2,y3,y4) := |x1-y1| + |x2-y2| + |x3-y3| + |x4-y4|
    

    Wynikiem jest 8 elementowy wektor słów:

    [0] = SAD4(w,x,y,z, a,b,c,d)
    [1] = SAD4(w,x,y,z, b,c,d,e)
    [2] = SAD4(w,x,y,z, c,d,e,f)
    [3] = SAD4(w,x,y,z, d,e,f,g)
    [4] = SAD4(w,x,y,z, e,f,g,h)
    [5] = SAD4(w,x,y,z, f,g,h,i)
    [6] = SAD4(w,x,y,z, g,h,i,j)
    [7] = SAD4(w,x,y,z, h,i,j,k)
    

    przy czym można wybrać, za pomocą stałej natychmiastowej, który wektor z xmm2 jest brany do obliczeń (0, 1, 2 lub 3) oraz na jakim zakresie podwójnych słów w xmm1 mają zostać przeprowadzone (tj. albo 0-1-2, albo 1-2-3).

  3. PHMINPOSUW — wyszukuje w rejestrze XMM najmniejsze słowo bez znaku, zwraca jego wartość oraz indeks.

  4. CRC32 — obliczanie sum kontrolnych.

  5. POPCNT — zliczanie ustawionych bitów.

Ciekawe tylko, szczególnie jeśli chodzi o instrukcje łańcuchowe i obliczające SAD4, jakie będą opóźnienia (myślę, że będzie przynajmniej kilka, jeśli nie kilkanaście cykli).

I na koniec bardzo miły akcent, żaden high-end, ale rzecz bardzo przydatna, mianowicie instrukcja PTEST, która działa podobnie do TEST, tj. wykonuje iloczyn logiczny, ale oczywiście na rejestrach XMM i na postawie wyniku ustawia flagi ZF oraz CF (nie modyfikuje argumentów!). Rozkaz ptest %xmm2, %xmm1 działa następująco:

tmp1 :=     xmm1 AND xmm2
tmp2 := NOT xmm1 AND xmm2

CF = ZF = AF = OF = SF = PF := 0

if (tmp1 = 0) then
   ZF := 1

if (tmp2 = 0) then
   CF := 1