- •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.4. Неарифметические инструкции
Неарифметические инструкции с плавающей точкой всегда используют полную точность регистра с плавающей точкой (82-бита), поэтому они не имеют расширений типа .pcи спецификаторов типа.sf.
Инструкция fclassиспользуется для классификации содержимого регистра с плавающей точкой. Инструкцияfmergeиспользуется для того, чтобы слить данные из двух регистров с плавающей точкой в один такой регистр. Инструкцииfmix, fsxt, fpackи fswapиспользуются для манипулирования параллельнымиFPданными в мантиссе регистра с плавающей точкой. Инструкцииfand, fandcm, forи fxorиспользуются для выполнения логических операций на мантиссе регистра с плавающей точкой. Инструкцияfselectиспользуется для условного выбора.
Псевдооперация fnegпросто реверсирует знаковый бит операнда и поэтому не эквивалентнаIEEEоперации отрицания. Для созданияIEEEоперации отрицания используетсяfnma, где сомножителем должен бытьFR1, а слагаемым –FR0.
В табл. 5.14 перечислены неарифметические инструкции с плавающей точкой, а в табл. 5.15 перечислены неарифметические псевдооперации.
Табл. 5.14. Неарифметические инструкции с плавающей точкой
Операция |
Мнемоника |
FPклассификация |
fclass.fcrel.fctype |
FPслияние со знаком |
fmerge.s |
Параллельное FPслияние со знаком |
fpmerge.s |
FPслияние с отрицанием знака |
fmerge.ns |
Параллельное FPслияние с отрицанием знака |
fpmerge.ns |
Смешивание левых FPчисел |
fmix.l |
Смешивание правых FPчисел |
fmix.r |
Смешивание левых и правых FPчисел |
fmix.lr |
Знак/порядок левого FPчисла |
fsxt.l |
Знак/порядок правого FPчисла |
fsxt.r |
Упаковка FPчисел |
fpack |
Обмен FPчисел |
fswap |
Обмен и отрицание левого FPчисла |
fswap.nl |
Обмен и отрицание правого FPчисла |
fswap.nr |
Логическое И для FP |
fand |
Логическое И с дополнением для FP |
fandcm |
Логическое ИЛИ для FP |
for |
Логическое Исключающее ИЛИ для FP |
fxor |
Выбор для FP |
fselect |
Табл. 5.15. Неарифметические псевдооперации с плавающей точкой
Операция |
Мнемоника |
Что реально используется |
Абсолютное FPзначение |
fabs |
fmerge.sсо знаком изFR0 |
Абсолютное значение параллельного FP |
fpabs |
fpmerge.sсо знаком изFR0 |
FPотрицание |
fneg |
fmerge.ns |
Параллельное FPотрицание |
fpneg |
fpmerge.ns |
FPотрицание абсолютного значения |
fnegabs |
fmerge.nsсо знаком изFR0 |
Параллельное FPотрицание абсолютного знач. |
fpnegabs |
fpmerge.nsсо знаком изFR0 |
5.3.5. Инструкции поля состояния для регистра состояния с плавающей точкой (fpsr)
Спекуляции операций с плавающей точкой требуют, чтобы флаги состояния были временно сохранены в одном из дополнительных полей состояния (не в FPSR.sf0). После завершения выполнения спекулятивной цепочки, инструкцияfchkfможет быть использована для обновления флагов основного поля состояния (FPSR.sf0.flags). Эта операция сохранит корректностьIEEEфлагов. Инструкцияfchkfделает это путем сравнения флагов поля состояния сFPSR.sf0.flagsиFPSR.traps. Если флаги дополнительного поля состояния указывают, что произошел случай соответствующий разрешенному вFPSR.trapsисключению с плавающей точкой, либо случай, который не был ранее уже зарегистрирован вFPSR.sf0.flags(т.е. вFPSR.sf0.flagsсброшен флажок для этого случая), то инструкцияfchkfвыполняет переход к коду восстановления. Если ни один из этих случаев не произошел, то инструкцияfchkfничего не делает.
Инструкция fsetcпозволяет побитовую модификацию битов управления поля состояния. Чтобы выработать управляющие биты для поля состояния, делается операция И между битами управления поляFPSR.sf0и непосредственным 7-битным значением И-маски, а затем делается операция ИЛИ с непосредственным 7-битным значением ИЛИ-маски. Инструкцияfclrfсбрасывает все флаги поля состояния в ноль.
Табл. 5.16. Инструкции поля состоянияFPSR
Операция |
Мнемоника |
Проверка FPфлагов |
fchkf.sf |
Очистка FPфлагов |
fclrf.sf |
Управление установкой FPфлагов |
fsetc.sf |