Почему FLD m80fp не вызывает исключения для входов SNaN, в то время как FLD двойного или с плавающей запятой может? - PullRequest
2 голосов
/ 04 апреля 2020

Здесь возможны исключения при использовании FLD :

  • #IS Произошло переполнение стека или переполнение.
  • #IA Операнд источника SNAN. Не возникает, если исходный операнд имеет двойной формат с плавающей запятой с расширенной точностью (FLD m80fp или FLD ST (i)).
  • #D Исходный операнд является ненормальным значением. Не возникает, если исходный операнд имеет двойной формат с плавающей запятой с расширенной точностью.

Почему исключение #IA "не возникает, если исходный операнд имеет двойное с плавающей запятой расширенной точности формат точки "?

Я думаю, что формат с плавающей точкой двойной точности и формат с двойной точностью расширенной точности в основном совпадают. Оба способны кодировать SNaN.

Есть ли логическая причина для такого различия или это просто так?

1 Ответ

5 голосов
/ 04 апреля 2020

fld m64fp и m32fp должны быть преобразованы во внутренний 80-битный формат, используемый в регистрах x87. Вы можете думать об этом как об этом процессе преобразования, который может вызвать исключение # SNaN.

fld m80fp - это просто загрузка данных, которые уже находятся в собственном внутреннем формате, например frstor.

(Обратите внимание, что ЦП AMD64 do сигнализируют об исключении FP при 80-битных нагрузках SNaN ; это одно из незначительных различий между реализациями AMD и Intel x86-64).

Преобразование из числа с плавающей запятой или двойного в расширенное 80-разрядное значение должно проверять биты исходного числа с плавающей запятой, расширяя мантиссу и добавляя явный начальный 1 или 0 в зависимости от показателя степени поле, отличное от нуля (нормальное или субнормальное).

Этот явный и неявный бит мантиссы является существенным отличием между x87 с двойным расширением и IEEE binary64 aka двойной или слово. Оба могут кодировать SNaN, но они определенно не «в основном одинаковы», как двоичные32 и двоичные 64 (просто более широкие поля).


Эта «несогласованность», вероятно, восходит к 8087 году, когда транзисторные бюджеты были очень ограниченное; fld m80fp проверка на наличие SNaN, даже если он не использует обычное оборудование для преобразования, обойдется в дополнительные транзисторы.

Обратите внимание, что fld m80fp - это only способ, которым вы можете сделать x87 FPU прочитать значение tbyte FP (отличное от frstor или более современное fxrstor или xrstor). Там нет fadd m80fp или ничего. Поэтому ни одна операция, которая включает чтение m80fp из памяти, никогда не должна вызывать исключение для SNaN.

Существуют формы операндов источника памяти большинства математических инструкций FP, такие как fadd st0, m64fp и fadd st0, m32fp, которые, по-видимому, также необходимо преобразовать во внутренний формат как часть их работы. Поэтому имеет смысл обнаруживать, что SNAN источника памяти является частью этого преобразования.

Так что, если вы проектируете 8087, имеет смысл иметь logi c, который обрабатывает нагрузки из проверка памяти на SNaN при преобразовании 32- и 64-разрядных входов, но не при простой загрузке 80-разрядного собственного формата. Вероятно, именно отсюда Intel изначально унаследовала это поведение, и не имело смысла выделять более поздние процессоры, чтобы они сохраняли это поведение.

IDK, следует ли рассматривать это как недостаток или на самом деле хорошо думаю, что вы можете загрузить 80-битные собственные значения FP без возможности создания исключения. По-видимому, AMD решила, что нет, и сигнализирует об исключении FP для fld m80fp SNaN.

Или вы можете посчитать это плохой вещью, что fld dword / qword может вызвать исключение при простом переформатировании плавающей запятой с помощью нет возможности потери данных и не выполнять какие-либо реальные вычисления.


Справочная информация:

Обычно вы никогда не сталкиваетесь с SNaN. выходами недопустимых операций, таких как деление на 0, являются QNaNs, IIR C. Таким образом, вы получаете SNaN, только если вы создаете его самостоятельно с целочисленными инструкциями или как постоянные данные. (Я думаю.)

И, конечно, обычно у вас маскируются исключения FP, поэтому он не ошибка , просто устанавливает бит в слове состояния FP.

...