- •5. Модель программирования с плавающей точкой.
- •5.1. Форматы и типы данных
- •5.1.1. Типы действительных чисел
- •5.1.2. Формат регистра с плавающей точкой
- •5.1.3. Представление значений в регистрах с плавающей точкой
- •5.2. Регистр состояния с плавающей точкой
- •5.3. Инструкции с плавающей точкой
- •5.3.1. Инструкции доступа к памяти
- •5.3.3. Арифметические инструкции
- •5.3.2. Инструкции обмена между регистрами с плавающей точкой и основными регистрами
- •5.3.4. Неарифметические инструкции
- •5.3.5. Инструкции поля состояния для регистра состояния с плавающей точкой (fpsr)
- •5.3.6. Инструкции целочисленного умножения и сложения
- •5.4. Дополнительные обсуждения в связи с ieee
- •5.4.1. Прерывания с плавающей точкой
- •5.4.1.1. Ошибка: Недоступный регистр с плавающей точкой
- •5.4.1.2. Ошибка: Исключение с плавающей точкой
- •5.4.1.3. Ловушка «Исключение с плавающей точкой»
- •5.4.2. Определение Переполнения
- •5.4.3. Определение Крошечности, Неточности и Антипереполнения.
- •5.4.4. Целочисленные неверные операции
- •5.4.5. Определение целочисленных операций
- •5.4.6. Определение и распространение значений.
- •5.4.7. Операции, предписанные стандартом ieee, отложенные программно
- •5.4.8. Дополнения сверх стандарта ieee
5.2. Регистр состояния с плавающей точкой
Регистр состояния с плавающей точкой (FPSR) содержит информацию состояния и динамического управления для операций с плавающей точкой. Здесь имеется один главный набор информации состояния и управления (FPSR.sf0) и три дополнительных набора (FPSR.sf1, FPSR.sf2, FPSR.sf3). Компоновка FPSR показана на рис.5.2, а его поля описаны в табл. 5.3. Компоновка поля состояния регистра FPSR показана на рис.5.3, а входящие в него поля описаны в табл. 5.4.
63 |
58 |
57 |
45 |
44 |
32 |
31 |
19 |
18 |
6 |
5 |
0 |
reserved |
sf3 |
sf2 |
sf1 |
sf0 |
traps |
||||||
6 |
13 |
13 |
13 |
13 |
6 |
||||||
Рис. 5.2. Формат регистра состояния с плавающей точкой
Табл.5.3. Описание полей регистра состояния с плавающей точкой
Поле |
Биты |
Описание |
traps.vd |
0 |
Если этот бит установлен, то запрещен вызов исключения «Недопустимая операция с плавающей точкой» (ловушка IEEE-trap) |
traps.dd |
1 |
Если этот бит установлен, то запрещен вызов исключения «Не нормализованный/денормализованный операнд с плавающей точкой» |
traps.zd |
2 |
Если этот бит установлен, то запрещен вызов исключения «Деление на ноль с плавающей точкой» (ловушка IEEE-trap) |
traps.od |
3 |
Если этот бит установлен, то запрещен вызов исключения «Переполнение с плавающей точкой» (ловушка IEEE-trap) |
traps.ud |
4 |
Если этот бит установлен, то запрещен вызов исключения «Антипереполнение с плавающей точкой» (ловушка IEEE-trap) |
traps.id |
5 |
Если этот бит установлен, то запрещен вызов исключения «Потеря значимости с плавающей точкой» (ловушка IEEE-trap) |
sf0 |
18:6 |
Основное поле состояния |
sf1 |
31:19 |
1-е дополнительное поле состояния |
sf2 |
44:32 |
2-е дополнительное поле состояния |
sf3 |
57:45 |
3-е дополнительное поле состояния |
reserved |
63:58 |
Резервировано |
-
12
11
10
9
8
7
6
5
4
3
2
1
0
FPSR.sfx
флаги
управление
i
u
o
z
d
v
td
rc
pc
wre
ftz
6
7
Рис.5.3. Формат поля состояния с плавающей точкой
Табл. 5.4. Описание состава полей, входящих в поле состояния с плавающей точкой
Поле |
Биты |
Описание |
ftz |
0 |
Режим flush-to-zero (стремления к нулю) |
wre |
1 |
Максимальный диапазон порядка (см. табл.5.6) |
pc |
3:2 |
Управление точностью (см. табл.5.6) |
rc |
4:5 |
Управление округлением (см. табл.5.5) |
td |
6 |
Ловушки запрещены а |
v |
7 |
Недействительная операция (IEEE флаг) |
d |
8 |
Денормализованный/Не нормализованный операнд |
z |
9 |
Деление на ноль (IEEE флаг) |
o |
10 |
Переполнение (IEEE флаг) |
u |
11 |
Антипереполнение (IEEE флаг) |
i |
12 |
Потеря значимости (IEEE флаг) |
а. Бит td является зарезервированным для основного поля состояния FPSR.sf0.
Флаг состояния «Денормализованный/Не нормализованный операнд» является промежуточным флагом типа IEEE, он устанавливается, если значение используется в арифметической инструкции или в арифметическом вычислении, а например, «ненорм.»*NaN не установит этот флаг. Как указано выше, в табл. 5.2, все денормализованные форматы являются подмножеством не нормализованных чисел.
Примечание. Ошибка/ловушка «Исключение с плавающей точкой» происходит только, если исключение с плавающей точкой случилось в течение обработки инструкции. Следовательно, установка в 1 флажка в поле состояния в программе не вызовет исключения. Флаги поля статуса просто показывают происшествия исключений с плавающей точкой.
Режим FTZ (Flush-to-Zero) создает результаты, которые были усечены к корректному знаковому нолю, при возникновении «крошечности» (tininess) (см. ниже раздел 5.4.3 «Определение крошечности, потери точности и антипереполнения). Режим FTZ может быть разрешен, только если запрещено антипереполнение. Если антипереполнение разрешено, то он более приоритетен и режим FTZ игнорируется. Заметим, что программный обработчик исключения может проверить бит FTZ режима и если разрешено, то эмулировать FTZ операцию.
Округление результата с плавающей точкой основывается на окончании инструкции управляющем точностью и на управляющих полях wre, pc, rc, входящих в поле состояния. Точность мантиссы и диапазон порядка результата задаются так, как это описано в табл.5.6. Если результат не точен, то способ округления задается полем FPSR.sfx.rc (см. табл.5.5).
Табл. 5.5. Определение управления округлением с плавающей точкой
|
К ближайшему (или четному) |
К минус бесконечности |
К плюс бесконечности |
К нулю (отсечением) |
FPSR.sfx.rc |
00 |
01 |
10 |
11 |
Табл. 5.6. Определение управления моделью вычислений с плавающей точкой
Поля, управляющие моделью вычислений |
Выбранная модель вычислений |
||||
Окончание инструкции управляющее точностью |
Динамическое поле FPSR.sfx.pc |
Динамическое поле FPSR.sfx.wre |
Точность мантиссы (бит) |
Диапазон порядка (бит) |
Стиль вычислений |
.s |
игнорир. |
0 |
24 |
8 |
Одинарное вещественное IEEE |
.d |
игнорир. |
0 |
53 |
11 |
Двойное вещественное IEEE |
.s |
игнорируется |
1 |
24 |
17 |
Диапазон формата регистра при одинарной точности |
.d |
игнорируется |
1 |
53 |
17 |
Диапазон формата регистра при двойной точности |
нет |
00 |
0 |
24 |
15 |
Стек IA-32 для одинарных |
нет |
01 |
0 |
|
|
|
нет |
10 |
0 |
53 |
15 |
Стек IA-32 для двойных |
нет |
11 |
0 |
64 |
15 |
Стек IA-32 для расширенных |
нет |
00 |
1 |
24 |
17 |
Диапазон формата регистра при одинарной точности |
нет |
01 |
1 |
|
|
|
нет |
10 |
1 |
53 |
17 |
Диапазон формата регистра при двойной точности |
нет |
11 |
1 |
64 |
17 |
Диапазон формата регистра при двойной расширенной точности |
не применяетсяa |
игнорируется |
игнорируется |
24 |
8 |
Пара одинарных вещественных IEEE |
не применяетсяb |
игнорируется |
игнорируется |
64 |
17 |
Диапазон формата регистра при двойной расширенной точности |
a. Для параллельных FP инструкций, которые не имеют окончаний управляющих точностью (например, fpma).
b. Для не параллельных FP инструкций, которые не имеют окончаний управляющих точностью (например, frcpa).
Установка управляющего бита (sfx.td), позволяет легко запретить локальные ловушки исключения IEEE в среде выполнения. Если бит FPSR.sfx.td сброшен (есть разрешение), то используются биты FPSR.traps. Если бит FPSR.sfx.td установлен, то биты FPSR.traps обрабатываются так, как будто они все установлены (нет разрешения). Заметим, что поле FPSR.sf0.td является зарезервированным и при чтении всегда возвращает ноль.
