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.