- x87
-
x87 bezeichnet eine Untermenge des Befehlssatzes der x86-Architektur für Gleitkommaberechnungen. Es ist die älteste Befehlssatzerweiterung für diese Architektur. Ihre Befehle sind nicht notwendig, um funktionierende Programme zu erzeugen, aber sie bieten Hardwareimplementierungen für häufige numerische Aufgaben, die damit wesentlicher schneller erledigt werden. Beispielsweise enthält der x87-Befehlssatz Befehle, die den Sinus und Kosinus eines Wertes berechnen. Bevor die x87-Befehle von den Prozessoren verarbeitet werden konnten, mussten Compiler oder Programmierer langsame Software-Bibliotheksprozeduren aufrufen, um derartige Gleitkommaoperationen durchzuführen. Diese Vorgehensweise ist in vielen preiswerten eingebetteten Systemen noch immer häufig notwendig. Alternativ wird in Systemen, die keine Gleitkommaeinheit aufweisen, Festkommaarithmetik eingesetzt, da diese in Integer-Recheneinheiten effizient implementiert werden kann.
Bis einschließlich des Intel 80486 wurden die x87-Befehle durch einen separaten Koprozessor, nach dem 80486 meist im Hauptprozessor implementiert. Der Koprozessor musste gesondert erworben werden und konnte in den dafür vorgesehenen Sockel auf der Hauptplatine eingesetzt werden. Gegenüber der Emulation durch Software war die Fließkommarechnung auf einer 80x87-FPU 75- bis 100-mal schneller.[1]
Der Begriff x87 wird immer noch verwendet, um die Untermenge des Befehlssatzes zu bezeichnen, die ursprünglich in den x87-Koprozessoren verarbeitet wurde. Seit der Einführung von SSE2 haben x87-Einheiten viel von ihrer früheren Bedeutung verloren. Für Berechnungen, die eine Mantisse von 64 Bit erfordern, wie sie mit den 80 Bit breiten x87-Registern möglich ist, sind sie aber weiterhin wichtig.
Inhaltsverzeichnis
Implementierung
Die x87-Familie verwendet keine direkt adressierbaren Register wie die Hauptregister der x86-Prozessoren; stattdessen bilden die x87-Register einen acht Stufen tiefen Stack, der von st0 bis st7 läuft. Die x87-Befehle arbeiten, indem sie Werte auf den Stack legen, dort für Berechnungen verwenden und sie wieder herunternehmen. Der x87-Koprozessor funktioniert daher ähnlich wie Taschenrechner, die für umgekehrte polnische Notation ausgelegt sind. Zweistellige Operationen wie FADD, FMUL, FCOM und so weiter können jedoch entweder st0 oder st1 implizit adressieren, oder alternativ st0 zusammen mit einem anderen Register oder einem Speicheroperanden verwenden. st0 kann daher als Akkumulator (ein Register, das sowohl Zielregister ist, als auch einen Operanden enthält) verwendet werden und es kann auch mit einem anderen Stackregister mit Hilfe des Befehls fxch st(x) getauscht werden. Der x87-Stack kann also als sieben frei adressierbare Register und als ein Akkumulator verwendet werden. Das ist besonders auf superskalaren x86-Prozessoren (wie den Pentiums ab 1993) nützlich, wo diese Exchange-Befehle so optimiert sind, dass sie nachfolgende FPU-Instruktionen nicht verzögern. Dazu wird für jeden exch-Befehl nicht die FPU, welche die folgenden Gleitkommaoperationen behandelt, sondern ein anderes Rechenwerk benutzt.
Die im Pentium MMX eingeführte Erweiterung der X86-Architektur namens MMX verwendet die gleichen physischen Register wie die Gleitkommaeinheit. Dies vereinfachte die Markteinführung von MMX, da bei einem Taskwechsel keine zusätzlichen Register gesichert werden müssen und somit keine Anpassungen im Betriebssystem für MMX notwendig sind. Es ist Aufgabe des Anwendungsprogrammes, den Prozessor vom x87- in den MMX-Modus und wieder zurück zu schalten. Allerdings sind diese Moduswechsel vergleichsweise langsam, so dass Intel und AMD bei den späteren Befehlserweiterungen (SSE und Nachfolger) einen anderen Weg gingen.
IEEE-Kompatibilität
Die x87-Befehle sind kompatibel mit der Norm IEEE 754. Der Gleitkommaprozessor kann Gleitkommazahlen mit einfacher Genauigkeit (32 Bit,
float
oderreal
in den meisten Sprachen) doppelter Genauigkeit (64 Bit,double
) oder vollen 80 Bit (long double
oderextended
) verarbeiten. Da die Prozessoren intern die vollen 80 Bit verwenden (um den Erhalt von Genauigkeit über viele Berechnungen zu ermöglichen), werden Rundungen jedoch nicht genau so durchgeführt, wie die strikten 32- und 64-Bit-Formate des IEEE 754 es verlangen, sofern nicht ein spezieller Rundungsmodus über ein Statusregister eingestellt ist. Eine Folge von arithmetischen Operationen kann sich daher leicht abweichend von strengen IEEE-754-Formaten verhalten.[2]Unterschiede im Ergebnis einer Berechnungskette können sich auch allein durch die Aktivierung der Optimierung beim Kompilieren ergeben.[3] Eine optimierte Version eines Programms wird also ein (in der Regel geringfügig) anderes Ergebnis liefern als eine nicht optimierte Version, wie sie oft zum Debuggen verwendet wird.
x87-Koprozessoren von Intel
Siehe auch: Liste der x86er-Koprozessoren8087
Der 8087 war der erste mathematische Koprozessor für 16-Bit-Prozessoren von Intel (der I8231 war älter, aber für den 8-Bit-8080 entworfen); er wurde gebaut, um mit dem 8088 und dem 8086 zusammen verwendet zu werden.
80287
Der 80287 (i287) war der mathematische Koprozessor für die Intel-80286-Serie. Intel und seine Konkurrenten führten später den 80287XL ein, der eigentlich ein 80387XS mit einer zum 80287 kompatiblen Pinbelegung war. Der 80287XL enthielt einen 3/2-Multiplizierer, damit Hauptplatinen, die den Koprozessor mit zwei Drittel der CPU-Geschwindigkeit betrieben, stattdessen die Gleitkommaeinheit mit der gleichen Geschwindigkeit wie die CPU betreiben konnten.
Der 80287 und 80287XL funktionierten auch mit dem 80386 und waren bis zur Einführung des 80387 1987 die einzigen für den 80386 erhältlichen Koprozessoren. Außerdem konnten sie auch mit dem Cyrix Cx486SLC eingesetzt werden. Jedoch wurde für beide Prozessoren aus Performancegründen und wegen der besseren Möglichkeiten des Befehlssatzes der 80387 bevorzugt.
Folgende Modelle des 80287 wurden hergestellt:
- i80287-3 (6 MHz)
- i80287-6 (6 MHz)
- i80287-8 (8 MHz)
- i80287-10 (10 MHz)
- i80287-12 (12,5 MHz)
- i80287XL (12,5 MHz, 387SX-Kern)
- i80287XLT (12,5 MHz, Laptop-Version)
80387
Der 80387 (387 oder i387) war der erste Intel-Koprozessor, der vollständig mit der IEEE-754-Norm kompatibel war. Bei seiner Einführung 1987, volle zwei Jahre nach dem 80386, war der i387 wesentlich schneller als der 80287 und enthielt deutlich verbesserte trigonometrische Funktionen. (Der 80827 hatte für sie nur Argumente zwischen −45 und +45 Grad erlaubt.)
Der i387 wurde mit CMOS-III-Technologie in 1,5 µm gefertigt. Sein Die war 7 mm × 7,5 mm groß.
Versionen
Vom i387 wurden später drei weitere Versionen hergestellt:
- i387DX
Der i387DX wurde 1989 eingeführt und war nur mit dem 386DX-Prozessor kompatibel. Er wurde mit CHMOS-IV-Technologie in 1,0 µm produziert. Der Die des 387DX war 5,5 mm × 5,5 mm groß.
- i387SX
Der i387 war nur mit dem Standard-80386, der einen 32-Bit-Prozessorbus hatte, kompatibel. Der spätere, kostenreduzierte i386SX mit einem schmaleren 16-Bit-Datenbus konnte nicht mit dem 32-Bit-Bus des i387 zusammengeführt werden. Der i386SX erforderte daher einen eigene Variante des Koprozessors, nämlich den i387SX, der mit dem schmaleren Bus des SX kompatibel war.
Wie der i387DX wurde auch der i387SX mit CHMOS-IV-Technologie in 1,0 µm gefertigt.
- i387SL Mobile
Diese speziell für i386SL-Prozessoren gedachte und ebenfalls mit CHMOS-IV-Technologie produzierte Variante wurde 1992 auf den Markt gebracht und verfügt wie der i386SL über ein integriertes Power-Management.
Der i387DX und der i387SX konnten in einem zum Systemtakt asynchronen Takt (*0,8 bis *1,25) betrieben werden.
80487
Der i487 ist ein FPU-Koprozessor für den i486SX. Er war grundsätzlich ein vollständiger i486DX-Chip. Wurde er in einem i486SX-System eingebaut, schaltete der i487 den Hauptprozessor aus und übernahm sämtliche CPU-Operationen. Theoretisch konnte ein solcher Computer auch dann arbeiten, wenn der eigentliche i486SX-Prozessor entfernt worden wäre. In der Praxis verhinderte ein Pin auf dem i487 jedoch die Benutzung als vollwertigen i486.
Siehe auch
Literatur
- Intel Corporation: IA-32 Intel Architecture Software Developer's Manual Volume 1: Basic Architecture, order number 253665-017
- Intel Corporation: IA-32 Intel Architecture Software Developer's Manual Volume 2a: Instruction Set Reference A-M, order number 253666-017
Weblinks
Commons: X87-Koprozessoren – Sammlung von Bildern, Videos und Audiodateien- Coprocessor.info : x86 Coprocessor development & history knowledge
- Everything you always wanted to know about math coprocessors
Einzelnachweise
- ↑ STEVE FARRER; Intel Corporation (Hrsg.): High Speed Numerics with the 80186/80188 and 8087. APPLICATION NOTE 258, 1986 (PDF, 270 kb).
- ↑ David Monniaux, The pitfalls of verifying floating-point computations, to appear in ACM TOPLAS
- ↑ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=323
Kategorien:- Intel-Prozessor
- Prozessorarchitektur
Wikimedia Foundation.