Intel 8087
# Intel 8087

Der Intel 8087 ist eine in NMOS-Technologie (HMOS III, 3 µm) gefertigte Gleitkommaeinheit (englisch floating point unit, kurz FPU). Intel entwickelte den 8087 im Jahr 1980 als x87-Koprozessor für die 8086-, 8088-, 80186- und 80188-Prozessoren.

## Eigenschaften und Verwendung

Der 8087 ist die erste von Intel entworfene Gleitkommaeinheit für 16-Bit-Prozessoren. Er entlastet den Hauptprozessor bei Gleitkommazahlen-Berechnungen. Ohne Koprozessor lösen diese Gleitkommabefehle eine CPU-Exception aus, die für hauptprozessorbasierte Software-Emulation des Koprozessors durch Programme oder durch das Betriebssystem genutzt werden können. Rechnungen mit Einsatz des 8087 sind 75- bis 100-mal schneller als bei emuliertem Koprozessor. Der 8087 enthält 45.000 Transistoren, hat 68 Befehle und es gibt ihn für Taktfrequenzen bis 5 (8087), 8 (8087-2) oder 10 MHz (8087-1).

Alle Modelle des 8087 wurden mit einem 40-poligen Dual in-line package (DIP) ausgeliefert und arbeiten bei einer Betriebsspannung von 5 V, die maximale Leistungsaufnahme betrug etwa 2,38 W (475 mA, bei 10 MHz) und lag damit über den max. 1,84 W des Intel 8086 (bei 8 MHz). Im Gegensatz zu späteren Koprozessoren, wie dem 80287, musste der 8087 mit der gleichen Frequenz wie die CPU getaktet werden. Die folgende Tabelle listet die, ebenfalls von späteren FPUs abweichende, Produktbezeichnung und deren maximale Taktfrequenzen auf:

| Modell | max. Takt |
| - | - |
| Intel 8087 | 05 MHz |
| Intel 8087-1 | 10 MHz |
| Intel 8087-2 | 08 MHz |
| Intel 8087-3 | 04 MHz |
| Intel 8087-6 | 06 MHz |

* Architektur des Intel D8087 bzw. Intel D80287
* Foto des Dies eines Intel D8087

Auf dem Motherboard des IBM-PC befindet sich ein freier IC-Sockel, in den ein 8087 zur Aufrüstung gesteckt werden kann.

Der 8087 konnte auch in den Bridgeboards für den Amiga verwendet werden. Der 8087 wurde zu einem Zeitpunkt entwickelt, in dem der IEEE 754-Standard zur Darstellung festgelegt wurde.

Nachfolgemodelle des 8087 sind der 80287, i387 und i487. Seit dem i486DX haben Intel-Prozessoren eine integrierte Gleitkommaeinheit.

## Gleitkomma-Operationen in Programmen

Zu Zeiten des 8086 kam ein Großteil der Programme ohne Gleitkomma-Operationen aus, für einen weiteren Teil spielten Gleitkomma-Operationen nur eine geringe Rolle, die Anwesenheit einer FPU wurde meist nicht beachtet. Betriebssysteme wie MS-DOS nutzten nur Ganzzahlarithmetik und stellten keine Emulation zur Verfügung. Es gab allerdings auch FPU-Emulatoren, die als Gerätetreiber oder TSR-Programm geladen werden konnten und dann allen Anwendungsprogrammen zur Verfügung standen.

Für die Einbindung von Programmen mit signifikanten Gleitkommaanteilen (CAD-Programme, selbst geschriebene Rechenprogramme) gab es mehrere Möglichkeiten:

* Die Programme setzten eine FPU voraus, ohne FPU waren sie nicht lauffähig. Für Prozessoren ab dem 80286 gab es FPU-Software-Simulatoren, die vorher als TSR-Programme zu installieren waren und die solche Programme lauffähig machten, natürlich bei teilweise drastisch reduzierter Performance.
* Gleitkommabefehle wurden als Funktionsaufrufe einkodiert. Eine eventuell vorhandene FPU wurde zumindest in diesem Compilat nicht berücksichtigt. Ohne FPU war die Performance allerdings deutlich besser als die aller FPU-emulierenden Versionen, da die Laufzeitinterpretation einer Emulation einen erheblichen Aufwand verursachte, der sich bei Installationen von Speichermanagern wie HIMEM.sys oder EMM386.sys noch mal deutlich erhöhte.
* Die Programme wurden mit FPU-Code kompiliert. Eine fehlende FPU erzeugte Exceptions, die vom Programm selbst abgefangen und emuliert wurden (ab 80286).
* Die Programme reservierten 11 IRQs und bauten anstelle von FPU-Code IRQ-Code ein. Während der Laufzeit wurde der Code je nach FPU (keine, 8087, 80287+) entweder als IRQ belassen, in 8087-kompatiblen Code mit notwendigen FWAITs umgepatcht oder in 80287-kompatiblen Code ohne FWAIT umgepatcht.

    OpcodesCompilatEmulation808780287+ Gleitkommabefehl D8 xx ...CD 34 xx ...CD 34 xx ...9B D8 xx ... (FWAIT + Opcode)90 D8 xx ... (NOP + Opcode) Gleitkommabefehl D9 xx ...CD 35 xx ...CD 35 xx ...9B D9 xx ... (FWAIT + Opcode)90 D9 xx ... (NOP + Opcode) Gleitkommabefehl DA xx ...CD 36 xx ...CD 36 xx ...9B DA xx ... (FWAIT + Opcode)90 DA xx ... (NOP + Opcode) Gleitkommabefehl DB xx ...CD 37 xx ...CD 37 xx ...9B DB xx ... (FWAIT + Opcode)90 DB xx ... (NOP + Opcode) Gleitkommabefehl DC xx ...CD 38 xx ...CD 38 xx ...9B DC xx ... (FWAIT + Opcode)90 DC xx ... (NOP + Opcode) Gleitkommabefehl DD xx ...CD 39 xx ...CD 39 xx ...9B DD xx ... (FWAIT + Opcode)90 DD xx ... (NOP + Opcode) Gleitkommabefehl DE xx ...CD 3A xx ...CD 3A xx ...9B DE xx ... (FWAIT + Opcode)90 DE xx ... (NOP + Opcode) Gleitkommabefehl DF xx ...CD 3B xx ...CD 3B xx ...9B DF xx ... (FWAIT + Opcode)90 DF xx ... (NOP + Opcode) Segment Override 36, 2E, 26: SS:, CS:, ES:, gefolgt von weiterem Opcode CD 3C pp, CD 3y ... CD 3C pp, CD 3y ... 90 90 9B, pp Dy ... (2× NOP + FWAIT, Prefix + nächster Opcode) 90 90 90, pp Dy ... (2× NOP + NOP, Prefix + nächster Opcode) Synchronisation CPU wartet auf FPU: 9B FWAIT CD 3D90 90 (2× NOP)90 9B (NOP + FWAIT)90 9B (NOP + FWAIT) Spezialbefehle von Borland für sin, cos, exp, log, ... CD 3E ss xxCD 3E ss xx ?? ??

## Literatur und Datenblätter

* Christian Reinsch: Der Arithmetik-Prozessor INTEL 8087: eine komplette Implementierung des vorgeschlagenen IEEE-Standards für Gleitpunktarithmetik, „Elektronische Rechenanlagen“, 23 (1981), Heft 4, S. 173–178 (doi:10.1524/itit.1981.23.16.173).
* Datenblatt: 8087 Math Coprozessor, Intel Corporation, Oktober 1989.
