
Таблица 2.27
Недействительные операции FPU и их результаты при маскировании (IM = 1)
| | | | | | | |
| Недействительная операция
| Результат при IM = 1
| Любая арифметическая операция над SNaN или операндами с неподдерживаемыми форматами
| QNaN
| Сложение ¥ с разными знаками или вычитание ¥ с одинаковым знаком
| Неопределенность (QNaN)
| Умножение 0´¥, ¥´0 или деление ¥/¥, 0/0
| Неопределенность (QNaN)
| Сравнение или тестирование, если один или оба операнда NAN
| Устанавливает код условия «не сравнимы»
| Операция вычисление остатка (команды FPREM, FPREM1), когда делитель равен 0 или делимое равно ¥
| Неопределенность (QNaN) с установкой бита условия С2=1
| Тригонометрические операции вычисления sin, cos, частичного tg (команды FCOS, FPTAN, FSIN, FSINCOS), когда операнд равен ¥
| Неопределенность (QNaN) с установкой бита условия С2=1
| Операция извлечения корня, вычисления функции log2x над отрицательными операндами вычисления, log2(х+1) над операндом х<-1 (команды FSQRT, FYL2X, FYL2XP1)
| Неопределенность (QNaN)
| Операция пересылки в память целых и двоично-десятичных чисел и регистра данных FPU, если регистр пуст, содержит NaN или бесконечность либо его содержимое превышает диапазон представления адресуемой памяти (команды FIST, FISTP, FBSTP)
| Целочисленная неопределенность, код 100...00
| Операция обмена содержимого регистров данных, если один из них или оба пусты (команда FXCH)
| Установка неопределенности (QNaN) для пустых регистров и последующий обмен
|
Если хотя бы один из признаков IE, DE, ZE, OE, UE, РЕ установлен в состояние «1» и не маскирован, то общий признак ошибки устанавливается в состояние ES = 1 и формируется сигнал ошибки FERR# = 0 на внешнем выводе процессора. Если в регистре управления CR0 установлено значение бита NE = 1, то в этом случае непосредственно перед следующей командой FPU реализуется исключение типа #MF («ошибка FPU»).
При значении NE = 0 процедура обработки прерывания вызывается командой INTn, формируемой внешним контроллером прерываний. Получив сигнал FERR#=0, этот контроллер должен подать сигнал IGNNE# = 1 на соответствующий вход процессора. Данный сигнал вызывает остановку процессора непосредственно перед следующей командой FPU или WAIT. Эта остановка продолжается до поступления от контроллера прерываний команды INTn. Если на входе IGNNE# поддерживается состояние «0», то процессор продолжает выполнение программы, игнорируя ошибки FPU.
Процедуры обслуживания исключений, вызываемых FPU, могут использовать для выявления причины ошибок содержимое регистров FIP и FDP - указателей команд и данных, которое выводится из процессора с помощью команд управления FSTENV, FSAVE. В регистр FIP заносится адрес текущей команды FPU и 11 разрядов ее кода (два первых байта без кода ESC), если эта команда не входит в группу команд управления. Если команда выбирает операнд из памяти, то в регистр FDP заносится адрес операнда, в противном случае разряды регистра устанавливаются в неопределенное состояние. Когда выполнение команды вызывает немаскированное прерывание вследствие возникновения какой-либо из вышеуказанных ошибок, регистры FIP и FDP содержат информацию об этой команде и операнде, которая может быть использована для анализа причин ошибки. Так как команды управления не изменяют содержимое FIP и FDP, то процедура обработки ошибок FPU с помощью этих команд может выбирать содержимое FIP, FDP для проведения такого анализа.
Необходимо отметить влияние битов ЕМ, TS, МР регистра управления CR0 на выполнение команд FPU и WAIT/FWAIT. При TS = 1 или ЕМ = 1 поступление команд FPU вызовет исключение типа #NM («FPU недоступен»). Команда WAIT/FWAIT вызывает это исключение только при TS = МР = 1.
|