Podręcznik
4. Procesor – informacje ogólne
4.14. Przykładowe rozkazy SSE, AVX
Zestaw rozkazów SSE w zasadzie przypomina te tradycyjne. Rozkazy SSE zawierają rozkazy realizujące:
- działania arytmetyczne,
- działania logiczne,
- porównania,
- rozmieszczenie elementów w wektorze,
- przesłania liczb zmiennoprzecinkowych między rejestrem i pamięcią,
- pobranie danych „bliżej” procesora,
- trwały zapis.
W rozkazach SSE2 dodatkowo zamieszczono:
- konwersje między liczbami zmiennoprzecinkowymi i całkowitymi,
- kontrolę pamięci podręcznej i spójności pamięci,
- zaawansowane rozkazy przesyłania danych.
SSE3 wprowadza 13 nowych rozkazów w stosunku do swojego poprzednika SSE2:
- FISTTP - do konwersji liczb zmiennoprzecinkowych do całkowitoliczbowych,
- ADDSUBPS, ADDSUBPD, MOVSLDUP, MOVSHDUP, MOVDDUP - do arytmetyki zespolonej,
- LDDQU - do kodowania wideo,
- HADDPS, HSUBPS, HADDPD, HSUBPD - do grafiki (SIMD FP/AOS),
- MONITOR, MWAIT - do synchronizacji wątków.
Rozkazy SSE4.1
- BLENDPS, BLENDPD, BLENDVPS, BLENDVPD, PBLENDVB, PBLENDW - przepisanie tylko wybranych elementów wektorów (wskazanych maską bitową),
- DPPS, DPPD - obliczanie iloczynu skalarnego,
- EXTRACTPS, PEXTRB, PEXTRW, PEXTRD, PEXTRD - wybranie elementu z wektora (z rejestru XMM) i zapisanie go do rejestru ogólnego przeznaczenia lub pamięci,
- INSERTPS, PINSRB, PINSRD, PINSRQ - zapisanie rejestru ogólnego przeznaczenia albo pamięci na wskazanej pozycji wektora,
- PMAXSB, PMAXSD, PMAXUB, PMAXD, PMINSB, PMINSD, PMINUB, PMIND - wybranie maksymalnych /minimalnych elementów z dwóch wektorów bajtów lub podwójnych słów (ze znakiem albo bez znaku),
- PMULDQ, PMULLD - rozkazy mnożą wektory 32-bitowych liczb ze znakiem; PMULDQ zapisuje wyniki 64-bitowe, natomiast PMULLD tylko młodsze 32 bity wyniku,
- PMOVSX, PMOVZX - konwersja wektorów liczb całkowitych (ze znakiem SX, bez znaku - ZX) na liczby całkowite o większej liczbie bitów; dostępne konwersje:
- PMOVSXBW, PMOVZXBW (8 bitów -> 16 bitów),
- PMOVSXBD, PMOVZXBD (8 bitów -> 32 bity),
- PMOVSXBQ, PMOVZXBQ (8 bitów -> 64 bity),
- PMOVSXWD, PMOVZXWD (16 bitów -> 32 bity),
- PMOVSXWD, PMOVZXWD (16 bitów -> 64 bity),
- PMOVSXDQ, PMOVZXDQ (32 bity -> 64 bity),
- PACKUSDW - konwersja wektora czterech 32-bitowych liczb całkowitych ze znakiem na wektor liczb całkowitych 16-bitowych bez znaku; przy konwersji następuje nasycenie wyniku,
- PCMPEQQ - porównanie wektorów poczwórnych słów ze znakiem (elementy 64-bitowe) relacją "równy",
- ROUNDPD, ROUNDPS, ROUNDSD, ROUNDSS - zaokrąglanie wektorów lub skalarów liczb zmiennoprzecinkowych pojedynczej bądź podwójnej precyzji,
- PHMINPOSUW - rozkaz wyszukuje w wektorze liczb 16-bitowych bez znaku wartość najmniejszą; zwraca wartość elementu oraz jego indeks,
- PTEST - rozkaz pozwala na sprawdzenie, które bity w rejestrze XMM są ustawione; rozkaz modyfikuje rejestr flag mikroprocesora,
- MPSADBW - rozkaz oblicza 8 kolejnych sum modułów różnic wektorów 4-elementowych,
- MOVNTDQA - ładuje 128 bitów z pamięci.
Rozkazy SSE4.2
- CRC32 - aktualizacja sumy kontrolnej CRC32; używany wielomian 11edc6f41h,
- POPCNT (ang. population count) - zliczenie liczby zapalonych bitów w słowach 16-, 32-, lub 64 bitowych (argumentami mogą być rejestry, bądź adresy pamięci),
- PCMPGTQ - porównanie wektorów poczwórnych słów ze znakiem (elementy 64-bitowe) relacją "większy",
- PCMPESTRI, PCMPESTRM, PCMPISTRI, PCMPISTRM - rozkazy działają na łańcuchach bajtów lub słów, ze znakiem lub bez znaku i pozwalają na:
- stwierdzenie czy łańcuchy są równe,
- stwierdzenie które znaki z pierwszego łańcucha znajdują się w drugim (ewentualnie czy znajdują się w przedziałach zdefiniowanych w łańcuchu drugim),
- wyszukanie wystąpień jednego z łańcuchów w drugim.
Jak widać poszczególne rozszerzenia wprowadzają coraz bardziej specjalizowane i jednocześnie mniej wykorzystywane rozkazy. AVX na początku było prostym rozszerzeniem SSE na dłuższe rejestry, później wprowadzono również bardziej specjalizowane rozkazy.