Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M9 / Архитектура часть 6..doc
Скачиваний:
42
Добавлен:
16.04.2013
Размер:
480 Кб
Скачать

6.2.5.2. Специальные случаи

Для IA-32 инструкций с плавающей точкой, загрузка одинарного или двойного денормализованного значения дает в результате в нормализованное значение с двойной расширенной точностью, помещаемое в приемный регистр с плавающей точкой. Для Itanium инструкций с плавающей точкой, загрузка одинарного или двойного денормализованного значения дает в результате не нормализованное, денормализованное значение, помещаемое в приемный регистр с плавающей точкой. В Itanium архитектуре имеются два канонических значения порядка, которые показывают денормализованные числа одиночной точности и двойной точности.

При передаче значений с плавающей точкой из Itanium инструкций в IA-32, настоятельно рекомендуется, чтобы применялись типичные соглашения о вызовах IA-32, которые передают значения с плавающей точкой через стек памяти. Если программа передает значения с плавающей точкой из IA-32 в Itanium код через регистры с плавающей точкой, то программа должна гарантировать следующее:

  • Денормализованные Itanium числа с одинарной или двойной точностью должны быть преобразованы в ожидаемые нормализованные значения с двойной расширенной точностью, с помощью инструкций. Программа может преобразовать денормализованные Itanium числа путем умножения на 1.0 с двойной расширенной точностью (fma.sfx fr = fr, f1, f0). Если в операциях с плавающей точкой встретилось ошибочное денормализованное число с одинарной или двойной точностью, то генерируется ошибка – Исключение IA-32 (Неверный операнд с плавающей точкой).

  • Значение с плавающей точкой должно быть в диапазоне формата IA-32 с двойной расширенной точностью – 80-бит (с 15-битным порядком). Архитектура Itanium использует для промежуточных вычислений 82 бита (порядок расширяется до 17 бит). Программа должна гарантировать, что значения всех регистров с плавающей точной, передаются инструкциям IA-32 так, как будто бы они в 80-битном формате с двойной расширенной точностью, в противном случае работа процессора становится модельно зависимой и не определена. Неопределенное поведение может включать в себя (не ограничиваясь этим): при использовании IA-32 инструкций с плавающей точкой, генерацию ошибки – Исключение IA-32 (Неверный операнд с плавающей точкой); округление значений выходящих за границы диапазона к нулевому, бесконечному или денормализованному значению, при этом возможны ошибки – Исключение IA-32 (Переполнение или Антипереполнение с плавающей точкой), либо регистр, содержащий значение выходящее за границы диапазона, тихо преобразуется в значение QNAN или SNAN (преобразование могло произойти в процессе входа в набор инструкций IA-32 или при использовании IA-32 инструкций с плавающей точкой). Программа может гарантировать, что значения всех регистров с плавающей точной находятся внутри диапазона, путем умножения на 1.0 в формате с двойной расширенной точностью (с запретом сверх широкого диапазона порядка), с помощью fma.sfx fr = fr, f1, f0.

  • Значения с плавающей точкой NaTVal, не должны распространяться в IA-32 инструкциях с плавающей точкой, иначе работа процессора становится модельно зависимой и не определена. Процессоры могут тихо преобразовывать регистры содержащие NaTVal в SNAN (в процессе входа в набор инструкций IA-32 или при их использовании в IA-32 инструкциях с плавающей точкой). Зависимые, IA-32 инструкции с плавающей точкой, которые прямо или косвенно используют распространенный регистр NaTVal, будут либо распространять признак NaTVal, либо сгенерируют ошибку – Исключение IA-32 (Неверный операнд с плавающей точкой). Оба случая – и генерация ошибки и распространение признака NaTVal – являются модельно зависимыми. В любом случае процессор не позволит использовать регистр NaTVal, либо без распространения признака NaTVal, либо без генерации ошибки – Исключение IA-32 (Неверный операнд с плавающей точкой).

Примечание. Это невозможно для кода IA-32, поскольку при чтении NaTVal из памяти с помощью IA-32 инструкции загрузки из памяти, значение NaTVal не может быть выражено в виде 80-битного числа с двойной расширенной точностью.

Настоятельно рекомендуется, чтобы значения с плавающей точкой передавались через стек памяти по типичным IA-32 соглашениям о вызовах, чтобы избежать проблем с денормализованными числами Itanium и значениями NaTVal.