Intel 8087 - Intel 8087

Intel 8087
Intel C8087.jpg
Intel 8087 Mathe-Coprozessor
Allgemeine Information
Gestartet 1980
Vermarktet von Intel , IBM
Entworfen von Intel
Gängige Hersteller
Performance
max. CPU- Taktrate 4 MHz bis 10 MHz
Architektur und Klassifizierung
Mindest. Feature-Größe 3 μm
Befehlssatz x87 ( Coprozessorerweiterung von x86-16 )
Physikalische Spezifikationen
Transistoren
Pakete)
Geschichte
Vorgänger 8231/8232
Nachfolger 80287

Der 1980 angekündigte Intel 8087 war der erste x87- Gleitkomma- Coprozessor für die 8086- Mikroprozessorlinie.

Der Zweck des 8087 bestand darin, Berechnungen für Gleitkomma- Arithmetik wie Addition , Subtraktion , Multiplikation , Division und Quadratwurzel zu beschleunigen . Es berechnete auch transzendente Funktionen wie exponentielle , logarithmische oder trigonometrische Berechnungen, und außer Gleitkommazahlen konnte es auch mit großen binären und dezimalen ganzen Zahlen arbeiten. Die Leistungssteigerungen betrugen je nach Anwendungsfall ca. 20 % bis über 500 %. Der 8087 könnte etwa 50.000 FLOPS mit etwa 2,4 Watt leisten  . Nur arithmetische Operationen profitierten von der Installation eines 8087; Computer, die nur mit Anwendungen wie der Textverarbeitung verwendet werden, würden beispielsweise nicht von den zusätzlichen Kosten (ca. 150 US-Dollar) und dem Stromverbrauch eines 8087 profitieren.

Die von Intel 8087

Der 8087 war für seine Zeit ein fortschrittlicher IC, der die Grenzen der Fertigungstechnologie dieser Zeit ausreizte. Die Anfangsrenditen waren extrem niedrig.

Die Verkäufe des 8087 erhielten einen deutlichen Schub, als IBM einen Coprozessorsockel auf dem IBM PC- Motherboard einbaute. IBM bot den 8087 wegen Chipmangels erst nach sechs Monaten auf dem Markt als Option für den PC an. Die Entwicklung des 8087 führte zum IEEE 754-1985- Standard für Gleitkomma-Arithmetik. Später gab es x87- Coprozessoren für 80186 (nicht in PC-kompatiblen Prozessoren verwendet), 80286-, 80386- und 80386SX-Prozessoren. Beginnend mit dem 80486 verwendeten die späteren Intel x86- Prozessoren keinen separaten Gleitkomma-Coprozessor; Gleitkommafunktionen wurden in den Prozessor integriert bereitgestellt.

Intern fehlte dem Chip ein Hardware-Multiplikator und es wurden Berechnungen mit dem CORDIC- Algorithmus implementiert .

Design und Entwicklung

Intel hatte zuvor die 8231 Arithmetic Processing Unit und den 8232 Floating Point Prozessor hergestellt . Diese wurden für die Verwendung mit 8080 oder ähnlichen Prozessoren entwickelt und verwendeten einen 8-Bit-Datenbus. Sie wurden entweder über programmierte E/A oder einen DMA- Controller an ein Hostsystem angeschlossen .

Der 8087 wurde ursprünglich von Bill Pohlman konzipiert, dem Engineering Manager bei Intel, der die Entwicklung des 8086-Chips beaufsichtigte. Bill unternahm Schritte, um sicherzustellen, dass der 8086-Chip einen noch zu entwickelnden mathematischen Chip unterstützen könnte.

1977 erhielt Pohlman den Startschuss, den 8087-Mathematikchip zu entwickeln. Bruce Ravenel wurde als Architekt zugewiesen und John Palmer wurde als Co-Architekt und Mathematiker für das Projekt engagiert. Die beiden entwickelten ein revolutionäres Design mit 64 Bit Mantisse und 16 Bit Exponent für die längste reelle Zahl, mit einer Stack-Architektur-CPU und acht 80-Bit-Stack-Registern mit einem rechenintensiven Befehlssatz. Das Design löste einige herausragende bekannte Probleme in der numerischen Berechnung und numerischer Software: Rundungsfehlerprobleme wurden für 64-Bit-Operanden beseitigt und numerische Modusumwandlungen wurden für alle 64-Bit-Zahlen gelöst. Palmer schrieb William Kahans Schriften über Gleitkommazahlen als einen bedeutenden Einfluss auf ihr Design zu.

Das Design des 8087 fand in Santa Clara aufgrund seines aggressiven Designs zunächst eine kühle Aufnahme. Schließlich wurde das Design an Intel Israel übertragen und Rafi Nave wurde beauftragt, die Implementierung des Chips zu leiten. Palmer, Ravenel und Nave erhielten Patente für das Design. Robert Koehler und John Bayliss erhielten auch ein Patent für die Technik, bei der einige Befehle mit einem bestimmten Bitmuster auf den Coprozessor ausgelagert wurden.

Der 8087 hatte 45.000 Transistoren und wurde als 3 µm Depletion-Load- HMOS- Schaltung hergestellt. Es arbeitete mit dem 8086 oder 8088 zusammen und führte ungefähr 60 neue Anweisungen ein . Die meisten 8087-Assembly- Mnemoniken beginnen mit F, wie FADD, FMUL, FCOM usw., wodurch sie leicht von 8086-Befehlen unterschieden werden können. Die binären Codierungen für alle 8087-Befehle beginnen mit dem Bitmuster 11011, dezimal 27, das gleiche wie das ASCII- Zeichen ESC, jedoch in den höherwertigen Bits eines Bytes; ähnliche Befehlspräfixe werden manchmal auch als „ Escape-Codes “ bezeichnet. Die von Intel für diese Coprozessorbefehle zugewiesene Befehlsmnemonik ist "ESC".

Wenn die 8086- oder 8088-CPU den ESC-Befehl ausführte, wenn das zweite Byte (das ModR/M-Byte) einen Speicheroperanden spezifizierte, würde die CPU einen Buszyklus ausführen, um ein Wort aus der in der Anweisung angegebenen Speicherstelle zu lesen (unter Verwendung eines beliebigen 8086 Adressierungsmodus), aber er würde den gelesenen Operanden nicht in einem CPU-Register speichern oder irgendeine Operation darauf ausführen; der 8087 würde den Bus beobachten und den Befehlsstrom synchron mit dem 8086 decodieren, wobei er die für sich selbst bestimmten Coprozessorbefehle erkennt. Bei einem 8087-Befehl mit einem Speicheroperanden würde der 8087 das von der Haupt-CPU gelesene Datenwort vom Datenbus nehmen, wenn der Befehl das Lesen des Operanden erforderte. Wenn der zu lesende Operand länger als ein Wort ist, kopiert der 8087 auch die Adresse vom Adressbus; dann würde der 8087 nach Beendigung des von der CPU gesteuerten Datenlesezyklus sofort DMA verwenden, um die Kontrolle über den Bus zu übernehmen und die zusätzlichen Bytes des Operanden selbst zu übertragen. Wenn ein 8087-Befehl mit einem Speicheroperand das Schreiben dieses Operanden erfordert, ignoriert der 8087 das gelesene Wort auf dem Datenbus und kopiert einfach die Adresse, fordert dann DMA an und schreibt den gesamten Operanden auf die gleiche Weise wie beim Lesen das Ende eines erweiterten Operanden. Auf diese Weise behielt die Haupt-CPU die allgemeine Kontrolle über das Bus- und Bus-Timing, während der 8087 alle anderen Aspekte der Ausführung von Coprozessor-Befehlen behandelte, mit Ausnahme von kurzen DMA-Perioden, in denen der 8087 den Bus zum Lesen oder Schreiben von Operanden auf/ aus eigenen internen Registern. Als Folge dieses Designs konnte der 8087 nur mit Operanden arbeiten, die entweder aus dem Speicher oder aus seinen eigenen Registern entnommen wurden, und jeglicher Datenaustausch zwischen dem 8087 und dem 8086 oder 8088 erfolgte nur über RAM.

Das Haupt-CPU-Programm wurde weiter ausgeführt, während der 8087 einen Befehl ausführte; aus Sicht der Haupt-8086- oder 8088-CPU dauerte ein Coprozessor-Befehl nur so lange wie die Verarbeitung des Opcodes und eines eventuellen Speicheroperandenzyklus (2 Taktzyklen für keinen Operanden, 8 Taktzyklen plus die EA-Berechnungszeit [5 bis 12 Takt] Zyklen] für einen Speicheroperanden [plus 4 weitere Taktzyklen bei einem 8088], um das zweite Byte des Operandenworts zu übertragen), wonach die CPU mit der Ausführung der nächsten Anweisung des Programms beginnen würde. Somit war ein System mit einem 8087 zu echter Parallelverarbeitung fähig, indem es eine Operation in der ganzzahligen ALU der Haupt-CPU durchführte, während gleichzeitig eine Gleitkommaoperation im 8087-Coprozessor ausgeführt wurde. Da der 8086 oder 8088 ausschließlich den Befehlsfluss und das Timing steuerte und keinen direkten Zugriff auf den internen Status des 8087 hatte und der 8087 nur einen Befehl gleichzeitig ausführen konnte, wurden Programme für das kombinierte 8086/8087- oder 8088/8087-System musste sicherstellen, dass der 8087 Zeit hatte, die letzte an ihn erteilte Anweisung zu vervollständigen, bevor eine weitere erteilt wurde. Der WAIT-Befehl (der Haupt-CPU) wurde zu diesem Zweck bereitgestellt, und die meisten Assembler aktivierten implizit einen WAIT-Befehl vor jeder Instanz der meisten Gleitkomma-Koprozessorbefehle. (Es ist nicht erforderlich, einen WAIT-Befehl vor einem 8087-Vorgang zu verwenden, wenn das Programm andere Mittel verwendet, um sicherzustellen, dass zwischen der Ausgabe von zeitabhängigen 8087-Befehlen genügend Zeit vergeht, sodass der 8087 niemals einen solchen Befehl empfangen kann, bevor er den vorherigen abgeschlossen hat Es ist auch nicht erforderlich, wenn ein WAIT verwendet wird, dass es dem nächsten 8087-Befehl unmittelbar vorangeht.) Der WAIT-Befehl wartete darauf, dass der −TEST-Eingangspin des 8086/8088 aktiviert wurde (low), und dieser Pin war an den BUSY-Pin des 8087 in allen Systemen angeschlossen, die einen 8087 hatten (also wurde TEST aktiviert, wenn BUSY deaktiviert wurde).

Da die Befehls-Prefetch-Warteschlangen des 8086 und 8088 die Zeit, zu der ein Befehl ausgeführt wird, nicht immer gleich der Zeit macht, zu der er abgerufen wird, kann ein Coprozessor wie der 8087 nicht bestimmen, wann ein Befehl für sich selbst der nächste auszuführende Befehl ist durch Beobachten des CPU-Busses. Der 8086 und der 8088 haben zwei Warteschlangenstatussignale, die mit dem Coprozessor verbunden sind, um ihm zu ermöglichen, sich mit dem internen Zeitablauf der CPU zur Ausführung von Befehlen aus seiner Vorabrufwarteschlange zu synchronisieren. Der 8087 unterhält seine eigene identische Prefetch-Warteschlange, aus der er die Coprozessor-Opcodes liest, die er tatsächlich ausführt. Da die Prefetch-Warteschlangen 8086 und 8088 unterschiedliche Größen und unterschiedliche Verwaltungsalgorithmen haben, bestimmt der 8087, an welchen CPU-Typ er angeschlossen ist, indem er eine bestimmte CPU-Busleitung beobachtet, wenn das System zurückgesetzt wird, und der 8087 passt seine interne Befehlswarteschlange entsprechend an. Die redundante Duplizierung der Prefetch-Warteschlangenhardware in der CPU und dem Coprozessor ist in Bezug auf den Energieverbrauch und die gesamte Chipfläche ineffizient, erlaubte jedoch der Coprozessorschnittstelle, nur sehr wenige dedizierte IC-Pins zu verwenden, was wichtig war. Zu der Zeit, als der 8086, der die Coprozessor-Schnittstelle definierte, eingeführt wurde, waren IC-Gehäuse mit mehr als 40 Pins selten, teuer und mit Problemen wie übermäßiger Leitungskapazität, einem der Hauptbegrenzungsfaktoren für die Signalisierungsgeschwindigkeit, konfrontiert.

Die Coprozessor-Operationscodes werden in 6 Bits über 2 Bytes codiert, beginnend mit der Escape-Sequenz:

 ┌───────────┬───────────┐
 │ 1101 1xxx │ mmxx xrrr │
 └───────────┴───────────┘

Die ersten drei "x"-Bits sind die ersten drei Bits des Gleitkomma-Opcodes. Dann zwei "m" Bits, dann die letzte Hälfte drei Bits des Gleitkomma-Opcodes, gefolgt von drei "r" Bits. Die Bits "m" und "r" spezifizieren die Adressierungsmodusinformationen.

Anwendungsprogramme mussten geschrieben werden, um die speziellen Gleitkommabefehle zu verwenden. Zur Laufzeit könnte die Software den Coprozessor erkennen und für Gleitkommaoperationen verwenden. Wenn das Fehlen erkannt wurde, mussten ähnliche Gleitkommafunktionen in Software berechnet werden, oder der gesamte Coprozessor konnte für eine genauere numerische Kompatibilität in Software emuliert werden.

Register

Vereinfachte 8087-Mikroarchitektur

Die x87-Familie verwendet keinen direkt adressierbaren Registersatz wie die Hauptregister der x86-Prozessoren; stattdessen bilden die x87-Register eine achtstufige Deep- Stack- Struktur, die von st0 bis st7 reicht, wobei st0 die Spitze ist. Die x87-Befehle arbeiten durch Pushen, Berechnen und Popping von Werten auf diesem Stapel. Jedoch können dyadische Operationen wie FADD, FMUL, FCMP usw. entweder implizit die obersten st0 und st1 verwenden oder können st0 zusammen mit einem expliziten Speicheroperanden oder Register verwenden; das Register st0 kann somit als Akkumulator (dh als kombiniertes Ziel und linker Operand) verwendet werden und kann auch mit einem der acht Stapelregister unter Verwendung eines Befehls namens FXCH st X (Codes D9C8–D9CF h ) ausgetauscht werden . Damit ist der x87-Stack als sieben frei adressierbare Register plus Akkumulator nutzbar. Dies gilt insbesondere für superskalare x86-Prozessoren ( Pentium von 1993 und später), bei denen diese Austauschbefehle bis auf eine Null-Takt-Strafe optimiert sind.

IEEE-Gleitkomma-Standard

Als Intel den 8087 entwarf, zielte es darauf ab, ein Standard-Gleitkommaformat für zukünftige Designs zu entwickeln. Ein wichtiger Aspekt des 8087 aus historischer Sicht war, dass er die Grundlage für den Gleitkomma-Standard IEEE 754 wurde . Der 8087 implementierte den späteren IEEE 754-Standard nicht in allen Details, da der Standard erst 1985 fertiggestellt wurde, der 80387 jedoch. Der 8087 bot zwei grundlegende 32 / 64-Bit- Gleitkommadatentypen und ein zusätzliches erweitertes internes 80-Bit- Temporärformat (das auch im Speicher gespeichert werden konnte), um die Genauigkeit bei großen und komplexen Berechnungen zu verbessern. Abgesehen davon bot der 8087 ein 80-Bit/18-stelliges gepacktes BCD - Format ( binär codierte Dezimalzahl ) und 16-, 32- und 64-Bit-Integer-Datentypen.

8087 Datentypen
7 9 ... 7 1 ... 6 7 ... 6 3 ... 5 0 ... 3 1 ... 2 2 ... 1 5 ... 0 0 (Bitposition)
± Exponent Fraktion 80-Bit-Real mit erweiterter Präzision
± Exponent Fraktion 64-Bit-Real mit doppelter Genauigkeit
± Exponent Fraktion 32-Bit-Real mit einfacher Genauigkeit
± BCD-Ganzzahl 18-stellige Dezimalzahl
± Ganze Zahl 64-Bit-Binärzahl
± Ganze Zahl 32-Bit-Binärzahl
± Ganze Zahl 16-Bit-Binär-Ganzzahl

Unendlichkeit

Der 8087 verarbeitet Unendlichkeitswerte entweder durch affine Schließung oder projektive Schließung (ausgewählt durch das Statusregister). Beim affinen Abschluss werden positive und negative Unendlichkeiten als unterschiedliche Werte behandelt. Beim projektiven Abschluss wird Unendlich als vorzeichenlose Darstellung für sehr kleine oder sehr große Zahlen behandelt. Diese beiden Methoden zur Behandlung von Unendlich wurden in die Entwurfsversion des IEEE 754- Gleitkommastandards integriert. Die projektive Schließung ( projektiv erweitertes reelles Zahlensystem ) wurde jedoch aus der späteren formellen Ausgabe von IEEE 754-1985 fallen gelassen. Der 80287 behielt als Option die projektive Schließung bei, aber der 80387 und nachfolgende Gleitkommaprozessoren (einschließlich des 80187) unterstützten nur affine Schließung.

Coprozessor-Schnittstelle

Der 8087 unterschied sich von nachfolgenden Intel-Coprozessoren dadurch, dass er direkt mit den Adress- und Datenbussen verbunden war. Der 8087 suchte nach Befehlen, die mit der Sequenz "11011" begannen, und reagierte darauf, indem er bei Bedarf sofort DMA von der Haupt-CPU anforderte, um auf Speicheroperanden zuzugreifen, die länger als ein Wort (16 Bits) waren, und dann sofort die Bussteuerung an die Haupt-CPU zurückgab . Der Coprozessor hielt die Ausführung des Programms nicht auf, bis der Coprozessor-Befehl abgeschlossen war, und das Programm musste die beiden Prozessoren explizit synchronisieren, wie oben (im Abschnitt " Design und Entwicklung " erläutert ). Es gab ein potenzielles Absturzproblem, wenn der Coprozessorbefehl nicht in einen vom Coprozessor verstandenen dekodiert werden konnte. Intels spätere Coprozessoren schlossen sich nicht auf die gleiche Weise an die Busse an, sondern erhielten Anweisungen über die I/O-Ports des Hauptprozessors. Dies führte zu einer Strafe für die Ausführungszeit, aber das potenzielle Absturzproblem wurde vermieden, da der Hauptprozessor die Anweisung ignorieren würde, wenn der Coprozessor sich weigerte, sie anzunehmen. Der 8087 konnte durch Überwachung des Datenbusses während des Reset-Zyklus erkennen, ob er an einen 8088 oder einen 8086 angeschlossen war.

Der 8087 war theoretisch in der Lage, gleichzeitig zu arbeiten, während der 8086/8 zusätzliche Befehle verarbeitet. In der Praxis bestand die Möglichkeit eines Programmfehlers, wenn der Coprozessor einen neuen Befehl ausgab, bevor der letzte abgeschlossen war. Der Assembler fügte automatisch nach jedem Coprozessor-Opcode einen FWAIT-Befehl ein, wodurch der 8086/8 gezwungen wurde, die Ausführung anzuhalten, bis der 8087 signalisierte, dass er fertig war. Diese Einschränkung wurde aus späteren Designs entfernt.

Modelle und Zweitquellen

Pinbelegung des Intel 8087 Math Coprozessors

Intel 8087-Coprozessoren wurden in zwei Varianten hergestellt: eine mit seitlich gelötetem Keramik-DIP (CerDIP) und eine mit hermetischem DIP (PDIP) und wurden für den Betrieb in den folgenden Temperaturbereichen entwickelt:

  • C-, D-, QC- und QD-Präfixe: 0 °C bis +70 °C (kommerzielle Verwendung).
  • LC-, LD-, TC- und TD-Präfixe: −40 °C bis +85 °C (industrieller Einsatz).
  • MC- und MD-Präfixe: −55 °C bis +125 °C (militärischer Einsatz).

Alle Modelle des 8087 hatten ein 40-Pin- DIP- Paket und wurden mit 5 Volt betrieben und verbrauchten etwa 2,4 Watt. Im Gegensatz zu späteren Intel-Coprozessoren musste der 8087 mit der gleichen Taktrate wie der Hauptprozessor laufen. Suffixe auf der Teilenummer identifizierten die Taktfrequenz:

8087 Taktraten
Modell-Nr Frequenz
Intel 8087 5 MHz
Intel 8087-1 10 MHz
Intel 8087-2 8 MHz
Intel 8087-3 4 MHz
Intel 8087-6 6 MHz

Das Teil wurde von AMD als AMD 8087 und von Cyrix als Cyrix 8087 aus zweiter Quelle bezogen. Der Klon K1810WM87 des 8087 wurde in der Sowjetunion hergestellt .

Nachfolger

So wie die Prozessoren 8088 und 8086 von späteren Teilen abgelöst wurden, wurde auch der 8087 abgelöst. Andere Intel-Coprozessoren waren 80287 , 80387 und 80187 . Beginnend mit dem 80486 verwendeten die späteren Intel-Prozessoren keinen separaten Gleitkomma-Coprozessor; praktisch alle enthielten es auf dem Hauptprozessor-Die, mit Ausnahme des 80486SX, der ein modifizierter 80486DX mit deaktivierter FPU war. Der 80487 war tatsächlich ein ausgewachsener 80486DX- Chip mit einem zusätzlichen Pin. Bei der Installation wurde die 80486SX-CPU deaktiviert. Die Prozessoren 80486DX , Pentium und später enthalten Gleitkommafunktionen auf dem CPU-Kern.

Verweise

Literaturverzeichnis

  • Sanchez, Julio; Kanton, Maria P. (2007). Softwarelösungen für Ingenieure und Wissenschaftler . CRC-Presse. ISBN 1-4200-4302-1.

Externe Links