L'Intel 8087 et son algorithme hybride CORDIC pour la tangente
Le reverse-engineering du coprocesseur arithmétique Intel 8087 révèle une implémentation hybride combinant CORDIC et approximation de Padé pour calculer la fonction tangente avec une précision de 64 bits.
Le coprocesseur arithmétique Intel 8087, lancé au début des années 1980, continue de livrer ses secrets. Ken Shirriff et son équipe, engagés dans un travail de rétro-ingénierie de ce composant mythique, viennent de détailler l'implémentation de la fonction FPTAN, qui calcule la tangente d'un angle. Leur analyse met en lumière un choix d'architecture remarquable : un algorithme hybride combinant la méthode CORDIC et une approximation polynomiale de type Padé.
La méthode CORDIC, pour Coordinate Rotation Digital Computer, ne nécessite que des opérations simples — additions, soustractions, décalages de bits et tables de correspondance — ce qui la rend particulièrement adaptée aux processeurs dépourvus d'unité de calcul flottant matérielle, comme le 6502 ou le Z80. Mais sa précision reste limitée lorsque l'on cherche à atteindre un grand nombre de bits. Les ingénieurs d'Intel ont donc opté pour une approche en deux temps : les seize premiers bits sont calculés via CORDIC, puis le reste de la valeur est obtenu par une approximation de Padé, qui repose sur le rapport de deux polynômes.
Ce choix s'explique par des considérations de performance et d'encombrement. Une fois que CORDIC a fourni l'essentiel du résultat, le reste à calculer devient suffisamment petit pour qu'une approximation polynomiale soit à la fois très précise et rapide. Cette méthode évite d'avoir recours à des tables de correspondance volumineuses et au temps de calcul supplémentaire qu'exigerait la poursuite de l'algorithme CORDIC pour les bits restants. Le résultat final atteint une précision de 64 bits, un niveau remarquable pour l'époque.
Ken Shirriff a publié le microcode complet utilisé par les ingénieurs d'Intel, accompagné de commentaires, ce qui permet de suivre pas à pas le déroulement de l'algorithme. Il a également estimé la répartition du temps de calcul pour une valeur donnée : environ 33 % du temps est consacré à la pseudo-division CORDIC, 47 % à la pseudo-multiplication CORDIC, et seulement 15 % à l'approximation polynomiale, le reste, soit environ 5 %, correspondant aux surcoûts. Cette analyse montre à quel point l'équilibre entre les deux techniques a été pensé pour maximiser l'efficacité.
L'histoire ne s'arrête pas là. Avec la série Pentium, Intel a complètement abandonné CORDIC. La raison est simple : aussi précise soit-elle, cette méthode devient difficile à étendre à un grand nombre de bits sans entraîner des pénalités de temps importantes. L'arrivée des instructions SIMD a par ailleurs réduit encore les fonctionnalités de l'architecture x87. Mais l'analyse du 8087 rappelle pourquoi ce coprocesseur a marqué son époque : il a permis aux ordinateurs personnels d'accéder à des calculs scientifiques et techniques d'une précision inédite, ouvrant la voie à des applications qui étaient jusque-là réservées aux gros systèmes.
Ce travail de rétro-ingénierie ne se contente pas de satisfaire une curiosité d'ingénieur. Il éclaire la manière dont les contraintes matérielles et les objectifs de performance façonnent les choix algorithmiques. À l'heure où l'intelligence artificielle et le calcul haute performance reposent sur des architectures toujours plus complexes, l'exemple du 8087 rappelle que l'élégance d'une solution tient souvent à un équilibre subtil entre plusieurs approches complémentaires.
2
