nisko Flashcards
FINCSTP
FDECSTP
FFREE
FINIT
FNINIT
FCLEX
FNCLEX
FSTCW
FNSTCW
FLDCW
FSTENV
FNSTENV
FLDENV
FSAVE
FNSAVE
FRSTOR
FSTSW
FNSTSW
WAIT/FWAIT
FNOP
FINCSTP zwiększenie rejestru wskaźnika stosu koprocesora
FDECSTP zmniejszenie rejestru wskaźnika stosu koprocesora
FFREE zwolnienie rejestru zmiennoprzecinkowego
FINIT inicjalizacja koprocesora po sprawdzeniu zgłoszenia błędu numerycznego
FNINIT inicjalizacja koprocesora bez sprawdzenia zgłoszenia błędu numerycznego
FCLEX zerowanie flag błędów numerycznych po sprawdzeniu zgłoszenia błędu numerycznego
FNCLEX zerowanie flag błędów numerycznych bez sprawdzenia zgłoszenia błędu numerycznego
FSTCW zapamiętanie rejestru sterowania po sprawdzeniu zgłoszenia błędu numerycznego
FNSTCW zapamiętanie rejestru sterowania bez sprawdzenia zgłoszenia błędu numerycznego
FLDCW wczytanie rejestru sterowania
FSTENV zapamiętanie środowiska koprocesora po sprawdzeniu zgłoszenia błędu numerycznego
FNSTENV zapamiętanie środowiska koprocesora bez sprawdzenia zgł. błędu numerycznego
FLDENV wczytanie środowiska koprocesora
FSAVE zapamiętanie zawartości koprocesora po sprawdzeniu zgłoszenia błędu numerycznego
FNSAVE zapamiętanie zawartości koprocesora bez sprawdzenia zgłoszenia błędu numerycznego
FRSTOR wczytanie zawartości koprocesora
FSTSW zapamiętanie rejestru stanu po sprawdzeniu zgłoszenia błędu numerycznego
FNSTSW zapamiętanie rejestru stanu bez sprawdzenia zgłoszenia błędu numerycznego
WAIT/FWAIT czekanie na koprocesor
FNOP nic nie robi
FXSAVE
FXRSTOR
EMMS
LDMXCSR
STMXCSR
FXSAVE zapisanie stanu x87 FPU i rejestrów SIMD
FXRSTOR wczytanie stanu x87 FPU i rejestrów SIMD
EMMS zwalnia wszystkie rejestry koprocesora
LDMXCSR wczytanie rejestru MXCSR
STMXCSR zapisanie rejestru MXCSR
PAVGB
PAVGW
PEXTRW
PINSRW
PMAXUB
PMAXSW
PMINUB
PMINSW
PMOVMSKB
PMULHUW
PSADBW
PSHUFW
PAVGB oblicza średnią z elementów wektorów bajtów bez znaku
PAVGW oblicza średnią z elementów wektorów słów bez znaku
PEXTRW wydobycie słowa
PINSRW wstawienie słowa
PMAXUB oblicza maksimum z elementów wektorów bajtów bez znaku
PMAXSW oblicza maksimum z elementów wektorów słów ze znakiem
PMINUB oblicza minimum z elementów wektorów bajtów bez znaku
PMINSW oblicza minimum z elementów wektorów słów ze znakiem
PMOVMSKB przesłanie maski bajtów
PMULHUW mnożenie wektorów słów bez znaku i zapamiętanie starszych słów
wyniku
PSADBW oblicza sumę wartości bezwzględnych różnic
PSHUFW tasuje słowa w rejestrze MMX
XGETBV
Czyta do edx:eax zawartość rozszerzonego rejestru
kontrolnego o indeksie ecx.
FCOM
FCOMI
FICOM
FCOM - przecinki flagi c0,c1 itd
FCOMI - przecinki + eflags
FICOM - całkowite
LOCK
LOCK:
-niepodzielne instrukcje
-bit test: bts, btr, btc
-zamiana: xchg, cmpxchg, cmpxchg8b, cmpxchg16b
-dodawania: add, adc, xadd
-odejmowanie: sub, sbb
-inkrementacja: inc, dec
-logiczne: and, or, xor, not, neg
VMOV[D/Q]
Instrukcja przesłania
vmovd xmm1, r/m32 xmm1 ← r/m32
vmovq xmm1, r/m64 xmm1 ← r/m64
vmovq xmm1, xmm2/m64 xmm1 ← xmm2/m64
vmovd r/m32, xmm1 r/m32 ← xmm1
vmovq r/m64, xmm1 r/m64 ← xmm1
vmovq xmm1/m64, xmm2 xmm1/m64 ← xmm2
VMOVD / VMOVQ przesyła podwójne lub poczwórne słowo z rejestru ogólnego przeznaczenia/pami ęci
do rejestru xmm lub odwrotnie. Używany jest jeden najmłodszy element rejestru xmm, starsze elementy
są zerowane
VMOVDQ[A/U]
do ilu wyrownanie?
vmovdq[a/u] xmm1, xmm2/m128
vmovdq[a/u] ymm1, ymm2/m256
vmovdq[a/u] xmm2/m128, xmm1
vmovdq[a/u] ymm2/m256, ymm1
Przesyła całą zawartość (128 lub 256 bitów) źródła do celu, jeśli celem lub źródłem jest pamięć,
wówczas w wersji (A) dane w pamięci muszą być wyrównane (ang. aligne) do granicy 16 (m128) lub 32
(m256) bajtów, w przeciwnym wypadku zgłaszany jest wyjątek ochrony pamięci. Aby przesłać dane do/z
niewyrównanych lokalizacji pamięci należy w instrukcji zamiast (A) użyć (U) (ang. unaligne) .
cel (r) ← źródło (r/m) cel (r/m) ← źródło
VMOVNTDQ[A]
vmovntdqa xmm1, m128 cel (r) ← źródło (m)
vmovntdqa ymm1, m256
vmovntdq m128, xmm1 cel (m) ← źródło (r)
vmovntdq m256, ymm1
Przesyła całą zawartość z/do pamięci m128/m256 do/z rejestru xmm1/ymm1.
Dla instrukcji w wersji (A) pamięć musi być wyrównana (ang. aligne) do granicy 16 (m128) lub 32 (256)
bajtów, w przeciwnym wypadku zgłaszany jest wyjątek ochrony pamięci, alternatywnie można zastosować
instrukcję bez litery A. NT oznacza (non-temporal hint) przesłanie z pominięciem pamięci podręcznej
(cache).
VLDDQU
vlddqu xmm1, m128
vlddqu ymm1, m256
Ładuje 256/128 bitowe dane całkowite z niewyrównanej pamięci do rejestru celu
VPMOVMSKB
vpmovmaskb reg, xmm1 rejestr ← xmm1
vpmovmaskb reg, ymm1 rejestr ← ymm1 (AVX2)
Przesyła najstarsze bity (bity znaku) każdego bajtu rejestru xmm1/ymm1 po kolei do rejestru r32/r64,
dla xmm przenosi 16 bitów do r32, dla ymm przenosi 32 bity do r64, pozostałe starsze bity są zerowane.
VPMOV[S/Z]XB[W/D/Q], VPMOV[S/Z]XW[D/Q]
VPMOV[S/Z]XDQ
vpmov[s/z]xbw xmm1, xmm2/m64
vpmov[s/z]xbd xmm1, xmm2/m32
vpmov[s/z]xbq xmm1, xmm2/m16
40
VPMOV[S/Z]XB[W/D/Q], VPMOV[S/Z]XW[D/Q]
VPMOV[S/Z]XDQ
vpmov[s/z]xwd xmm1, xmm2/m64
vpmov[s/z]xwq xmm1, xmm2/m32
vpmov[s/z]xdq xmm1, xmm2/m64
Instrukcja zamienia (konwertuje) ze znakiem / bez znaku:
bajty na słowa/podwójne słowa/poczwórne słowa, słowa na podwójne słowa/poczwórne słowa,
podwójne słowa na poczwórne słowa przepisując odpowiednio wartości z młodszej części rejestru
xmm2/(m64||m32||m16) do rejestru celu xmm1.
W AVX2 młodsza część rejestru ymm
VMASKMOVDQU
vmaskmovdqu xmm1, xmm2
Celem jest obszar 16 bajtów pamięci adresowany przez DS: DI / EDI / RDI.
Bajty ze źródła xmm1 są przesyłane do celu pod warunkiem, że siódme bity (bity znaku) odpowiadających
im bajtów z xmm2 są jedynkami.
xmm2 = maska
if xmm2[i][7] = 1 then m128[i] = xmm1[i]
i – jest numerem bajtu
VPMASKMOV[D/Q]
vpmaskmov[d/q] xmm1, xmm2, m128
vpmaskmov[d/q] ymm1, ymm2, m256
vpmaskmov[d/q] m128, xmm1, xmm2
vpmaskmov[d/q] m256, ymm1, ymm2
Przesyła podwójne/poczwórne słowa z pamięci m128/m256 lub xmm2/ymm2 do rejestru celu xmm2/ymm2
lub pamięci m128/m256 , pod warunkiem, że bit znaku odpowiadających wartości z rejestru maski (drugi
operand) xmm2/ymm2 lub xmm1/ymm1 jest ustawiony na jeden, w przeciwnym wypadku zapisuje zero.
if źródło1[i][31/63] == 1 then cel[i] ← źródło2[i] else cel[i] ← 0
Bity od 128/256 do MSB są zerowane
VPACK[S/U]SWB
vpack[s/u]swb xmm1, xmm2, xmm3/m128
vpack[s/u]swb ymm1, ymm2, ymm3/m256 (AVX2)
Konwertuje słowa ze znakiem na bajty ze znakiem (S) / bez znaku(U), z rejestru xmm2 / ymm2 wpisuje
do młodszych części rejestru xmm1, a z xmm3/m128 / ymm3/ m256 wpisuje do starszych części rejestru
xmm1/ ymm1. Starsza część rejestru ymm1 jest wypełniana danymi ze starszych części rejestrów hi ymm2 i
hi ymm3/m256. Wynik jest zapisywany ze znakiem(S) / bez znaku(U) oraz z nasyceniem.
VPACK[S/U]SDW
vpack[s/u]sdw xmm1, xmm2, xmm3/m128
vpack[s/u]sdw ymm1, ymm2, ymm3/m256 (AVX2)
Konwertuje podwójne słowa ze znakiem na słowa ze znakiem(S)/bez znaku(U), z rejestru xmm2/ lo
ymm2 wpisuje do młodszych części rejestru xmm1/ lo ymm1, z xmm3/m128 / lo ymm3/ lo m256 wpisuje
do starszych części rejestru celu xmm1/lo ymm1. Starsza część rejestru ymm1, jest wypełniana danymi ze
starszych części rejestrów hi ymm2 oraz hi ymm3/m256. Wynik jest zapisywany ze znakiem(S) / bez
znaku(U) oraz z nasyceniem
VPUNPCKLBW
vpunpcklbw xmm1, xmm2, xmm3/m128
vpunpcklbw ymm1, ymm2, ymm3/m256 (AVX2)
Młodsze bajty ze 128 bitowych części rejestru ymm2 (xmm2) oraz ymm3 (xmm3)/m256(m128) zapisuje z
przeplotem do rejestru celu ymm1/xmm1
VPUNPCKHBW
vpunpckhbw xmm1, xmm2, xmm3/m128
vpunpckhbw ymm1, ymm2, ymm3/m256 (AVX2)
Starsze bajty ze 128 bitowych części rejestru ymm2 (xmm2) oraz ymm3 (xmm3)/m256(m128) zapisuje z
przeplotem do rejestru celu ymm1/xmm1.
VEXTRACTI128
vextracti128 xmm1/m128, ymm2, imm8 (AVX2)
Przepisuje 128 bitów z rejestru ymm2 do rejestru xmm1 lub m128. Jeśli zerowy bitu bajtu sterującego
imm8[0] = o przepisuje młodszą część, a jeśli imm8[0] = 1 przepisuje starszą część rejestru ymm2.
VINSERTI128
vinserti128 ymm1, ymm2, xmm3/m128, imm8 (AVX)
Przepisuje cały rejestr ymm2 do ymm1 następnie przepisuje rejestr xmm3 lub m128 również do rejestru
celu ymm1 zależnie od ustawienia bitu bajtu sterującego: imm8[0] = 0 przepisuje xmm3/m128 na młodszą
część, gdy imm8[0] = 1 na starszą część celu ymm1
VPSHUFB
vpshuf b xmm1, xmm2, xmm3/m128
vpshuf b ymm1, ymm2, ymm3/m256 (AVX2)
Tasuje bajty z xmm2/ymm2, w zależności od bitu znaku kolejnych bajtów rejestru xmm3/m128 /
ymm3/m256. Jeśli bit znaku jest ustawiony odpowiedni bajt rejestru celu xmm1/ymm1 jest zerowany, jeśli
bit znaku xmm3/ymm3 / m128/m256 nie jest ustawiony wówczas z takiego bajtu jest tworzony 4 bitowy
indeks wskazujący numer bajtu ze 128-bitowej części, który ma być przepisany z xmm2/ymm2 do
właściwego xmm1/ymm1.
i = numer bajtu
if xmm3/m128[i][7] == 1 then xmm1[i] = 0
else { index[3..0] = xmm3/m128[i][3..0]
xmm1[i] = xmm2[index]
}
VPSHUFD
vpshufd xmm1, xmm2/m128, imm8
vpshufd ymm1, ymm2/m256, imm8 (AVX2)
Tasuje podwójne słowa z rejestru xmm2/m128/ymm2/m256 według dwubitowych wartości bajtu sterującego imm8 (argument
kolejności), wynik zapisuje w xmm1/ymm1, tasowanie odbywa się w blokach 128 bitowych
VPSHUFLW
vpshuf lw xmm1, xmm2/m128, imm8 (AVX)
vpshuf lw ymm1, ymm2/m256, imm8 (AVX2)
Tasuje wektory młodszych słów z rejestru xmm2/ymm2 według dwubitowych wartości bajtu sterującego
imm8 (argument kolejności), wynik zapisuje odpowiednio w xmm1/ymm1
VPERMD
vpermd ymm1, ymm2, ymm3/m256 (AVX2)
Wykonuje permutacje wektorów podwójnych słów z rejestru ymm3/m256 według porządku podanego w ymm2, najmłodsze
3 bity odpowiedniego podwójnego słowa rejestru ymm2 wyznaczają, z którego miejsca w ymm3/m256 zostanie skopiowane
podwójne słowo do miejsca położenia „adresu” (ymm2). Wynik jest zapisywany w ymm1.
VPERMQ
vpermq ymm1, ymm2/m256, imm8 (AVX2)
Wykonuje permutacje wektorów poczwórnych słów z rejestru ymm2/m256 według porządku
określonego w imm8, kolejne dwubitowe pola imm8 określają, spod którego indeksu „adresu” zostaną
skopiowane poczwórne słowa z ymm2/m56. Wynik jest zapisywany do ymm1.
VPERM2I128
vperm2i128 ymm1, ymm2, ymm3/m256, imm8 (AVX2)
Wykonuje permutacje dwóch wektorów 128 bitowych z rejestrów ymm2 oraz ymm3/m256, bajt sterujący
imm8 odpowiada za sposób przepisania, pola imm8[5:4] i imm8[1:0] są indeksami wskazującymi skąd
należy pobrać starszą i młodszą część rejestru celu, bity imm8[7 ] = 1 i imm8[3] = 1 powodują
wyzerowanie starszej i młodszej części.
VPBLENDVB
vpblendvb xmm1, xmm2, xmm3/m128, xmm4 (AVX)
vpblendvb ymm1, ymm2, ymm3/m256, ymm4 (AVX2)
Miesza wektory bajtów z rejestru xmm2/ymm2 oraz xmm3/ymm3 lub m128/m256 według bitu znaku
każdego bajtu w xmm4/ymm4, wynik zapisuje w xmm1/ymm1.
i <o, 15> lub <o, 31> - indeks bajtu
if źródło3 [i][7] = 1 => cel[i] = źródło2[i]
else cel[i] = źródło1[i]
if xmm4 [i][7] = 1 => xmm1[i] = xmm3/m128[i]
else xmm1l[i] = xmm2[i]
if ymm4[i][7] = 1 => ymm1[i] = ymm3/m256[i]
else ymm1[i] = ymm2[i]
78
Bity od 128/256 do MSB są zerowane
VPBLENDW
vpblendw xmm1, xmm2, xmm3/m128, imm8 (AVX)
vpblendw ymm1, ymm2, ymm3/m256, imm8 (AVX2)
W oparciu o bajt kontrolny miesza wektory słów; wybiera elementy wektora z rejestru xmm3/ymm3 lub
m128/m256 dla imm8[i] = 1, albo elementy wektora xmm2/ymm2 dla imm8[i] = 0. Dla indeksu 8-15 należy
wziąć imm8[i-8]. Wynik zapisuje w xmm1/ymm1.
i <o, 7> lub <o, 15> - indeks słowa
if imm8[i modulo 8] = 1 then cel[i] = źródło2[i]
else cel[i] = źródło1[i]
if imm8[i]= 1 then xmm1[i] = xmm3/m128[i]
else xmm1l[i] = xmm2[i]
if imm8[i modulo 8] = 1 then ymm1[i] = ymm3/m256[i]
else ymm1[i] = ymm2[i]
80
Bity od 128/256 do MSB są zerowane
VPBLENDD
vpblendd ymm1, ymm2, ymm3/m256, imm8 (AVX2)
Miesza wektory podwójnych słów z rejestru ymm2 oraz ymm3 lub m256, w oparciu o specyfikację z bajtu
kontrolnego imm8, wynik zapisuje w ymm1.
i <o, 7> - indeks podwójnego słowa
if imm8[i] = 1 then cel[i] = źródło2[i]
else cel[i] = źródło1[i]
if imm8[i] = 1 then ymm1[i] = ymm3/m256[i]
else ymm1[i] = ymm2[i]
82
Bity od 128/256 do MSB są zerowane
VPGATHER[D/Q][D/Q]
Instrukcja kompletuje wektor xmm1/ymm1 używając
adresów w postaci podwójnych/poczwórnych słów
zdefiniowanych w vm32[x/y]/vm64[x/ y] używając jako
indeksów podwójnych/poczwórnych słów zapisanych w
xmm2/ymm2 do wskazanej lokalizacji pamięci skąd
pobierane są wartości podwójnego/poczwórnego słowa.
Pobierane z pamięci wartości są zapisywane do rejestru celu
xmm1/ymm1 tylko wówczas gdy najstarsze bity
odpowiednich elementów wektora maski xmm3/ymm3 są
równe 1.
Bity od 128/256 do MSB są zerowane.
vpgatherdd xmm1, vm32x, xmm3
vpgatherqd xmm1, vm64x, xmm3
vpgatherdd ymm1, vm32y, ymm3
vpgatherqd ymm1, vm64y, ymm3
vpgatherdq xmm1, vm32x, xmm3
vpgatherqq xmm1, vm64x, xmm3
vpgatherqq ymm1, vm32y, ymm3
vpgatherqq ymm1, vm64y, ymm3
W opisie instrukcji vm32x wskazuje wektor czterech 32-bitowych
wartości adresów dla konkretnego xmm, vm32y wektor
ośmiu 32- bitowych wartości indeksów dla konkretnego ymm.
Notacja vm64x i vm64y wskazuje analogicznie
na maksymalnie dwa lub cztery adresy
Działanie instrukcji gather
Pobiera z pamięci o wskazanej lokalizacji określonej tu jako adres_fizyczny wartości
podwójnych/poczwórnych słów i zapisuje je do rejestru celu ymm1/xmm1 tylko wówczas gdy bit znaku
odpowiadającego elementu maski ymm3/xmm3 jest równy jeden, jeśli bit znaku jest równy zero w rejestrze
celu zostaje wartość poprzednia. Po wykonaniu operacji pobierania z pamięci elementy maski są zerowane.
if xmm3[i][63/31] then xmm1[i] ← [adres_fizyczny(xmm2[i])]
if ymm3[i][63/31] then ymm1[i] ← [adres_fizyczny(ymm2[i])]
Różnica pomiędzy instrukcjami
gather a blend/perm/shuf
Instrukcje blend/perm/shuf operują na rejestrach,
zatem najpierw należy załadować dane
z pamięci do rejestru ymm/xmm.
Instrukja gather pobiera dane bezpośrednio z pamięci,
jednak wcześniej trzeba przygotować rejestr indeksów
(rejestr porządku).
VPADDUS[B/W]
vpaddusb xmm1, xmm2, xmm3/m128
vpaddusb ymm1, ymm2, ymm3/m256 (AVX2)
Dodawanie bez znaku wektorów bajtów/słów rejestru xmm2/ymm2 i xmm3/ymm3 lub pamięci
m128/m256, wynik jest zapisywany z nasyceniem w rejestrze xmm1/ymm1.
cel[i] = źródło1[i] + źródło2[i]
xmm1[i] = xmm2[i] + xmm3/m128[i]
ymm1[i] = ymm2[i] + ymm3/m256[i]
101
VPADDUS[B/W]
Bity od 128/256 do MSB są zerowane
VPHADDW / VPHADDD / VPHADDSW
vphaddd xmm1, xmm2,ymm3/m128
vphaddd ymm1, ymm2,ymm3/m256
Horyzontalne dodawanie sąsiednich słów/podwójnych słów i zapisywanie wyniku z przeplotem po 64 bity. Jako najmłodsze
są zapisywane sumy z rejestru xmm2. Ostatnia w/w instrukcja jest dodawaniem słów z nasyceniem.
VPHSUBW / VPHSUBD / VPHSUBSW
vphsubd xmm1, xmm2, xmm3/m128
vphsubd ymm1, ymm2, ymm3/m256
Horyzontalne odejmowanie sąsiednich słów/podwójnych słów w ramach 128-bitowych części. Od
młodszego elementu wektora jest odejmowany starszy oraz jako najmłodsze są zapisywane różnice z
rejestru xmm2. Ostatnia instrukcja jest odejmowaniem słów z nasyceniem
VPSADBW
vpsadbw xmm1, xmm2, xmm3/m128
vpsadbw ymm1, ymm2, ymm3/m256 (AVX2)
Od wartości wektorów bajtów rejestru xmm2/ymm2 są odejmowane odpowiednie wartości rejestru
xmm3/ymm3 lub pamięci m128/m256, następnie obliczane są wartości absolutne i ich sumy po 8
elementów, wynik jest zapisywany w rejestrze xmm1/ymm1 dla zestawów 8-elementowych