Исследователь Кен Ширрифф, который уже долгое время изучает архитектуру и микрокод легендарного математического сопроцессора Intel 8087, дошёл до этапа, когда можно проследить, как именно микрокод реализует отдельные инструкции набора x87. Одной из первых он разобрал FSCALE — и она оказалась куда сложнее, чем можно было ожидать.
Что такое 8087 и зачем нужен FSCALE
Intel 8087 появился в 1980 году как сопроцессор для работы с плавающей запятой (FPU) к процессорам 8086 и 8088. Центральный процессор в те годы умел выполнять лишь целочисленную арифметику, а вычисления с дробными числами приходилось эмулировать программно, что сильно замедляло научные расчёты, инженерные программы и электронные таблицы. Для 8087 в материнских платах, в том числе в IBM PC, предусматривали отдельный разъём, и установка сопроцессора ускоряла такие задачи в разы. Набор команд x87 со стеком из восьми регистров и 80-битным форматом чисел до сих пор поддерживается современными процессорами архитектуры x86.
Инструкция FSCALE умножает число на вершине стека на двойку в степени, заданной вторым регистром стека (с отбрасыванием дробной части). По сути, это масштабирование на степень двойки, которое на первый взгляд сводится к простой корректировке порядка числа.
140 микроинструкций ради одной команды
На практике реализация FSCALE в 8087 включает более 140 микроинструкций и три уровня вызовов подпрограмм — всё ради того, чтобы корректно обработать все возможные случаи. На аннотированном снимке кристалла отмечены функциональные блоки, которые участвуют в выполнении только этой одной инструкции. Он наглядно показывает, сколько аппаратных ресурсов требует даже «простое» масштабирование числа с плавающей запятой.
Как и команды процессоров x86 с их CISC-архитектурой, инструкции 8087 раскладываются на отдельные шаги. Среди них загрузка значений в регистры, выполнение операций, проверка и обработка ошибочных ситуаций, а также управление стеком. Разбор Ширриффа показывает, что вся эта цепочка выстроена очень логично: высокоуровневая команда выполняет всё необходимое для надёжной работы и при этом избавляет программиста от необходимости разбираться в деталях.
Наследие сопроцессора
Разработка 8087 заметно повлияла на появившийся позднее стандарт IEEE 754, который до сих пор определяет, как компьютеры хранят и обрабатывают числа с плавающей запятой. Для своего времени этот сопроцессор был одним из самых математически точных FPU, но при этом оставался достаточно дешёвым, чтобы попасть в сравнительно доступные персональные компьютеры. Поэтому детальный разбор его микрокода интересен не только историкам вычислительной техники, но и всем, кто хочет понять, как устроены вычисления с плавающей запятой на аппаратном уровне.


















