Streaming SIMD Extensions 2 (SSE2) – zestaw instrukcji SIMD, rozszerzający istniejący SSE. Nowe cechy:
Technologia ta została wprowadzona w procesorach rodziny Pentium 4 oraz Athlon 64.
SSE2 wykorzystuje typy danych zdefiniowane w MMX i SSE, definiuje także kilka nowych typów danych: w większości wektorów o określonych rozmiarach.
Typy zmiennoprzecinkowe:
Typy całkowite (rozszerzenia typów MMX):
Analogicznie jak w SSE, rozkazy SSE2 mogą wykonywać działania arytmetyczne na wektorach liczb zmiennoprzecinkowych podwójnej precyzji na dwa sposoby:
Rozmiar słowa [bity] |
Rozmiar elementu [bity] |
Liczba elementów wektora | Uwagi |
---|---|---|---|
Liczby zmiennoprzecinkowe | |||
128 | 64 | 2 | SSE2, liczby podwójnej precyzji |
128 | 32 | 4 | SSE, liczby pojedynczej precyzji |
Liczby całkowite (ze znakiem lub bez) | |||
128 | 128 | 1 | SSE2, całe słowo |
128 | 64 | 2 | SSE2, packed quad word |
128 | 32 | 4 | SSE2, packed double word |
128 | 16 | 8 | SSE2, packed word |
128 | 8 | 16 | SSE2, packed byte |
64 | 64 | 1 | MMX, quad word |
64 | 32 | 2 | MMX, packed double word |
64 | 16 | 4 | MMX, packed word |
64 | 8 | 8 | MMX, packed byte |
Tak jak w SSE, również w SSE2 sufiksy mnemoników określają typy danych, na jakich działają określone rozkazy; oprócz tych zdefiniowanych w MMX i SSE pojawiły się nowe dla liczb zmiennoprzecinkowych podwójnej precyzji:
PD
- wektory,SD
- skalary.ADDPD
, ADDSD
)SUBPD
, SUBSD
)DIVPD
, DIVSD
)MULPD
, MULSD
)SQRTPD
, SQRTSD
)MAXPD
, MAXSD
)MINPD
, MINSD
)Wykonywane są na poziomie bitów, a nie liczb:
ORPD
),ANDPD
),ANDNPD
) - jeden z argumentów jest negowany przed obliczeniem iloczynu,XORPD
),Rozkazy porównania SSE2 działają w taki sam sposób jak SSE, jedna różnica to oczywiście rozmiary elementów wektorów:
CMPPD
i CMPSD
odpowiadają rozkazy SSE CMPPS
i CMPSS
;COMISD
i UCOMISD
odpowiadają rozkazy SSE COMISS
i UCOMISS
.SHUFPD
UNPCKLPD
, UNPCKHPD
CVTPD2PI
, CVTTPD2PI
- liczby zmiennoprzecinkowe na 32-bitowe liczby całkowiteCVTPD2PQ
, CVTTPD2PQ
- liczby zmiennoprzecinkowe na 64-bitowe liczby całkowiteCVTPI2PD
- 32-bitowe liczby całkowite na liczby zmiennoprzecinkoweCVTDQ2PD
- 64-bitowe liczby całkowite na liczby zmiennoprzecinkoweCVTSD2SI
, CVTTSD2SI
- liczba zmiennoprzecinkowa na 32-bitową liczbę całkowitąCVTSI2SD
- 32-bitowa liczba całkowita na liczbę zmiennoprzecinkowąCVTPS2DQ
, CVTTPS2DQ
- liczby zmiennoprzecinkowe na 64-bitowe liczby całkowiteCVTDQ2PS
- 64-bitowa liczba całkowita na liczbę zmiennoprzecinkowąCVTPS2PD
- z pojedynczej na podwójną precyzjęCVTPD2PS
- z podwójnej na pojedynczą precyzjęCVTSS2SD
- z pojedynczej na podwójną precyzjęCVTPS2SS
- z podwójnej na pojedynczą precyzjęPMULUDQ
- mnożenie 32-bitowych liczb bez znaku, wyniki są 64-bitowePADDQ
- dodawanie 64-bitowych liczb ze znakiemPSUBQ
- odejmowanie 64-bitowych liczb ze znakiemPSHUFLW
, PSHUFHW
- zmiana kolejności elementów 16-bitowych, odpowiednio, w dolnej i górnej połówce 128-bitowego wektoraPSHUFD
- zmiana kolejności elementów 32-bitowychPSLLDQ
, PSRLDQ
- przesunięcia bitowe w lewo i prawo elementów 64-bitowychPUNPCKHQDQ
, PUNPCKLQDQ
MFENCE
, LFENCE
- uszeregowanie operacji odczytu pamięci i zapisu pamięci/wyłącznie odczytu - patrz bariera pamięciCLFLUSH
- zapisuje i unieważnia wskazaną linijkę cache na wszystkich poziomach pamięci podręcznejPAUSE
- jest podpowiedzią (ang. hint) dla procesora, która przyspiesza wyjście z pętli aktywnego oczekiwania (ang. spin-wait loop)MASKMOVDQU
- uaktualnienie wybranych bajtów z rejestru XMMMOVNTPD
, MOVNTDQ
- zapis rejestru XMM (tj. dwóch słów 64-bitowych, przez pierwszy rozkaz traktowanych jako liczby zmiennoprzecinkowe, w drugim - jako całkowite)MOVNTI
- zapisanie rejestru ogólnego przeznaczenia (czyli EAX
, EBX
itd.)MOVAPD
MOVUPD
MOVHPD
, MOVLPD
MOVSD
MOVMSKPD
MOVDQA
MOVQ2DQ
, MOVDQ2Q
W SSE2 dodano jedną flagę kontrolującą obliczenia zmiennoprzecinkowe:
Podsystem przewidywania skoków posiada wbudowane reguły statycznego przewidywania skoków warunkowych - np. jeśli adres docelowy skoku jest ujemny (skok wstecz, jak w pętlach) to przyjmuje się, że skok nastąpi. W SSE2 wprowadzono podpowiedzi (ang. branch hint), które dla wskazanych instrukcji skoku nadpisują domyślne reguły, pozwalając wskazać bardziej prawdopodobny przepływ sterowania w programie. Podpowiedzi te mają formę przedrostków dla kodów rozkazu skoku, nie są odrębnymi instrukcjami.
Mimo że w symulacjach rozwiązanie to wyglądało bardzo obiecująco, w rzeczywistych programach nie zanotowano wzrostu wydajności[1].