Форматы данных и команды их обработки процессоров Pentium III, Pentium IV
|ed) | | | | | |
|Двоичные целые |
|Слова |16 |15 |4 |[pic] |[pic] |
|(word) | | | | | |
|Коротки|32 |31 |9 |[pic] |[pic] |
|е | | | | | |
|(short)| | | | | |
|Длинные|64 |63 |18 |[pic] |[pic] |
|(long) | | | | | |
|Упакованные двоично-десятичные |
|BCD |80 |— |18 |— |[pic] |
Сопроцессор контролирует числа, участвующие в арифметических
операциях. При загрузке денормализованного операнда в регистр FPU и попытке
выполнения арифметических инструкций хотя бы с одним денормализованным
операндом сопроцессор фиксирует условие исключения #D. Денормализованные
числа могут появляться при выполнении вычислений, в этом случае сопроцессор
фиксирует факт исчезновения значащих разрядов и генерирует исключение #U.
При попытке выполнения арифметических операций с нечислами, а также с
недопустимыми значениями операндов (например, извлечение квадратного корня
из отрицательного числа) вырабатывается исключение #I. При переполнении
вырабатывается исключение #O, при попытке деления на нуль ненулевого
операнда вырабатывается исключение #Z.
Если результат вычисления невозможно представить точно в выбранном
формате, сопроцессор выполняет округление результата в сторону соседнего
допустимого значения. Правила округления программируются. Вместо
автоматического выполнения округления сопроцессор может вырабатывать
исключение #Р.
3. Технология MMX
Технология ММХ ориентирована на приложения мультимедиа, 2D/3D-графикy
и коммуникации. Это расширение базовой архитектуры появилось только после
выхода второго поколения процессоров Pentium. Основная идея ММХ заключается
в одновременной обработке нескольких элементов данных за одну инструкцию —
так называемая технология SIMD (Single Instruction — Multiple Data).
Расширение ММХ использует новые типы упакованных 64-битных целочисленных
данных:
• упакованные байты (Packed byte) — восемь байт;
• упакованные слова (Packed word) — четыре слова;
• упакованные двойные слова (Packed doubleword) — два двойных слова;
• учетверенное слово (Quadword) — одно слово.
Эти типы данных могут специальным образом обрабатываться в 64-битных
регистрах ММХ0-ММХ7, представляющих собой младшие биты стека 80-битных
регистров FPU. Каждая инструкция ММХ выполняет действие сразу над всем
комплектом операндов (8, 4, 2 или 1), размещенных в адресуемых регистрах.
Как и регистры FPU, эти регистры ММХ не могут использоваться для адресации
памяти. Совпадение регистров ММХ и FPU накладывает ограничения на
чередование кодов FPU и ММХ — забота об этом лежит на программисте
приложений с ММХ.
Еще одна особенность технологии ММХ — поддержка арифметики с
насыщением (saturating arithmetic). Ее отличие от обычной арифметики с
циклическим переполнением (wraparound mode) заключается в том, что при
возникновении переполнения в результате фиксируется максимально возможное
значение для данного типа данных, а перенос игнорируется. В случае
переполнения снизу в результате фиксируется минимально возможное значение.
Граничные значения определяются типом (знаковый или беззнаковый) и
разрядностью переменных. Такой режим вычислений удобен, например, для
определения цветов.
В систему команд введено 57 дополнительных инструкций для
одновременной обработки нескольких единиц данных. Одновременно
обрабатываемое 64-битное слово может содержать как одну единицу обработки,
так и 8 однобайтных, 4 двухбайтных или 2 четырехбайтных операнда. Новые
инструкции включают следующие группы:
• арифметические (Arithmetic Instructions), куда входят сложение и
вычитание в разных режимах, умножение и комбинация умножения и сложения;
• сравнение (Comparison Instructions) элементов данных на равенство
или по величине;
• преобразование форматов (Conversion Instructions);
• логические инструкции (Logical Instructions) — И, И-НЕ, ИЛИ и
исключающее ИЛИ, выполняемые над 64-битными операндами;
• сдвиги (Shift Instructions) — логические и арифметические;
• пересылки данных (Data Transfer Instructions) между регистрами ММХ и
целочисленными регистрами или памятью;
• очистка ММХ (Empty ММХ State) — установка признаков пустых регистров
в слове тегов.
Инструкции ММХ не влияют на флаги условий в слове состояния FPU.
Регистры ММХ в отличие от регистров FPU адресуются физически, а не
относительно значения указателя стека ТОР. Более того, любая инструкция ММХ
обнуляет поле ТОР регистра состояния FPU. В слове тегов свободному регистру
соответствует комбинация 11, остальные комбинации указывают только на
занятость регистра. После каждой операции ММХ биты тегов регистра
назначения обнуляются. Неиспользуемые в ММХ биты [79:64] регистров FPU
заполняются единицами, так что ошибочная обработка данных ММХ инструкцией
FPU приведет к исключению.
Инструкции ММХ не порождают новых исключений. Исключения при
выполнении инструкций ММХ могут возникать только в случае нарушения границ
в обращениях к памяти (как при обмене данными, так и при выборке
инструкции). Однако если предшествующая инструкция FPU породила условие
исключения, то оно произойдет при выполнении инструкции ММХ. После его
обработки инструкция ММХ может исполнена.
С инструкциями ММХ могут применяться префиксы замены сегмента и
изменения разрядности адреса (влияют на инструкции, обращающиеся к памяти).
Использование префиксов изменения разрядности операнда и повторов
зарезервировано (может привести к непредсказуемым результатам). Префикс
Lock вызывает исключение #UD.
Инструкции ММХ доступны из любого режима процессора. При переключении
задач необходимо следить за корректностью сохранения контекста, как и при
работе с FPU.
Любая инструкция ММХ вызывает обнуление полей тегов всех регистров
FPU/ММХ, что для FPU означает наличие действительных данных во всех
регистрах. Последующая инструкция для FPU над "неправильными" данными может
привести к непредсказуемому результату, поскольку "входной контроль" данных
осуществляется по состоянию тегов. Чтобы застраховаться от подобных
неприятностей, после инструкций ММХ и перед инструкциями FPU в программный
код вводят инструкцию EMMS, которая устанавливает в слове тегов значение
FFFFh (все регистры пустые).
Различие в способе адресации регистров (относительная для FPU и явная
прямая в ММХ), обнуление тегов инструкциями ММХ и некоторые другие нюансы
не позволяют чередовать инструкции FPU и ММХ. Блок FPU/MMX может работать
либо в одном, либо в другом режиме. Если, к примеру, в цепочку инструкций
FPU нужно вклинить инструкции ММХ, после чего продолжить вычисления FPU, то
перед первой инструкцией ММХ приходится сохранять контекст (состояние
регистров) FPU в памяти, а после этих инструкций снова загружать контекст.
На эти сохранения и загрузки расходуется процессорное время, в результате
возможна полная потеря выигрыша от реализации технологии SIMD. Совпадение
регистров ММХ и FPU оправдывают тем, что для сохранения контекста ММХ при
переключении задач не требуется доработок в операционной системе — контекст
ММХ сохраняется тем же способом, что и FPU, с которым умели работать
издавна. Таким образом, операционным системам было все равно, какой
процессор установлен — с ММХ или без. Но для того чтобы реализовать
преимущества SIMD, приложения должны "уметь" ими пользоваться (и не
проиграть на переключениях).
Частое чередование кодов FPU и ММХ может снизить производительность за
счет необходимости сохранения и восстановления весьма объемного контекста
FPU.
4. Расширение SSE и SSE2 — блок XMM
Процессоры Pentium 3 имеют так называемое потоковое расширение SSE
(Streaming SIMD Extensions). В те времена, когда будущий Pentium III
называли еще Kathmai, фирма Intel объявила о новых инструкциях KNI (Kathmai
New Instruction), так что SSE — это синоним "староинтеловского" KNI. Новые
процессоры имеют дополнительный независимый блок из восьми 128-битных
регистров, названных ХММ0...ХММ7 (очевидно, eXtended MultiMedia), и регистр
состояния/управления MXCSR. В каждый из регистров ХММ помещаются четыре 32-
битных числа в формате с плавающей точкой одинарной точности. Блок
позволяет выполнять векторные (они же пакетные) и скалярные инструкции.
Векторные инструкции реализуют операции сразу над четырьмя комплектами
операндов. Скалярные инструкции работают с одним комплектом операндов —
младшим 32-битным словом. При выполнении инструкций с ХММ традиционное
оборудование FPU/MMX не используется, что позволяет эффективно смешивать
инструкции ММХ с инструкциями над операндами с плавающей точкой. Здесь
блоки процессора меняются ролями — регистры ММХ, наложенные на регистры
традиционного сопроцессора, используются для целочисленных потоковых
вычислений, а вычисления с плавающей точкой (правда, только с одинарной
точностью, но для мультимедийпых приложений ее хватает) возлагаются на
новый блок ХММ. Кроме инструкций с новым блоком ХММ в расширение SSE входят
и дополнительные целочисленные инструкции с регистрами ММХ, а также
инструкции управления кэшированием. Новые инструкции с регистрами ММХ, как
и их предшественники из "классического" ММХ, не допускают чередования с
инструкциями FPU без переключения контекста FPU/MMX.
С инструкциями SSE могут использоваться префиксы замены сегмента и
изменения разрядности адреса (влияют на инструкции, обращающиеся к памяти).
Использование префиксов изменения разрядности операнда зарезервировано
(может привести к непредсказуемым результатам). Префикс Lock вызывает
исключение #UD. Из префиксов повтора можно использовать только безусловный
(REP) и только для "потоковых" инструкций (с ХММ), Остальные применения
префиксов повтора могут привести к непредсказуемым результатам.
В процессоре Pentium 4 набор инструкций получил очередное расширение —
SSE2, в основном касающееся добавления новых типов 128-битных операндов для
блока ХММ:
• упакованная пара вещественных чисел двойной точности;
• упакованные целые числа: 16 байт, 8 слов, 4 двойных слова или пара
учетверенных (по 64 бита) слов.
В процессор введены новые функции целочисленной арифметики SIMD, 128-
разрядные для регистров ХММ и такие же 64-разрядные для регистров ММХ; ряд
старых инструкций ММХ распространили и на ХММ (в 128-битном варианте);
добавлены инструкции преобразований для новых форматов данных, а также
расширены возможности "перемешивания" данных в блоке ХММ. Кроме того,
расширена поддержка управления кэшированием и порядком исполнения операций
с памятью. Инструкции SSE2 предназначены для ЗD-графики,
кодирования/декодирования видео, а также шифрования данных.
5. Команды обработки данных
Система команд 32-разрядных процессоров является существенно
расширенной системой команд процессоров 8086/80286. Расширения касаются
увеличения разрядности адресов и операндов, более гибкой системы адресации,
появления принципиально новых типов данных (битовые строки и поля) и
команд.
Команды (инструкции) содержат одно- или двухбайтный код инструкции, за
которым может следовать несколько байт, определяющих режим исполнения
команды, и операнды. Команды могут использовать до трех операндов (или ни
одного). Операнды могут находиться в памяти, регистрах процессора или
непосредственно в команде. Для 32-разрядных процессоров разрядность слова
(word) по умолчанию может составлять 32, а не 16 бит. Это распространяется
на многие инструкции, включая и строковые. В реальном режиме и режиме
виртуального процессора 8086 по умолчанию используется 16-битная адресация
и 16-битные операнды-слова. В защищенном режиме режим адресации и
разрядность слов по умолчанию определяются дескриптором кодового сегмента.
Перед любой инструкцией может быть указан префикс переключения разрядности
адреса или слова. При адресации памяти использование сегментного регистра,
предусмотренного командой, в ряде инструкций может подавляться префиксом
изменения сегмента (Segment Override).
В системе команд насчитывается несколько сотен инструкций, поэтому в
данной работе обзорно рассмотрены все команды обработки данных (блоков
процессора АЛУ, FPU, MMX, и XMM), а далее более подробно описаны
инструкции, появившиеся в процессорах Pentium 3 (блок XMM — SSE) и Pentium
4 (блок XMM — SSE2).
Инструкции пересылки данных (см. табл) позволяют передавать константы
или переменные между регистрами и памятью, а также портами ввода-вывода в
различных комбинациях, но в памяти может находиться не более одного
операнда. В эту группу отнесены и инструкции преобразования форматов —
расширений и перестановки байт. Операции со стеком выполняются словами с
разрядностью, определяемой текущим режимом. При помещении в стек слова
указатель стека SP уменьшается на число байт слова (2 или 4), при
извлечении — увеличивается. "Классические" (8086) инструкции пересылки не
влияют на содержимое регистра флагов. Инструкции пересылки по результатам
сравнения (CMPXCHG) модифицируют флаг ZF. Новые инструкции условной
пересылки (CMOVxx) позволяют сократить число ветвлений в программе.
Таблица. Инструкции пересылки данных
Инструкция Описание
BSWAP Перестановка байт из порядка младший-старший (L-H) в порядок старший-
младший (H-L) (486+)
CBW/CWDE Преобразование байта AL в слово АХ (расширение знака AL в АН:
АН заполняется битом AL.7) или слова АХ в двойное
слово ЕАХ
CMOVA/CMOVNBE Пересылка, если выше "CF ИЛИ ZF)=0) (P6+)
CMOVAE/CMOVNB Пересылка, если не ниже (CF=0) (P6+)
CMOVB/CMOVNAE Пересылка, если ниже (CF=1) (P6+)
CMOVBE/CMOVNA Пересылка, если не выше ((CF ИЛИ ZF)=1) (P6+)
CMOVC Пересылка, если перенос (CF=1) (P6+)
CMOVE/CMOVZ Пересылка, если равно (ZF=1) (P6+)
CMOVG/CMOVNLE Пересылка, если больше (SF=(0F И ZF)) (P6+)
CMOVGE/CMOVNL Пересылка, если больше или равно (SF=0F) (P6+)
CMOVL/CMOVNGE Пересылка, если меньше (ZF0F) (P6+)
CMOVLE/CMOVNG Пересылка, если меньше или равно (SF0F или ZF=0) (P6+)
CMOVNC Пересылка, если нет переноса (CF=0) (P6+)
CMOVNE/CMOVNZ Пересылка, если не равно (ZF=0) (P6+)
CMOVNO Пересылка, если нет переполнения (0F=0) (P6+)
CMOVNP/CMOVPO Пересылка, если нет паритета (нечетность) (P6+)
CMOVNS Пересылка, если неотрицательно (SF=0) (P6+)
CMOVO Пересылка, если переполнение (0F=1) (P6+)
CMOVP/CMOVPE Пересылка, если паритет (четность) (Р6+)
CMOVS Пересылка, если отрицательно (SF=1)(P6+)
CMPXCHG r/in,r Обмен по результату сравнения байта, слова или двойного
слова (486+)
CMPXCHG8B m64 Обмен по результату сравнения учетверенного слова
(5+)
CWD/CDQ Преобразование слова АХ в двойное слово DX:AX (расширение
знака, DX заполняется битом АХ. 15) или двойного
слова ЕАХ в учетверенное EDX:EAX
IN Ввод из порта ввода-вывода в AL/(E)AX
MOV Пересылка(копирование)данных
MOVSX Копирование байта/слова со знаковым расширением до слова/ двойного
слова(386+)
MOVZX Копирование байта/слова с нулевым расширением до слова/ двойного
слова(386+)
OUT Вывод в порт из AL/(E)AX
POP Извлечение слова данных из стека в регистр или память, (E)SP
инкрементируется
POPA(POPAll) Извлечение данных из стека в регистры Dl, SI, ВР, ВХ, DX,
CX, AX (286+)
POPAD Извлечение данных из стека в регистры EDI, ESI, ЕВР, ЕВХ, EDX, ЕСХ,
ЕАХ (386+)
PUSH Помещение слова из регистра или памяти в стек после декремента (E)SP
PUSHA (PUSH All) Помещение в стек регистров АХ, CX, DX, BX, SP (исходное
значение), ВР, SI, Dl (286+)
PUSHAD Помещение в стек регистров ЕАХ, ЕСХ, EDX, ЕВХ, ESP (исходное
значение), ЕВР, ESI, EDI (386+)
XCHG Обмен данными (взаимный) между регистрами или регистром и памятью
Инструкции ввода-вывода позволяют пересылать как одиночный бант или
слово между портом и регистром процессора (инструкции IN и OUT), так и блок
байт (слов) между портом и группой смежных ячеек памяти (инструкции
INSB/INSW и OUTSB/OUTSW с префиксом повтора, см. ниже). Непосредственная
адресация порта в команде обеспечивает доступ только к первым 256 адресам
портов, косвенная (через регистр DX) — ко всему пространству ввода-вывода
(64 Кбайт). Разрядность операнда и адрес должны согласовываться с
физическими возможностями и особенностями поведения адресуемого устройства.
При работе с памятью такие нюансы во внимание принимать обычно не
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9
|