- •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.3. Регистры управления с плавающей точкой ia-32.
Регистр FPSR управляет Itanium инструкциями с плавающей точкой, с помощью битов состояния и управления. Регистр FPSR не управляет IA-32 инструкциями с плавающей точкой и не отражает состояние IA-32 инструкций с плавающей точкой. Инструкции IA-32 с плавающей точкой и SSE имеют отдельные регистры управления и состояния, называемые FCR (floating point control register – регистр управления с плавающей точкой) и FSR (floating point status register – регистр состояния с плавающей точкой).
Как показано на рис.6.8., FCR содержит IA-32 биты FCW и все биты управления SSE.
Как показано на рис.6.9., FSR содержит IA-32 флаги состояния с плавающей точкой FSW, FTW и поля состояния SSE. Поля тегов показывают – являются ли соответствующие логические IA-32 регистры с плавающей точкой пустыми. Не поддерживаются коды тегов для нуля и специальных условий, таких как NaN, бесконечность или денормализованность каждого логического IA-32 регистра с плавающей точкой. Однако, набор инструкций IA-32 читая FTW, вычисляет дополнительные специальные условия для каждого IA-32 регистра с плавающей точкой. Код типа Itanium может использовать операцию классификации с плавающей точкой для того, чтобы определить диспозицию каждого IA-32 регистра с плавающей точкой.
Вместе, FCR и FSR содержат всю IA-32 информацию о тегах, состоянии и управлении с плавающей точкой. Инструкции IA-32, которые изменяются и управляются MXSCR, FCW, FSW и FTAG, на самом деле изменяют FSR и управляются FCR. При IA-32 чтении или записи регистров MXSCR, FCW, FSW и FTW, возвращается та же самая информация, как при чтении или записи FSR и FCR с помощью Itanium инструкций.
Перед входом в набор инструкций IA-32, программа должна гарантировать, что FCR и FSR загружены должным образом для числового выполнения. Когда программа типа Itanium загружает эти прикладные регистры (AR21 и AR28), тогда, если в зарезервированном бите окажется не нулевое значение, то будет вызвана ошибка «Зарезервированный регистр/поле». При записи в эти регистры, никакие значения кодов полей не проверяются.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IA-32 FCW{12:0} |
||||||||||||
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Резервировано (установлено в 0) |
IC |
R |
C |
P |
C |
0 |
1 |
PM |
UM |
OM |
ZM |
DM |
IM |
||||||||||||||||||
63 |
62 |
61 |
60 |
59 |
58 |
57 |
56 |
55 |
54 |
53 |
52 |
51 |
50 |
49 |
48 |
47 |
46 |
45 |
44 |
43 |
42 |
41 |
40 |
39 |
38 |
37 |
36 |
35 |
34 |
33 |
32 |
Резервировано (установлено в 0) |
FZ |
R |
C |
PM |
UM |
OM |
ZM |
DM |
IM |
rv |
Игнорируется |
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IA-32 MXCSR (управление) |
|||||||||||||||
Рис.6.8. IA-32 регистр управления с плавающей точкой (FCR).
IA-32 FTW{15:0} |
IA-32 FSW{15:0} |
||||||||||||||||||||||||||||||
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
tg7 |
0 |
tg6 |
0 |
tg5 |
0 |
tg4 |
0 |
tg3 |
0 |
tg2 |
0 |
tg1 |
0 |
tg0 |
B |
C3 |
TOP |
C2 |
C1 |
C0 |
ES |
SF |
PE |
UE |
OE |
ZE |
DE |
IE |
||
63 |
62 |
61 |
60 |
59 |
58 |
57 |
56 |
55 |
54 |
53 |
52 |
51 |
50 |
49 |
48 |
47 |
46 |
45 |
44 |
43 |
42 |
41 |
40 |
39 |
38 |
37 |
36 |
35 |
34 |
33 |
32 |
Резервировано (установлено в 0) |
Игнорируется |
rv |
PE |
UE |
OE |
ZE |
DE |
IE |
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IA-32 MXCSR (состояние) |
|||||||||||||||
Рис.6.9. IA-32 регистр состояния с плавающей точкой (FSR).
Табл. 6.7. Размещение IA-32 регистров состояния с плавающей точкой (FSR)
Управляющее поле IA-32 |
Управляющее поле Itanium |
Биты |
Использование IA-32 |
Использование в Itanium |
FSW.ie |
FSR.ie |
0 |
Исключение: неверная операция |
Эти биты не отражают состояние выполнения с плавающей точкой Itanium.
Подробности о цифровых флагах IA-32 см. в Intel Architecture Software Developer's Manual |
FSW.de |
FSR.de |
1 |
Исключение: операнд денормализован |
|
FSW.ze |
FSR.ze |
2 |
Исключение: деление на ноль |
|
FSW.oe |
FSR.oe |
3 |
Исключение: переполнение |
|
FSW.ue |
FSR.ue |
4 |
Исключение: антипереполнение |
|
FSW.pe |
FSR.pe |
5 |
Исключение по точности |
|
FSW.sf |
FSR.sf |
6 |
Ошибка стека |
|
FSW.es |
FSR.esA |
7 |
Ошибка Summury |
|
FSW.c3:0 |
FSR.c3:0 |
8:10, 14 |
Коды числовых условий |
|
FSW.top |
FSR.top |
11:13 |
Верхушка числового стека |
|
FSW.b |
FSR.b |
15 |
|
|
FTW |
FSR.tg {7:0}B |
16,18,20,22, 24,26,28,30 |
Теги чисел: 0 – не пуст, 1 – пуст C |
|
Нули |
17, 19, 21, 23, 25, 27, 29,31,39:47 |
Игнорируются – Запись игнорируется, чтение возвращает 0 |
||
MXCSR.ie |
FSR.ie |
32 |
Исключение: неверная операция при SSE |
Не отражают состояние выполнения с плавающей точкой Itanium.
Подробности см. в Intel Architecture Software Developer's Manual |
MXCSR.de |
FSR.de |
33 |
Исключение: операнд SSE денормализован |
|
MXCSR.ze |
FSR.ze |
34 |
Исключение: деление на ноль при SSE |
|
MXCSR.oe |
FSR.oe |
35 |
Исключение: переполнение при SSE |
|
MXCSR.ue |
FSR.ue |
36 |
Исключение: антипереполнение при SSE |
|
MXCSR.pe |
FSR.pe |
37 |
Исключение по точности при SSE |
|
Резервировано |
38, 48:63 |
Резервировано |
||
Игнорируется |
39:47 |
Игнорируются – Запись игнорируется, чтение возвращает 0 |
||
Детальнее о бите исключения Summury см. в разделе 6.2.5.4
Коды тегов показывающие содержится ли в числовом регистре 0, NaN, бесконечность или денормализованное значение, не поддерживаются при чтении FSR инструкциями типа Itanium. Набор инструкций IA-32, читая поле FTW, классифицирует возвращаемое значение как ноль, NaN, бесконечность или денормализованное.
Все инструкции технологии ММХ, устанавливают все цифровые теги в ноль (что означает – регистр не пуст). Однако, ММХ инструкция EMMS устанавливают все цифровые теги в единицу (что означает – регистр пуст).
6.2.5.4. IA-32 среда с плавающей точкой
Для поддержки модели отложенного числового исключения Intel 8087, регистры FSR, FDR и FIR содержат отложенную информация связанную с числовым исключением. Регистр FDR содержит эффективный адрес и селектор сегмента операнда. Регистр FIR содержит эффективный адрес, селектор кодового сегмента и биты кода операции числовой инструкции. Регистр FSR указывает на тип числового исключения совокупностью битов IE, DE, ZE, OE, UE, PE, SF и ES. Бит ES итожит IA-32 состояние исключения с плавающей точкой, следующим образом:
Если FSR.es читается кодом типа Itanium, то возвращаемое значение является итогом любых немаскируемых отложенных исключений содержащихся в битах IE, DE, ZE, OE, UE и PE регистра FSR.
Примечание. Чтение бита ES не обязательно возвращает последнее записанное значение, если бит ES противоречит другим битам отложенных исключений в FSR.
Если FSR.es установлен в 1 кодом типа Itanium, то задержанные числовые IA-32 исключения генерируются на следующей IA-32 инструкции с плавающей точкой, независимо от информации числового исключения, записанной в FSR битах IE, DE, ZE, OE, UE и PE.
Если FSR.es записан в противоречии с FSR битами (IE, DE, ZE, OE, UE и PE), то последующие числовые исключения могут сообщить противоречивые биты состояний с плавающей точкой.
Когда программа типа Itanium загружает эти прикладные регистры (AR29, AR30), тогда, если не нулевое значение будет записано в битах, перечисленных как резервированные, то будет вызвана ошибка «Зарезервированный регистр/поле». При записи этих регистров никакие значения кодов полей не проверяются. Регистры FSR, FDR и FIR должны быть сохранены, не смотря на переключение контекста, чтобы генерировать и точно сообщать числовые исключения.
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Смещение операнда (fea) |
|||||||||||||||||||||||||||||||
63 |
62 |
61 |
60 |
59 |
58 |
57 |
56 |
55 |
54 |
53 |
52 |
51 |
50 |
49 |
48 |
47 |
46 |
45 |
44 |
43 |
42 |
41 |
40 |
39 |
38 |
37 |
36 |
35 |
34 |
33 |
32 |
Резервировано (установлено в 0) |
Селектор операнда (fds) |
||||||||||||||||||||||||||||||
Рис. 6.10. Регистр данных с плавающей точкой (FDR)
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Смещение кода (fip) |
|||||||||||||||||||||||||||||||
63 |
62 |
61 |
60 |
59 |
58 |
57 |
56 |
55 |
54 |
53 |
52 |
51 |
50 |
49 |
48 |
47 |
46 |
45 |
44 |
43 |
42 |
41 |
40 |
39 |
38 |
37 |
36 |
35 |
34 |
33 |
32 |
резервировано |
Код операции {10:0} (fop) |
Селектор кода (fcs) |
|||||||||||||||||||||||||||||
Рис. 6.11. Регистр инструкций с плавающей точкой (FIR)
6.2.6. IA-32 регистры ММХ технологии
Восемь IA-32 регистров ММХ технологии отображаются в восьми Itanium регистрах с плавающей точкой FR8-FR15, причем ММ0 отображается в FR8, а ММ7 отображается в FR15. Отображение регистра ММХ технологии для представления IA-32 стека с плавающей точкой, зависит от значения указателя вершины IA-32 стека с плавающей точкой
81 |
80 |
64 |
63 |
0 |
|
1 |
единицы |
ММ0…ММ7{31:0} |
FR8-FR15 |
||
Рис. 6.12. IA-32 регистры ММХ технологии (от ММ0 до ММ7)
Когда значение, записанное в регистр ММХ технологии, используется IA-32 инструкцией ММХ технологии:
В поле порядка соответствующего регистра с плавающей точкой (биты 80-64) и в знаковом бите (бит 81), все биты устанавливаются в единицы.
Мантисса (биты 63-0) устанавливается в значение данных технологии ММХ.
Когда из регистра ММХ технологии считывается значение с помощью IA-32 инструкции ММХ технологии:
Поле порядка соответствующего регистра с плавающей точкой (биты 80-64) и знаковый бит (бит 81) игнорируются, включая любые коды NaTVal.
В результате этого отображения мантисса значения с плавающей точкой, записанного либо IA-32, либо Itanium инструкциями, проявится в IA-32 регистре ММХ технологии. Также, IA-32 регистр технологии ММХ проявится в поле мантиссы одного из восьми отображаемых регистров с плавающей точкой.
Чтобы избежать деградации эффективности, программистам настоятельно советуется не смешивать IA-32 инструкции с плавающей точкой и ММХ технологии. Детальнее рекомендации по программированию ММХ технологии см. в Intel Architecture Software Developer's Manual.
6.2.7. IA-32 регистры SSE
Восемь 128-битных регистров SSE (ХММ0-7) отображаются в шестнадцати физических регистрах Itanium с плавающей точкой FR16-FR31, попарно. Младшие 64 бита ХХМ0 отображаются на FR16{63:0}, а старшие 64 бита ХХМ0 отображаются на FR17{63:0}.
81 |
80 |
64 |
63 |
0 |
|
0 |
0x1003E |
XММ0-7{127:64} |
FR17-FR31, нечетные |
||
81 |
80 |
64 |
63 |
0 |
|
0 |
0x1003E |
XММ0-7{63:0} |
FR17-FR31, четные |
||
Рис. 6.13. SSE регистры (XMМ0 до XММ7)
Когда значение записывается в SSE регистр с помощью IA-32 инструкций SSE:
Поле порядка соответствующего регистрах Itanium с плавающей точкой (биты 80-64) устанавливается в 0x1003E, а бит знака устанавливается в 0.
Мантисса (биты 63-0) устанавливается в значение ХММ данных, в биты {63:0} для четных регистров и в биты {127:64} для нечетных регистров.
Когда SSE регистр читается с помощью IA-32 инструкций SSE:
Поле порядка соответствующего Itanium регистра с плавающей точкой (биты 80-64) и знаковый бит (бит 81) игнорируются, включая любые коды NaTVal.
