X87

**x87** tarkoittaa Intelin IA-32-yhteensopivan x86-sarjan suorittimien käyttämiä matematiikkasuorittimia (FPU) ja niiden käyttämää konekieltä.

Matematiikkasuoritin oli erikseen ostettava apusuoritin, joka liitettiin varsinaisen suorittimen rinnalle emolevylle. Jokainen suoritinmalli vaati erillisen, sen kanssa yhteensopivan matematiikkasuorittimen. Esimerkiksi Intel 8086 käytti Intel 8087 -matematiikkasuoritinta, 80286 80287-matematiikkasuoritinta jne.

Intel i486 oli ensimmäinen suoritin, jossa matematiikkasuoritin integroitiin samalle piisirulle. Siitä oli myös halvempi rinnakkaismalli i486SX, joka ei sisältänyt matematiikkasuoritinta, mutta jonka rinnalle sai erikseen sellaisen ostaa. Kuitenkin kaikki Intelin matematiikkasuorittimet sisälsivät pääasiassa samat ominaisuudet ja niiden käyttämä konekieli oli sama.


KL Intel C80287.jpg | Intel C80287 6 MHz versio
80386with387.JPG | Intel i386 ja i387 DX
KL Intel i487SX.jpg | Intel i487 SX


## Arkkitehtuuri

x87 FPU on IA-32 suorittimesta erillinen suoritusympäristö. Se sisältää kahdeksan liukulukurekisteriä, rekisterit, jotka osoittavat viimeisen suoritettuun käskyyn ja dataan ja tila- ja ohjausrekistereitä. x87 suorittaa käskyjä suorittimen lukemasta käskyvirrasta.

x87:n liukulukurekisterit ovat 80 bittiä leveitä, mikä vastaa laajennetun kaksoistarkkuuden (*double extended-precision*) liukulukua. Muut mahdolliset liukulukumuodot ovat 24-bittiä (yksinkertainen tarkkuus) ja 53-bittiä (kaksinkertainen tarkkuus). Lisäksi käskykanta tukee BCD-koodattuja kokonaislukuja. Kaikki luetut luvut (myös kokonaisluvut) muunnetaan laajennetun kaksoistarkkuuden luvuiksi rekistereihin ladattaessa. Muistiin tallennettavat luvut muunnetaan takaisin haluttuun muotoon.

x87 käyttää rekistereitä pinona. Latauskäsky lataa luvun pinon päälle ja tallennus tallentaa päällimmäisen luvun. Kuitenkin suorittimessa on käskyt, joilla muillakin kuin päällimmäisellä luvulla voidaan laskea. Kaikki viittaukset rekistereihin tapahtuvat suhteessa päällimmäiseen rekisteriin. Jos rekisteriin ladataan ylimääräinen luku, kierähtää rekisteripino ympäri. Tällöin nostetaan keskeytys pinon yli/alivuodosta.

Koska matematiikkasuoritin on erillinen yleiskäyttöisestä suorittimesta, sen rekistereihin eivät vaikuta aliohjelmakutsut, jotka tallentavat normaalit rekisterit. Matematiikkasuorittimen tila on tallennettava erikseen FSAVE/FNSAVE -käskyillä jos se halutaan tehdä.

Pentium Pro -mallista (P6-perhe) lähtien x87-konekieli tukee ehdollisia haarautumisia ja ehdollisia siirtoja kahden liukuluvun vertailulla. Intelin Pentium MMX uusilla MMX-SIMD-käskyllä otti x87-FPU:n rekisterit MMX-käskyjen käyttöön. Käytettäessä MMX-käskyjä ja x87-liukulukukäskyjä sekaisin täytyy ohjelmoijan erityisesti hallita suorittimen toimintatilaa.
Intelin Pentium III (1999) sisälsi uuden SSE-käskykannan, joka mahdollisti liukulukujen rinnakkaisen vektorilaskennan uusissa 128-bittisissä rekistereissä, tosin käskykanta tuki ainoastaan 32-bitin tarkkuuden liukulukuja. SSE2-käskykanta Pentium 4:ssa (2001) laajensi vektorikäskyt 64-bitin tarkkuuden liukuluvuille.
SSE2 ei täysin korvannut x87-käskykantaa, toisaalta sitä harvemmin käytetään sen hitauden vuoksi.

## Lähteet