- •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.3.2. Инструкции обмена между регистрами с плавающей точкой и основными регистрами
Инструкции setf и getf (см. табл. 5.8) перемещают данные между регистрами с плавающей точкой (FR) и основными регистрами (GR). Эти инструкции транслируют значение NaT основного регистра в значение NaTVal регистра с плавающей точкой, туда и обратно, как на рис. 5.4, 5.5 и 5.7. Представление памяти читается из (или записывается в) GR. Варианты инструкций setf и getf с расширениями .exp и .sig работают с только соответствующей частью регистра с плавающей точкой либо со знаком и порядком, либо с мантиссой соответственно. Их форматы трансляции описаны в табл. 5.9 и 5.10.
Табл.5.8. Инструкции обмена с регистром с плавающей точкой
Операции |
Из GR в FR |
Из FR в GR |
С одинарной точностью |
setf.s |
getf.s |
С двойной точностью |
setf.d |
getf.d |
Над знаком и порядком |
setf.exp |
getf.exp |
Над мантиссой или целочисленным |
setf.sig |
getf.sig |
Табл. 5.9. Передача данных (setf) из основного регистра (целое число) в регистр с плавающей точкой.
|
Основной регистр |
FP регистр (.sig) |
FP регистр (.exp) |
|||||
Класс |
NaT |
Целое |
знак |
порядок |
мантисса |
знак |
порядок |
мантисса |
NaT |
1 |
игнорируется |
|
NaTVal |
|
|
NaTVal |
|
Целое |
0 |
от 000…00 до 111…11 |
0 |
0x1003E |
целое |
int{17} |
int{16:0} |
0x8…(15)нулей |
Табл. 5.9. Передача данных (getf) из регистра с плавающей точкой в основной регистр (целое число).
|
Регистр с плавающей точкой |
GR (.sig) |
GR (.exp) |
||||
Класс |
знак |
порядок |
мантисса |
NaT |
Целое |
NaT |
Целое |
NaTVal |
0 |
0x1FFFE |
0.000…00 |
1 |
0x(16)нулей |
1 |
0x1FFFE |
Целое или FP параллельное |
0 |
0x1003E |
от 0.000…00 до 1.111…11 |
0 |
мантисса |
0 |
0x1003E |
Другое |
любой |
любой |
любая |
0 |
мантисса |
0 |
((знак<<17)|порядок) |
5.3.3. Арифметические инструкции
Все арифметические инструкции с плавающей точкой, за исключением fcvt.xf (которая всегда только такая) имеют спецификатор .sf. Он показывает, какое поле, из четырех полей состояния в FPSR, будет управлять выполнением и содержать состояние инструкции (см. табл. 5.11). Поле состояния задает: разрешение исключений, режим округления, ширину порядка, управление точностью, а также какой флажок поля состояния обновлять. См. выше раздел «Регистр состояния с плавающей точкой».
Табл. 5.11. Толкование спецификатора поля состояния инструкции с плавающей точкой.
Спецификатор .sf |
.s0 |
.s1 |
.s2 |
.s3 |
Поле состояния |
FPSR.sf0 |
FPSR.sf1 |
FPSR.sf2 |
FPSR.sf3 |
Большинство арифметических инструкций с плавающей точкой могут задавать точность и диапазон результата. Точность задается либо статически, используя расширение инструкции типа .pc (задающее точность), либо динамически, используя поле pc в поле состояния FPSR. Диапазон задается точно также, но здесь уже в поле состояния FPSR фигурирует поле wre. Нормальные (не параллельные FP) арифметические инструкции, которые не имеют расширения типа .pc, используют точность и диапазон формата регистра с плавающей точкой. Детальнее см. табл. 5.6.
В табл. 5.12 перечислены арифметические инструкции с плавающей точкой, а в табл. 5.13 перечислены арифметические псевдооперации.
Табл. 5.12. Арифметические инструкции с плавающей точкой
Операция |
Нормальная FP мнемоника |
Параллельная FP мнемоника |
FP умножение и сложение |
fma.pc.sf |
fpma.pc.sf |
FP умножение и вычитание |
fms.pc.sf |
fpms.pc.sf |
FP отрицательное умножение и сложение |
fnma.pc.sf |
fpnma.pc.sf |
FP обратное значение аппроксимации |
frcpa.sf |
fprcpa.sf |
FP обратное значение аппроксимации квадратного корня |
frsqrta.sf |
fprsqrta.sf |
FP сравнение |
fcpm.frel.fctype.sf |
fpcpm.frel.sf |
FP минимум |
fmin.sf |
fpmin.sf |
FP максимум |
fmax.sf |
fpmax.sf |
FP абсолютный минимум |
famin.sf |
fpamin.sf |
FP абсолютный максимум |
famax.sf |
fpamax.sf |
Преобразовать число с плавающей точкой в целое со знаком |
fcvt.fx.sf fcvt.fx.trunc.sf |
fpcvt.fx.sf fpcvt.fx.trunc.sf |
Преобразовать число с плавающей точкой в целое без знака |
fcvt.fxu.sf fcvt.fxu.trunc.sf |
fpcvt.fxu.sf fpcvt.fxu.trunc.sf |
Преобразовать целое со знаком в FP число |
fcvt.xf |
не используется |
Табл. 5.13. Арифметические псевдооперации с плавающей точкой
Операция |
Мнемоника |
Что реально используется |
FP умножение (типа IEEE) и параллельное FP умножение |
fmpy.pc.sf fpmpy.sf |
fma использ. FR0 для сложения fmpa использ. FR0 для сложения |
FP отрицательное умножение (типа IEEE) и параллельное отрицательное FP умножение |
fnmpy.pc.sf fnpmpy.sf |
fnma использ. FR0 для сложения fnmpa использ.FR0 для сложения |
FP сложение (типа IEEE) |
fadd.pc.sf |
fma использ. FR1 для умножения |
FP вычитание (типа IEEE) |
fsub.pc.sf |
fms использ. FR1 для умножения |
FP нормализация (типа IEEE) |
fnorm.pc.sf |
fma использ. FR1 для умножения, а FR0 для сложения |
Преобразовать целое без знака в FP число |
fcvt.xuf.pc.sf |
fma использ. FR1 для умножения, а FR0 для сложения |
Не существует псевдоопераций для параллельного FP сложения, вычитания, отрицания или нормализации, поскольку FR1 не содержит упакованной пары переменных с одинарной точностью равных 1.0. Параллельное сложение может быть выполнено путем предварительного формирования в регистре пары чисел равных 1.0 (с помощью инструкции fpack), а затем используя инструкцию fmpa. Моделирование операции целочисленного сложения может быть создано путем предварительного формирования целочисленной 1 в регистре с плавающей точкой, а затем использованием инструкции xma.
Псевдооперация fmpy доставляет согласующийся с IEEE результат, с помощью округления произведения, без выполнения сложения, характерного для fma. Если в инструкции fma указать не регистр FR0, а другой, не содержащий значение +0.0, то в этом случае, согласующийся с IEEE результат умножения не получится.
