Регистры FPU
FPU предоставляет восемь регистров для хранения данных и пять вспомогательных регистров.
Регистры данных (R0 – R7) не адресуются по именам, как регистры основного процессора. Вместо этого эти восемь регистров рассматриваются как стек, вершина которого называется ST, а более глубокие элементы — ST(1), ST(2) и так далее до ST(7). Если, например, в какой-то момент времени регистр R5 называется ST (рис. 13), то после записи в этот стек числа оно будет записано в регистр R4, который станет называться ST, R5 станет называться ST(1) и т.д.
Рис. 13. Регистры FPU
|
|
К регистрам R0 – R7 нельзя обращаться напрямую, по именам, но если процессор поддерживает расширение ММХ, то мантиссы, находящиеся в этих регистрах, становятся доступны, как ММ0 – ММ7. | |
|
Регистр состояний SR содержит слово состояния FPU:
Бит 15: В — занятость FPU — этот флаг существует для совместимости с 8087, и его значение всегда совпадает с ES.
Бит 14: С3 — условный флаг 3.
Биты 13 – 11: ТОР — число от 0 до 7, показывающее, какой из регистров данных R0 – R7 в настоящий момент является вершиной стека.
Бит 10: С2 — условный флаг 2.
Бит 9: С1 — условный флаг 1.
Бит 8: С0 — условный флаг 0.
Бит 7: ES — общий флаг ошибки — равен 1, если произошло хотя бы одно немаскированное исключение.
Бит 6: SF — ошибка стека. Если С1 = 1, произошло переполнение (команда пыталась писать в непустую позицию в стеке), если С1 = 0, произошло антипереполнение (команда пыталась считать число из пустой позиции в стеке).
Бит 5: РЕ — флаг неточного результата — результат не может быть представлен точно.
Бит 4: UE — флаг антипереполнения — результат слишком маленький.
Бит 3: ОЕ — флаг переполнения — результат слишком большой.
Бит 2: ZE — флаг деления на ноль — выполнено деление на ноль.
Бит 1: DE — флаг денормализованного операнда — выполнена операция над денормализованным числом.
Бит 0: IE — флаг недопустимой операции — произошла ошибка стека (SF = 1) или выполнена недопустимая операция.
Биты С0 – С3 употребляются так же, как и биты, состояния в основном процессоре, — их значения отражают результат выполнения предыдущей команды и используются для условных переходов; команды
fstsw ax sahf
копируют их значения в регистр FLAGS так, что флаг С0 переходит в CF, С2 — в PF, а С3 — в ZF (флаг С2 теряется).
Биты 0 – 5 отражают различные ошибочные ситуации, которые могут возникать при выполнении команд FPU. Они рассмотрены в описании управляющих регистров.
Регистр управления CR:
Биты 15 – 13 — зарезервированы.
Бит 12 «IC» — управление бесконечностью (поддерживается для совместимости с 8087 и 80287 — вне зависимости от значения этого бита +
> -
).
Биты 11 – 10 «RC» — управление округлением.
Биты 9 – 8 «PC» — управление точностью.
Биты 7 – 6 — зарезервированы.
Бит 5 «РМ» — маска неточного результата.
Бит 4 «UM» — маска антипереполнения.
Бит 3 «ОМ» — маска переполнения.
Бит 2 «ZM» — маска деления на ноль.
Бит 1 «DM» — маска денормализованного операнда.
Бит 0 «IM» — маска недействительной операции.
Биты RC определяют способ округления результатов команд FPU до заданной точности (табл. 10).
Таблица 10. Способы округления
Значение RC |
Способ округления |
0 |
к ближайшему числу |
1 |
к отрицательной бесконечности |
2 |
к положительной бесконечности |
3 |
к нулю |
Биты PC определяют точность результатов команд FADD, FSUB, FSUBR, FMUL, FDIV, FDIVR и FSQRT (табл. 11).
Таблица 11. Точность результатов
Значение PC |
Точность результатов |
0 |
одинарная точность (32-битные числа) |
1 |
зарезервировано |
2 |
двойная точность (64-битные числа) |
3 |
расширенная точность (80-битные числа) |
Биты 0 – 5 регистра CR маскируют соответствующие исключения — если маскирующий бит установлен, исключения не происходит, а результат вызвавшей его команды определяется правилами для каждого исключения специально.
Регистр тегов TW содержит восемь пар бит, описывающих содержание каждого регистра данных, — биты 15 – 14 описывают регистр R7, 13 – 12 — R6 и т.д. Если пара бит (тег) равна 11, соответствующий регистр пуст. 00 означает, что регистр содержит число, 01 — ноль, 10 — нечисло, бесконечность, денормализованное число, неподдерживаемое число.
Регистры FIP и FDP содержат адрес последней выполненной команды (кроме FINIT, FCLEX, FLDCW, FSTCW, FSTSW, FSTSWAX, FSTENV, FLDENV, FSAVE, FRSTOR и FWAIT) и адрес ее операнда соответственно и используются в обработчиках исключений для анализа вызвавшей его команды.
Содержание раздела