AVX (Advanced Vector Extensions) – rozszerzenie listy rozkazów SSE opublikowane w marcu 2008 przez Intel. Jako pierwszy procesor zawierający ten zestaw instrukcji miał się pojawić w pierwszym kwartale 2011 roku i być oparty na architekturze Sandy Bridge tej firmy. AMD zapowiadał wprowadzenie procesora z AVX na trzeci kwartał 2011 roku – miałby być to układ o architekturze Bulldozer.

Rozszerzenia: W AVX wprowadzono 256-bitowe rejestry – 2 razy większe niż wykorzystywane dotychczas w SSE. Nowych rejestrów jest 16 i w asemblerze noszą nazwy YMM0...YMM15. W dalszych wersjach AVX mogą pojawić się jeszcze większe rejestry, 512-, a nawet 1024-bitowe. Dodano kilka rozkazów działających wyłącznie na rejestrach YMM (19 rozkazów). Dodane czteroargumentowe rozkazy akumulujące wyniki mnożenia wektorów liczb zmiennoprzecinkowych, to znaczy wykonujące obliczenia według schematu (12 rozkazów). Dodane specjalizowane instrukcje wspomagające szyfrowanie AES (6 rozkazów). Część rozkazów SSE, głównie tych działających na wektorach liczb zmiennoprzecinkowych, może wykonywać działania na rejestrach YMM (88 rozkazów). Rozszerzone kodowanie rozkazów, dzięki któremu możliwe stało się wykonywanie niektórych instrukcji SSE w wariancie trójargumentowym lub czteroargumentowym. Dotychczas wszystkie rozkazy były dwuargumentowe, z czego jeden był docelowy (nadpisywany) i często zachodziła konieczność jego zapisania/przepisania do innego rejestru lub pamięci, jeśli musiał zostać wykorzystany w dalszej części obliczeń – w wariancie trójargumentowym można wprost wskazać docelowy rejestr (rozwiązanie zapożyczone z architektury RISC) (166 rozkazów).

Rejestry prawo|220px

Mikroprocesor pracujący w trybie 32-bitowym ma dostęp do pierwszych 8 rejestrów (0..7), w trybie 64-bitowym do wszystkich. Istniejące rejestry SSE (XMM0...XMM7) zostały zamapowane na młodsze 128 bitów rejestrów YMM0...YMM7.

Typy danych W związku z dwukrotnym poszerzeniem rejestru pojawiły się nowe typy wektorowe tylko dla liczb zmiennoprzecinkowych: 8 × 32 bity – wektor 8 liczb zmiennoprzecinkowych pojedynczej precyzji 4 × 64 bity – wektor 4 liczb zmiennoprzecinkowych podwójnej precyzji

Mnemoniki instrukcji Mnemoniki rozkazów AVX oraz SSE działających na 256-bitowych rejestrach rozpoczynają się literą V. Typ danych, na jakich działają, określa sufiks: PS, PD – wektor liczb zmiennoprzecinkowych, SS, SD – skalar (pierwszy element wektora), czyli liczba zmiennoprzecinkowa odpowiednio pojedynczej i podwójnej precyzji

Mnemoniki rozkazów akumulujących wyniki mnożenia rozpoczynają się od VFM lub VFNM, natomiast mnemoniki rozkazów wspomagających szyfrowanie od AES.

Rozkazy AVX Instrukcje AVX działają na rejestrach YMM, niektóre również na XMM.

Nowe rozkazy Instrukcja Działanie VBROADCASTSSVBROADCASTSDVBROADCASTF128 powielenie liczby 32-, 64- lub 128-bitowej pobranej z pamięci w rejestrze XMM lub YMM VEXTRACTF128 przepisanie starszych lub młodszych 128 bitów z rejestru YMM do pamięci lub rejestru XMM (zerując starsze 128 bitów stowarzyszonego z nim rejestru YMM) VINSERTF128 wpisanie 128 bitów z rejestru XMM lub pamięci do starszej lub młodszej połówki źródłowego rejestru YMM i przepisanie tak utworzonego wektora docelowego YMM VMASKMOVPSVMASKMOV przesłanie wybranych elementów z do pamięci (przesłania 128 lub 256-bitowe) VPERMILPDVPERMILPS dowolna permutacja elementów wektora VPERMIL2PDVPERMIL2PSVPERM2F128 dowolna permutacja elementów z dwóch wektorów; dodatkowo można wskazać które elementy wektora wynikowego mają zostać wyzerowane PCLMULQDQ ang. carry-less-multiplication – mnożenie liczb binarnych 64-bitowych, w którym przy dodawaniu nie uwzględnia się przeniesień (kolejne bity wyniku to efekt wykonania pewnej liczby różnic symetrycznych) VPTESTPSVPTESTPD rozkazy podobne do VPTEST (PTEST, patrz opis SSE4), przy czym działania bitowe nie są przeprowadzane na całych rejestrach, lecz na bitach znaków liczb zmiennoprzecinkowych VZEROALL w trybie 64-bitowym wyzerowanie wszystkich rejestrów YMM, w trybie 32-bitowym – YMM0..YMM7 VZEROUPPER w trybie 64-bitowym wyzerowanie bitów 128..255 we wszystkich rejestrach YMM, w trybie 32-bitowym – w rejestrach YMM0..YMM7 VLDMXCSRVSTMXCSR załadowanie/zapis zawartości rejestru kontrolnego z/do pamięci

Akumulujące wyniki mnożenia (FMA) Liczba rozkazów należących do tej grupy wynosi 12. Wszystkie są czteroargumentowe VFMxxxxx w, x, y, z i wykonują działanie według schematu

Instrukcje skalarne, czyli działające na pierwszym elemencie wektora (sufiks SD lub SS), zachowują się inaczej niż instrukcje skalarne SSE: wpisują wartość zero na pozostałe pozycje wektora wynikowego, podczas gdy w SSE przepisywane są elementy jednego z argumentów.

Lista rozkazów FMA:

InstrukcjaDziałanie VFMADDPDVFMADDPSVFMADDSDVFMADDSS lub VFMSUBPDVFMSUBPSVFMSUBSDVFMSUBSS VFNMADDPDVFNMADDPSVFNMADDSDVFNMADDSS VFNMSUBPDVFNMSUBPSVFNMSUBSDVFNMSUBSS VFMADDSUBPDVFMADDSUBPS przy czym dla parzystego wykonywane jest dodawanie, dla nieparzystego – odejmowanie VFMSUBADDPDVFMSUBADDPS przy czym dla nieparzystego wykonywane jest dodawanie, dla parzystego – odejmowanie

Wspomagające szyfrowanie algorytmem AES AESDEC, AESDECLAST – deszyfrowanie AESENC, AESENCLAST – szyfrowanie AESIMC AESKEYGENASSIST

Rozszerzone rozkazy SSE AVX rozszerza możliwości instrukcji SSE na dwa sposoby: umożliwia przeprowadzanie obliczeń na dwa razy szerszych rejestrach YMM rozszerza liczbę argumentów z dwóch na trzy lub trzech na cztery

Rozkazy SSE mogące dodatkowo działać na rejestrach YMM InstrukcjaDziałanie VCVTDQ2PDVCVTDQ2PS konwersja 32-bitowych liczb całkowitych na zmiennoprzecinkowe VCVTPD2DQVCVTTPD2DQVCVTPS2DQVCVTTPS2DQ konwersja liczb zmiennoprzecinkowych podwójnej/pojedynczej precyzji na 32-bitowe liczby całkowite VCVTPD2PS konwersja liczb zmiennoprzecinkowych podwójnej precyzji na liczby pojedynczej precyzji VCVTPS2PD konwersja liczb zmiennoprzecinkowych pojedynczej precyzji na liczby podwójnej precyzji VLDDQUVMOVDQUVMOVUPDVMOVUPS załadowanie 256 bitów z pamięci (adresy pamięci dowolne) VMOVPADVMOVAPSVMOVDQA załadowanie 256 bitów z pamięci (adresy pamięci wyrównane do granicy 256 bitów) VMOVDDUP powielenie elementów VMOVMSKPD utworzenie 4-bitowej maski bitowej z najstarszych bitów wektora liczb zmiennoprzecinkowych podwójnej precyzji (4 × 64 bity) VMOVMSKPS utworzenie 8-bitowej maski bitowej z najstarszych bitów wektora liczb zmiennoprzecinkowych pojedynczej precyzji (8 × 32 bity) VMOVSHDUPVMOVSLDUP powielenie elementów o nieparzystych/parzystych indeksach w wektorze liczb 32-bitowych VPTEST VRCPPS aproksymacja odwrotności VRSQRTPS aproksymacja odwrotności pierwiastka VROUNDPDVROUNDPS zaokrąglanie VSHUFPDVSHUFPS utworzenie wektora z elementów dwóch innych wekorów VSQRTPDVSQRTPS pierwiastek VUNPCKHPDVUNPCKHPSVUNPCKLPDVUNPCKLPS

Trójargumentowe instrukcje SSE mogące działać na rejestrach XMM oraz YMM InstrukcjaDziałanie VADDPDVADDPS dodawanie VSUBPDVSUBPS odejmowanie VMULPDVMULPSVMULSDVMULSS mnożenie VDIVPDVDIVPSVDIVSDVDIVSS dzielenie VSUBADDPDVSUBADDPS naprzemienne dodawanie i odejmowanie VHADDPDVHADDPS dodawanie sąsiednich elementów VHSUBPDVHSUBPS odejmowanie sąsiednich elementów VMAXPDVMAXPSVMINPDVMINPS wybranie maksymalnych/minimalnych wartości z dwóch wektorów VANDPDVANDPS iloczyn bitowy VANDNPDVANDNPS iloczyn bitowy z jednym z argumentów zanegowanym VORPDVORPS suma bitowa VXORPDVXORPS różnica symetryczna VCMPPDVCMPPSVCMPSDVCMPSS porównania (rozszerzono także z 8 do 32 liczbę relacji, które można sprawdzić) VCVTSD2SS konwersja liczby zmiennoprzecinkowej podwójnej precyzji na pojedynczej precyzji VCVTSS2SD konwersja liczby zmiennoprzecinkowej pojedynczej precyzji na podwójnej precyzji VMOVSDVMOVSS wpisanie pojedynczej liczby zmiennoprzecinkowej podwójnej/pojedynczej precyzji VRCPSS aproksymacja odwrotności VRSQRTSS aproksymacja odwrotności pierwiastka VROUNDSDVROUNDSS zaokrąglanie VSQRTSDVSQRTSS pierwiastek VPACKSSDWVPACKSSWB konwersja liczb całkowitych 32-bitowych na 16-bitowe/16-bitowych na 8-bitowe; wyniki są nasycane VPACKUSDWVPACKUSWB konwersja liczb całkowitych 32-bitowych na 16-bitowe bez znaku/16-bitowych na 8-bitowe bez znaku; wyniki są nasycane

Trójargumentowe instrukcje SSE mogące działać wyłącznie na rejestrach XMM Rozkazy działające na wektorach liczb zmiennoprzecinkowych: InstrukcjaDziałanie VADDSDVADDSS dodawanie skalarne VSUBSDVSUBSS odejmowanie skalarne VMAXSDVMAXSSVMINSDVMINSS wybranie maksymalnych/minimalnych wartości z dwóch skalarów VMOVHLPS przepisanie starszych 64 bitów (64..127) rejestru XMM na najmłodsze pozycje (0..63), wyzerowanie starszych 128 bitów stowarzyszonego z nim rejestru YMM VMOVLHPS przepisanie młodszych 64 bitów (0..63) rejestru XMM na najmłodsze pozycje (0..63), wyzerowanie starszych 128 bitów stowarzyszonego z nim rejestru YMM VMOVHPDVMOVHPS skopiowanie bitów młodszych 64 bitów (0..63) argumentu na pozycje 0..63 i 64..127 rejestru XMM, wyzerowanie starszych 128 bitów stowarzyszonego z nim rejestru YMM VMOVLPDVMOVLPS

Rozkazy działające na wektorach liczb całkowitych: InstrukcjaDziałanie VMPSADBW wyznaczenie 8 kolejnych sum modułów różnic (dokładny opis działania w artykule SSE4) VPADDBVPADDWVPADDDVPADDQ dodawanie wektorów liczb całkowitych (8-, 16-, 32- i 64-bitowych) VPSUBBVPSUBWVPSUBDVPSUBQ odejmowanie wektorów liczb całkowitych (8-, 16-, 32- i 64-bitowych) VPADDSBVPADDSW dodawanie z nasyceniem wektorów liczb całkowitych ze znakiem (8- i 16-bitowych) VPSUBSBVPSUBSW odejmowanie z nasyceniem wektorów liczb całkowitych ze znakiem (8- i 16-bitowych) VPSUBUSBVPSUBUSW odejmowanie z nasyceniem wektorów liczb całkowitych bez znaku (8- i 16-bitowych) VPHADDWVPHADDD dodawanie sąsiednich elementów wektorów liczb całkowitych (16- i 32-bitowych) VPHSUBWVPHSUBD odejmowanie sąsiednich elementów wektorów liczb całkowitych (16- i 32-bitowych) VPHADDSW dodawanie z nasyceniem sąsiednich elementów wektorów 16-bitowych liczb całkowitych VPHSUBSW odejmowanie z nasyceniem sąsiednich elementów wektorów 16-bitowych liczb całkowitych VPADDUSBVPADDUSW dodawanie z nasyceniem wektorów liczb całkowitych bez znaku (8- i 16-bitowych) VPALIGNR połączenie dwóch wektorów 16-bajtowych w 32-bitowy i wybranie z niego zakresu 16 bajtów VPANDVPORVPXORVPANDN działania bitowe: iloczyn, suma, różnica symetryczna, iloczyn z zanegowanym jednym z argumentów VPAVGBVPAVGW średnia arytmetyczna wektorów VPCMPEQBVPCMPEQWVPCMPEQDVPCMPEQQ testowanie relacji równości liczb całkowitych (8-, 16-, 32- i 64-bitowych) VPCMPGTBVPCMPGTWVPCMPGTDVPCMPGTQ testowanie relacji większości liczb całkowitych ze znakiem (8-, 16-, 32- i 64-bitowych) VPINSRBVPINSRWVPINSRDVPINSRQ VMPADDWDVMPADDUBSW mnożenie wektorowe, następnie dodawanie sąsiednich elementów VPMAXSBVPMINSBVPMAXSWVPMINSWVPMAXSDVPMINSD wybranie maksymalnych/minimalnych liczb całkowitych ze znakiem (z wektorów 8-, 16- i 32-bitowych liczb) VPMAXUSBVPMINUSBVPMAXUSWVPMINUSWVPMAXUSDVPMINUSD wybranie maksymalnych/minimalnych liczb całkowitych bez znaku (z wektorów 8-, 16- i 32-bitowych liczb) VPMULHUWVPMULHW mnożenie liczb 16-bitowych ze znakiem/bez znaku, zapis starszego słowa wyniku VPMULHRSW mnożenie liczb 16-bitowych ze znakiem, zapis starszego słowa wyniku po zaokrągleniu VPMULLWVPMULLD mnożenie liczb 16-bitowych/32-bitowych ze znakiem, zapis młodszego słowa wyniku VPMULDQVPMULUDQ mnożenie liczb 32-bitowych ze znakiem/bez znaku, zapis pełnego 64-bitowego wyniku VPSADBW obliczenie odległości wektorów w metryce manhattan, tj. suma modułów różnic bajtów VPSHUFBVPHSHUFDVPHSHUFHWVPHSUFLW permutacje wektorów VPSIGNBVPSIGNWVPSIGND VPSQLLDQVPSRLDQVPSLLWVPSLLDVPSLLQVPSRAWVPSRADVPSRLWVPSRLDVPSRLQ przesunięcie bitowe VPUNPCKLBWVPUNPCKLWDVPUNPCKLDQVPUNPCKLQDQVPUNPCKHBWVPUNPCKHWDVPUNPCKHDQVPUNPCKHQDQ naprzemienne kopiowanie elementów z dwóch wektorów

Czteroargumentowe instrukcje SSE mogące działać na rejestrach XMM oraz YMM