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 coma 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 (extensión del procesador numérico ). Al igual que otras extensiones del conjunto de instrucciones básico, 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 el código de máquina correspondiente.las rutinas pueden. 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 de biblioteca bastante lentas para realizar operaciones de coma flotante, un método que todavía es común en los sistemas integrados (de bajo costo) .

Los registros x87 forman una estructura de pila no estricta de ocho niveles de profundidad que van 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 empujados y sacados . (Este esquema se puede comparar con la forma en que un marco de pila se puede empujar/quitar e indexar).

Hay instrucciones para insertar, calcular y sacar valores en la parte superior de esta pila; las operaciones unarias (FSQRT, FPTAN, etc.) se dirigen implícitamente al ST superior (0), 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 directa o con un registro de pila especificado explícitamente , ST( x ), en un papel similar al de 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 el operando no modificado y ST( x ) como el 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 libremente direccionables más un acumulador dedicado (o como siete acumuladores independientes). Esto es especialmente aplicable en los procesadores superescalares x86 (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 enteros para FXCH ST( x ) en paralelo con la instrucción FPU. A pesar de ser natural y conveniente para los programadores humanos del lenguaje ensamblador , a algunos escritores de compiladores les ha resultado complicado construir generadores de código automáticos.que programe el código x87 de manera efectiva. Tal interfaz basada en pila puede minimizar potencialmente 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 original limitaron ese potencial. [2] [3] )


Versión de 16 MHz del Intel 80187
Imagen de matriz de CPU Intel 80387
i487SX