X87

El x87 es un subconjunto de coma flotante del conjunto de instrucciones de la arquitectura x86. Se originó como una extensión del conjunto de instrucciones del 8086 en la forma de un coprocesador opcional de coma flotante que trabajó en paralelo con el correspondiente CPU x86. Estos microchips tenían nombres que terminaban en "87" ( 8087, 80287, 80387).

Como otras extensiones al conjunto de instrucciones básico, las instrucciones x87 no son estrictamente necesarias para construir programas funcionales, pero proporcionan implementaciones de hardware y microcódigo de tareas numéricas comunes, permitiendo a estas tareas desempeñarse mucho más rápido que las rutinas correspondientes en código de máquina. El conjunto de instrucciones x87 incluye instrucciones para operaciones de coma flotante básicas tales como adición, sustracción y comparación, como también para operaciones numéricas más complejas, como el cálculo de la función tangente y su inversa, por ejemplo.

Desde el Intel 80486, la mayoría de los procesadores x86 han tenido estas instrucciones x87 implementadas en el propio CPU, pero el término a veces es todavía usado para referirse a esa parte del conjunto de instrucciones. Antes de que las instrucciones x87 fueron estándar en los PC, los compiladores o programadores tenían que usar llamadas a bastante lentas bibliotecas, para realizar operaciones de coma flotante, un método que aún es común en sistemas empotrados (de bajo costo).

Descripción

Los registros del x87 forman una estructura de stack de 8 niveles de profundidad que van desde el registro ST(0) hasta el ST(7) con registros que pueden ser accesados directamente por cualquiera de los operandos, usando un desplazamiento relativo al tope del stack, así como también apilados y desapilados del stack. (Este esquema puede ser comparado con como un stack frame puede ser tanto apilado y desapilado como también indexado).

Existen instrucciones para apilar (push), desapilar (pop), y calcular valores en el stack; operaciones monádicas (FSQRT, FPTAN, etc.), que implícitamente direccionan el tope del stack ST(0) y operaciones diádicas (FADD, FMUL, FCOM, etc.) que implícitamente direccionan a los dos elementos del tope ST(0) y ST(1). El modelo de pila no estricto también permite operaciones diádicas que usan ST(0) junto con un operando de memoria directo o con un registro de stack ST(x) explícitamente especificado, en un rol similar a un acumulador tradicional (un operando de destino combinado con un operando de la izquierda). Esto también puede invertirse instrucción por instrucción con ST(0) como el operando sin modificar y ST(x) como el destino. Además, el contenido en ST(0) puede intercambiarse con otro registro del stack mediante una instrucción llamada FXCH ST(x) (intercambia ST(0) con ST(X)).

Estas propiedades hace el stack x87 usable 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 sus instrucciones de intercambio (códigos D9C8..D9CFh) están optimizadas a cero ciclos de reloj usando uno de los caminos de enteros para FXCH ST(x) en paralelo con la instrucción del FPU. A pesar de ser natural y conveniente para los programadores humanos de lenguaje ensamblador, algunos desarrolladores de compiladores han encontrado complicado construir generadores de código automáticos que programen el código x87 efectivamente. Tal interfaz basada en stack potencialmente puede minimizar la necesidad de guardar variables temporales en llamadas a funciones en comparación con una interfaz basada en registros[3]

Los x87 proporciona aritmética de coma flotante binaria de simple precisión, doble precisión, y precisión extendida de 80 bits según el estándar IEEE 754-1985. Por defecto, todos los procesadores x87 usan internamente la precisión extendida de 80 bits (para permitir mantener la precisión sobre muchos cálculos, ver fundamentos de diseño del IEEE 754). Así, una determinada secuencia de operaciones aritméticas puede comportarse de forma ligeramente diferente en comparación con una FPU IEEE 754 de estricta simple precisión o doble precisión.[4] Esto a veces puede ser problemático para algunos cálculos seminuméricos escritos asumiendo doble precisión para el correcto funcionamiento: para evitar esos problemas, el x87 puede configurarse a través de un registro especial de estado/configuración para redondear automáticamente a simple o doble precisión después de cada operación. Desde la introducción del SSE2, las instrucciones de x87 no son tan esenciales como lo fueron una vez, pero siguen siendo importantes como una unidad escalar para cálculos numéricos sensibles a errores de redondeo y que requieren la parte significativa de 64 bits de precisión disponible en el formato de 80 bits.

Other Languages
български: X87
Deutsch: X87
English: X87
français: X87
magyar: X87
日本語: X87
한국어: X87
polski: X87
português: X87
русский: X87
українська: X87