Ken Shirriff, junto con un grupo llamado Opcode Collective, publicó un análisis detallado de la instrucción FSCALE del coprocesador de coma flotante 8087 de Intel, lanzado en 1980. FSCALE escala un número por una potencia de dos ajustando su exponente, una tarea que suena trivial comparada con una multiplicación o una división.
#0748 st(0) -> tmpA Input argument from top of stack
#0749 jmp #0776 if tmpA:tag ZERO Bail if 0
#0750 stackPtr++
#0751 st(0) -> tmpB Scale argument from stack(1)
#0752 stackPtr--
#0753 jmp #0776 if tmpB:tag ZERO Bail if 0
#0754 expconst 0x403e Const 403e: exp shift to convert to int
#0755 jmp #0763 if not tmp empty/special/div
#0756 call SPECIAL_TMPS Special handling
#0757 jmp #0762 if flag
#0758 jmp #0761 if not tmpB:tag SPECIAL
#0759 except:invalid Invalid exception, use NaN
#0760 NaN -> tmpA
#0761 jmp #0776 if intr
#0762 jmp #0775 if expConv[0] Return tmpA if expConv set, otherwise continueShirriff encontró lo contrario. El microcódigo de FSCALE alcanza más de 140 microinstrucciones repartidas en tres niveles de llamadas a subrutinas, extraídas de la ROM de microcódigo total del chip, de 1648 instrucciones. Fotografió un die del 8087 (5 por 6 milímetros) con microscopio para rastrear cómo la rutina recurre al sumador, el desplazador, el convertidor de exponente y la ROM de constantes de exponente del chip.
El camino simple, escalar un número normal por un valor distinto de cero, requiere unas 22 microinstrucciones a partir de la dirección #0748: los dos argumentos de la pila se cargan en los registros temporales tmpA y tmpB, el factor de escala se convierte a entero mediante un desplazamiento controlado por la constante 0x403e y luego se suma al exponente.
La mayor parte de la complejidad proviene de los casos especiales. Una subrutina llamada SPECIAL_TMPS gestiona registros de pila vacíos, números denormalizados, infinitos y NaN. Si ambos operandos son NaN, el microcódigo compara sus bits de fracción y devuelve el mayor, un comportamiento documentado pero poco usado, pensado para que los programadores puedan rastrear qué NaN provocó qué error. Otras subrutinas, NONNORMAL_RESULT, CREATE_DENORM y ADJUST_PRECISION, se encargan del desbordamiento, el subdesbordamiento, la creación de denormales y el redondeo según las tres precisiones admitidas por el chip bajo cuatro modos de redondeo.
Shirriff presenta al 8087 como el antecesor del estándar IEEE 754, que hoy usa casi cualquier ordenador, desarrollado con la colaboración del especialista en análisis numérico William Kahan. Señala que la 8087 Support Library de Intel, un emulador de software para máquinas sin el chip, necesitaba unos 16 kilobytes de código 8086 para reproducir lo que el 8087 logra con apenas 3.3 kilobytes de microcódigo.




Comentarios
Aún no hay comentarios — escribe el primero.
Inicia la conversación
Sin cuenta ni contraseña — introduce tu correo y te enviamos un enlace de acceso de un solo uso. ¿Primera vez? Todo se configura automáticamente.
Tu valoración se aplicará automáticamente al iniciar sesión.
Revisa tu bandeja de entrada
Hemos enviado un enlace de acceso a …. Ábrelo en este dispositivo — esta pestaña te conectará automáticamente.
¿No llega nada? Mira en la carpeta de spam — y marca el correo como «No es spam» para que la próxima vez llegue directo.