- •5. Модель программирования с плавающей точкой.
- •5.1. Форматы и типы данных
- •5.1.1. Типы действительных чисел
- •5.1.2. Формат регистра с плавающей точкой
- •5.1.3. Представление значений в регистрах с плавающей точкой
- •5.2. Регистр состояния с плавающей точкой
- •5.3. Инструкции с плавающей точкой
- •5.3.1. Инструкции доступа к памяти
- •5.3.2. Инструкции обмена между регистрами с плавающей точкой и основными регистрами
- •5.3.3. Арифметические инструкции
- •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.4.1.2. Ошибка: Исключение с плавающей точкой
Ошибка «Исключение с плавающей точкой» вызывается, если происходит одно из следующих четырех обстоятельств:
Процессор запрашивает помощь системного программного обеспечения для завершения операции через ошибку «Программная помощь».
IEEEловушка «Неверная операция» доступна и произошла.
IEEEловушка «Деление на ноль» доступна и произошла.
Ловушка «Не нормализованный/Денормальзованный операнд» доступна и не нормализованный операнд (в файле регистров, денормализованные числа представляются как не нормализованные числа) встретился в арифметической инструкции с плавающей точкой.
Если вызвана только индикация ошибки «Исключение с плавающей точкой», то она отмечается в поле ISR.code. Соответствующие флаги состояния вFPSRне изменяются.
Не требуется, чтобы ошибка «Исключение: Программная помощь с плавающей точкой» когда-нибудь сигнализировала (за исключением некоторых операндов в инструкциях frcpaиfrsqrta), при этом нет режима, вынуждающего это использовать. Если нет исходного операндаNaTVal, то реализация процессора может сигнализировать об ошибке «Исключение: Программная помощь с плавающей точкой» в любое время в течение операции. Чтобы гарантировать максимальную производительность с плавающей точкой, большинство реализаций не будет использовать это исключение, если нет трудных ситуаций, таких как операции, применяющие денормализованные числа.
Правила очередности ошибок «Исключения с плавающей точкой» для арифметических операций, изображено на рис. 5.11.
5.4.1.3. Ловушка «Исключение с плавающей точкой»
Ловушка «Исключение с плавающей точкой» вызывается, если происходит одно из следующих четырех обстоятельств:
Процессор запрашивает помощь системного программного обеспечения для завершения операции через ловушку «Программная помощь».
IEEEловушка «Переполнение» доступна и произошло переполнение.
IEEEловушка «Антипереполнение» доступна и произошло антипереполнение.
IEEEловушка «Потеря точности» доступна и у результата произошла потеря точности.
Когда происходят переполнение, антипереполнение, потеря точности результата, то обновляются соответствующие флаги в FPSR. Если произошла разрешенная ловушка «Исключение с плавающей точкой», то индикация этой разрешенной ловушки запоминается в полеISR.code, а битfpaв этом поле (ISR{14}) устанавливается так, как это описано в следующем абзаце.
Если величина представленного результата больше, чем величина абсолютно точного результата, то ISR.fpaустанавливается в 1, иначе он устанавливается в 0. Величина представленного результата может быть больше, если
мантисса увеличена в процессе округления, либо
если большее предопределенное значение (например, бесконечность) заменило собой вычисленный результат (например, когда переполнение заблокировано).
Не требуется, чтобы ловушка «Исключение: Программная помощь с плавающей точкой» когда-нибудь сигнализировала, при этом нет режима, вынуждающего это использовать. Чтобы гарантировать максимальную производительность с плавающей точкой, выполнение будет редко использовать это исключение – только в трудных ситуациях, таких как операции создания денормализованных чисел. Если ловушка «Программная помощь» запрещена, но произошла, то это указывается установкой бита ловушки в поле ISR.code. При этом приемный регистр содержит ответ, допустимый для этой ловушки.
Правила очередности ловушек «Исключения с плавающей точкой» для арифметических операций, изображено на рис. 5.12.
|
|
|
|
START |
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
| ||
|
|
|
NaTVal |
Y |
NaTVal |
|
|
|
|
|
|
|
|
Response |
|
Operand? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
N |
|
|
|
|
|
|
|
|
|
|
|
|
| |||
|
|
|
|
|
Unsupported |
Y |
Invalid |
Y |
FP.Fault |
|
|
|
|
|
|
Operand? |
|
Enabled? |
|
ISR.v=1 |
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
N |
|
|
|
|
|
|
|
|
N |
|
QNaN Ind |
|
|
|
|
|
|
|
|
|
|
FLAGS.v=1 |
|
|
|
|
|
|
|
|
|
|
| |||
|
|
|
|
|
SNaN |
Y |
Invalid |
Y |
FP.Fault |
|
|
|
|
|
|
Operand? |
|
Enabled? |
ISR.v=1 |
| |
|
|
|
|
|
|
N |
|
|
| |
|
|
|
|
|
N |
|
FLAGS.v=1 |
|
|
|
|
|
|
|
|
|
|
|
| ||
|
|
|
|
|
SNaN |
Y |
Reg prioritized |
|
|
|
|
|
|
|
|
Operand? |
NaN resp(f4,f2,f3) |
|
|
| |
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
N |
|
|
|
|
| |
|
|
|
|
|
|
|
|
| ||
|
|
|
|
|
Other Invalid |
Y |
Invalid |
Y |
FP.Fault |
|
|
|
|
|
|
Operand? |
|
Enabled? |
|
ISR.v=1 |
|
|
|
|
|
|
|
|
|
| ||
|
|
|
|
|
|
|
N |
|
|
|
|
|
|
|
|
N |
|
QNaN Ind |
|
|
|
|
|
|
|
|
|
|
FLAGS.v=1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||
|
|
|
|
|
Zero |
Y |
ZeroDiv |
Y |
FP.Fault |
|
|
|
|
|
|
Divide?(1) |
Enabled? |
|
ISR.z=1 |
| |
|
|
|
|
|
|
|
|
| ||
|
|
|
|
|
N |
|
N |
|
|
|
|
|
|
|
|
|
|
| |||
|
|
|
SWA.Fault |
Limits |
|
IEEE Resp |
|
|
| |
|
|
|
ISR.swa=1 |
|
Check?(2) |
|
FLAGS.z=1 |
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
N |
|
|
|
|
|
|
|
|
|
|
|
|
| |||
|
FP.Fault |
Y |
Denomal |
Y |
UnNomal |
|
|
|
|
|
|
ISR.d=1 |
|
Enabled? |
|
Operand? |
|
|
|
|
|
|
|
|
|
|
|
|
|
| ||
|
|
|
N |
|
N |
|
(1) для frcpa/fprcpa |
|
| |
|
|
|
FLAGS.d=1 |
|
COMPUTE |
|
(2) для frcpa/frsqrta |
|
| |
|
|
|
|
OPERATION |
|
|
|
|
|
Рис.5.11. Приоритетность ошибок «Исключения с плавающей точкой»
Рис.5.12. Приоритетность ловушек«Исключения с плавающей точкой»