Intel 8087 прячет за сдвигом экспоненты 140 микроинструкций
В регистровом стеке 8087 лежат два числа. Одно надо домножить на 2 в степени второго, предварительно отбросив дробную часть степени в сторону нуля. Для нормализованного числа действие почти физическое: взять экспоненту, прибавить целое значение и вернуть мантиссу в покое. Именно так на уровне ISA выглядит FSCALE — компактная команда, унаследованная позднейшей x87-архитектурой.
Короткая команда открывает длинный граф переходов
Реконструкция Ken Shirriff показывает, какую цену платит микрокод, чтобы это обещание сохранялось для любых данных. Полный граф исполнения FSCALE содержит свыше 140 микроинструкций и три уровня вызовов микроподпрограмм. Число описывает объём восстановленного control flow; оно не задаёт фиксированную latency команды и не означает 140 тактов. Прямой маршрут для обычных нормализованных операндов занимает около 22 микроинструкций.
За пределами этого короткого маршрута процессор попадает в старую, очень плотную драму плавающей точки. У операндов есть теги стека, возможны пустой регистр, ноль, денормализованное или ненормализованное значение, бесконечность и NaN. Изменённая экспонента может переполниться либо увести число в underflow. Результат требуется округлить, выставить статусные флаги и, в зависимости от масок исключений, передать специальное значение или сигнализировать исключение. Одна арифметическая строчка превращается в автомат состояний, где путь определяется одновременно данными и режимом FPU.
Где формула встречает все состояния FPU
Shirriff сопоставляет ветви реконструированного листинга с размеченной микрофотографией 8087. В работе участвуют стековые и временные регистры, B-регистр, суммирующий регистр, сумматор, сдвигатель и ROM-преобразователь экспоненты. Благодаря этой привязке FSCALE перестаёт быть псевдокодом из справочника: можно проследить, где число ждёт проверки своего класса, где экспонента получает поправку и где результат готовят к возврату в стек.
Микрокод можно увидеть на кристалле
Документация Intel фиксирует именно тот контракт, который раздувает эту кажущуюся простой операцию: ST(1) усечён к нулю, экспонента ST(0) масштабируется соответствующей степенью двойки, а таблицы special cases и исключений обязательны для архитектурного поведения. Микрокод 8087 скрывает эту таблицу за десятками переходов и общими подпрограммами. Для современного разработчика ускорителей, DSP-блоков и «однокомандных» периферий это наглядная цена красивой семантики: normal path рисуется за вечер, а кремний разрастается там, где интерфейс обязан оставаться определённым.