Форматы данных и команды их обработки процессоров Pentium III, Pentium IV

Форматы данных и команды их обработки процессоров Intel Pentium III и Intel
                                 Pentium IV

                                  АННОТАЦИЯ

      В курсовой работе представлены данные о всевозможных  форматах  данных
процессоров Intel Pentium III и Intel Pentium IV.  Так  же  приведён  полный
список команд, реализованных в данных процессорах, с кратким  описанием  для
обработки этих данных. Более подробно рассмотрены команды блока XMM:  SSE  –
Pentium III и SSE2 – Pentium IV, с подробным описанием:  для  данных  команд
предсталено описание синтксиса, правила построения машинного  кода,  принцип
действия  (для  многих  команд  принцип  действия  для  большей  наглядности
представлен  графически,  ввиде  схем),   воздействие   команды   на   флаги
процессора, возможные возникаемые исключения во время выполнения команд.

                                 СОДЕРЖАНИЕ

      Введение.   .   .   .   .   .   .   .   .   .   .   .   .   .   .    .
       .   .   .   .   .   .   .   .   .   .   .   .     .   4
      1. Типы данных процессоров Pentium 3, Pentium 4 .   .   .   .   .    .
       .   .   .   .   .   .    5
      2. Математический сопроцессор x87 .   .    .    .   .     .    .     .
.    .   .   .   .    .   .    .    9
      3. Технология MMX .    .   .    .   .   .   .   .    .    .    .     .
.    .   .    .   .   .   .    .   .   .   . 12
      4. Расширение SSE и SSE2 — блок XMM.  .   .    .   .    .   .    .   .
  .   .    .   .   .   .   14
      5. Команды обработки данных.   .    .   .    .   .    .    .    .    .
.   .   .   .   .    .   .   .   .   15
      6. Команды блока XMM (SSE и SSE2) .    .   .   .   .    .    .   .   .
  .    .    .   .   .   .    . 31
           6.1. Команды блока XMM (SSE – Pentium 3) .    .   .   .   .    .
         .   .   .   .    .  33
           6.2. Команды блока XMM (SSE2 – Pentium 4) .     .    .    .    .
      .    .   .   .   .   . 50
      Литература .   .   .   .   .   .   .   .   .   .   .   .   .    .    .
.   .   .   .   .   .   .   .   .   .   .   .    .  89
                                  ВВЕДЕНИЕ
            Целью курсовой работы «Форматы данных  и  команды  их  обработки
процессоров Intel Pentium III, Intel Pentium IV»  является  поытка  наиболее
полно показать отличительные  признаки  современных  процессоров.  В  данной
работе автор не  ставил  себе  задачу  расписать  каждую  команду  обработки
данных существующую в данных  процессорах,  ведь  отличительная  особенность
процессоров Intel  заключается  в  том,  что  наиболее  поздние  модификации
полностью совместимы с более  ранними.  В  процессорах  Intel  Pentium  III,
Intel Pentium IV нововведением стали два блока XMM (eXtended  MultiMedia)  –
это SSE (Streaming SIMD (Single  Istruction  Multiply  Data)  Extensions)  –
введённый в процессоре Intel Pentium III и SSE2  –  введённый  в  процессоре
Intel Pentium IV. Поэтому  базовые  команды  (существующие  в  более  ранних
модификациях Intel, начиная с 8086),  команды  математического  сопроцессора
(FPU) и команды блока MMX, появившегося впервые в процессоре  Intel  Pentium
рассмотрены лишь обзорно. Так как расширение  3Dnow!  блока  MMX,  введённое
фирмой AMD в процессорах K6-2 на данный  момент  отсутствует  в  процессорах
фирмы Intel, то оно совсем не рассмотренно в курсовой работе.

     1. Типы данных процессоров Pentium 3, Pentium 4

      История 32-разрядных процессоров Intel Pentium 3 и Pentium 4  началась
с процессора Intel386.  Он  вобрал  в  себя  все  черты  своих  16-разрядных
предшественников 8086/88 и 80286 для обеспечения совместимости  с  громадным
объемом программного обеспечения, существовавшего на момент  его  появления.
Процессоры могут оперировать с  8-,16-  и  32-битными  операндами,  строками
байт, слов и двойных слов, а также с  битами,  битовыми  полями  и  строками
бит.

      Рассматриваемые процессоры непосредственно поддерживают (используют  в
качестве операндов) знаковые и беззнаковые целые числа, строки байт, цифр  и
символов, битовые строки, указатели и числа с плавающей точкой. В  семействе
х86 принято, что слова записываются в двух смежных байтах памяти, начиная  с
младшего. Адресом слова является адрес его  младшего  байта.  Двойные  слова
записываются в четырех смежных байтах, опять-таки начиная с младшего  байта,
адрес которого и является адресом двойного слова.  Этот  порядок  называется
Little-Endian Memory Format. В других  семействах  процессоров  применяют  и
обратный порядок  —  Big-Endian  Memory  Format,  в  котором  адресом  слова
(двойного  слова)  является  адрес  его  старшего  байта,  а  младшие  байты
располагаются в последующих адресах. Для взаимного  преобразования  форматов
слова имеется инструкция XCHG, двойного  слова  —  BSWAP  (процессор  486  и
выше).

      На  рис.1.  приведены  форматы  данных,  обрабатываемых  целочисленным
блоком АЛУ всех 32-разрядных процессоров:
      • Бит (Bit) — единица информации. Бит в памяти задается базой (адресом
слова) и смещением (номером бита в слове).
      • Битовое поле (Bit Field) — группа до 32 смежных бит, располагающихся
не более чем в 4 байтах.
      • Битовая строка (Bit String) — набор смежных бит длиной до 4 Гбит.
      • Байт (Byte) — 8 бит.
      • Числа без  знака:  байт/слово/двойное/учетверенное  слово  (Unsigned
Byte/ Word/Double Word/Quade Word), 8/16/32/64 бит.
      •  Целые  числа  со  знаком:   байт/слово/двойное/учетверенное   слово
(Integer Byte/  Word/Double  Word/Quade  Word).  Единичное  значение  самого
старшего  бита  (знак)  является  признаком  отрицательного  числа,  которое
хранится в дополнительном коде.
      • Двоично-десятичные числа (BCD — Binary Coded Decimal):
      • 8-разрядные упакованные  (Packed  BCD),  содержащие  два  десятичных
разряда в одном байте;
      • 8-разрядные неупакованные (Unpacked BCD), содержащие один десятичный
разряд в байте (значение бит 7:4 при  сложении  и  вычитании  несущественно,
при умножении и делении они должны быть нулевыми).
      • Строки байт, слов и двойных слов  (Bit  String,  Byte  String,  Word
String, Double Word String) длиной до 4 Гбайт.
      • Указатели:
           • длинный указатель (48 бит) — 16-битный селектор (или  сегмент)
      и 32-битное смещение;
           • короткий указатель — 32-битное смещение;
           • просто указатель (32 бит, единственный тип указателя для  8086
           и  80286)  •  16-битный  селектор  (или  сегмент)  и   16-битное
           смещение.
      16-разрядные процессоры из приведенных типов  данных  не  поддерживают
учетверенные слова всех типов, битовые поля и строки, строки  двойных  слов,
короткие и длинные указатели.

      Числа в формате с плавающей точкой и упакованные  80-битные  BCD-числа
обрабатываются  блоками  FPU  процессоров  класса  486  и  выше,   а   также
сопроцессорами  8087/287/387.  Упакованные  64-битные  и  128-битные  данные
обрабатываются процессорами с ММХ  и  SSE.  Форматы  данных,  обрабатываемых
блоками FPU/MMX и ХММ, представлены на рис. 2.

      • Действительные числа в формате с плавающей точкой:
           • одинарной  точности  (Single  Precision),  32  бит  —  23  бит
      мантисса, 8 бит порядок;
           • двойной точности (Double Precision), 64 бит — 52 бит мантисса,
      11 бит порядок;
           • повышенной точности (Extended Precision),  80  бит  —  64  бит
      мантисса, 15 бит порядок.
      •  Двоично-десятичные  80-битные  упакованные  числа  (18   десятичных
      разрядов и знак).
      • Упакованные действительные числа  одинарной  точности  в  формате  с
плавающей точкой, обрабатываются блоком ХММ.
      • Упакованные целые  числа,  знаковые  и  беззнаковые,  обрабатываются
блоком ММХ:
      • упакованные байты (Packed byte) — восемь байт;
      • упакованные слова (Packed word) — четыре слова;
      • упакованные двойные слова (Packed doubleword) — два двойных слова;
      • учетверенное слово (Quadword) — одно слово.

      Для 16-разрядных  процессоров,  естественно,  все  форматы  чисел  для
блоков ММХ и ХММ недоступны.

      Рассмотрим более подробно блоки, упомянутые выше: блоки FPU, MMX, XMM,
которые  архитектуре  процессоров  IA-32   х86   держатся   особняком.   Они
присутствуют не но всех процессорах и даже  по  схемотехнической  реализации
являются пристройками  к  центральному  процессору  с  его  набором  обычных
целочисленных  регистров.   Данные   блоки   предназначены   для   ускорения
вычислений.

      Математический  сопроцессор  (FPU)  позволяет  использовать  несколько
форматов чисел с плавающей точкой — FP-форматов. Операции с  такими  числами
можно  выполнять  и  программно  средствами  целочисленного  процессора,  но
сопроцессор выполняет эти операции анпаратно во много раз быстрее. Блок  ММХ
дает ускорение целочисленных  вычислений  за  счет  одновременной  обработки
одной инструкцией целого пакета чисел (пар чисел). Блок ХММ комбинирует  эти
два приема — обрабатывает одной инструкцией пакет из  четырех  чисел  в  FP-
формате.  Исторически   первым   появился   сопроцессор.   Блок   ММХ   ради
совместимости с операционными системами "спрятали"  в  то  же  оборудование,
что и сопроцессор. Так  появился  комбинированный  блок,  называемый  блоком
FP/MMX, или  FPU/ММХ.  И  толысо  блок  ХММ,  используемый  расширением  SSE
процессоров  Pentium  3,  стал  полностью  новым   самостоятельным   набором
регистров.
[pic]
Рис. 1. Типы данных, обрабатываемых целочисленным АЛУ

[pic]
Рис. 2. Типы данных, обрабатываемых блоками FPU/MMX и ХММ
При отсутствии математического сопроцессора  прикладная  программа  все-таки
может использовать инструкции FPU, но для этого операционная система  должна
поддерживать эмуляцию сопроцессора. Эмулятор сопроцессора —  это  программа-
обработчик прерывания от сопроцессора или  исключения  #NM,  которая  должна
"выловить" код операции, сопроцессора, определить местонахождение  данных  и
выполнить   требуемые   вычисления,   используя   целочисленную   арифметику
центрального процессора. Понятно, что эмуляция будет  выполняться  во  много
раз медленнее, чем те же действия, выполняемые настоящим сопроцессором.  Тем
не менее эмуляция позволяет все-таки пользоваться  прикладными  программами,
требующими вычислений с плавающей точкой. Для этого в  регистре  CR0  должно
быть установлено сочетание флагов ЕМ = 1, МР = 0.  Для  эмуляции  в  IBM  PC
обычно  устанавливают  значение  NE  =  0.  Тогда  каждая   инструкция   FPU
автоматически будет вызывать эмулятор генерацией запроса  прерывания  (а  не
исключения #NM, как было бы при NE = 1).

      Эмуляция для блоков  ММХ  и  ХММ  не  предусматривается  —  эти  блоки
предназначены для ускорения вычислений в приложениях  реального  времени,  и
выполнять  их  с  крайне  низкой   скоростью   эмуляции   было   бы   просто
бессмысленно. Если установлен флаг эмуляции ЕМ = 1, то любая инструкция  ММХ
вызовет исключение #UD.

     2. Математический сопроцессор x87

      Математический сопроцессор предназначен для расширения  вычислительных
возможностей центрального процессора — выполнения  арифметических  операций,
вычисления основных математических функции (тригонометрических,  экспоненты,
логарифма) и т. д. В разных поколениях процессоров он  назывался  по-разному
— FPU (Floating Point  Unit  —  блок  чисел  с  плавающей  точкой)  или  NPX
(Numeric Processor eXtension — числовое расширение процессора).

      Сопроцессор поддерживает семь типов данных: 16-, 32-, 64-битные  целые
числа; 32-, 64-, 80-битные числа с плавающей точкой и 18-разрядные  числа  в
двоично-десятичном формате. Формат чисел с  плавающей  точкой  соответствует
стандартам   IEEE   754   и   854.    Применение    сопроцессора    повышает
производительность вычислений  в  сотни  раз.  С  программной  точки  зрения
сопроцессор и процессор выглядят как  единое  целое.  В  современных  (486+)
процессорах FPU располагается на одном кристалле с центральным  процессором.
Для  процессоров  386  и  ниже  сопроцессор   был   отдельной   микросхемой,
подключаемой  к  локальной  нише  основного  процессора.  В   любом   случае
сопроцессор исполняет только свои специфические команды,  а  всю  работу  по
декодированию инструкции и доставке  данных  осуществляет  CPU.  Сопроцессор
может  выполнять   вычисления   параллельно   с   центральным   процессором,
независимо от  переключения  задач  в  защищенном  режиме.  Как  и  основной
процессор, сопроцессор может работать в реальном  или  защищенном  режиме  и
переключать разрядность- 16 или 32. Переключение режимов  влияет  на  формат
отображения регистров сопроцессора в оперативной  памяти,  при  этом  формат
используемых внутренних регистров не изменяется.

      Форматы данных FPU

      Сопроцессор оперирует данными в формате с  плавающей  точкой,  который
позволяет  представлять  существенно  больше   действительных   чисел,   чем
целочисленное АЛУ центрального процессора.  Арифметические  операции  (здесь
под арифметическими понимаются операции, изменяющие  значения  операндов,  а
также операции сравнения) в FPU выполняются над  80-битными  числами,  преде
га пленными во внутреннем формате  расширенной  точности  (рис.  3).  Формат
позволяет представлять следующие категории чисел:
      • нули (положительный и отрицательный) — оба значения эквивалентны;
      • денормализованные конечные числа (положительные и отрицательные);
      • нормализованные конечные числа (положительные и отрицательные);
      • бесконечность (положительная и отрицательная).

      Числа представляются в аффинном пространстве. Это означает, что  [pic]
меньше любого конечного числа, а [pic] больше любого конечного числа.

[pic]
Рис. 3. Формат внутреннего представления чисел.

      Бит Sign определяет знак числа: 0 — положительное, 1  —  отрицательное
число. Поле Exponent  хранит  смещенное  значение  двоичного  порядка  числа
(biased exponent). Смещение  позволяет  все  значения  порядков  допустимого
диапазона  чисел  представлять  положительным  числом,  при  этом   значению
000...000 соответствуют минимальные (по модулю) числа, значению 111...110  —
максимальные допустимые числа, а значению  111...111  —  бесконечно  большие
числа. Нуль может быть положительным или  отрицательным,  в  зависимости  от
бита знака, при  этом  и  мантисса,  и  порядок  у  него  нулевые.  Мантисса
(Signficand) нормализованного числа, отличного от  нуля,  всегда  имеет  вид
"1,ххх....ххх",  то  есть  представляет  величину,  не  меньшую  единицы.  У
бесконечностей  (тоже  положительной  и  отрицательной)  мантисса   нулевая.
Денормализованные  числа  имеют  нулевой  порядок  (смещенное  значение)   и
мантиссу вида "0,ххх...ххх" (отличную от нуля).  Денормализованные  числа  —
это слишком  малые  величины,  которые  представляются  и  обрабатываются  с
точностью меньшей, чем позволяет разрядность регистров сопроцессора.

      Кроме    вещественных    чисел     (конечных     нормализованных     и
денормализованных,  нулей  и  бесконечностей)  регистры  сопроцессора  могут
содержать не-числа NaN (Not a Number) четырех видов.
      •  -SNaN  и  +SNaN  —   порядок   111...111,   мантисса   1,0ххх...ххх
(ненулевая).  Эти  "сигнализирующие"  не-числа  (signaling   NaN)   вызывают
исключения сопроцессора,  если  с  ними  пытаются  выполнять  арифметические
действия.
      •  -QNaN  и  +QNaN  —   порядок   111...111,   мантисса   1,1ххх...ххх
(ненулевая). Эти "тихие" не-числа (quiet NaN)  не  вызывают  исключений  при
арифметических операциях.

      Внешние  операнды  могут  быть  представлены  в  одном  из   форматов,
приведенных  на  рис.  2.  Характеристики  форматов  чисел,   поддерживаемых
сопроцессором, приведены в таблице. При  их  загрузке  в  FPU  и  сохранении
результатов преобразования форматов  во  внутренний  и  обратно  выполняются
автоматически. Во внешних  представлениях  вещественных  чисел  целая  часть
мантиссы всегда подразумевается равной единице. В расширенном формате  целая
часть задается  явно  (бит  63),  она  имеет  нулевое  значение  только  при
представлении нулей и денормализованных чисел. Смещение  порядка  составляет
127  для  одиночного,  1023  для  двойного  и  16   383   для   расширенного
вещественного  форматов.  Форматы  вещественных  чисел  представляют  только
множество дискретных значений множества чисел, расположенных на  непрерывной
бесконечной  числовой  оси.  Диапазон  и  плотность  значений   зависят   от
выбранного формата представления.  Заметим,  что  не  все  десятичные  дроби
могут быть представлены точно в двоичном коде. Так, например, дробь 1/10  не
имеет  точного  двоичного  представления  (аналогично  тому,   что   1/3   =
0,33333(3)).

      Таблица.  Форматы чисел, поддерживаемых сопроцессором

|Тип    |Длина|Точность       |Диапазон нормализованных значений            |
|       |, бит|               |                                             |
|       |     |двоичн|десятич|Двоичный               |десятичный           |
|       |     |ая    |ная    |                       |                     |
|Вещественные числа                                                           |
|Одиночн|32   |24    |7      |[pic]                  |[pic]                |
|ые     |     |      |       |                       |                     |
|(single|     |      |       |                       |                     |
|)      |     |      |       |                       |                     |
|Двойные|64   |53    |15-16  |[pic]                  |[pic]                |
|(double|     |      |       |                       |                     |
|)      |     |      |       |                       |                     |
|Рассшир|80   |64    |19     |[pic]                  |[pic]                |
|енные  |     |      |       |                       |                     |
|(extend|     |      |       |                       |                     |
|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  Кбайт).  Разрядность  операнда  и  адрес   должны   согласовываться   с
физическими возможностями и особенностями поведения адресуемого  устройства.
При  работе  с  памятью  такие  нюансы  во  внимание  принимать  обычно   не
приходится.
      Инструкции двоичной арифметики  выполняют все арифметические  действия
с байтами, словами и двойными словами, кодирующими знаковые или  беззнаковые
целые числа. Умножение и деление для 8086 возможны только  с  аккумулятором,
результат для 16-битных операндов расширяется в регистре DX.

      Для 286+ возможно двух- и трехадресное умножение с расширенном  тилько
в старший байт (два байта для 386+).

Таблица. Инструкции двоичной арифметики

Инструкция                        Описание

ADC              Сложение двух операндов с  учетом  переноса  от  предыдущей
                 операции
ADD   Сложение двух операндов
СМР              Сравнение (вычитание без сохранения результата —  установка
                 флагов)
DEC                    Декремент (вычитание 1, но не действует на флаг CF)
DIV                    Деление беззнаковое
IDIV                   Деление знаковое
IMUL                   Умножение знаковое
INC                    Инкремент (сложение с 1, но не действует на флаг CF)
MUL              Беззнаковое умножение
NEG                    Изменение знака операнда
SBB              Вычитание с заемом
SUB              Вычитание
XADD             Обмен содержимым и сложение (486+)

      Инструкции десятичной арифметики являются  дополнением  к  предыдущим.
Они позволяют оперировать с неупакованными  (биты  [7:4]  =  0,  биты  [3:0]
содержат  десятичную  цифру  0-9)  или  упакованными  (биты  [7:4]  содержат
старшую, биты [3:0]  —  младшую  десятичную  цифру  0-9)  двоичнодесятичными
числами.  Арифметические  операции  над  этими  числами  требуют  применения
инструкций коррекции форматов.

Таблица.  Инструкции десятичной арифметики

Инструкция                        Описание

ААА         Десятичная коррекция после сложения двух неупакованных чисел
AAD   Десятичная коррекция перед делением неупакованного двузначного числа
ААМ              Десятичная коррекция  после  умножения  двух  неупакованных
чисел
AAS              Десятичная коррекция  после  вычитания  двух  неупакованных
чисел
DAA              Десятичная коррекция AL  после  сложения  двух  упакованных
чисел
DAS              Десятичная коррекция AL после  вычитания  двух  упакованных
чисел

      Инструкции AAD и ААМ допускают обобщенный формат вызова,  при  котором
коррекция выполняется но любому модулю (а не только по модулю 10).

      Инструкции логических операций выполняют все функции  булевой  алгебры
над байтами, словами или двойными словами.

Таблица. Инструкции логических операций

Инструкция                        Описание
AND              Логическое И
NOT              Инверсия (переключение всех бит)
OR               Логическое ИЛИ
XOR              Исключающее ИЛИ

      Сдвиги и вращения (циклические сдвиги) выполняются над  регистром  или
операндом в памяти. Число позиций, на которое  производится  сдвиг,  берется
непосредственно из операнда или регистра CL по  модулю  8  для  однобайтного
операнда и по  модулю  16  или  32  для  операнда-слова,  в  зависимости  от
разрядности данных (32 только для 386+). Биты,  выталкиваемые  при  сдвигах,
попадают  во  флаг  CF.  При  сдвигах  влево   и   простом   сдвиге   вправо
освобождающиеся биты заполняются нулями (инструкции SAL и SHL  —  синонимы).
При  арифметическом  сдвиге  вправо  старший  бит  (знак)   сохраняет   свое
значение. При циклических сдвигах выталкиваемые биты попадают и во флаг  CF,
и в освобождающиеся позиции. В сдвигах  могут  участвовать  и  два  операнда
(инструкции SHLD и SHRD).

Таблица. Инструкции сдвигов

Инструкция                        Описание
RCL                          Циклический сдвиг влево через бит переноса
RCR                          Циклический сдвиг вправо через бит переноса
ROL                          Циклический сдвиг влево
ROR                          Циклический сдвиг вправо
SAL                          Сдвиг арифметический влево
SAR              Сдвиг арифметический (с сохранением старшего бита) вправо
SHL                          Сдвиг влево
SHR                          Сдвиг вправо
SHLD             Сдвиг влево  и  вставка  данных  в  освободившиеся  позиции
                       (386+)
SHRD             Сдвиг вправо и  вставка  данных  в  освободившиеся  позиции
                       (386+)

      Инструкции обработки бит и байт позволяют проверять (копировать в  CF)
и устанавливать значение указанного операнда, а также  искать  установленный
бит. Битовые операции выполняются над 16-или  32-битным  словом  памяти  или
регистром. Инструкции BSF, BSR и ВТ не изменяют значения слова; ВТС,  BTR  и
BTS воздействуют на указанный бит слова. Номер  интересующего  бита  берется
из операнда по модулю 16 или 32, в зависимости от разрядности.

      Операции с байтами обеспечивают условную установку  значений  00h  или
01h. Инструкция  тестирования  может  выполняться  над  байтом,  словом  или
двойным словом.



      Таблица. Инструкции обработки бит и байт

Инструкция                        Описание
BSF                    Сканирование бит (поиск единичного) вперед
BSR                    Сканирование бит назад
ВТ                     Тестирование бита (загрузка в CF)
ВТС                    Тестирование и изменения значения бита
BTR                          Тестирование и сброс бита
BTS                          Тестирование и установка бита
SALC              Условная  (по  CF)  установка  А1  в  FFh  или   OOh   (не
                       документировано, код D6h)
SETA/            Установка байта в 01h, если выше ((CF ИЛИ ZF)=0),  иначе  в
                       00h
SETNBE
SETAE/                       Установка байта в 01 h, если  не  ниже  (CF=0),
иначе в 00h
SETNB/
SETNC
SETB/                        Установка байта в 01h, если ниже (CF=1),  иначе
в 00h
SETNAE/
SETC
SETBE/           Установка байта в 01h, если не выше (CF ИЛИ ZF)=1, иначе  в
                       00h
SETNA
SETE/                        Установка  байта  в  01h,  если  равно  (ZF=1),
иначе в 00h
SETZ
SETG/            Установка байта в 01 h, если больше (SF=(OP И  ZF)),  иначе
                       в 00h
SETNLE
SETQE/           Установка байта в  01h,  если  больше  или  равно  (SF=OF),
                       иначе в  00h
SETNL
SETL/                  Установка  байта  в  01h,  если  меньше  (ZF[pic]OF),
иначе в 00h
SETNGE                 00h
SETLE/      Установка байта в 01h, если  меньше  или  равно  (SF[pic]0F  или
                       ZF=0),иначе в 00h
SETNG
SETNE/           Установка байта в 01h, если не равно (ZF=0), иначе в 00h
SETNZ
SETNO            Установка байта в 01h, если нет переполнения (0F=0),  иначе
                       в 00h
SETNS            Установка байта в 01 h, если неотрицательно  (SF=0),  иначе
                       в 00h
SETO             Установка байта в 01h, если переполнение  (0F=1),  иначе  в
                       00h
SETPE/           Установка байта в 01h, если  паритет  (четность),  иначе  в
                       00h
SETP
SETPO/           Установка байта в 01 h,  если  нет  паритета  (нечетность),
                       иначе в 00h
SETNP
SETS             Установка байта в 01 h, если отрицательно (SF=1),  иначе  в
                       00h
SETC                         Установка байта в 01 h,  если  перенос  (CF=1),
иначе в 00h
SETNC            Установка байта в 01 h, если нет переноса (CF=0),  иначе  в
                       00h
TEST              Проверка  бит  (логическое  И  без  записи  результата   —
                       установка флагов)

      Строковые операции выполняются  с  операндами  в  памяти,  адресуемыми
регистрами DS:SI (DS:ESI) для источника  и  ES:DI  (ES:EDI)  для  приемника.
Операции  могут  использоваться  с  префиксами  условного  или  безусловного
повтора. После каждой пересылки или сравнения  индексные  регистры  (SI,  DI
или  оба)   участвующих   операндов   автоматически   инкрементируются   или
декрементируются на количество байт, участвующих в  операции  (1,2  или  4).
Направление модификации определяется флагом DF: DF = 0 -инкремент, DF = 1  —
декремент. Строковые инструкции ввода-вывода с префиксами повтора  позволяют
достигать высоких скоростей обмена с портами  при  условии  полной  загрузки
процессора.

Таблица. Инструкции строковых операций

Инструкция                        Описание

CMPSB, CMPSD, CMPSW     Сравнение  строк  байт,  слов  или  двойных  слов  с
                       записью результата сравнения в регистр флагов
INSB,  INSD,  INSW              Запись  байта,  слова  или  двойного  слова,
                       введенного из порта, в память(286+)
LODSB, LODSD, LODSW     Копирование  байта,  слова  или  двойного  слова  из
                       строки в AL/(E)AX
MOVSB, MOVSD, MOVSW    Копирование байта, слова или двойного слова из  одной
                       строки в другую
OUTSB, OUTSD, OUTSW    Вывод байта, считанного из памяти, в порт (286+)
SCASB, SCASD, SCASW    Сканирование строки байт, слов  или  двойных  слов  —
                       сравнение с AL/(E)AX и запись результата сравнения  в
                       регистр флагов
STOSB, STOSD, STOSW    Запись байта, слова или двойного слова  в  строку  из
                       AL/(E)AX
REP                     Префикс  повтора  строковых  операций  до  обнуления
                       (Е)СХ, (Е)СХ декрементируется на каждом повторе
REPE/REPZ               Префикс  условного  повтора  строковых  операций   —
                       выполнения REP при ZF=1
REPNE/                  Префикс  условного  повтора  строковых  операций   —
                       выполнения
REPNZ                        REP при ZF=0

      Инструкции математического сопроцессора  (FPU)  имеют  свою  специфику
задания   операндов.   Переменная   st(0)   находится   на   вершине   стека
сопроцессора, st(i) смещена от вершины на i. Загрузка  данных  начинается  с
декремента указателя стека сопроцессора (поле TOP)  —  перемещения  вершины.
Если новая вершина не пустая (по полю TAG)  или  стек  исчерпан,  вызывается
исключение с указанием причины.

      После загрузки поле TAG устанавливается в соответствии  с  загруженным
числом. При извлечении из стека производится инкремент ТОР,  а  в  поле  TAG
старой вершины устанавливается признак пустой ячейки. Попытка  использования
пустого регистра  в  операциях  или  для  сохранения  результатов  в  памяти
вызывает исключение. Инструкции с префиксом F предварительно проверяют  флаг
исключения  ES  (они  называются  ожидающими  инструкциями),  инструкции   с
префиксом FN флаг исключения  не  проверяют  (неожидающие  инструкции).  Ряд
инструкций не вызывает исключения в случае, если обнаруживаются операнды не-
числа (NaN).

Таблица. Инструкции FPU

Инструкция                        Описание

Пересылки данных

FBLD             Преобразование и помещение (push) числа в упакованном  BCD-
                 формате из памяти в стек
FBSTP            Извлечение из стека и запись в память  в  упакованном  BCD-
                 формате (10 байт, 18 цифр)
FCMOVB           Пересылка, если ниже (CF=1) (P6+)
FCMOVBE          Пересылка, если не выше (CF ИЛИ ZF)=1 (P6+)
FCMOVE           Пересылка, если равно (ZF=1) (P6+)
FCMOVNB          Пересылка, если не ниже (CF=0) (P6+)
FCMOVNBE         Пересылка, если выше ((CF ИЛИ ZF)=0) (P6+)
FCMOVNE          Пересылка, если не равно (ZF=0) (P6+)
FCMOVNU          Пересылка, если не NaN (PF=0) (P6+)
FCMOVU           Пересылка, если NaN (unordered) (PF=0) (P6+)
FILD                   Загрузка (push) целого числа из памяти
FIST                   Запись в память в формате целого числа
FISTP                  Запись в память в формате целого числа с извлечением
FLD                    Загрузка (push) вещественного числа
FST              Сохранение (копирование) числа  в  памяти  (в  вещественном
                 формате) или в регистре стека
FSTP             Запись числа  в  память  (в  вещественном  формате)  или  в
                 регистр стека с извлечением
FXCH                   Обмен значениями вершины стека и регистра

Загрузка констант
FLD1                   Загрузка (push)+1,0
FLDL2E           Загрузка (push) log2(e)
FLDL2T           Загрузка (push) log2( 10)
FLDLG2           Загрузка (push) lg(2)
FLDLN2           Загрузка (push) ln(2)
FLDPI                  Загрузка (push) pi
FLDZ                   Загрузка (push) + 0,0

Базовая арифметика
FABS                   Нахождение абсолютного значения
FADD                   Сложение вещественных чисел
FADDP                  Сложение вещественных чисел с извлечением
FCHS                   Изменение знака
FDIV             Деление вещественных чисел
FDIVP            Деление вещественных чисел с извлечением
FDIVR       Обратное деление вещественных чисел
FDIVRP           Обратное деление вещественных чисел с извлечением
FIADD       Сложение с целым числом
FIDIV            Деление на целое число
FIDIVR           Обратное деление целых чисел
FIMUL       Умножение на целое число
FISUB            Вычитание целого числа
FISUBR           Вычитание из целого числа
FMUL             Умножение вещественных чисел
FMULP       Умножение вещественных чисел с извлечением
FPREM       Нахождение частичного остатка
FPREM1           Нахождение частичного остатка в стандарте IEEE (387+)
FRNDINT          Округление до ближайшего целого
FSCALE      Масштабирование  —  умножение  на  округленную  в  сторону  нуля
                 степень числа 2
FSQRT       Извлечение квадратного корня
FSUB             Вычитание вещественного числа
FSUBP       Вычитание вещественных чисел с извлечением
FSUBR       Обратное вычитание числа
FSUBRP           Обратное вычитание с извлечением
FXTRACT          Выделение мантиссы и порядка числа

Сравнение данных
FCOM               Сравнение   вещественных    чисел    (установка    флагов
сопроцессора)
FCOMI Сравнение и соответствующая установка флагов в  EFLAGS  (ZF,  PF,  CF)
                 (P6+)
FCOMIP      Сравнение и соответствующая установка флагов в EFLAGS  (ZF,  PF,
                 CF), с извлечением (P6+)
FCOMP       Сравнение вещественных чисел с извлечением
FCOMPP           Сравнение вещественных чисел с двойным извлечением
FICOM       Сравнение с целочисленным операндом из памяти
FICOMP            Сравнение  с   целочисленным   операндом   из   памяти   с
извлечением
FTST             Проверка на нуль
FUCOM       Сравнение без генерации исключения в случае NaN (387+)
FUCOMI       Сравнение   без   генерации   исключения   в   случае   NaN   и
                 соответствующая установка флагов  в  EFLAGS  (ZF,  PF,  CF)
                 (P6+)
FUCOMIP      Сравнение   без   генерации   исключения   в   случае   NaN   и
                 соответствующая установка флагов в EFLAGS (ZF,  PF,  CF)  с
                 извлечением (P6+)
FUCOMP            Сравнение  без  генерации  исключения  в  случае   NaN   с
                 извлечением (387+)
FUCOMPP          Сравнение без генерации исключения в случае NaN  с  двойным
                 извлечением (387+)
FXAM                   Анализ числа — установка кода условия в СО, С2, СЗ

Трансцендентные функции
Р2ХМ1                  Вычисление [pic]
FCOS                   Косинус (387+)
PPATAN           Арктангенс частного с извлечением
FPTAN            Вычисление тангенса и загрузка (push) в стек +1,0
FSIN                   Вычисление синуса (387+)
FSINCOS          Вычисление синуса и косинуса с  помещением  (push)  в  стек
(387+)
FYL2X                  Вычисление Yxlog2(X)
FYL2XP1          Вычисление Yxlog2(X+1)

Управление сопроцессором
FCLEX       Сброс флагов исключений с предварительной проверкой
                 ожидающих немаскированных исключений
FDECSTP          Декремент указателя стека FPU
FFREE                  Освобождение регистра — пометка как свободного
FINCSTP          Инкремент указателя стека FPU
FINIT            Инициализация FPU  с  предварительной  проверкой  ожидающих
                 исключений
FLDCW            Загрузка управляющего слова (FPU CW) из памяти
FLDENV           Загрузка состояния  сопроцессора  из  памяти,  сохраненного
                 инструкциями FSTENV/FNSTENV
FNCLEX           Сброс флагов исключений без проверки ожидающих
FNINIT           Инициализация FPU без проверки ожидающих исключений
FNOP             Пустая операция FPU
FNSAVE           Сохранение  состояния  сопроцессора  и  стека  регистров  в
                 памяти без проверки ожидающих исключений
FNSTCW            Сохранение  управляющего  слова  без  проверки   ожидающих
                 исключений
FNSTENV          Сохранение состояния сопроцессора  (SR,  CR,  TAGW,  FIP  и
                 FDP) в памяти без проверки ожидающих исключений
FNSTSW           Запись слова состояния без проверки ожидающих исключений
FRSTOR           Загрузка состояния сопроцессора и регистров из памяти
FSAVE            Сохранение  состояния  сопроцессора  и  стека  регистров  в
                 памяти с предварительной проверкой ожидающих исключений
FSTCW            Сохранение управляющего слова с  предварительной  проверкой
                 ожидающих исключений
FSTENV           Сохранение состояния сопроцессора  (SR,  CR,  TAGW,  FIP  и
                 FDP)  в  памяти  с  предварительной   проверкой   ожидающих
                 исключений
FSTSW            Запись  слова  состояния  для  последующего  переноса  кода
                 завершения в регистр  флагов  с  предварительной  проверкой
                 ожидающих исключений
WAIT/FWAIT       Синхронизация — останов CPU до завершения текущей  операции
                 FPU, проверка ожидающих исключений FPU

      Инструкции ММХ появились  в  процессорах  Pentium  ММХ  и  с  тех  пор
поддерживаются  всеми  более   современными   процессорами   (Pentium   Pro,
появившийся раньше, эти  инструкции  не  поддерживает).  Они  имеют  сложную
мнемонику, которая включает следующие элементы:
      • префикс Р (Packed), указывающий на обработку упакованных форматов;
      • мнемонику операции (например, ADD, CMP или XOR);
      • суффикс, идентифицирующий тип насыщения: US (Unsigned Saturation)  —
насыщение беззнаковое, S (Signed saturation) — насыщение знаковое;
      • суффикс, идентифицирующий тип данных: В —  упакованные  байты,  W  —
упакованные слова, D — упакованные двойные слова, Q -учетверенное слово.

      Инструкции, у которых  типы  входных  и  выходных  данных  различаются
(например, преобразования), имеют два суффикса.

      Для инструкций пересылки данных операнды источника и назначения  могут
находиться в памяти  (m32  или  m64),  целочисленных  регистрах  (ir32)  или
регистрах ММХ  (mm).  Для  остальных  инструкций,  кроме  вышеперечисленных,
операнд-источник может быть и непосредственным, а операнд назначения  всегда
является регистром ММХ. Для операндов, находящихся в памяти,  применимы  все
существующие режимы адресации.

Таблица. Инструкции ММХ

Инструкция                        Описание
EMMS                   Очистка стека регистров — установка всех единиц в
слове тегов

Пересылка данных
MOVD  Пересылка данных  в  младшие  32  бита  регистра  ММХ  (с  заполнением
                 старших бит нулями) или из младших 32 бит регистра ММХ
MOVQ                   Пересылка данных (64 бит) из/в регистр ММХ

Преобразование форматов
PACKSSDW         Упаковка со знаковым насыщением четырех двойных слов в
четыре
                 слова
PACKSSWB         Упаковка со знаковым насыщением восьми слов в восемь байт
PACKUSWB          Упаковка  с  насыщением  восьми  знаковых  слов  в  восемь
                 беззнаковых байт
PUNPCKHBW        Чередование в регистре  назначения  байт  старшей  половины
                 операнда-источника  с  байтами  старшей  половины  операнда
                 назначения
PUNPCKHWD        Чередование в регистре  назначения  слов  старшей  половины
                 операнда-источника со  словами  старшей  половины  операнда
                 назначения
PUNPCKHDQ        Чередование в регистре назначения  двойного  слова  старшей
                 половины  операнда-источника  с  двойным   словом   старшей
                 половины операнда назначения
PUNPCKLBW        Чередование в регистре  назначения  байт  младшей  половины
                 операнда-источника  с  байтами  младшей  половины  операнда
                 назначения
PUNPCKLWD        Чередование в регистре  назначения  слов  младшей  половины
                 операнда-источника со  словами  младшей  половины  операнда
                 назначения
PUNPCKLDQ        Чередование в регистре назначения  двойного  слова  младшей
                 половины  операнда-источника  с  двойным   словом   младшей
                 половины операнда назначения

Упакованная арифметика
PADDB            Сложение упакованных  байт  (слов  или  двойных  слов)  без
                 насыщения
PADDW            (с циклическим переполнением)
PADDD
PADDSB           Сложение знаковых упакованных байт (слов) с насыщением
PADDSW
PADDUSB          Сложение упакованных беззнаковых байт (слов) с насыщением
PADDUSW
PMADDWD           Умножение  четырех  знаковых  слов  операнда-источника  на
                 четыре знаков слова операнда назначения. Два двойных  слова
                 результатов   умножения   младших   слов   суммируются    и
                 записываются в младшее двойное слово  операнда  назначения.
                 Два  двойных  слова  результатов  умножения  старших   слов
                 суммируются и записываются в старшее двойное слово операнда
                 назначения
PMULHW           Умножение упакованных знаковых слов  с  сохранением  только
                 старших 16 элементов результата
PMULLW           Умножение  упакованных  знаковых  или  беззнаковых  слов  с
                 сохранением только младших 16 бит элементов результата
PSUBB            Вычитание упакованных байт (слов или двойных слов) без
PSUBW       насыщения (с циклическим антипереполнением)
PSUBD
PSUBSB           Вычитание упакованных знаковых  байт  (слов)  с  насыщением
PSUBSW
PSUBUSB          Вычитание упакованных беззнаковых байт (слов) с  насыщением
PSUBUSW

Логика
PAND                   Логическое И
PANDN                  Логическое И mm/m64 и инверсного значения mm
POR                    Логическое ИЛИ
PXOR                   Исключающее ИЛИ

Сравнение
PCMPEQB          Сравнение (на равенство) упакованных байт (слов, двойных
                 слов). Все биты элемента результата будут единичными (True)

PCMPEQD           совпадении  соответствующих  элементов  (байт,  слов   или
                 двойных
PCMPEQW          слов) операндов и нулевыми (False) при несовпадении
PCMPGTB          Сравнение (по величине) упакованных  знаковых  байт  (слов,
                 двойных слов).
PCMPGTD,  PCMPGTW        Все  биты  элемента  результата  будут   единичными
                 (True), если соответствующий  элемент  операнда  назначения
                 больше элемента операнда-источника, и  нулевыми  (False)  в
                 противном случае
Сдвиги и вращения
PSLLD, PSLLQ, PSLLW    Логический сдвиг  влево  упакованных  слов  (двойных,
                 учетверенных)  операнда  назначения  на   количество   бит,
                 указанных в операнде-источнике, с заполнением  младших  бит
                 нулями
PSRAD,   PSRAW       Арифметический   сдвиг   вправо   упакованных   двойных
                 (учетверенных)  знаковых  слов   операнда   назначения   на
                 количество   бит,   указанных   в   операнде-источнике,   с
                 заполнением младших бит битами знаковых разрядов
PSRLD, PSRLQ, PSRLW    Логический сдвиг вправо  упакованных  слов  (двойных,
                 учетверенных)  операнда  назначения  на   количество   бит,
                 указанных в операнде- источнике, с заполнением старших  бит
                 нулями

      Инструкции SSE появились в процессорах Pentium 3. Они делятся  на  три
основные  группы:  инструкции  над  числами  в  блоке  ХММ,   дополнительные
целочисленные SIMD-инструкции (в блоке ММХ) и новые инструкции  кэширования.
Основное число новых инструкций  предназначено  для  работы  с  блоком  ХММ.
Векторные инструкции выполняются сразу над четырьмя парами чисел.  Скалярные
инструкции выполняются только  над  числами,  расположенными  в  младших  32
битах  операндов.  Операнд-источник  для  инструкций  ХММ  может  быть   как
регистром ХММ, так  и  128-битной  ячейкой  памяти.  Для  многих  инструкций
требуется, чтобы операнд в памяти был выровнен  по  границе  параграфа.  При
обработке скалярными инструкциями операнда в памяти пересылка между  памятью
и  регистрами  ХММ  производится   для   всего   128-битного   слова,   хотя
используется только 32 бита.

Таблица. Инструкции расширения SSE

Инструкция                        Описание

Пересылка данных с участием регистров ХММ
MOVAPS           Пересылка 128-битных данных между памятью и регистрами ХММ
или
                 между регистрами ХММ. Данные в памяти должны быть выровнены