- •6. Модель прикладного выполнения в системной среде Intel®Itanium™
- •6.1. Режимы набора инструкций
- •6.1.1. Выполнение набора инструкций в среде IntelItanium.
- •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. Ia-32 регистры с плавающей точкой
- •6.2.5.1. Ia-32 стек регистров с плавающей точкой
- •6.2.5.2. Специальные случаи
- •6.2.5.3. Регистры управления с плавающей точкой ia-32.
- •6.2.5.4. Ia-32 среда с плавающей точкой
- •6.2.6. Ia-32 регистры ммх технологии
- •6.2.7. Ia-32 регистрыSse
- •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.2. Alat
- •6.4.3. Влияние NaT/NaTValна инструкцииIa-32
6.2.5. Ia-32 регистры с плавающей точкой
Стек IA-32 регистров с плавающей точкой, числовые средства управления и среды с плавающей точкой, отображаются в Itanium регистрах с плавающей точкой FR8-FR15, а имена прикладных регистров размещены так, как показано в табл. 6.6.
Табл. 6.6. Отображение IA-32 регистров с плавающей точкой
Itanium регистр |
IA-32 регистр |
Размер (бит) |
Описание |
FR8 |
ST[(TOS+N)==0] |
80 |
Стек цифровых регистров IA-32. Обращения к FR8-FR15 с помощью Itanium инструкций игнорируютIA-32 настройкуTOS. Обращения IA-32 используют настройкуTOSдля получения регистраN. |
FR9 |
ST[(TOS+N)==1] | ||
FR10 |
ST[(TOS+N)==2] | ||
FR11 |
ST[(TOS+N)==3] | ||
FR12 |
ST[(TOS+N)==4] | ||
FR13 |
ST[(TOS+N)==5] | ||
FR14 |
ST[(TOS+N)==6] | ||
FR15 |
ST[(TOS+N)==7] | ||
FCR (AR21) |
FCW, MXCSR |
64 |
IA-32 управляющее словоFPUиSSEуправляющий регистр |
FSR (AR28) |
FSW, FTW, MXCSR |
64 |
Слова тегов и состояния FPUIA-32 иSSEсостояние |
FIR (AR29) |
FOP, FCS, FIP |
64 |
Указатель инструкций FPUIA-32 |
FDR (AR30) |
FDS,FEA |
48 |
Указатель данных FPUIA-32 |
6.2.5.1. Ia-32 стек регистров с плавающей точкой
IA-32 регистры с плавающей точкой определены следующим образом:
Стек числовых регистров IA-32 отображается вFR8-FR15, используя 80-битныйIEEEформат с плавающей точкойIntel8087.
При обращениях набора инструкций IA-32, регистры с плавающей точкой логически отображаются вFR8-FR15, аIA-32 указатель верхушки стека (TOS) содержится в полеFCR.top.FR8 представляет физический регистр после настройкиTOSи не обязательно будет вершиной стека логических регистров с плавающей точкой.
При обращениях набора инструкций Itanium, номера регистров с плавающей точкой являются физическими, а не функциями числового указателя TOS, например, обращение кFR8 всегда возвращает значение физического регистраFR8, не зависимо от значенияTOS. Программы типа Itanium не могут обязательно полагать, чтоFR8 содержитIA-32 логический регистрST(0). Настоятельно рекомендуется, чтобы использовались обычные соглашения о вызовах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.