Группа энтузиастов Opcode Collective занимается обратным инжинирингом микрокода легендарного математического сопроцессора Intel 8087, выпущенного в 1980 году. Они добрались до команды FXCH (Floating-point Exchange), которая меняет местами два регистра в стеке. Казалось бы, простая операция, но её микрокод оказался нетривиальным — целых 14 микроинструкций.
Для изучения пришлось вскрыть чип и получить его изображение под микроскопом. Дамп микрокода сняли с помощью нейросети, которая классифицировала размеры транзисторов в ПЗУ. Всего в ROM 1648 шестнадцатибитных микроинструкций. Внутри 8087 данные хранятся в 80-битном формате (64-битная мантисса, 15-битный порядок и знак). У чипа восемь стековых регистров и два временных: tmpA и tmpB. У каждого регистра есть тег из двух бит, который помечает значение как valid, special, zero или empty.
Команда FXCH меняет вершину стека ST(0) с указанным регистром ST(i). Микрокод сначала копирует оба значения во временные регистры. Если один из них пуст — аппаратура взводит флаг исключения invalid operation. Если исключение не замаскировано (не подавлено), чип шлёт прерывание процессору 8086. Если же маска стоит — выполнение продолжается: пустой регистр заменяется специальным значением NaN (Not a Number). После этого происходит реальный обмен: tmpB сохраняется на вершину стека, а tmpA — на место ST(i). Завершает всё микроинструкция RNI (Run Next Instruction).
Исследователи отмечают, что микрокод 8087 чрезвычайно сложен из-за обилия аппаратных хаков — некоторые условные прыжки имеют побочные эффекты, а другие инструкции устанавливают флаги, влияющие на последующие операции. Полного понимания всех микроинструкций пока нет, но работа продолжается. Результаты публикуют в репозитории на GitHub.