Historia de la FPU: cómo detectaban su presencia

Fuentes: Learn Something Old Every Day, Part XVIII: How Does FPU Detection Work?

Este artículo del blog de os2museum.com explora la intrincada historia de la detección de la presencia de la Unidad de Punto Flotante (FPU) en los primeros microprocesadores Intel, desde el 8086 hasta el 80386. Aunque las FPU eran complementos costosos y no estándar en los primeros PCs, su detección correcta era crucial para que el software funcionara correctamente, especialmente en sistemas sin FPU.

En los sistemas 8086/8087, la detección se basaba en la instrucción ESC, un código de operación especial utilizado para la comunicación con un co-procesador. Si no había FPU, la instrucción ESC no hacía nada, mientras que la instrucción WAIT (diseñada para sincronización) se bloqueaba indefinidamente. Por lo tanto, la detección requería secuencias como FNINIT/FNSTSW para evitar estos bloqueos. Un problema adicional era la información errónea proporcionada por IBM en los primeros BIOS, lo que hacía que la detección basada en el BIOS fuera poco fiable y requería comprobaciones de software explícitas.

Con la llegada del 80286, Intel abandonó la interfaz de co-procesador genérica. Aunque la documentación de Intel inicialmente sugería que la instrucción ESC no se necesitaba, esto resultó ser incorrecto. La arquitectura 80286/80287 introdujo un mecanismo más sofisticado: el bit 'EM' en el registro CR0. Cuando este bit está activado, la instrucción ESC genera una excepción de 'Coprocessor Not Available', simplificando la emulación de punto flotante. Sin embargo, esto requería que el firmware o el sistema operativo estableciera el bit 'EM' correctamente, lo que a su vez requería la ejecución de instrucciones de punto flotante para determinar la presencia de la FPU, creando una paradoja.

La interfaz 80286/80287 se comunicaba a través de puertos de E/S reservados, eliminando la necesidad de instrucciones WAIT explícitas antes de cada operación de punto flotante, ya que el procesador verificaba automáticamente el estado 'BUSY' de la FPU. Esto también implicó que el procesador 286 debía ser capaz de interpretar las instrucciones que requerían esta verificación.

Finalmente, el artículo destaca la evolución de la instrucción WAIT, con su variante FWAIT utilizada en sistemas sin FPU para permitir la emulación de punto flotante a través de interrupciones de software. La lentitud de las operaciones de punto flotante en los primeros procesadores hacía que el paralelismo con la FPU fuera teóricamente posible, aunque su utilidad práctica era limitada.