x87 - x87

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 funcionaban en conjunto con las CPU x86 correspondientes. Estos microchips tenían nombres que terminaban en "87". Esto también se conocía como NPX ( Numeric Processor eXtension ). 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 correspondientes rutinas de código de máquina . 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 tenido estas instrucciones x87 implementadas 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 los sistemas embebidos (de bajo costo) .

Descripción

Los registros x87 forman una estructura de pila no estricta de ocho niveles de profundidad que va desde ST (0) a ST (7) con registros a los que se puede acceder directamente por cualquiera de los operandos, utilizando un desplazamiento relativo a la parte superior, así como presionados y desplegados. . (Este esquema puede compararse con la forma en que un marco de pila se puede empujar / abrir e indexar).

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 usen ST (0) junto con un operando de memoria directo o con un registro de pila especificado explícitamente , ST ( x ), en un papel 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 sin modificar y ST ( x ) como destino . Además, el contenido en 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 libremente direccionables 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 de lenguaje ensamblador humano , algunos escritores de compiladores han encontrado complicado construir generadores de código automáticos que programen el código x87 de manera efectiva. Una interfaz basada en pila de este tipo puede minimizar potencialmente la necesidad de guardar variables de borrador en llamadas a funciones en comparación con una interfaz basada en registros (aunque, históricamente, los problemas de diseño en la implementación original limitaron ese potencial).

El x87 proporciona aritmética de coma flotante binaria de precisión simple, precisión doble 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 de doble extensión de 80 bits (para permitir una precisión sostenida en muchos cálculos, consulte la justificación del diseño IEEE 754 ). Por tanto, una secuencia determinada de operaciones aritméticas puede comportarse de forma ligeramente diferente en comparación con una FPU IEEE 754 estricta de precisión simple o doble precisión. Como esto a veces puede ser problemático para algunos cálculos semi-numéricos escritos para asumir una precisión doble para un funcionamiento correcto, para evitar tales problemas, el x87 se puede configurar usando una configuración especial / registro de estado para redondear automáticamente a precisión simple o doble después de cada operación. Desde la introducción de SSE2 , las instrucciones x87 no son tan esenciales como antes, pero siguen siendo importantes como una 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 disponible en el formato de 80 bits.

Rendimiento

El ciclo de reloj cuenta para ejemplos de instrucciones típicas de x87 FPU (aquí solo se muestran las versiones de registro-registro).

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 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.

implementación x87 FADD FMUL FDIV FXCH FCOM FSQRT FPTAN FPATAN Reloj máximo
(MHz)
Pico FMUL
(millones / 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 × más rápido
80287 (original) 0006 → 0012 0,041… 0,066 → 0,083… 0,133 .0001,2 → 2,4 ×
80387 (y modelos 287 posteriores) 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 (o 80487) 8… 20 dieciséis 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 (incluido 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 múltiples
ciclos
1 20… 43 ? ? 1300 → 3800 ..00186… 650 → 543… 1900 ~ 11000 → 34000 ×
* A menudo es posible un retardo de reloj cero efectivo mediante una ejecución superescalar.
§ El 8087 de 5 MHz era el procesador x87 original. En comparación con las rutinas típicas de punto flotante implementadas por software en un 8086 (sin un 8087), los factores serían aún mayores, quizás por otro factor de 10 (es decir, una adición correcta de punto flotante en lenguaje ensamblador bien puede consumir más de 1000 ciclos ).

Fabricantes

Las empresas que han diseñado o fabricado unidades de punto flotante compatibles con Intel 8087 o modelos posteriores incluyen AMD ( 287 , 387 , 486DX , 5x86 , K5 , K6 , K7 , K8 ), Chips and Technologies (los coprocesadores Super MATH ), Cyrix ( la FasMath , Cx87SLC , Cx87DLC , etc., 6x86 , Cyrix MII ), Fujitsu (principios Pentium Mobile , etc.), Harris Semiconductor (fabricado 80387 y 486DX procesadores), IBM (varios 387 y 486 diseños), 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 , Nano , etc.) y Xtend (el 83S87SX-25 y otros coprocesadores).

Generaciones arquitectónicas

8087

El 8087 fue el primer coprocesador matemático para procesadores de 16 bits diseñado por Intel . Fue construido para ser emparejado con los microprocesadores Intel 8088 o 8086 . (Los procesadores de punto flotante 8231 y 8232 anteriores de Intel, comercializados para su uso con la CPU i8080, eran de hecho versiones con licencia de las FPU Am9511 y Am9512 de AMD de 1977 y 1979).

80187

Versión de 16 MHz del Intel 80187

El 80187 ( 80C187 ) es el coprocesador matemático para la CPU Intel 80186 . No puede funcionar con el 80188, ya que el 80188 tiene un bus de datos de ocho bits; el 80188 solo puede usar el 8087. El 80187 no apareció al mismo tiempo que el 80186 y el 80188, pero de hecho se lanzó después del 80287 y el 80387. Aunque la interfaz al procesador principal es la misma que la del 8087 , su núcleo es el del 80387 y, por lo tanto, es totalmente compatible con IEEE 754 y es capaz de ejecutar todas las instrucciones adicionales del 80387.

80287

El 80287 ( i287 ) es el coprocesador matemático para la serie de microprocesadores Intel 80286 . Los modelos de Intel incluían variantes con límites de frecuencia superior especificados que van desde 6 hasta 12 MHz. Posteriormente siguió el i80287XL con microarquitectura 387 y el i80287XLT, una versión especial destinada a portátiles, así como otras variantes.

El 80287XL es en realidad un 80387SX con un pinout 287. Contiene un multiplicador interno 3/2 para que las placas base que ejecutaban el coprocesador a 2/3 de la velocidad de la CPU pudieran ejecutar la FPU a la misma velocidad que la CPU. Otros modelos 287 con un rendimiento similar al 387 son el Intel 80C287, construido con CHMOS III, y el AMD 80EC287 fabricado en el proceso CMOS de AMD , utilizando solo 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, el 80387 es muy preferido por su mayor rendimiento y la mayor capacidad de su conjunto de instrucciones.

80387

Imagen de matriz de CPU Intel 80387

El 80387 ( 387 o i387 ) es el primer coprocesador Intel en ser totalmente compatible con el estándar IEEE 754-1985 . Lanzado en 1987, dos años completos después del chip 386, el i387 incluye una velocidad muy mejorada con respecto a los coprocesadores 8087/80287 anteriores de Intel y características mejoradas de sus funciones trigonométricas. Las instrucciones FPTAN y FPATAN del 8087 y 80287 están limitadas a un argumento en el rango ± π / 4 (± 45 °), y el 8087 y 80287 no tienen instrucciones directas para las funciones SIN y COS.

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 de biblioteca de software (emulando).

El i387 es compatible solo con el chip i386 estándar, que tiene un bus de procesador de 32 bits. El último 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.

80487

i487SX

El i487SX (P23N) se comercializó como un coprocesador de unidad de punto flotante para máquinas Intel i486SX . En realidad, contenía una implementación completa de i486DX . Cuando se instala en un sistema i486SX, el i487 deshabilita la CPU principal y se hace 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 en su lugar.

80587

El Nx587 fue el último FPU para x86 que se fabricó por separado de la CPU, en este caso el Nx586 de NexGen .

Ver también

Referencias

Notas

enlaces externos