![]() |
Inštrukcie FPU |
![]() |
![]() |
Na dnešných procesoroch je spolu s CPU integrovaná aj jednotka operácií s číslami s
pohyblivou desatinnou rádovou čiarkou, ktorá sa nazýva FPU (Floating-Point Unit). Je
to vlastne matematický koprocesor pre procesor triedy x87. Programové ovládanie FPU je
totožné s ovládaním predchádzajúcich typov matematických koprocesorov.
Typy dát spracovávaných FPU
FPU pracuje s ôsmimi rôznymi typmi dát. Prvé dva typy sú zhodné s typmi, ktoré
používa procesor bez FPU.
· 16 bitové celé číslo (Word Integer) je celé číslo so znamienkom uložené v 16
bitovom slove v dvojkovom doplnkovom kóde.
· 32 bitové celé číslo (Short Integer) je číslo so znamienkom ulžené v 32 bitovom
dvojslove v dvojkovom doplnkovom kóde.
· 64 bitové celé číslo (Long Integer) je číslo so znamienkom uložené v 64 bitovom
objekte v dvojkovom doplnkovom kóde.
· Zhustené BCD číslo (Packed BCD) je 18 BCD číslic (viď obr.) so znamienkom v 80
bitoch. Znamienko je uložené v najvyššom bite rovnako ako pri celých číslach.
· 32 bitové reálne číslo (Single Precision) je uložené podľa štandardu IEEE.
· 64 bitové reálne číslo (Double Precision) je uložené podľa štandardu IEEE.
· 80 bitové reálne číslo (Expanded Precision) je uložené podľa štandardu IEEE.
FPU interne ukladá a spracováva len 80 bitové reálne čísla. Ostatné tvary sú
použité na vstupe a výstupe FPU a FPU ich interne prevádza do a z 80 bitových
reálnych čísel.
79 | 78 | 64 |
63 | 0 |
Sign-Znamienko | Exponent |
Significand- Mantisa |
Reálne čísla sú uložené podľa štandardu IEEE 754 (Institute
of Electrical and Electronic Engineers). Objekt, v ktorom je
uložené reálne číslo, je rozdelený do troch častí. Najvyšší bit je označený
písmenom S a slúži ako znamienkový. V prípade, že je nulový, číslo je uložené v
objekte kladné. Časť označená ako „Exponent” obsahuje informáciu o veľkosti
čísla a „Mantisa” uchováva číslice čísla.
Do mantisy sa ukladajú významné binárne číslice. Neukladajú sa
nevýznamné nuly nachádzajúce sa naľavo od poslednej nenulovej číslice. Aby sa
šírka mantisy využila čo najviac, ukladá sa v normalizovanom tvare, t.j. prvá
významná číslica je umiestnená v najvyššom bite. Z toho vyplýva, že v najvyššom
bite musí byť vždy jednotka, okrem prípadu, keď je v objekte uložené číslo nula.
Pokiaľ tento prípad považujeme za špeciálny, môže byť presnosť rozšírená o
jeden bit tak, že binárnu jednotku najvyššieho rádu do objektu neukladáme.
„Mantisa” 16 a 32 bitových reálnych čísel teda podľa štandardu IEEE obsahuje v
najvyššom bite druhú významnú číslicu. V 80 bitovom reálnom čísle nie je
najvyššia významná číslica ignorovaná.
„Mantisa” vyjadruje číslo v tvare 1.xxxxxxx. „Exponent” potom
určuje počet binárnych rádov o ktoré musíme desatinnú čiarku posunúť, aby sme
získali požadované číslo. Pokiaľ je exponent záporný, desatinnú čiarku posúvame
doľava a naopak. Matematicky je možné číslo vyjadriť ako Mantisa x 2Exponent.
„Exponet” je celé číslo a môže byť buď kladný, alebo
záporný. Nie je vyjadrený v dvojkovom doplnkovom kóde, ako by sa dalo predpokladať,
ale v kóde posunutej nuly. Pokiaľ je priestor pre uloženie exponentu 8 bitový (Single
Precision), je k zapisovanému číslu pričítaná hodnota 7Fh (127). To znamená, že
nula bude zapísaná ako 7Fh, jednotka ako 80h, atď.. Ak je priestor pre uloženie
exponentu 11 bitový (Double Precision), k zapisovanému číslu sa pričíta 3FFh (1023)
a keď je exponent 15 bitový, pričíta sa 3FFFh (16383). Pri čítaní čísla
zapísaného v takomto tvare musíme pripočítavanú konštantu odčítať.
Aj keď sa tento spôsob ukladania čísla zdá byť na prvý pohľad
zbytočne komplikovaný, má jednu významnú výhodu, ktorá spočíva v jednoduchom
znamienkovom porovnávaní dvoch reálnych čísel bez ohľadu na ich šírku. Obe reálne
čísla začneme porovnávať od znamienkového (najvyššieho) bitu smerom k najnižším
bitom objektu. Akonáhle nájdeme dvojicu nezhodujúcich sa bitov, zistíme, ktoré z
čísel je numericky vyššie.
Nasleduje niekoľko príkladov pre osvojenie si princípu zápisu
reálneho čísla pomocou IEEE formátu.
Výsadné symboly
Nula (Zero) môže byť kladná, alebo záporná. FPU
bežne produkuje kladnú nulu.
Nekonečno (Infinity) môže byť (rovnako ako nula)
zapísané ako kladné, alebo záporné. Pokiaľ by sme obe nekonečná porovnávali, tak
by sme vzhľadom na vyššie uvedené skutočnosti zistili, že kladné nekonečno je
väčšie ako záporné.
Nenormalizované číslo sa pripúšťa len vtedy, keď
potrebuje zapísať číslo, ktorého absolútna hodnota je vyššia ako je exponent
schopný zobraziť. Potom doplnením nevýznamných ľavostranných núl do mantisy
môžeme číslo ešte (v absolútnej hodnote) zmenšiť na úkor presnosti. O čísle
musí byť známe, že je zapísané v nenormalizovanom tvare, aby sa nedoplňovala
jednotka do najvyššieho rádu mantisy.
Nečíselné hodnoty (Not a Number) sa uvádzajú pod
skratkou NaN. Pretože nie sú povolené všetky kombinácie bitov čísla zapísaného vo
formáte IEEE, sú nepovolené kombinácie označené NaN a FPU takéto vstupné hodnoty
odmietne. Nečíselné hodnoty sú rozdelené do dvoch skupín: neohlasované (Quiet) a
ohlasované (Signaling). Do neohlasovaných patria čísla s mantisou v rozmedzí od
100...01 do 111...11 a do ohlasovaných čísla od 100...01 až 101...11. Obe skupiny
majú exponent 111...11.
Neurčitá hodnota (Indefinite) je určená pre každý
typ čísla, vrátane celočíselných. Bežne je celočíselná hodnota predstavovaná
najväčším záporným číslom v absolútnej hodnote. V reálnych formátoch je
neurčitá hodnota tvorená exponentom obsahujúcim samé jednotky a mantisou obsahujúcou
110...00.
Výnimky FPU
Pokiaľ FPU detekuje chybu pri výpočte, procesor na tento stav odpovedá generovaním
výnimky 16. FPU dokáže detekovať niekoľko rôznych chýb. Konkrétny druh chýb sa
oznamuje v stavovom registri FPU. Zoznam možných chýb:
I - invalid operation
- chybná operácia je detekovaná rozpoznaním NaN, nepodporovaného formátu čísla,
nepovolenou operáciou (väčšinou sú to operácie s nulou, resp. s nekonečnom), alebo
preplnením zásobníka. V prípade, že je prerušenie maskované, vracia ako výsledok
neohlasovanej NaN nedefinované celé číslo, alebo BCD.
D – denormalized
- nenormalizovaný výsledok je zapríčinený hodnotou výsledku, ktorá je v absolútnej
hodnote menšia ako číslo zobraziteľné najmenším záporným normalizovaným
číslom. V prípade, že je prerušenie maskované, výpočet pokračuje normálne
ďalej.
Z - divide by zero
- delenie nulou nastane vtedy ak je deliteľ nula a delenec je rôzny od nekonečna alebo
nuly. V prípade, že je prerušenie maskované, výsledok je nekonečno.
O - numeric overflow
- preplnenie (pretečenie) je detekované vtedy, ak je výsledok väčší ako maximálne
zobraziteľné číslo v použitom formáte. V prípade, že je prerušenie maskované,
výsledok je najväčšie možné konečné číslo, alebo nekonečno.
U - numeric underflow
- nenaplnenie (podtečenie) nastane pri nenulovom výsledku operácie, ktorý je natoľko
malý, že ho nie je možné v danom formáte dát zapísať. V prípade, že je
prerušenie maskované, výsledok je nenormalizované číslo, alebo nula.
P - precision
- nepresný výsledok nastane vtedy, ak FPU nebola schopná vypočítať výsledok s
požadovanou presnosťou. Výsledok je zaokrúhlený podľa riadiaceho registra. V
prípade, že je prerušenie maskované, výpočet pokračuje ďalej.
Registre FPU
FPU obsahuje osem dátových 80 bitových registrov a tri 16 bitové
pomocné registre (riadiaci, stavový a doplňujúci).
Dátové registre sú očíslované 0 až 7. Každý má kapacitu 80 bitov a slúži na
uloženie spracovávaného čísla v ľubovolnom formáte. Skupina registrov môže byť
použitá buď ako zásobník, alebo ako jednotlivo adresované registre.
79 | 78 | 64 |
63 | 0 |
Tag Bits | Sign-Znamienko | Exponent |
Significand- Mantisa |
XX | FPR0 | ||
XX | FPR1 | ||
XX | FPR2 | ||
XX | FPR3 | ||
XX | FPR4 | ||
XX | FPR5 | ||
XX | FPR6 | ||
XX | FPR7 |
Pokiaľ sa používa skupina registrov ako zásobník, potom je v
stavovom registri v položke „vrchol” číslo registra, ktorý je práve na vrchole
zásobníka - t.j. číslo registra, do ktorého bola operáciou vloženia do zásobníka
(PUSH) zápísaná posledná hodnota. Operácia vloženie do zásobníka najprv zníži
hodnotu premennej „vrchol” o jedna a potom do registra určeného obsahom tejto
premennej zapíše hodnotu. Operácia výberu zo zásobníka najprv vyberie hodnotu z
registra určeného obsahom premennej „vrchol” a potom pripočíta k obsahu tejto
premennej jedna.
Register, ktorý je práve na vrchole zásobníka, je označovaný
ST(0) alebo iba ST. Keď ukazuje premenná „vrchol” napríklad na register číslo 2,
potom ST(0) znázorňuje register číslo 2, ST(1) register číslo 3, ... ST(5) register
číslo 7, ST(6) register číslo 0 a ST(7) register číslo 1.
Osem dátových registrov je skutočne implementovaných ako zásobník
a nie ako kruhový front. Preto pokiaľ je do zásobníka vložených viac ako 8
operandov, generuje FPU prerušenie chybná operácia (v stavovom registri je nastavené
SF - chyba zásobníka a C1 - preplnenie). Prerušenie sa generuje aj v tom prípade, keď
je zo zásobníka vybraných viac ako osem položiek.
Riadiaci register nastavuje niektoré parametre pre výpočty v FPU:
· RC (Rouding Control)
- riadi zaokrúhľovanie výsledkov. Možné kombinácie:
00b - zaokrúhlenie na najbližšie číslo
01b - zaokrúhlenie nadol (smerom k zápornému nekonečnu)
10b - zaokrúhlenie nahor (smerom ku kladnému nekonečnu)
11b - odseknutie
Implicitne je RC nastavené na 00b.
· PC (Precision Control)
- stanovuje presnosť výsledku, ktorá môže byť znížená za účelom zvýšenia
rýchlosti výpočtu. Možné kombinácie:
00b - 24 bitov (Single Precision)
01b - nepoužité
10b - 53 bitov (Double Precision)
11b - 64 bitov (Extended Precision)
Implicitne je PC nastavené na 11b.
· PM (Precision Mask)
nastavené na 11b maskuje prerušenie vyvolané nepresným výsledkom.
· UM (Underflow Mask)
nastavené na 11b maskuje prerušenie vyvolané nenaplnením.
· OM (Overflow Mask)
nastavené na 11b maskuje prerušenie vyvolané preplnením.
· ZM (Divide by zero Mask)
nastavené na 11b maskuje prerušenie vyvolané delením nulou.
· DM (Denormalized Mask)
nastavené na 11b maskuje prerušenie vyvolané nenormalizovaným výsledkom.
· IM (Invalid operation Mask)
nastavené na 11b maskuje prerušenie vyvolané chybnou operáciou.
Stavový register obsahuje stav o FPU a zaznamenáva informáciu o
vzniknutej chybe tak, aby rutina obsluhy INT 16 mohla bližšie upresniť príčinu
prerušenia.
B (Busy) je zachovávaný pre kompatibilitu s koprocesorom 8087. Neodráža
aktuálny stav FPU, obsahuje rovnakú hodnotu ako bit ES.
C3, C2, C1, C0 (Condition Ci) sú štyri bity príznakov nastavovaných podľa
výsledku prevedenej operácie.
„vrchol” (Top) je trojbitová hodnota uchovávajúca číslo dátového
registra, ktorý je práve na vrchole zásobníka.
ES (Error Summary) je programovým duplikátom signálu FERR. Oznamuje, že nastalo
prerušenie, ktoré bolo vyvolané jednou z nemaskovaných chybových príčin.
SF (Stack Fault) upresňuje, že chybná operácia bola vyvolaná chybou v
zásobníku. Pokiaľ je tento bit nastavený, je pri preplnení zásobníka C1 nastavené
na 1 a pri nenaplnení zásobníka na 0.
PE, UE, OE, ZE, DE, IE - každý z týchto bitov oznamuje, že prerušenie nastalo
po výskyte príslušnej chyby. Jednotlivé bity zodpovedajú bitom riadiaceho registra,
ktoré na rozdiel od stavového registra jednotlivé prerušenia maskujú.
Doplňujúci register obsahuje doplňujúce informácie o každom z dátových
registrov. Každému z ôsmich datových registrov sú vyhradené dva bity (TAG BITS).
Možné kombinácie:
00b - správny obsah registra
01b - nula
10b - nekonečno, NaN, nenormalizované číslo, alebo chybný formát
11b - prázdny
Komunikácia procesora a FPU
Inštrukcie určené pre FPU (podobne ako pre koprocesor v starších
typoch procesorov) sú v inštrukčnom toku spoločne s inštrukciami pre procesor.
Akonáhle procesor rozpozná, že inštrukcia je určená pre FPU (prvých 5 bitov je
11011), odovzdá ju na V/V bránu určenú na odovzdávanie príkazpu FPU (800000F8h).
Potom procesor normálne pokračuje v spracovávaní inštrukčného toku. Pokiaľ FPU
požaduje viac informácií (t.j. ďalšiu slabiku operačného kódu alebo slabiku
operandu), nastaví signál PEREQ (Processor Extension Request) do aktívnej úrovne. Na
základe toho si procesor prečíta V/V bránu na odovzdávanie príkazov FPU, aby zistil,
čo FPU potrebuje. Pokiaľ FPU vyžaduje preniesť dáta, odovzdá ich procesor
prostredníctvom dátovej V/V brány (800000fCh).
Počas doby vykonávania inštrukcia je nastavená aktívna úroveň
signálu BUSY, ktorý informuje procesor o tom, že FPU nie je schopná príjmať ďalšie
príkazy. V takom prípade procesor čaká na dokončenie činnosti FPU.