Скачиваний:
57
Добавлен:
16.04.2013
Размер:
349.18 Кб
Скачать

5.4.1.2. Ошибка: Исключение с плавающей точкой

Ошибка «Исключение с плавающей точкой» вызывается, если происходит одно из следующих четырех обстоятельств:

  1. Процессор запрашивает помощь системного программного обеспечения для завершения операции через ошибку «Программная помощь».

  2. IEEEловушка «Неверная операция» доступна и произошла.

  3. IEEEловушка «Деление на ноль» доступна и произошла.

  4. Ловушка «Не нормализованный/Денормальзованный операнд» доступна и не нормализованный операнд (в файле регистров, денормализованные числа представляются как не нормализованные числа) встретился в арифметической инструкции с плавающей точкой.

Если вызвана только индикация ошибки «Исключение с плавающей точкой», то она отмечается в поле ISR.code. Соответствующие флаги состояния вFPSRне изменяются.

Не требуется, чтобы ошибка «Исключение: Программная помощь с плавающей точкой» когда-нибудь сигнализировала (за исключением некоторых операндов в инструкциях frcpaиfrsqrta), при этом нет режима, вынуждающего это использовать. Если нет исходного операндаNaTVal, то реализация процессора может сигнализировать об ошибке «Исключение: Программная помощь с плавающей точкой» в любое время в течение операции. Чтобы гарантировать максимальную производительность с плавающей точкой, большинство реализаций не будет использовать это исключение, если нет трудных ситуаций, таких как операции, применяющие денормализованные числа.

Правила очередности ошибок «Исключения с плавающей точкой» для арифметических операций, изображено на рис. 5.11.

5.4.1.3. Ловушка «Исключение с плавающей точкой»

Ловушка «Исключение с плавающей точкой» вызывается, если происходит одно из следующих четырех обстоятельств:

  1. Процессор запрашивает помощь системного программного обеспечения для завершения операции через ловушку «Программная помощь».

  2. IEEEловушка «Переполнение» доступна и произошло переполнение.

  3. IEEEловушка «Антипереполнение» доступна и произошло антипереполнение.

  4. 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. Приоритетность ловушек«Исключения с плавающей точкой»