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:
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.
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).
PHMINPOSUW — wyszukuje w rejestrze XMM najmniejsze słowo bez znaku, zwraca jego wartość oraz indeks.
CRC32 — obliczanie sum kontrolnych.
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