Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка.doc
Скачиваний:
617
Добавлен:
22.05.2015
Размер:
2.56 Mб
Скачать

8.2 Состав модуля fpu

Модуль FPU содержит:

  • восемь 80-битных регистров для хранения данных с плавающей запятой;

  • 48-битовый регистр указателя команд FPU;

  • 48-битовый регистр указателя данных FPU;

  • 16-битовый регистр тэгов;

  • 16-битовый управляющий регистр;

  • 16-битовый регистр состояния FPU;

  • регистр кода операции FPU.

Регистры данных FPU

Каждый 80-разрядный регистр данных FPU хранит расширенное вещественное число в формате, указанном на рисунке 8.2. Эти восемь регистров имеют свои собственные имена R0-R7.

Стек регистров

Основной особенностью FPU является то, что все восемь 80-разрядных регистров данных образуют стек. Однако в стеке регистры именуются относительными именами ST(0)-ST(7), в зависимости от глубины стека, на которой они находятся в данный момент. Регистр ST(0) всегда является вершиной стека и допускает сокращённое именование ST. Номер конкретного регистра R0-R7, который в данный момент находится на вершине стека, т.е. является регистром ST, указывается в 3-битовом поле TOP, находящимся в регистре состояния FPU. К регистрам R0 – R7 нельзя обращаться напрямую, по именам, но если процессор поддерживает расширение ММХ, то мантиссы, находящиеся в этих регистрах, становятся доступны через MMX‑регистры ММ0 – ММ7.

При помещении данных в стек (загрузке данных) регистров значение поля TOP декрементируется, а затем операнд помещается в регистр, находящийся на вершине стека, т.е. ST. Если перед выполнением команды помещения данных в стек поле TOP равно 0, вершина стека циклически сдвигается к регистру R7. Если загрузка данных в стек регистров приведёт к перезаписи несохранённых в нём данных, т.е. произойдёт переполнение стека и будет сгенерирована исключительная ситуация.

При выталкивании данных из стека (сохранении данных) регистров данные копируются из регистра ST в указанный операнд, а затем поле TOP инкрементируется. Если перед выполнением команды выталкивания значение поле TOP равно 7, вершина стека циклически сдвигается к регистру R0.

При выполнении команд с плавающей запятой их операнды хранятся в 80-битных регистрах в расширенном формате с двойной точностью (временный формат). При сохранении результата операции в памятьFPU автоматически преобразовывает его из расширенного формата в целое или длинное целое число, а также в короткое или длинное вещественное число. Модули ALU и FPU могут обмениваться значениями с плавающей запятой только через оперативную память. Поэтому перед вызовом команды с плавающей запятой её операнд всегда должен находиться в памяти. При этом FPU загружает число из памяти в свой стек регистров, выполняет над ним операцию и сохраняет результат обратно в память.

Регистры специального назначения

FPU имеет 6 регистров специального назначения (рис.8.3).

Регистр состояния SW содержит слово состояния FPU:

Бит 15: В – занятость FPU – этот флаг существует для совместимости с i8087, и его значение всегда совпадает с битом 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 употребляются так же, как и биты, состояния в основном процессоре, их значения отражают результат выполнения предыдущей команды и используются для условных переходов.

Биты 0 – 5 отражают различные ошибочные ситуации, которые могут возникать при выполнении команд FPU.

Регистр управления CW содержит следующие биты:

Биты 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 до заданной точности:

00 – округление к ближайшему числу;

01 – округление к отрицательной бесконечности;

10 – округление к положительной бесконечности;

11 – округление к нулю.

Биты PC определяют точность результатов команд FADD, FSUB, FSUBR, FMUL, FDIV, FDIVR и FSQRT:

00 – одинарная точность (32-битные числа);

01 – зарезервировано;

10 – двойная точность (64-битные числа);

11 – расширенная точность (80-битные числа).

Биты 0 – 5 регистра CW маскируют соответствующие исключения – если маскирующий бит установлен, исключения не происходит, а результат вызвавшей его команды определяется правилами для каждого исключения специально.

Регистр тегов TW содержит восемь двухразрядных тегов – по одному тегу для каждого регистра данных (рис.8.4). В тегах содержится информация о признаке хранимых в каждом регистре данных.

Двухразрядный тег может иметь одно из четырёх значений:

00 – в регистре разрешённое число (valid);

01 – в регистре ноль (zero);

10 – в регистре неразрешённое, бесконечное или денормализованное число (invalid, infinity, или denormalized);

11 – в регистре нет значения (empty).

Регистры‑указатели FIP и FDP содержат адрес последней выполненной команды (кроме FINIT, FCLEX, FLDCW, FSTCW, FSTSW, FSTSWAX, FSTENV, FLDENV, FSAVE, FRSTOR и FWAIT) и адрес ее операнда соответственно и используются в обработчиках исключений для анализа вызвавшей его команды.

Вопросы для самопроверки

  1. Перечислите стандарты представления чисел с плавающей запятой.

  2. Раскройте понятия нормализации и денормализации числа.

  3. Перечислите способы кодирования чисел и специальных значений.

  4. Каков состав модуля FPU?