- •5. Модель программирования с плавающей точкой.
- •5.1. Форматы и типы данных
- •5.1.1. Типы действительных чисел
- •5.1.2. Формат регистра с плавающей точкой
- •5.1.3. Представление значений в регистрах с плавающей точкой
- •5.2. Регистр состояния с плавающей точкой
- •5.3. Инструкции с плавающей точкой
- •5.3.1. Инструкции доступа к памяти
- •5.3.3. Арифметические инструкции
- •5.3.2. Инструкции обмена между регистрами с плавающей точкой и основными регистрами
- •5.3.4. Неарифметические инструкции
- •5.3.5. Инструкции поля состояния для регистра состояния с плавающей точкой (fpsr)
- •5.3.6. Инструкции целочисленного умножения и сложения
- •5.4. Дополнительные обсуждения в связи с ieee
- •5.4.1. Прерывания с плавающей точкой
- •5.4.1.1. Ошибка: Недоступный регистр с плавающей точкой
- •5.4.1.2. Ошибка: Исключение с плавающей точкой
- •5.4.1.3. Ловушка «Исключение с плавающей точкой»
- •5.4.2. Определение Переполнения
- •5.4.3. Определение Крошечности, Неточности и Антипереполнения.
- •5.4.4. Целочисленные неверные операции
- •5.4.5. Определение целочисленных операций
- •5.4.6. Определение и распространение значений.
- •5.4.7. Операции, предписанные стандартом ieee, отложенные программно
- •5.4.8. Дополнения сверх стандарта ieee
5.3.5. Инструкции поля состояния для регистра состояния с плавающей точкой (fpsr)
Спекуляции операций с плавающей точкой требуют, чтобы флаги состояния были временно сохранены в одном из дополнительных полей состояния (не в FPSR.sf0). После завершения выполнения спекулятивной цепочки, инструкция fchkf может быть использована для обновления флагов основного поля состояния (FPSR.sf0.flags). Эта операция сохранит корректность IEEE флагов. Инструкция fchkf делает это путем сравнения флагов поля состояния с FPSR.sf0.flags и FPSR.traps. Если флаги дополнительного поля состояния указывают, что произошел случай соответствующий разрешенному в FPSR.traps исключению с плавающей точкой, либо случай, который не был ранее уже зарегистрирован в FPSR.sf0.flags (т.е. в FPSR.sf0.flags сброшен флажок для этого случая), то инструкция fchkf выполняет переход к коду восстановления. Если ни один из этих случаев не произошел, то инструкция fchkf ничего не делает.
Инструкция fsetc позволяет побитовую модификацию битов управления поля состояния. Чтобы выработать управляющие биты для поля состояния, делается операция И между битами управления поля FPSR.sf0 и непосредственным 7-битным значением И-маски, а затем делается операция ИЛИ с непосредственным 7-битным значением ИЛИ-маски. Инструкция fclrf сбрасывает все флаги поля состояния в ноль.
Табл. 5.16. Инструкции поля состояния FPSR
Операция |
Мнемоника |
Проверка FP флагов |
fchkf.sf |
Очистка FP флагов |
fclrf.sf |
Управление установкой FP флагов |
fsetc.sf |
5.3.6. Инструкции целочисленного умножения и сложения
Целочисленное (с фиксированной точкой) умножение выполняется в устройстве с плавающей точкой, при использовании инструкции xma с тремя операндами. Операнды и результат этих инструкций являются регистрами с плавающей точкой. Инструкции xma игнорируют поля знака и порядка в регистре с плавающей точкой, за исключением проверки значения NaTVal. Произведение двух 64-битных мантисс складывается с третьей 64-битной мантиссой (расширенной нулями) для получения 128 битного результата. Старшая (high) и младшая (low) версии инструкции, выбирают соответственно младшие или старшие 64-бита из 128-битного результата и записывают полученное значение в приемный регистр, как обычное целое. Версии инструкции со знаком или без знака оперируют с 64-битными целыми сомножителями, как со знаковыми или беззнаковыми, соответственно.
Табл. 5.17. Инструкции целочисленного умножения и сложения
Целочисленное сложение и умножение |
Младшее |
Старшее |
Со знаком |
xma.l |
xma.h |
Без знака |
xma.lu (псевдооперация) |
xma.hu |
5.4. Дополнительные обсуждения в связи с ieee
Этот раздел описывает поддержку стандартов IEEE в областях, где определенные детали оставлены открытыми.
5.4.1. Прерывания с плавающей точкой
Прерывания с плавающей точкой являются точными. Сообщение и обработка исключения происходят на инструкции, которая вызвала прерывание. Имеется три прерывания с плавающей точкой: ошибка «Недоступный регистр с плавающей точкой», ошибка «Исключение с плавающей точкой», ловушка «Исключение с плавающей точкой» (детальнее, см. главу 5 «Прерывания» во втором томе).
Исключения обрабатываются согласно предопределенному правилу очередности. Правило очередности обработки исключений состоит в том, что исключение с более высоким приоритетном отмечается флагом в первую очередь, и результаты вырабатываются согласно требованиям этого исключения. Исключение с более низким приоритетом не отмечается флагом, даже если оно происходит. Например, деление SNaN на ноль вызовет исключение «Неверная операция» (из-за SNaN), а не исключение «Деление на ноль». Результатом запрета исключения будет неопределенность QNaN, а не бесконечность. Однако, IEEE исключение-ловушка «Потеря точности с плавающей точкой» может сопровождать исключения-ловушки «Переполнение или Антипереполнение с плавающей точкой».
Для инструкций, которые обращаются к файлу регистров с плавающей точкой, наивысший приоритет имеет ошибка «Недоступный регистр с плавающей точкой».
