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.