- •5. Модель программирования с плавающей точкой.
- •5.1. Форматы и типы данных
- •5.1.1. Типы действительных чисел
- •5.1.2. Формат регистра с плавающей точкой
- •5.1.3. Представление значений в регистрах с плавающей точкой
- •5.2. Регистр состояния с плавающей точкой
- •5.3. Инструкции с плавающей точкой
- •5.3.1. Инструкции доступа к памяти
- •5.3.2. Инструкции обмена между регистрами с плавающей точкой и основными регистрами
- •5.3.3. Арифметические инструкции
- •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является зарезервированным и при чтении всегда возвращает ноль.