- •6. Модель прикладного выполнения в системной среде Intel® Itanium™
- •6.1. Режимы набора инструкций
- •6.1.1. Выполнение набора инструкций в среде Intel Itanium.
- •6.1.2. Выполнение набора инструкций ia-32
- •6.1.3. Переключения наборов инструкций
- •6.1.3.1. Инструкция jmpe
- •6.1.3.2. Инструкция перехода к ia
- •6.1.4. Переключения режимов работы ia-32
- •6.2. Модель состояния прикладных регистров ia-32
- •6.2.1. Регистры общего назначения ia-32
- •6.2.2. Указатель инструкций ia-32
- •6.2.3. Сегментные регистры ia-32
- •6.2.3.1. Сегменты данных и кода
- •6.2.3.2. Сегментный дескриптор и целостность среды
- •6.2.3.2.1. Защищенный режим.
- •6.2.3.2.2 Режим vm86
- •6.2.3.2.2 Реальный режим
- •6.2.3.3. Проверки целостности среды ia-32 во время выполнения
- •6.2.4. Прикладной ia-32 регистр eflag
- •6.2.5.2. Специальные случаи
- •6.2.5.3. Регистры управления с плавающей точкой ia-32.
- •6.3. Обзор моделей памяти
- •6.3.1. Упорядочивание памяти
- •6.3.2. Сегментация ia-32
- •6.3.3. Самомодифицирующийся код
- •6.3.4. Взаимодействия упорядочивания памяти.
- •6.4. Использование кодом ia-32, регистров Itanium
- •6.4.1. Механизм стека регистров
- •6.4.3. Влияние NaT/NaTVal на инструкции ia-32
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.
