# X87

x87 és un subconjunt relacionat amb la coma flotant del conjunt d'instruccions d'arquitectura x86. Es va originar com una extensió del conjunt d'instruccions 8086 en forma de coprocessadors opcionals de coma flotant que funcionen conjuntament amb les CPU x86 corresponents. Aquests microxips tenen noms que acaben en "87". Això també es coneix com a NPX (Numeric Processor eXtension). Com altres extensions del conjunt d'instruccions bàsiques, les instruccions x87 no són estrictament necessàries per construir programes de treball, sinó que proporcionen implementacions de maquinari i microcodi de tasques numèriques comunes, permetent que aquestes tasques es realitzin molt més ràpidament que les rutines de codi màquina corresponents. El conjunt d'instruccions x87 inclou instruccions per a operacions bàsiques de coma flotant com la suma, la resta i la comparació, però també per a operacions numèriques més complexes, com ara el càlcul de la funció tangent i la seva inversa, per exemple.
La majoria dels processadors x86 des de l'Intel 80486 han tingut aquestes instruccions x87 implementades a la CPU principal, però de vegades encara s'utilitza el terme per referir-se a aquesta part del conjunt d'instruccions. Abans que les instruccions x87 fossin estàndard als ordinadors, els compiladors o programadors havien d'utilitzar trucades de biblioteques més aviat lentes per realitzar operacions de coma flotant, un mètode que encara és comú en sistemes encastats (de baix cost).

## Descripció

Els registres x87 formen una estructura de pila no estricta de vuit nivells que va des de ST(0) fins a ST(7) amb registres als quals es pot accedir directament amb qualsevol operand, utilitzant un desplaçament respecte a la part superior, així com empès i esclatat. (Aquest esquema es pot comparar amb com es pot empènyer/aixecar i indexar un marc de pila).
Hi ha instruccions per empènyer, calcular i mostrar valors a la part superior d'aquesta pila; Les operacions unàries (FSQRT, FPTAN, etc.) aborden implícitament l'ST(0) superior, mentre que les operacions binàries (FADD, FMUL, FCOM, etc.) s'adrecen implícitament a ST(0) i ST(1). El model de pila no estricte també permet que les operacions binàries utilitzin ST(0) juntament amb un operand de memòria directe o amb un registre de pila especificat explícitament, ST(x), en un paper similar a un acumulador tradicional (una destinació combinada i un operand esquerre.). Això també es pot invertir instrucció per instrucció amb ST(0) com a operand sense modificar i ST(x) com a destinació. A més, el contingut de ST(0) es pot intercanviar amb un altre registre de pila utilitzant una instrucció anomenada FXCH ST(x).
Aquestes propietats fan que la pila x87 es pugui utilitzar com a set registres adreçables lliurement més un acumulador dedicat (o com a set acumuladors independents). Això és especialment aplicable als processadors x86 superescalars (com el Pentium de 1993 i posteriors), on aquestes intercanvien instruccions (codis D9C8. .D9CF$_h$) s'optimitzen fins a una penalització de rellotge zero utilitzant un dels camins enters per a FXCH ST(x) en paral·lel amb la instrucció FPU. Tot i ser natural i convenient per als programadors de llenguatge ensamblador humà, alguns escriptors de compiladors han trobat complicat construir generadors de codi automàtics que programin el codi x87 de manera eficaç. Aquesta interfície basada en la pila potencialment pot minimitzar la necessitat de desar variables scratch en les trucades de funció en comparació amb una interfície basada en registres (tot i que, històricament, els problemes de disseny en la implementació 8087 limitaven aquest potencial).
El x87 proporciona una precisió única, doble precisió i 80 bits de precisió doble estesa aritmètica binària de coma flotant segons l'estàndard IEEE 754-1985. Per defecte, tots els processadors x87 utilitzen internament una precisió doble ampliada de 80 bits (per permetre una precisió sostinguda en molts càlculs, vegeu la justificació del disseny IEEE 754). Per tant, una seqüència determinada d'operacions aritmètiques pot comportar-se de manera lleugerament diferent en comparació amb una FPU IEEE 754 de precisió única o doble precisió. Com que això de vegades pot ser problemàtic per a alguns càlculs seminumèrics escrits per assumir una precisió doble per a un funcionament correcte, per evitar aquests problemes, el x87 es pot configurar mitjançant un registre especial de configuració/estat per arrodonir automàticament a precisió simple o doble després de cada operació. Des de la introducció de SSE2, les instruccions x87 no són tan essencials com abans, però segueixen sent importants com a unitat escalar d'alta precisió per a càlculs numèrics sensibles a l'error d'arrodoniment i que requereixen la precisió de mantissa de 64 bits i el rang estès disponible a el format de 80 bits.

## Generacions arquitectòniques
### 8087

El 8087 va ser el primer coprocessador matemàtic per a processadors de 16 bits dissenyat per Intel. Va ser construït per emparellar-se amb els microprocessadors Intel 8088 o 8086. (Els primers processadors de punt flotant 8231 i 8232 d'Intel, comercialitzats per utilitzar-los amb la CPU i8080, eren de fet versions amb llicència de les FPU Am9511 i Am9512 d'AMD de 1977 i 1979).

### 80187

El 80187 (80C187) és el coprocessador matemàtic de la CPU Intel 80186. És incapaç de funcionar amb el 80188, ja que el 80188 té un bus de dades de vuit bits; el 80188 només pot utilitzar el 8087. El 80187 no va aparèixer al mateix temps que el 80186 i el 80188, però de fet es va llançar després del 80287 i el 80387. Tot i que la interfície amb el processador principal és la mateixa que la del 8087, el seu nucli és el del 80387 i, per tant, és totalment compatible amb IEEE 754 i és capaç d'executar totes les instruccions addicionals del 80387.

### 80287

El 80287 (i287 ) és el coprocessador matemàtic de la sèrie de microprocessadors Intel 80286. Els models d'Intel incloïen variants amb límits de freqüència superior especificats que van des de 6 fins a 12 MHz. Posteriorment va seguir l'i80287XL amb microarquitectura 387 i l'i80287XLT, una versió especial destinada a portàtils, així com altres variants. El cost del coprocessador numèric Intel 80287-10 MHz era 250 USD en quantitats de 100.

### 80387

The 80387 (387 or i387) is the first Intel coprocessor to be fully compliant with the IEEE 754-1985 standard. Released in 1987, two years after the 386 chip, the i387 includes much improved speed over Intel's previous 8087/80287 coprocessors and improved characteristics of its trigonometric functions. It was made available for USD $500 in quantities of 100. Shortly afterwards, it was made available through Intel's Personal Computer Enhancement Operation for a retail market price of USD $795. The 25 MHz version was available in retail channel for USD $1395. The Intel M387 math coprocessor met under MIL-STD-883 Rev. C standard.
L'i387 només és compatible amb el xip estàndard i386, que té un bus de processador de 32 bits. El posterior i386SX de cost reduït, que té un bus de dades de 16 bits més estret, no pot connectar amb el bus de 32 bits de l'i387. L'i386SX requereix el seu propi coprocessador, el 80387SX, que és compatible amb el bus de dades de 16 bits més estret de l'SX. Intel va llançar la versió de baix consum del coprocessador 387SX.

### 80487

L' i487SX (P23N) es va comercialitzar com a coprocessador d'unitat de punt flotant per a màquines Intel i486SX. En realitat contenia una implementació i486DX en tota regla. Quan es va instal·lar en un sistema i486SX, l'i487 va desactivar la CPU principal i es va fer càrrec de totes les operacions de la CPU. L'i487 va prendre mesures per detectar la presència d'un i486SX i no funcionaria sense la CPU original al seu lloc.

### 80587

L'Nx587 va ser l'última FPU per a x86 que es va fabricar per separat de la CPU, en aquest cas l'Nx586 de NexGen.

## Referències

* ↑ William Kahan. «On the advantages of 8087's stack» (en anglès). Unpublished course notes, Computer Science Division, University of California at Berkeley, 02-11-1990. Arxivat de l'original el 18 gener 2017.
* ↑ William Kahan. «How Intel 8087 stack overflow/underflow should have been handled» (en anglès), 08-07-1989. Arxivat de l'original el 12 juny 2013.
* ↑ Jack Woehr. «A conversation with William Kahan» (en anglès), 01-11-1997.
* ↑ David Monniaux ACM Transactions on Programming Languages and Systems, 30, 3, 5-2008, pàg. 1–41. arXiv: cs/0701192. DOI: 10.1145/1353445.1353446.
* ↑ «Arithmetic Processors: Then and Now» (en anglès). www.cpushack.com, 23-09-2010. [Consulta: 3 maig 2023].
* ↑ «CPU Collection – Model 80187» (en anglès). cpu-info.com. Arxivat de l'original el 23 juliol 2011. [Consulta: 14 abril 2018].
* ↑ «80C187 80-BIT MATH COPROCESSOR» (en anglès), 01-11-1992. [Consulta: 3 maig 2023].
* ↑ «"New Product Focus Components: The 32-Bit Computing Engine Full Speed Ahead"». Intel Solutions, 5-1987, pàg. 10.
* ↑ «"NewsBit: Intel 80387 Available Through Retail Channels".». Intel Solutions, 7-1987, pàg. 1.
* ↑ «Intel 80487» (en anglès). www.cpu-world.com. [Consulta: 9 juny 2021].