Streaming SIMD Extension (SSE)
ST0, ST1, ST2, ..., ST7 zorganizowane w stos (LIFO).
ST0 zawsze wskazuje na szczyt stosu. Nowe liczby są dodawane na szczyt stosu, a pozostałe przesuwane w dół.
Wszystkie instrukcje FPU poprzedzone są przedrostkiem F.
FLD [mem32/64/80 st(n)] - umieszcza liczbę zmiennoprzecinkową pojedynczej, podwójnej lub rozszerzonej precyzji na szczycie stosu.FILD [mem16/32/64] - konwertuje liczbę całkowitą (16, 32 lub 64 bitową w pamięci) do zmiennoprzecinkowej i umieszcza na stosie.FLDZ - załaduj zero. st(0) = 0.0FLD1 - załaduj 1. st(0) = 1.0FLDPI - załaduj pi.FLDL2T - załaduj log2(10)FLDL2E - załaduj log2(e)FLDLG2 - załaduj log(2)=log10(2)FLDLN2 - załaduj ln(2)Instrukcje które zdejmują wartość ze stosu mają przyrostek P, jeżeli zdejmują dwie wartości to PP
FST [mem32/64/80 STn] - zapisz do pamięci lub rejestru STn liczbę z ST0.FSTP [mem32/64/80] - zapisz liczbę z ST0 w pamięci i zdejmij ją ze stosu. (ST1 jest przesuwany do ST0)FIST [mem16/32] - konwertuj ST0 do liczby całkowitej i zapisz do pamięci.FISTP [mem16/32/64] - jak wyżej, tylko ze zdjęciem ze stosu.FXCH STn - zamień ST0 z STn.Wynik działań jest zawsze umieszczany w jednym z rejestrów.
FADD [mem32/64] | ST0 += mem |
FADD STn | ST0 += STn |
FADD STn, ST0 | STn += ST0 |
FADDP STnFADDP STn, ST0 | STn += ST0. Następnie zdejmuje ST0 ze stosu. |
FIADD [mem32/64] | ST0 += mem. Dodaje liczbę całkowitą znajdującą się w pamięci. |
FSUB [mem32/64] | ST0 -= mem |
FSUB STn | ST0 -= STn |
FSUB STn, ST0 | STn -= ST0 |
FSUBP STnFSUBP STn, ST0 | STn -= ST0. Następnie zdejmuje ST0 ze stosu. |
FISUB [mem32/64] | ST0 -= mem. Odejmuje liczbę całkowitą znajdującą się w pamięci. |
FSUBR [mem32/64] | ST0 = mem- ST0 |
FSUBR STn | ST0 = STn - ST0 |
FSUBR STn, ST0 | STn = ST0 - STn |
FSUBRP STnFSUBRP STn, ST0 | STn = ST0 - STn. Następnie zdejmuje ST0 ze stosu. |
FISUBR [mem32/64] | ST0 = mem - ST0. Odejmuje od liczby całkowitej znajdującej się w pamięci wartość ST0. |
FMUL, składnia identyczna jak w dodawaniu.FDIV, składnia identyczna jak w odejmowaniu prostym.FDIVR, składnia identyczna jak w odejmowaniu odwrotnym.Przykład
Plik asemblerowy
Plik C
FABS (bez argumentów) zastępuje st(0) jego wartością bezwzględną.FCHS: st(0) := -st(0).FSQRT: st(0) := SQRT[ st(0) ]FRNDINT: st(0) := (int)st(0).FSIN - st(0) := sinus [st(0)]FCOS - st(0) := kosinus [st(0)]FSINCOS - st(0) := kosinus [st(0)], st(1) := sinus [st(0)]FPTAN - partial tangent = tangens st(0) := tg [st(0)]FPATAN - arcus tangens st(0) := arctg [st(0)]FYL2X st(1) := st(1)*log2[st(0)] i zdejmijFYL2XPI st(1) := st(1)*log2[ st(0) + 1.0 ] i zdejmij F2XM1 st(0) := 2^[st(0)] - 1FPU control word pozwala na zmianę ustawień FPU

FPU status word zawiera aktualny stan FPU:

WAIT/FWAIT - czekaj, aż FPU skończy pracę. Używane do synchronizacji z CPU. FINIT/FNINIT - inicjalizacja FPU, przywraca FPU do domyślnego stanu: ustawia flagi, czyści stos. FLDCW, FSTCW/FNSTCW - Load/Store control word
- zapisuje 16 kontrolnych bitów do pamięci,
gdzie można je zmieniać na przykład aby zmienić sposób zaokrąglania liczb.FSTSW/FNSTSW - zapisz do pamięci (lub rejestru AX) słowo statusu, czyli stan FPUFCLEX/FNCLEX - wyczyść wyjątkiFLDENV, FSTENV/FNSTENV - wczytaj/zapisz środowisko (rejestry stanu,
kontrolny i kilka innych, bez rejestrów danych). Wymaga 14 albo 28 bajtów pamięci, w zależności
od trybu pracy procesora (rzeczywisty - DOS lub chroniony - Windows/Linux).FRSTOR, FSAVE/FNSAVE - jak wyżej, tylko że z rejestrami danych. Wymaga 94
lub 108 bajtów w pamięci, zależnie od trybu procesora.FINCSTP, FDECSTP - zwiększ/zmniejsz wskaźnik stosu - przesuń st(0)
na st(7), st(1) na st(0) itd. oraz w drugą stronę, odpowiednio.FFREE - zwolnij podany rejestr danychFNOP - no operation. Nic nie robi, ale zabiera czas.FPU oprócz rejestrów danych zawiera także rejestr
kontrolny (16 bitów) i rejestr stanu (16 bitów).
W rejestrze stanu są 4 bity nazwane
C0, C1, C2 i C3. To one wskazują wynik ostatniego porównania, a układ ich jest taki sam,
jak flag procesora, co pozwala na ich szybkie przeniesienie do flag procesora.
Aby odczytać wynik porównania, należy przenieść rejestr flag z koprocesora do procesora:
fcom ; porównujemy fstsw ax ; kopiujemy rejestr flag koprocesora do ax sahf ; AH zapisane do flag
Następnie możemy używać rozkazów skoków tak jak dla liczb całkowitych bez znaku: JE, JB itp.
FCOM st(n)/[mem] - porównaj st(0) z st(n)
(lub zmienną w pamięci) bez zdejmowania st(0) ze stosu FPUFCOMP st(n)/[mem] - porównaj st(0) z st(n)
(lub zmienną w pamięci) i zdejmij st(0)FCOMPP - porównaj st(0) z st(1) i zdejmij oba ze stosuFICOM [mem] - porównaj st(0) ze zmienną
całkowitą 16- lub 32-bitową w pamięciFICOMP [mem] - porównaj st(0) ze zmienną
całkowitą 16- lub 32-bitową w pamięci, zdejmij st(0)FCOMI st(0), st(n) - porównaj st(0) z st(n)
i ustaw flagi procesora, nie tylko FPUFCOMIP st(0), st(n) - porównaj st(0) z st(n)
i ustaw flagi procesora, nie tylko FPU, zdejmij st(0)Komendy kończące się na I lub IP zapisują swój wynik bezpośrednio do flag procesora.
Można tych flag od razu używać (JZ, JA, ...). Te komendy są
dostępne od Pentium Pro.
FTST porównuje st(0) z zerem.
FXAM bada, co jest w st(0) - prawidłowa liczba, błąd
(NaN = Not a Number), czy 0.
| Rodzaj liczby | C3 | C2 | C0 |
|---|---|---|---|
| Błędna liczba | 0 | 0 | 0 |
| NaN | 0 | 0 | 1 |
| Zwykła liczba skończona | 0 | 1 | 0 |
| Nieskończoność | 0 | 1 | 1 |
| Zero | 1 | 0 | 0 |
| Pusty rejestr | 1 | 0 | 1 |
| Liczba zdenormalizowana | 1 | 1 | 0 |
Rejest C1 zawiera znak liczby w ST0