- •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.4.1.1. Ошибка: Недоступный регистр с плавающей точкой
В регистре PSR, два бита – PSR.dfl и PSR.dfh (см. раздел 3.3.2 «Регистр состояния процессора (PSR) во втором томе) могут быть использованы операционной системой для разрешения или запрещения доступа к двум подмножествам регистров с плавающей точкой: от FR2 до FR31 и от FR32 до FR127 соответственно. Ошибка «Недоступный регистр с плавающей точкой» случается, когда обращение (чтение или запись) делается для FR, доступ к которому запрещен. Операционная система может использовать эту ошибку для идентификации задачи как целочисленной или с плавающей запятой и оптимизировать, заданный по умолчанию набор регистров, которые сохраняются при переключении задач. Если целочисленная задача, главным образом, способна использовать для операций целочисленного умножения и деления, только регистры от FR2 до FR31, то время переключения контекста может быть уменьшено отключением доступа к старшим регистрам с плавающей точкой.
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 |
|
Invalid |
Y |
FP.Fault |
|
|
|
|
|
|
Operand? |
|
E |
|
ISR.v=1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N
|
|
|
|
|
|
|
|
|
N |
|
Q |
|
|
|
|
|
|
|
|
|
|
FLAGS.v=1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SNaN |
Y |
Invalid |
Y |
FP.Fault |
|
|
|
|
|
|
Operand? |
|
Enabled? |
|
ISR.v=1 |
|
|
|
|
|
|
|
|
N
|
|
|
|
|
|
|
|
|
N |
|
F |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SNaN |
Y |
Reg prioritized |
|
|
|
|
|
|
|
|
Operand? |
|
NaN resp(f4,f2,f3) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Other Invalid |
|
I |
Y |
FP.Fault |
|
|
|
|
|
|
Operand? |
|
Enabled? |
|
ISR.v=1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N
|
|
|
|
|
|
|
|
|
N |
|
QNaN Ind |
|
|
|
|
|
|
|
|
|
|
FLAGS.v=1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Zero |
Y |
Z |
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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F |
Y |
Denomal |
Y |
UnNomal |
|
|
|
|
|
|
ISR.d=1 |
|
Enabled? |
|
Operand? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N |
|
N |
|
(1) для frcpa/fprcpa |
|
|
|
|
|
|
F |
|
COMPUTE |
|
(2) для frcpa/frsqrta |
|
|
|
|
|
|
|
OPERATION |
|
|
|
|
|
|
Рис.5.11. Приоритетность ошибок «Исключения с плавающей точкой»
Рис.5.12. Приоритетность ловушек«Исключения с плавающей точкой»

Y
nabled?
NaN
Ind
LAGS.v=1
Y
nvalid
eroDiv
P.Fault
LAGS.d=1