Contexte et architecture du 8087

L’8087, coprocesseur flottant introduit en 1980, possède une ROM de microcode de 1648 micro‑instructions. Son datapath se divise en deux parties : un chemin de 16 bits dédié à l’exposant et un chemin de 64 bits dédié à la mantisse. L’exposant est stocké avec un biais de 16383, ce qui rend la valeur codée toujours positive et permet de couvrir la plage de –16382 à +16383. Le circuit comprend un convertisseur d’exposant, un shifter capable de décaler des valeurs de 64 bits sur un nombre arbitraire de bits, et un additionneur utilisé dans les boucles de multiplication, division et racine carrée. Les registres internes sont organisés en pile de huit registres de 80 bits, chacun associé à deux bits de « tag » indiquant si la valeur est valide, spéciale, zéro ou vide.

Déroulement du microcode FSCALE

L’instruction FSCALE multiplie le registre ST(0) par 2^{int(ST(1))}. Son implémentation nécessite plus de 140 micro‑instructions réparties sur trois niveaux d’appels de sous‑routines. La première sous‑routine extrait l’exposant de ST(1), le convertit de son format biaisé en entier signé, puis le tronque à la partie entière. La deuxième sous‑routine transmet cet entier au shifter, qui décale la mantisse de ST(0) de ce nombre de positions vers la gauche ou la droite selon le signe. La troisième sous‑routine ré‑encode l’exposant résultant, applique le biais 16383 et met à jour le registre de destination. Le flux micro‑code se compose de sauts conditionnels qui testent les bits de tag afin de sélectionner le chemin approprié.

DB 0xD9, 0xF9 ; FSCALE

Gestion des cas spéciaux et exceptions

Avant d’effectuer le décalage, le microcode vérifie les tags de ST(0) et ST(1). Si l’un des deux registres contient NaN, infini ou une valeur dénormalisée, le convertisseur d’exposant génère le code spécial correspondant et déclenche l’exception appropriée (invalid operation, overflow, underflow, etc.). En cas d’exposant résultant hors de la plage –16382..+16383, le microcode force un overflow ou un underflow selon le sens du dépassement, puis remplace le résultat par ∞ ou 0. Les exceptions masquées sont traitées en continuant l’exécution avec le résultat arrondi, tandis que les exceptions non masquées provoquent une interruption du processeur hôte.

Implications pour la rétro‑ingénierie

Le décodage du microcode FSCALE montre que l’8087 ne se contente pas d’ajouter les exposants ; il exploite le shifter pour réaliser le facteur de puissance de deux, ce qui explique la rapidité de l’instruction par rapport à une multiplication générique. La présence de trois niveaux de sous‑routines indique une modularité interne qui facilite la prise en charge de nouveaux formats d’exposant ou de nouvelles exceptions sans modifier le chemin de données principal. Cette structure modulaire, visible dans les 140 micro‑instructions, constitue une référence pour l’analyse de micro‑architectures similaires et illustre les compromis entre densité de ROM et flexibilité fonctionnelle dans les coprocesseurs de l’époque.