Смекни!
smekni.com

Форматы данных и команды их обработки процессоров Pentium III, Pentium IV (стр. 7 из 18)

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

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

Инструкции пересылки данных (чисел с плавающей точкой двойной точности между регистрами ХММ, а также регистрами ХММ и памятью)

MOVAPD Пересылка пары упакованных выровненных чисел

MOVUPD Пересылка пары упакованных невыровненных чисел

MOVHPD Пересылка старшего упакованного числа

MOVLPD Пересылка младшего упакованного числа

MOVMSKPD Извлечение знаковой маски из пары чисел

MOVSD Пересылка скалярного числа

Арифметические инструкции над операндами с плавающей точкой двойной точности в регистрах ХММ

ADDPD Векторное сложение

ADDSD Скалярное сложение

SUBPD Векторное вычитание

SUBSD Скалярное вычитание

MULPD Векторное умножение

MULSD Скалярное умножение

DIVPD Векторное деление

DIVSD Скалярное деление

SQRTPD Векторное извлечение квадратного корня

SQRTSD Скалярное извлечение квадратного корня

MAXPD Векторное нахождение максимума

MAXSD Скалярное нахождение максимума

MINPD Векторное нахождение минимума

MINSD Скалярное нахождение минимума

Логические инструкции над упакованными 64-битными операндами в регистрах ХММ (побитные функции)

ANDPD Логическое И

ANDNPD Логическое И-НЕ

ORPD Логическое ИЛИ

XORPD Исключающее ИЛИ

Инструкции сравнения упакованных (векторных) и скалярных операндов с плавающей точкой двойной точности в регистрах ХММ с помещением результата в операнд-приемник или регистр EFLAGS

CMPPD Сравнение векторное

CMPSD Сравнение скалярное

COMISD Упорядоченное сравнение скалярных чисел с помещением результата в биты регистра EFLAGS (если хоть один из операндов QNaN или SNaN, генерируется исключение #I и EFLAGS не модифицируется)

UCOMISD Неупорядоченное сравнение (то же, но исключение #I генерируется только в случае SNaN)

Инструкции перестановок и распаковки операндов с плавающей точкой двойной точности в регистрах ХММ

SHUFPD Перестановка элементов в упакованных операндах

UNPCKHPD Распаковка и чередование старших элементов (в приемнике собираются старшие части операндов)

UNPCKLPD Распаковка и чередование младших элементов (в приемнике собираются младшие части операндов)

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

CVTPD2PI Преобразование упакованных чисел с плавающей точкой в упакованные целые (двойные слова)

CVTTPD2PI Преобразование с усечением упакованных чисел с плавающей точкой двойной точности в упакованные целые (двойные слова)

CVTP12PD Преобразование упакованных целых (двойных слов) в упакованные числа с плавающей точкой двойной точности

CVTPD2DQ Преобразование упакованных чисел с плавающей точкой в упакованные целые (двойные слова)

CVTTPD2DQ Преобразование с усечением упакованных чисел с плавающей точкой двойной точности в упакованные целые (двойные слова)

CVTDQ2PD Преобразование упакованных 32-битных целых в упакованные числа с плавающей точкой двойной точности

CVTPS2PD Преобразование упакованных чисел с плавающей точкой одинарной точности в числа двойной точности

CVTPD2PS Преобразование упакованных чисел с плавающей точкой двойной точности в числа одинарной точности

CVTSS2SD Преобразование скалярного числа с плавающей точкой одинарной точности в число двойной точности

CVTSD2SS Преобразование скалярного числа с плавающей точкой двойной точности в число одинарной точности

CVTSD2SI Преобразование скалярного числа одинарной точности в 32-битное целое

CVTTSD2SI Преобразование с усечением скалярного числа двойной точности в 32-битное целое

CVTS12SD Преобразование 32-битного целого в число двойной точности

Инструкции преобразований с числами одинарной точности

CVTDQ2PS Преобразование упакованных 32-битных целых в упакованные числа с плавающей точкой одинарной точности

CVTPS2DQ Преобразование упакованных чисел одинарной точности в числа двойной точности

CVTTPS2DQ Преобразование с усечением упакованных чисел одинарной точности в числа двойной точности

Целочисленные 128-битные SIMD-инструкции

MOVDQA Пересылка выровненного 128-битного операнда

MOVDQU Пересылка невыровненного 128-битного операнда

MOVQ2DQ Пересылка 64-битного целого из ММХ в ХММ

MOVDQ2Q Пересылка 64-битного целого из ХММ в ММХ

PMULUDQ Умножение упакованных беззнаковых 32-битных целых

PADDQ Сложение упакованных 64-битных целых

PSUBQ Вычитание упакованных 64-битных целых

PSHUFLW Перестановка упакованных младших слов

PSHUFHW Перестановка упакованных старших слов

PSHUFD Перестановка упакованных двойных слов

PSLLDQ Логический сдвиг 64-битных чисел влево

PSRLDQ Логический сдвиг 64-битных чисел вправо

PUNPCKHQDQ Распаковка старших 64-битных чисел

PUNPCKLQDQ Распаковка младших 64-битных чисел Управление кэшированием

CLFLUSH Очистка и инвалидация строки кэша (всех уровней), связанной с указанным операндом в памяти

LFENCE Упорядочивание операций загрузки из памяти

MFENCE Упорядочивание операций загрузки и записи

PAUSE Улучшение выполнения цикла ожидания

MASKMOVDQU Выборочная запись байтов из ХММ в память, минуя кэш

MOVNTPD Запись пары упакованных чисел из ХММ в память, минуя кэш

MOVNTDQ Запись 128-битного числа из ХММ в память, минуя кэш

MOVNTI Запись двойного слова из регистра общего назначения в память, минуя кэш

Инструкции 3DNow!, появившиеся с процессорами AMD K6-2, поддерживаются всеми последующими процессорами AMD и некоторыми другими процессорами.

Процессоры Intel этот набор не поддерживают, хотя в SSE имеются инструкции, совпадающие с частью инструкций 3DNow!. В процессорах Athlon расширение 3DNow! получило дополнительные инструкции для сигнальных процессоров. Целочисленные инструкции ММХ и управления кэшированием совпадают с одноименными инструкциями SSE. В данной работе инструкции 3DNow! не рассмотрены, так как не относятся к инструкциям процессоров Pentium 3,4.

6. Команды блока XMM (SSE и SSE2)

Порядок описания команд в этом разделе следующий:

• в заголовок вынесена схема команды, поясняющая общий набор и назначение операндов;

• в следующей строке дается название команды, расшифровка ее мнемоники и назначение;

• далее следует синтаксис команды (сложный синтаксис приводится в виде диаграмм), при описании которого используются следующие обозначения:

• r8, r16, r32 — операнд в одном из регистров размером байт, слово или двойное слово;

• m8, m16, m32, m48, m64 — операнд в памяти размером байт, слово, двойное слово или 48 бит;

• i8, i16, i32 — непосредственный операнд размером байт, слово или двойное слово;

• машинный код для всех сочетаний операндов описываемой команды (при сложном синтаксисе машинный код включается в синтаксис);

• состояние флагов после выполнения команды;

• описание действия команды;

• описание флагов после выполнения команды, при этом приводятся сведения только о флагах, изменяемых командой, и используются следующие обозначения:

• 1 — флаг устанавливается (равен 1);

• 0 — флаг сбрасывается (равен 0);

• r — значение флага зависит от результата выполнения команды;

• ? — после выполнения команды флаг не определен;

• список исключений.

На многих диаграммах в целях компактности возможные сочетания операндов показаны в виде следующей конструкции:

Конструируя команду на основе подобной синтаксической диаграммы, нужно помнить о соответствии типов. Допустимы только следующие сочетания: "r8, m8", "r16, m16", "r32, m32", а сочетание, например, "r8, m16" недопустимо. Однако, есть единичные случаи, когда подобные сочетания возможны; тогда они оговариваются специальным образом.

Описание машинного кода приводится в двух вариантах.

• В двоичном виде. Это описание применяется для демонстрации особенностей внутренней структуры машинной команды. Байты машинного представления машинной команды отделяются двоеточием.

• В шеснадцатеричном виде. Каждый байт машинного представления команды представлен двумя шестнадцатеричными цифрами. Часто за одним (двумя и более) первым байтом следует обозначение: /цифра. Это означает, что поле reg в байте mod r/m используется как часть кода операции и цифра представляет содержимое этого поля.

Вместо цифры может стоять символ "r" — /r. Как уже не раз отмечалось, большинство команд процессора — двухоперандные. Один операнд располагается в регистре, местоположение другого операнда определяет байт ModR/M — это может быть либо регистр, либо ячейка памяти. Более того, если операнд — ячейка памяти, то содержимое байта ModR/M определяет номенклатуру компонентов машинного кода команды, которые должны использоваться для вычисления эффективного адреса.

При описании команд могут быть опущены некоторые из перечисленных пунктов. Например, отсутствие пункта "синтаксис" говорит о том, что он совпадает со схемой команды. Отсутствие пункта "исключения" означает, что при выполнении данной команды исключения не возникают. То же касается описания флагов.

Некоторые регистры программной модели процессора имеют внутреннюю структуру. Указание того, о каком поле такого регистра идет речь, показано следующим образом: имя_регистра.имя_поля.

6.1. Команды блока XMM (SSE – Pentium 3)

ADDPS приемник, источник

ADDPS (ADDition Packed Single-precision float-point) — сложение упакованных значений в формате ХММ.

Синтаксис: ADDPS rxmm1, rxmm2/m128

Машинный код: 00001111:01011000:mod rxmm1 r/m

Действие: алгоритм работы команды показан на рисунке ниже.

Исключения: NE: #O, #U, #I, #Р, #D; PM: #GP(0): 37; #NM: 3; #PF(fault-code); #SS(0): 13; #UD: 10,11,12,13; #XM; RM: #GP: 13; #NM: 3; #UD: 17,18; #XM; VM: исключения реального режима; #PF(fault-code).

ADDSS приемник, источник

ADDSS (ADD Scalar Single-precision float-point) — скалярное сложение значений в формате ХММ.

Синтаксис: ADDSS rxmm1, rxmm2/m128

Машинный код: 11110011:00001111:01011000:mod rxmm1 r/m

Действие: алгоритм работы команды показан на рисунке ниже.