- •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. Инструкции с плавающей точкой
Этот раздел описывает инструкции с плавающей точкой. Детали описаны в томе 3 «Справочник набора инструкций».
5.3.1. Инструкции доступа к памяти
Существуют инструкции загрузки и сохранения чисел с плавающей точкой, для одинарного, двойного, двойного расширенного типов данных с плавающей точкой, а также для параллельных FPили целых типов данных со знаком либо без знака. Режимы адресации для инструкций загрузки и сохранения чисел с плавающей точкой, те же самые, что и для инструкций загрузки и сохранения целых чисел. Исключением являются инструкции парной загрузки чисел с плавающей точкой, которые могут иметь явно указанный базовый регистр с постинкрементом. Дополнительные подсказки памяти для инструкций загрузки и сохранения чисел с плавающей точкой, те же самые, что и для инструкций загрузки и сохранения целых чисел (см. раздел 4.4.6 «Управление иерархией памяти и непротиворечивость»). В табл.5.7 перечислены типы инструкций загрузки и сохранения с плавающей точкой. Инструкции парной загрузки и сохранения с плавающей точкой, требуют двух приемных регистров (см. раздел «Парная загрузка с плавающей точкой» в третьем томе). Инструкциям сохранения с плавающей точкой (stfs, stfd, stfe) требуется, чтобы значения в регистрах с плавающей точкой были такого типа, чтобы преобразование данных при сохранении было корректным.
Табл.5.7. Инструкции доступа к данным с плавающей точкой
Операции |
Загрузка в FR |
Парная загрузка в FR |
Сохранение из FR |
С одинарной точностью |
ldfs |
ldfps |
stfs |
Целочисленная/Параллельная FP |
ldf8 |
ldfp8 |
stf8 |
С двойной точностью |
ldfd |
ldfpd |
stfd |
С расширенной точностью |
ldfe |
|
stfe |
Сливания/Заливания |
ldf.fill |
|
stf.spill |
Безуспешные спекулятивные загрузки записывают NaTValв приемный регистр или регистры (см. раздел 4.4.4). СохранениеNaTValв память вызовет ошибку «Употребление регистрового значенияNaT», исключением является инструкция сливания (stf.spill).
Сохранение и восстановление регистров завершается инструкциями сливания и заливания (stf.spill, ldf.fill) использующими 16-битовое содержимое памяти. Они являются единственными инструкциями, которые могут быть использованы для сохранения и восстановления фактического содержимого регистров, т.к. они не вызывают ошибку приNaTVal. Они сохраняют и восстанавливают все типы (единичный, двойной, расширенный регистровые форматы и целые или параллельныеFP) и гарантируют совместимость с возможными будущими архитектурными расширениями.
Рисунки 5.4, 5.5, 5.6, 5.7, 5.8 и 5.9 описывают как происходит преобразование данных при обмене между регистром с плавающей точкой и памятью для различных типов данных и для различных инструкций загрузки/сохранения и сливания/заливания.
Рис.5.4. Преобразование данных одинарной точности при передаче их из памяти в регистр с плавающей точкой.
Рис.5.5. Преобразование данных двойной точности при передаче их из памяти в регистр с плавающей точкой.
Рис.5.6. Преобразование данных двойной расширенной точности, целых и параллельных FPданных, при передаче их из памяти в регистр с плавающей точкой, а также заливка регистра с плавающей точкой из памяти.
Рис.5.7. Преобразование данных одинарной точности при передаче их из регистра с плавающей точкой в память.
Рис.5.8. Преобразование данных двойной точности при передаче их из регистра с плавающей точкой в память.
Рис.5.9. Преобразование данных двойной расширенной точности, целых и параллельных FPданных, при передаче их из регистра с плавающей точкой в память, а также слив регистра с плавающей точкой в память.
При загрузке и сохранении с плавающей точкой поддерживаются оба способа упорядочивания байт – и по возрастанию, и по убыванию. Для одинарного и двойного форматов памяти, упорядочивание байтов идентично для 32-битных и 64-битных целых типов (см. раздел 3.2.3). Упорядочивание байтов для двойного расширенного формата и для операций сливания/заливания показано на рис.5.10.
Форматы памяти |
Формат регистра с плавающей точкой | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Сливания/заливания (128-битные)
|
Двойной-расширенный (80 бит)
|
(82-битный)
|
Рис.5.10. Форматы памяти с плавающей точкой при сливании/заливании и при двойной расширенной точности.