Почему инструкция stfs PowerPC не работает должным образом? - PullRequest
1 голос
/ 08 ноября 2019

Регистры с плавающей запятой PowerPC поддерживают только формат двойной точности, поэтому загрузка и хранение значений одинарной точности требует преобразования. Преобразование из одинарного в двойное при загрузке имеет смысл, но преобразование из двойного в единичное для хранения делает некоторые запутанные вещиКажется, он правильно усекает числа, которые находятся в пределах диапазона с одинарной точностью, а также NaN, бесконечность и ноль, но делает странное смещение для всего остального вместо округления до нуля или бесконечности, как я и ожидал.

Примеры из процессора PPC750. Примеры, которые дают ожидаемый результат, перечислены первыми.

double-precision input    decimal approximation    single-precision output    decimal approximation

0x 400f ffff ffff ffff    3.99999999               0x 407f ffff               3.99999976
0x 7ff8 0000 0000 0000    QNaN                     0x 7fc0 0000               QNaN
0x 7ff0 0000 0000 0000    +inf                     0x 7f80 0000               +inf
0x 8000 0000 0000 0000    -0.0                     0x 8000 0000               -0.0
--------------------------------------------------------------------------------------------------
0x 8000 0000 0000 0001    -4.941e-324              0x 8080 0000               -1.175e-38
0x 00a0 0000 0000 0000    1.139e-305               0x 0500 0000               6.019e-36
0x 7fe0 1234 5678 9abc    9.028e+307               0x 7f00 91a2               1.709e+38

Я посмотрел Руководство по средам программирования PowerPC , чтобы увидеть, может ли оно пролить свет на это. Раздел C.7 описывает шаги для преобразования для случаев «Не требуется денормализация» и «Требуется денормализация». (Обратите внимание, что || в этой записи означает сцепление.)

conversion steps

Затем он переходит в состояние:

Обратите внимание, что если значение, которое должно быть сохранено инструкцией с плавающей запятой с одинарной точностью, больше по величине, чем максимальное число, представляемое в одном формате, применяется первый упомянутый случай «Не требуется денормализация». В этом случае результат, хранящийся в WORD, является четко определенным значением, но он не равен числовому значению в исходном регистре (т. Е. Результат с плавающей точкой загрузки одинарной точности из WORD не сравнивается с содержимымрегистр исходного кода).

Это объясняет, почему я получил полученные результаты, но не объясняет, насколько это полезно. Мне кажется, что это вызовет ужасные ошибки, если значения снова будут загружены из памяти.

Почему инструкция stfs не выполняет нормальное округление? Как ожидается, что результат не вызовет проблем?

1 Ответ

2 голосов
/ 09 ноября 2019

Документация stfs гласит: «Обратите внимание, что сохраняемое значение должно быть в формате с одинарной точностью до выполнения инструкции stfs ». Это означает, что содержимое сохраняемого регистра должнобыть результатом некоторых предыдущих инструкций, которые производят значение одинарной точности, например fmuls (умножение с плавающей запятой одинарной точности) или frsp (округление до одинарной точности).

Я бы рискнулодна из причин состоит в том, что это может быть быстро и легко реализовано - stfs не должен делать округления и не должен идти к единице с плавающей запятой, чтобы сделать это. Он может напрямую перейти к блоку хранения нагрузки, который имеет логику только для обработки более простых случаев, в которых достаточно усечения битов.

...