- •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.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результат умножения не получится.