x87 es un subconjunto relacionado con el punto flotante del conjunto de instrucciones de la arquitectura x86 . Se originó como una extensión del conjunto de instrucciones 8086 en forma de coprocesadores de punto flotante opcionales que funcionan en conjunto con las CPU x86 correspondientes. Estos microchips tienen nombres que terminan en "87". Esto también se conoce como NPX ( extensión de procesador numérico ). Al igual que otras extensiones del conjunto de instrucciones básicas, las instrucciones x87 no son estrictamente necesarias para construir programas de trabajo, pero proporcionan implementaciones de hardware y microcódigo de tareas numéricas comunes, lo que permite que estas tareas se realicen mucho más rápido que las rutinas de código de máquina correspondientes . El conjunto de instrucciones x87 incluye instrucciones para operaciones básicas de punto flotante como suma, resta y comparación, pero también para operaciones numéricas más complejas, como el cálculo de la función tangente y su inversa, por ejemplo.
La mayoría de los procesadores x86 desde Intel 80486 han implementado estas instrucciones x87 en la CPU principal, pero el término a veces todavía se usa para referirse a esa parte del conjunto de instrucciones. Antes de que las instrucciones x87 fueran estándar en las PC, los compiladores o programadores tenían que usar llamadas a bibliotecas bastante lentas para realizar operaciones de punto flotante, un método que todavía es común en sistemas integrados (de bajo costo) .
Los registros x87 forman una estructura de pila profunda y no estricta de ocho niveles que va desde ST(0) a ST(7) con registros a los que se puede acceder directamente mediante cualquiera de los operandos, utilizando un desplazamiento relativo a la parte superior, así como push y popped. . (Este esquema se puede comparar con cómo se puede empujar/extraer e indexar un marco de pila ).
Hay instrucciones para insertar, calcular y colocar valores en la parte superior de esta pila; Las operaciones unarias (FSQRT, FPTAN, etc.) se dirigen implícitamente al ST(0) superior, mientras que las operaciones binarias (FADD, FMUL, FCOM, etc.) se dirigen implícitamente a ST(0) y ST(1). El modelo de pila no estricto también permite que las operaciones binarias utilicen ST(0) junto con un operando de memoria directo o con un registro de pila especificado explícitamente , ST( x ), en una función similar a un acumulador tradicional (un destino combinado y un operando izquierdo). ). Esto también se puede revertir instrucción por instrucción con ST(0) como operando no modificado y ST( x ) como destino . Además, el contenido de ST(0) se puede intercambiar con otro registro de pila usando una instrucción llamada FXCH ST( x ).
Estas propiedades hacen que la pila x87 se pueda utilizar como siete registros direccionables libremente más un acumulador dedicado (o como siete acumuladores independientes). Esto es especialmente aplicable en procesadores x86 superescalares (como el Pentium de 1993 y posteriores), donde estas instrucciones de intercambio (códigos D9C8..D9CF h ) se optimizan hasta una penalización de reloj cero mediante el uso de una de las rutas de números enteros para FXCH ST( x ) en paralelo con la instrucción FPU. A pesar de ser natural y conveniente para los programadores humanos en lenguaje ensamblador , a algunos escritores de compiladores les ha resultado complicado construir generadores de código automáticos que programen código x87 de manera efectiva. Una interfaz basada en pila de este tipo puede potencialmente minimizar la necesidad de guardar variables temporales en llamadas a funciones en comparación con una interfaz basada en registros [1] (aunque, históricamente, los problemas de diseño en la implementación de 8087 limitaron ese potencial. [2] [3] )
El x87 proporciona aritmética binaria de punto flotante de precisión simple, doble precisión y precisión doble extendida de 80 bits según el estándar IEEE 754-1985 . De forma predeterminada, todos los procesadores x87 utilizan internamente precisión doblemente extendida de 80 bits (para permitir una precisión sostenida en muchos cálculos, consulte la justificación del diseño IEEE 754 ). Por lo tanto, una secuencia determinada de operaciones aritméticas puede comportarse de manera ligeramente diferente en comparación con una FPU IEEE 754 estricta de precisión simple o doble. [4] Como esto a veces puede ser problemático para algunos cálculos seminuméricos escritos para asumir doble precisión para una operación correcta, para evitar tales problemas, el x87 se puede configurar usando un registro de configuración/estado especial para redondear automáticamente a precisión simple o doble después cada operación. Desde la introducción de SSE2 , las instrucciones x87 no son tan esenciales como antes, pero siguen siendo importantes como unidad escalar de alta precisión para cálculos numéricos sensibles al error de redondeo y que requieren la precisión de mantisa de 64 bits y el rango extendido disponibles en el formato de 80 bits.
Recuentos de ciclos de reloj para ejemplos de instrucciones típicas de FPU x87 (aquí solo se muestran versiones registro-registro). [5]
La notación A ... B (de mínimo a máximo) cubre las variaciones de tiempo que dependen del estado transitorio de la tubería y de la precisión aritmética elegida (32, 64 u 80 bits); también incluye variaciones debidas a casos numéricos (como el número de bits establecidos, cero, etc.). La notación L → H representa los valores correspondientes a las frecuencias de reloj máximas más bajas (L) y más altas (H) que estaban disponibles.
Las empresas que han diseñado o fabricado [una] unidad de punto flotante compatible con Intel 8087 o modelos posteriores incluyen AMD ( 287 , 387 , 486DX , 5x86 , K5 , K6 , K7 , K8 ), Chips and Technologies (los coprocesadores Super MATH ) , Cyrix ( FasMath , Cx87SLC , Cx87DLC , etc., 6x86 , Cyrix MII ), Fujitsu (primeros Pentium Mobile, etc.), Harris Semiconductor ( procesadores 80387 y 486DX fabricados ), IBM (varios diseños 387 y 486 ), IDT (el WinChip , C3 , C7 , Nano , etc.), IIT (el 2C87 , 3C87 , etc.), LC Technology (los coprocesadores Green MATH ), National Semiconductor (el Geode GX1 , Geode GXm , etc.), NexGen (el Nx587 ), Rise Technology (el mP6 ), ST Microelectronics (fabricado 486DX , 5x86 , etc.), Texas Instruments (fabricado procesadores 486DX, etc.), Transmeta (el TM5600 y TM5800 ), ULSI (los coprocesadores Math·Co ), VIA ( el C3 , C7 y Nano , etc.), Weitek (el 1067 , 1167 , 3167 y 4167 ) y Xtend (el 83S87SX-25 y otros coprocesadores).
El 8087 fue el primer coprocesador matemático para procesadores de 16 bits diseñado por Intel . Fue construido para combinarse con los microprocesadores Intel 8088 o 8086 . (Los anteriores procesadores de punto flotante 8231 y 8232 de Intel , comercializados para su uso con la CPU i8080, eran en realidad versiones con licencia de las FPU Am9511 y Am9512 de AMD de 1977 y 1979. [6] )
Aunque la hoja de datos original de 1982 para los 80188 y 80186 ( basados en NMOS ) parece mencionar coprocesadores matemáticos específicos, [7] ambos chips en realidad estaban emparejados con un 8087.
Sin embargo, en 1987, para trabajar con la CPU Intel 80C186 basada en CMOS actualizada , Intel introdujo el coprocesador matemático 801C87 [8] . Aunque la interfaz del 801C87 con el procesador principal es la misma que la del 8087, su núcleo es esencialmente el de un 80387SX y, por tanto, es totalmente compatible con IEEE 754 y capaz de ejecutar todas las instrucciones adicionales del 80387. [9]
El 80287 ( i287 ) es el coprocesador matemático de la serie de microprocesadores Intel 80286 . Los modelos de Intel incluían variantes con límites de frecuencia superiores especificados que iban desde 6 hasta 12 MHz. La versión NMOS estaba disponible en 6, 8 y 10 MHz. [10] Posteriormente siguió el i80287XL con microarquitectura 387 y el i80287XLT, una versión especial destinada a portátiles, así como otras variantes. La versión disponible del coprocesador numérico Intel 80287-10 de 10 MHz costaba 250 USD en cantidades de 100. [11] Tanto el 80287XL como el 80287XLT ofrecían un rendimiento un 50 % mejor, un 83 % menos de energía e instrucciones adicionales. [12]
El 80287XL es en realidad un 80387SX con una distribución de 287 pines. Contiene un multiplicador interno 3/2, de modo que las placas base que ejecutaban el coprocesador a 2/3 de la velocidad de la CPU podrían ejecutar la FPU a la misma velocidad de la CPU. Otros modelos 287 con rendimiento similar al 387 son el Intel 80C287, construido usando CHMOS III, y el AMD 80EC287 fabricado en el proceso CMOS de AMD , usando sólo puertas completamente estáticas.
El 80287 y el 80287XL funcionan con el microprocesador 80386 y fueron inicialmente los únicos coprocesadores disponibles para el 80386 hasta la introducción del 80387 en 1987. Finalmente, pudieron trabajar con el Cyrix Cx486SLC . Sin embargo, para ambos chips se prefiere el 80387 por su mayor rendimiento y la mayor capacidad de su conjunto de instrucciones.
El 80387 ( 387 o i387 ) es el primer coprocesador Intel que cumple totalmente con el estándar IEEE 754-1985 . Lanzado en 1987, [13] dos años después del chip 386, el i387 incluye una velocidad mucho mejor que los coprocesadores 8087/80287 anteriores de Intel y características mejoradas de sus funciones trigonométricas. Estuvo disponible por 500 dólares estadounidenses en cantidades de 100. [14] Poco después, estuvo disponible a través de la Operación de mejora de computadoras personales de Intel por un precio de mercado minorista de 795 dólares estadounidenses. [15] La versión de 25 MHz estaba disponible en el canal minorista por USD $1395. [16] El coprocesador matemático Intel M387 cumplió con el estándar MIL-STD-883 Rev. C. Este dispositivo fue probado que incluye ciclos de temperatura entre -55 y 125 °C, sellado de hermeticidad y quemado prolongado. Esta versión militar opera a 16 MHz. Esta versión militar estaba disponible en PGA de 68 derivaciones y paquete plano cuádruple. Esta versión militar estaba disponible por USD $1155 en cantidades de 100 unidades para la versión PGA. [17] La versión de 33 MHz del 387DX estaba disponible y tiene un rendimiento de 3,4 megapiedras de afilar por segundo . [18] Las instrucciones FPTAN y FPATAN de 8087 y 80287 están limitadas a un argumento en el rango ±π/4 (±45°), y 8087 y 80287 no tienen instrucciones directas para las funciones SIN y COS. [19] [ se necesita cita completa ]
Sin un coprocesador, el 386 normalmente realiza aritmética de punto flotante a través de rutinas de software (relativamente lentas), implementadas en tiempo de ejecución a través de un controlador de excepciones de software . Cuando un coprocesador matemático se empareja con el 386, el coprocesador realiza la aritmética de punto flotante en el hardware, devolviendo resultados mucho más rápido que una llamada a una biblioteca de software (emulación).
El i387 sólo es compatible con el chip i386 estándar, que tiene un bus de procesador de 32 bits. El posterior i386SX, de costo reducido, que tiene un bus de datos de 16 bits más estrecho , no puede interactuar con el bus de 32 bits del i387. El i386SX requiere su propio coprocesador, el 80387SX , que es compatible con el bus de datos de 16 bits más estrecho del SX. Intel lanzó la versión de bajo consumo del coprocesador 387SX. [20]
El i487SX (P23N) se comercializó como un coprocesador unitario de punto flotante para máquinas Intel i486SX . En realidad, contenía una implementación i486DX completa . Cuando se instaló en un sistema i486SX, el i487 deshabilitó la CPU principal y se hizo cargo de todas las operaciones de la CPU. El i487 tomó medidas para detectar la presencia de un i486SX y no funcionaría sin la CPU original instalada. [21] [22] [ verificación fallida ]
El Nx587 fue la última FPU para x86 que se fabricó por separado de la CPU, en este caso el Nx586 de NexGen .