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.SHUFPDUNPCKLPD, UNPCKHPDCVTPD2PI, 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, PUNPCKLQDQMFENCE, 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.)MOVAPDMOVUPDMOVHPD, MOVLPDMOVSDMOVMSKPDMOVDQAMOVQ2DQ, MOVDQ2QW 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.