x87 - x87

X87 je s plovoucí desetinnou čárkou příbuzné podmnožinou x86 architektury instrukční sady . Vzniklo jako rozšíření instrukční sady 8086 ve formě volitelných koprocesorů s plovoucí desetinnou čárkou, které pracovaly v tandemu s odpovídajícími x86 CPU. Tyto mikročipy měly jména končící na „87“. Toto bylo také známé jako NPX ( Numeric Processor eXtension ). Stejně jako ostatní rozšíření základní sady instrukcí nejsou instrukce x87 nezbytně nutné pro konstrukci pracovních programů, ale poskytují hardwarové a mikrokódové implementace běžných numerických úloh, což umožňuje provádění těchto úkolů mnohem rychleji, než lze odpovídajícím rutinám strojového kódu . Sada instrukcí x87 obsahuje pokyny pro základní operace s plovoucí desetinnou čárkou, jako je sčítání, odčítání a porovnávání, ale také pro složitější numerické operace, jako je například výpočet funkce tangens a její inverze.

Většina procesorů x86 od Intel 80486 má tyto instrukce x87 implementovány v hlavním CPU, ale termín je někdy stále používán k označení té části instrukční sady. Než byly instrukce x87 v počítačích standardem, kompilátory nebo programátoři museli k provádění operací s plovoucí desetinnou čárkou používat spíše pomalá volání knihoven, což je metoda, která je v (levných) vestavěných systémech stále běžná .

Popis

Registry x87 tvoří osmiúrovňovou hlubokou nepříliš přísnou strukturu zásobníku v rozsahu od ST (0) do ST (7) s registry, ke kterým lze přímo přistupovat kterýmkoli z operandů, pomocí odsazení vzhledem k vrcholu, stejně jako tlačenými a vyskočenými . (Toto schéma lze porovnat s tím, jak lze rámeček zásobníku posunout/vysunout a indexovat.)

Nahoře v tomto zásobníku jsou pokyny, jak tlačit, počítat a vysazovat hodnoty; unární operace (FSQRT, FPTAN atd.) pak implicitně adresují nejvyšší ST (0), zatímco binární operace (FADD, FMUL, FCOM atd.) implicitně adresují ST (0) a ST (1). Non-strict stack model také umožňuje binárním operacím používat ST (0) společně s operandem přímé paměti nebo s explicitně zadaným registrem zásobníku, ST ( x ), v roli podobné tradičnímu akumulátoru (kombinovaný cílový a levý operand ). To lze také obrátit na základě instrukcí po instrukcích s ST (0) jako nemodifikovaným operandem a ST ( x ) jako cílem . Kromě toho lze obsah v ST (0) vyměnit za jiný registr zásobníku pomocí instrukce nazvané FXCH ST ( x ).

Díky těmto vlastnostem je zásobník x87 použitelný jako sedm volně adresovatelných registrů plus vyhrazený akumulátor (nebo jako sedm nezávislých akumulátorů). To je zvláště použitelné na superskalárních procesorech x86 (jako je Pentium z roku 1993 a novějších), kde jsou tyto výměnné pokyny (kódy D9C8..D9CF h ) optimalizovány až na nulovou hodinovou penalizaci pomocí jedné z celých cest pro FXCH ST ( x ) souběžně s instrukcí FPU. Navzdory tomu, že je to pro přirozené a praktické programátory v jazyce lidského assembleru , některým autorům kompilátorů se zdálo složité konstruovat automatické generátory kódu, které efektivně plánují kód x87. Takové rozhraní založené na zásobníku může potenciálně minimalizovat potřebu ukládat proměnné typu scratch do volání funkcí ve srovnání s rozhraním založeným na registru (ačkoli historicky problémy s designem v původní implementaci omezovaly tento potenciál.)

X87 poskytuje binární aritmetiku s plovoucí desetinnou čárkou s jednoduchou přesností, dvojitou přesností a 80bitovou dvojnásobnou přesností podle standardu IEEE 754-1985 . Ve výchozím nastavení všechny procesory x87 interně používají 80bitovou dvojnásobně prodlouženou přesnost (aby byla zajištěna trvalá přesnost u mnoha výpočtů, viz odůvodnění návrhu IEEE 754 ). Daná posloupnost aritmetických operací se tak může chovat mírně odlišně ve srovnání s IEEE 754 FPU s přísnou jednoduchou nebo dvojitou přesností. Protože to může být někdy u některých semi-numerických výpočtů napsaných tak, aby předpokládaly dvojitou přesnost pro správnou operaci, může být x87 konfigurováno pomocí speciálního registru konfigurace/stavu pro automatické zaokrouhlování na jednoduchou nebo dvojitou přesnost po každé operaci, aby se předpokládalo dvojí přesnost pro správnou operaci. Od zavedení SSE2 nejsou instrukce x87 tak zásadní jako kdysi, ale zůstávají důležité jako vysoce přesná skalární jednotka pro numerické výpočty citlivé na zaokrouhlovací chybu a vyžadující 64bitovou přesnost mantisy a rozšířený rozsah dostupný v 80bitový formát.

Výkon

Cyklus hodin se počítá pro příklady typických instrukcí x87 FPU (zde jsou zobrazeny pouze verze registru a registru).

Zápis A ... B (minimální až maximální) pokrývá časové variace závislé na přechodném stavu potrubí a zvolené aritmetické přesnosti (32, 64 nebo 80 bitů); zahrnuje také variace způsobené číselnými případy (jako je počet nastavených bitů, nula atd.). Zápis L → H zobrazuje hodnoty odpovídající nejnižším (L) a nejvyšším (H) maximálním taktovacím frekvencím, které byly k dispozici.

implementace x87 FADD FMUL FDIV FXCH FCOM FSQRT FPTAN FPATAN Max. Hodiny
(MHz)
Peak FMUL
(miliony/ 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 × tak rychle
80287 (původní) 0006 → 0012 0,041… 0,066 → 0,083… 0,133 .0001,2 → 2,4 ×
80387 (a novější 287 modelů) 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 (nebo 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 (včetně 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 ~ 18 000 → 58 000 ×
Pentium 4 1… 5 2… 7 20… 43 více
cyklů
1 20… 43 ? ? 1300 → 3800 ..00186… 650 → 543… 1900 ~ 11 000 → 34 000 ×
* Účinné nulové zpoždění hodin je často možné pomocí superskalárního provedení.
§ 5 MHz 8087 byl původní procesor x87. Ve srovnání s typickými softwarově implementovanými rutinami s plovoucí desetinnou čárkou na 8086 (bez 8087) by faktory byly ještě větší, možná o další faktor 10 (tj. Správné přidání s plovoucí desetinnou čárkou v jazyce sestavení může dobře spotřebovat více než 1000 cyklů ).

Výrobci

Mezi společnosti, které navrhly nebo vyrobily jednotky s plovoucí desetinnou čárkou kompatibilní s modely Intel 8087 nebo novějšími, patří AMD ( 287 , 387 , 486DX , 5x86 , K5 , K6 , K7 , K8 ), Chips and Technologies ( koprocesory Super MATH ), Cyrix ( FasMath , Cx87SLC , Cx87DLC , atd., 6x86 , Cyrix MII ), Fujitsu (časné Pentium Mobile atd.), Harris Semiconductor (vyrobeno 80387 a 486DX procesory), IBM (různé 387 a 486 vzory) IDT (na WinChip , C3 ( C7 , Nano atd.), IIT ( 2C87 , 3C87 atd.), LC Technology ( koprocesory Green MATH ), National Semiconductor ( Geode GX1 , Geode GXm atd.), NexGen ( Nx587 ), Rise Technologie ( mP6 ), ST Microelectronics (vyrobeno 486DX , 5x86 atd.), Texas Instruments (vyrobené 486DX procesory atd.), Transmeta ( TM5600 a TM5800 ), ULSI ( koprocesory Math · Co ), VIA ( C3 , C7 a Nano atd.) A Xtend ( 83S87SX-25 a další koprocesory).

Architektonické generace

8087

8087 byl první matematický koprocesor pro 16bitové procesory navržených Intel . Byl postaven tak, aby byl spárován s mikroprocesory Intel 8088 nebo 8086 . (Dřívější procesory Intel s pohyblivou řádovou čárkou 8231 a 8232 , prodávané pro použití s ​​procesorem i8080, byly ve skutečnosti licencovanými verzemi procesorů AMD Am9511 a Am9512 FPU z let 1977 a 1979.)

80187

16 MHz verze Intel 80187

80187 ( 80C187 ) je matematický koprocesor pro Intel 80186 CPU. Není schopen pracovat s 80188, protože 80188 má osmibitovou datovou sběrnici; 80188 může používat pouze 8087. 80187 se neobjevil současně s 80186 a 80188, ale ve skutečnosti byl spuštěn po 80287 a 80387. Přestože je rozhraní k hlavnímu procesoru stejné jako u 8087 , jeho jádro je jádro 80387 a je tedy plně kompatibilní s IEEE 754 a je schopné provést všechny další pokyny 80387.

80287

80287 ( i287 ) je matematický koprocesor pro Intel 80286 řada mikroprocesorů . Modely Intel obsahovaly varianty se specifikovanými horními frekvenčními limity v rozmezí od 6 do 12 MHz. Později následoval i80287XL s mikroarchitekturou 387 a i80287XLT, speciální verze určená pro notebooky, ale i další varianty.

80287XL je ve skutečnosti 80387SX s 287 vývody. Obsahuje interní 3/2 multiplikátor, takže základní desky, na kterých běžel koprocesor rychlostí 2/3 CPU, mohly místo toho provozovat FPU stejnou rychlostí CPU. Dalšími 287 modely s výkonem podobným 387 jsou Intel 80C287, postavený pomocí systému CHMOS III, a AMD 80EC287 vyráběný procesem AMD CMOS , využívající pouze plně statické brány.

80287 a 80287XL fungují s mikroprocesorem 80386 a byly zpočátku jedinými koprocesory dostupnými pro 80386 až do zavedení 80387 v roce 1987. Nakonec byli schopni pracovat s Cyrix Cx486SLC . U obou těchto čipů je však 80387 silně preferován pro svůj vyšší výkon a větší schopnost sady instrukcí.

80387

Obraz procesoru procesoru Intel 80387

80.387 ( 387 nebo i387 ) je první Intel koprocesor, aby byl plně kompatibilní s IEEE 754-1985 standardu. Model i387, který byl vydán v roce 1987, dva roky po čipu 386, nabízí mnohem vyšší rychlost oproti předchozím koprocesorům Intel 8087/80287 a vylepšené vlastnosti jeho goniometrických funkcí. Pokyny FPTAN a FPATAN 8087 a 80287 jsou omezeny na argument v rozsahu ± π/4 (± 45 °) a 8087 a 80287 nemají žádné přímé pokyny pro funkce SIN a COS.

Bez koprocesoru 386 normálně provádí aritmetiku s pohyblivou řádovou čárkou prostřednictvím (relativně pomalých) softwarových rutin, implementovaných za běhu pomocí obsluhy softwarových výjimek . Když je matematický koprocesor spárován s 386, koprocesor provádí v hardwaru aritmetiku s pohyblivou řádovou čárkou a vrací výsledky mnohem rychleji než (emulace) volání softwarové knihovny.

I387 je kompatibilní pouze se standardním čipem i386, který má 32bitovou sběrnici procesoru. Pozdější i386SX se sníženou cenou, který má užší 16bitovou datovou sběrnici , nemůže komunikovat s 32bitovou sběrnicí i387. I386SX vyžaduje vlastní koprocesor 80387SX , který je kompatibilní s užší 16bitovou datovou sběrnicí SX.

80487

i487SX

I487SX (P23N) byl uveden na trh jako matematický koprocesor koprocesor pro Intel i486SX strojů. Ve skutečnosti obsahoval plnohodnotnou implementaci i486DX . Při instalaci do systému i486SX i487 deaktivoval hlavní CPU a převzal veškeré operace s CPU. I487 přijal opatření k detekci přítomnosti i486SX a bez původního CPU by nefungoval.

80587

Nx587 byl poslední FPU pro x86, které mají být vyrobeny odděleně od CPU, v tomto případě je NEXGEN Nx586 .

Viz také

Reference

Poznámky

externí odkazy