Скачиваний:
57
Добавлен:
16.04.2013
Размер:
480.26 Кб
Скачать

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.