La instrucción FSCALE del 8087 esconde 140 microinstrucciones y tres niveles de llamadas
El Opcode Collective desmonta el microcódigo del coprocesador matemático de Intel de 1980 y encuentra una instrucción que parecía trivial.
El 8087 fue el coprocesador de coma flotante que Intel lanzó en 1980 y que acabó definiendo el formato numérico que usan casi todos los ordenadores actuales. El Opcode Collective, el grupo que se dedica a desmontar su microcódigo, ha publicado el análisis de FSCALE, la instrucción que escala un número por una potencia de dos. La expectativa era que fuera un caso casi trivial. No lo es: consume más de 140 microinstrucciones y tres niveles de subrutinas anidadas.
Para reconstruirlo hubo que abrir un chip y fotografiarlo con microscopio. La pastilla mide 5×6 mm. En el centro está la ROM de microcódigo, con 1648 microinstrucciones que gobiernan el chip entero. A la izquierda queda el motor que las recorre y resuelve saltos y llamadas. La mitad inferior es el datapath, partido en un camino de 16 bits para el exponente y otro de 64 para el significand.
Shifter, sumador y convertidor de exponente
FSCALE escala por potencias de dos mucho más rápido que una multiplicación corriente, pero por debajo pasa por el shifter, el sumador y el convertidor de exponente, los mismos bloques que usan la multiplicación, la división y la raíz cuadrada. Ahí está la gracia del ejercicio: una instrucción secundaria sirve para ver cómo se conectan las piezas grandes del chip. El análisis destapa además una función del 8087 que no estaba documentada.
El contexto ayuda. En los setenta la aritmética en coma flotante era un desastre de formatos incompatibles, diseñados más por comodidad del hardware que por rigor numérico. El 8087 se hizo popular porque entraba en el IBM PC y aceleraba hasta 100 veces cosas como hojas de cálculo o CAD. Pero su efecto duradero fue otro: su formato se convirtió en la base del estándar que hoy implementa casi todo el mundo.
Por dentro, el chip guarda todo como un «temporary real» de 80 bits: signo, exponente de 15 bits y significand de 64. El exponente va sesgado con 16383 para que el valor almacenado sea siempre positivo, y cubre de -16382 a 16383. Cada uno de los ocho registros de la pila lleva una etiqueta —valid, special, zero, empty— invisible para el programador, que el microcódigo sí consulta para decidir por dónde tirar. Los ceros, los infinitos, los NaN y los denormalizados son casos aparte con su propia codificación, y son justo los que obligan a FSCALE a ramificarse tanto; el suplemento numérico de Intel los detalla.
Nada de esto es arqueología. El estándar que nació con el 8087 sigue dentro del silicio que ejecuta cualquier cosa hoy, y el microcódigo es la capa donde se decide el comportamiento en los casos raros, que es donde de verdad se rompen las cosas. El desmontaje del Opcode Collective sigue abierto y su código está en el repositorio.
