x87 - x87

x87 ist eine gleitkommabezogene Teilmenge des Befehlssatzes der x86-Architektur . Es entstand als Erweiterung des 8086-Befehlssatzes in Form von optionalen Gleitkomma- Coprozessoren , die mit entsprechenden x86-CPUs zusammenarbeiteten. Diese Mikrochips hatten Namen mit der Endung "87". Dies wurde auch als NPX ( Numeric Processor eXtension ) bezeichnet. Wie andere Erweiterungen des grundlegenden Befehlssatzes werden x87-Befehle nicht unbedingt benötigt, um Arbeitsprogramme zu erstellen , sondern bieten Hardware- und Mikrocode- Implementierungen üblicher numerischer Aufgaben, wodurch diese Aufgaben viel schneller ausgeführt werden können, als es entsprechende Maschinencode- Routinen können. Der x87-Befehlssatz enthält Befehle für grundlegende Gleitkomma-Operationen wie Addition, Subtraktion und Vergleich, aber auch für komplexere numerische Operationen, wie beispielsweise die Berechnung der Tangensfunktion und ihrer Umkehrung.

Die meisten x86-Prozessoren seit dem Intel 80486 haben diese x87-Befehle in der Haupt-CPU implementiert, aber der Begriff wird manchmal immer noch verwendet, um sich auf diesen Teil des Befehlssatzes zu beziehen. Bevor x87-Anweisungen Standard in PCs waren, mussten Compiler oder Programmierer ziemlich langsame Bibliotheksaufrufe verwenden, um Gleitkommaoperationen durchzuführen, eine Methode, die in (kostengünstigen) eingebetteten Systemen noch üblich ist .

Beschreibung

Die x87-Register bilden eine achtstufige, tiefe, nicht strikte Stack- Struktur von ST(0) bis ST(7) mit Registern, auf die von beiden Operanden direkt zugegriffen werden kann, wobei ein Offset relativ zum oberen Rand verwendet wird, sowie gedrückt und gepoppt . (Dieses Schema kann damit verglichen werden, wie ein Stapelrahmen sowohl gepusht/geknallt als auch indiziert werden kann.)

Es gibt Anweisungen zum Verschieben, Berechnen und Platzieren von Werten oben auf diesem Stapel. unäre Operationen (FSQRT, FPTAN etc.) adressieren dann implizit das oberste ST(0), während binäre Operationen (FADD, FMUL, FCOM etc.) implizit ST(0) und ST(1) adressieren. Das nicht strikte Stapelmodell erlaubt auch binären Operationen, ST(0) zusammen mit einem direkten Speicheroperanden oder mit einem explizit spezifizierten Stapelregister ST( x ) in einer ähnlichen Rolle wie ein herkömmlicher Akkumulator (ein kombinierter Ziel- und linker Operand) zu verwenden ). Dies kann auch befehlsweise mit ST(0) als unverändertem Operanden und ST( x ) als Ziel rückgängig gemacht werden . Außerdem kann der Inhalt in ST(0) mit einem anderen Stack-Register unter Verwendung eines Befehls namens FXCH ST( x ) ausgetauscht werden .

Diese Eigenschaften machen den x87-Stack als sieben frei adressierbare Register plus einen dedizierten Akkumulator (oder als sieben unabhängige Akkumulatoren) verwendbar. Dies gilt insbesondere für superskalare x86-Prozessoren (wie den Pentium von 1993 und später), bei denen diese Austauschbefehle (Codes D9C8..D9CF h ) durch Verwendung eines der ganzzahligen Pfade für FXCH ST( x ) parallel zum FPU-Befehl. Obwohl es für menschliche Assembler- Programmierer natürlich und praktisch ist , fanden es einige Compiler-Autoren kompliziert, automatische Code-Generatoren zu konstruieren , die x87-Code effektiv planen. Eine solche stapelbasierte Schnittstelle kann potenziell die Notwendigkeit minimieren, Scratch-Variablen in Funktionsaufrufen zu speichern, verglichen mit einer registerbasierten Schnittstelle (obwohl in der Vergangenheit Designprobleme in der ursprünglichen Implementierung dieses Potenzial begrenzten.)

Der x87 bietet binäre Gleitkomma-Arithmetik mit einfacher Genauigkeit, doppelter Genauigkeit und 80-Bit- Doppelgenauigkeit mit doppelter Genauigkeit gemäß dem Standard IEEE 754-1985 . Standardmäßig verwenden die x87-Prozessoren alle intern 80-Bit-Double-Extended-Präzision (um eine anhaltende Präzision bei vielen Berechnungen zu ermöglichen, siehe IEEE 754-Entwurfsgrundsätze ). Eine gegebene Folge von arithmetischen Operationen kann sich daher im Vergleich zu einer strengen IEEE 754 FPU mit einfacher oder doppelter Genauigkeit etwas anders verhalten. Da dies für einige halbnumerische Berechnungen, die so geschrieben sind, dass sie für den korrekten Betrieb doppelte Genauigkeit annehmen, manchmal problematisch sein kann, kann der x87 mit einem speziellen Konfigurations-/Statusregister so konfiguriert werden, dass es nach jeder Operation automatisch auf einfache oder doppelte Genauigkeit rundet, um solche Probleme zu vermeiden. Seit der Einführung von SSE2 sind die x87 Anweisungen nicht so wichtig wie sie einmal waren, aber nach wie vor wichtig wie eine hochpräzise skalare Einheit für numerische Berechnungen empfindlich auf Rundungsfehler und erfordert die 64-Bit - Mantisse Präzision und erweiterten Bereich in das 80-Bit-Format.

Leistung

Taktzykluszählungen für Beispiele typischer x87-FPU-Befehle (hier werden nur Register-Register-Versionen gezeigt).

Die Notation A ... B (Minimum bis Maximum) deckt Timing-Variationen ab, die vom vorübergehenden Pipeline-Status und der gewählten arithmetischen Genauigkeit (32, 64 oder 80 Bit) abhängen; es enthält auch Variationen aufgrund von numerischen Fällen (wie die Anzahl der gesetzten Bits, Null usw.). Die Notation L → H stellt Werte dar, die der niedrigsten (L) und der höchsten (H) maximalen Taktfrequenz entsprechen, die verfügbar waren.

x87-Implementierung FADD FMUL FDIV FXCH FCOM FSQRT FPTAN FPATAN Maximaler Takt
(MHz)
Spitzen-FMUL
(Millionen/ s )
FMUL §
rel. 5 MHz 8087
8087 70…100 90…145 193…203 10…15 40…50 180…186 30…540 250…800 0005 → 0010 0,034…0,055 → 0,100…0,111 ~00001 → 2× so schnell
80287 (Original) 0006 → 0012 0,041…0,066 → 0,083…0,133 .0001,2 → 2,4×
80387 (und später 287 Modelle) 23…34 29…57 88…91 18 24 122…129 191…497 314…487 0016 → 0033 0,280…0,552 → 0,580…1,1 000~10 → 20×
80486 (oder 80487) 8…20 16 73 4 4 83…87 200…273 218…303 0016 → 0050 ….0000001.0 → 3.1 000~18 → 56×
Cyrix 6x86 , Cyrix MII 4…7 4…6 24…34 2 4 59…60 117…129 97…161 0066 → 0300 ..000011…16 → 50…75 00~320 → 1400×
AMD K6 (einschließlich K6 II/III) 2 2 21…41 2 3 21…41 ? ? 0166 → 0550 …..00000083 → 275 0~1500 → 5000×
Pentium / Pentium MMX 1…3 1…3 39 1 (0*) 1…4 70 17…173 19…134 0060 → 0300 ..000020…60 → 100…300 0~1100 → 5400×
Pentium Pro 1…3 2…5 16…56 1 28…68 ? ? 0150 → 0200 ..000030…75 → 40…100 0~1400 → 1800×
Pentium II / III 1…3 2…5 17…38 1 27…50 ? ? 0233 → 1400 ..00047…116 → 280…700 0~2100 → 13000×
Athlon (K7) 1…4 1…4 13…24 1…2 16…35 ? ? 0500 → 2330 ..00125…500 → 580…2330 0~9000 → 42000×
Athlon 64 (K8) 1000 → 3200 ..0250…1000 → 800…3200 ~18000 → 58000×
Pentium 4 1…5 2…7 20…43 mehrere
Zyklen
1 20…43 ? ? 1300 → 3800 ..00186…650 → 543…1900 ~11000 → 34000×
* Eine effektive Nulltaktverzögerung ist oft durch superskalare Ausführung möglich.
§ Der 5 MHz 8087 war der ursprüngliche x87-Prozessor. Im Vergleich zu typischen softwareimplementierten Gleitkomma-Routinen auf einem 8086 (ohne 8087) wären die Faktoren sogar noch größer, vielleicht um einen weiteren Faktor von 10 (dh eine korrekte Gleitkomma-Addition in Assembler kann durchaus über 1000 Zyklen verbrauchen ).

Hersteller

Zu den Unternehmen, die Gleitkommaeinheiten entwickelt oder hergestellt haben, die mit Intel 8087 oder späteren Modellen kompatibel sind, gehören AMD ( 287 , 387 , 486DX , 5x86 , K5 , K6 , K7 , K8 ), Chips and Technologies (die Super-MATH- Coprozessoren), Cyrix ( die FasMath , Cx87SLC , Cx87DLC usw., 6x86 , Cyrix MII ), Fujitsu (frühe Pentium Mobil etc.), Harris Semiconductor (hergestellt 80387 und 486DX - Prozessoren), IBM (verschiedene 387 und 486 Modelle), IDT (die WinChip , C3 , C7 , Nano usw.), IIT (der 2C87 , 3C87 usw.), LC Technology (die Green MATH Coprozessoren), National Semiconductor (der Geode GX1 , Geode GXm usw.), NexGen (der Nx587 ) ), Rise Technology (der mP6 ), ST Microelectronics (hergestellt 486DX , 5x86 usw.), Texas Instruments (hergestellte 486DX- Prozessoren usw.), Transmeta (der TM5600 und TM5800 ), ULSI (die Math·Co- Koprozessoren), VIA (der C3 , C7 und Nano usw.) und Xtend (der 83S87SX-25 und andere Coprozessoren).

Architektonische Generationen

8087

Der 8087 war der erste von Intel entwickelte mathematische Coprozessor für 16-Bit-Prozessoren . Es wurde für die Kombination mit den Intel 8088- oder 8086- Mikroprozessoren entwickelt. (Intels frühere 8231- und 8232- Gleitkommaprozessoren, die für die Verwendung mit der i8080-CPU vermarktet wurden, waren tatsächlich lizenzierte Versionen von AMDs Am9511- und Am9512-FPUs von 1977 und 1979.)

80187

16-MHz-Version des Intel 80187

Der 80187 ( 80C187 ) ist der mathematische Coprozessor für die Intel 80186 CPU. Er kann nicht mit dem 80188 betrieben werden, da der 80188 über einen 8-Bit-Datenbus verfügt; der 80188 kann nur den 8087 verwenden. Der 80187 erschien nicht gleichzeitig mit dem 80186 und 80188, sondern wurde tatsächlich nach dem 80287 und dem 80387 auf den Markt gebracht. Obwohl die Schnittstelle zum Hauptprozessor die gleiche ist wie beim 8087 , sein Kern ist der des 80387 und ist somit vollständig IEEE 754- kompatibel und in der Lage, alle zusätzlichen Befehle des 80387 auszuführen.

80287

Die 80287 ( I287 ) ist der mathematische Coprozessor für die Intel 80286 - Reihe von Mikroprozessoren . Intels Modelle enthielten Varianten mit spezifizierten oberen Frequenzgrenzen von 6 bis 12 MHz. Später folgten der i80287XL mit 387er Mikroarchitektur und der i80287XLT, eine spezielle Version für Laptops, sowie weitere Varianten.

Der 80287XL ist eigentlich ein 80387SX mit 287 Pinbelegung. Es enthält einen internen 3/2-Multiplikator, sodass Motherboards, die den Coprozessor mit 2/3 CPU-Geschwindigkeit betrieben, die FPU stattdessen mit derselben CPU-Geschwindigkeit ausführen können. Andere 287-Modelle mit 387-ähnlicher Leistung sind der Intel 80C287, der mit CHMOS III gebaut wurde, und der AMD 80EC287, der im CMOS- Prozess von AMD hergestellt wird und nur vollständig statische Gates verwendet.

Die 80287 und 80287XL arbeiten mit dem 80386- Mikroprozessor und waren zunächst bis zur Einführung des 80387 im Jahr 1987 die einzigen Coprozessoren für den 80386. Schließlich konnten sie mit dem Cyrix Cx486SLC arbeiten . Für diese beiden Chips wird jedoch der 80387 wegen seiner höheren Leistung und der größeren Fähigkeit seines Befehlssatzes stark bevorzugt.

80387

Intel 80387 CPU-Chip-Image

Der 80387 ( 387 oder i387 ) ist der erste Intel-Coprozessor, der vollständig mit dem IEEE 754-1985- Standard kompatibel ist . Der i387 wurde 1987, volle zwei Jahre nach dem 386-Chip, veröffentlicht und bietet gegenüber Intels früheren 8087/80287-Coprozessoren eine deutlich verbesserte Geschwindigkeit und verbesserte Eigenschaften seiner trigonometrischen Funktionen. Die FPTAN- und FPATAN-Anweisungen der 8087 und 80287 sind auf ein Argument im Bereich ±π/4 (±45°) beschränkt, und die 8087 und 80287 haben keine direkten Anweisungen für die SIN- und COS-Funktionen.

Ohne einen Coprozessor führt der 386 normalerweise Gleitkommaarithmetik durch (relativ langsame) Softwareroutinen durch, die zur Laufzeit durch einen Software- Ausnahmebehandler implementiert werden . Wenn ein mathematischer Coprozessor mit dem 386 gepaart wird, führt der Coprozessor die Gleitkommaarithmetik in Hardware aus und liefert Ergebnisse viel schneller als ein (emulierender) Softwarebibliotheksaufruf.

Der i387 ist nur mit dem Standard-i386-Chip kompatibel, der über einen 32-Bit-Prozessorbus verfügt. Der spätere, kostenreduzierte i386SX, der einen schmaleren 16-Bit -Datenbus hat , kann nicht mit dem 32-Bit-Bus des i387 verbunden werden. Der i386SX benötigt einen eigenen Coprozessor, den 80387SX , der mit dem schmaleren 16-Bit-Datenbus des SX kompatibel ist.

80487

i487SX

Der i487SX (P23N) wurde als Gleitkomma- Koprozessor für Intel i486SX- Maschinen vermarktet . Es enthielt tatsächlich eine ausgewachsene i486DX- Implementierung. Bei der Installation in einem i486SX-System deaktivierte der i487 die Haupt-CPU und übernahm alle CPU-Operationen. Der i487 hat Maßnahmen ergriffen, um das Vorhandensein eines i486SX zu erkennen und würde ohne die ursprüngliche CPU nicht funktionieren.

80587

Die Nx587 war die letzte FPU für x86, die getrennt von der CPU hergestellt wurde, in diesem Fall die Nx586 von NexGen .

Siehe auch

Verweise

Anmerkungen

Externe Links