Типы данных
MMX-команды используют новые типы данных: упакованные байты (packed byte, суффикс команды b), упакованные слова (packed word, суффикс w), упакованные двойные слова (packed doubleword, суффикс d) и 64-разрядные слова (quadword, суффикс q).

Одни и те же 64 бита могут трактоваться одной MMX-командой как 8 байт, другой командой - как 4 слова, и т.д. Тип данных определяется суффиксом команды.

back Возврат к изучаемой теме

Допустимый диапазон данных
тип данныхминимальное значениемаксимальное значение
Байт со знаком80h (-128)7Fh (127)
Байт без знака00hFFh (256)
Слово со знаком8000h (-32768)7FFFh (32767)
Слово без знака0000hFFFFh (65535)
Двойное слово со знаком80000000h (-2147483648)7FFFFFFFh (2147483647)
Двойное слово без знака00000000hFFFFFFFFh (4294967295)

back Возврат к изучаемой теме

Операнд
Большинство MMX-команд имеет два операнда: выходной и входной. Обычно входная информация берется из обоих операндов; результат записывается в выходной операнд.

Пример: pand MM2,MM4
Здесь регистр MM2 - выходной операнд, регистр MM4 - входной. Эта команда вычисляет поразрядное логическое И между значениями в регистрах MM2 и MM4 и записывает результат в регистр MM2.

back Возврат к изучаемой теме

Арифметика с насыщением
(saturation arithmetic)

Если команда использует арифметику с насыщением и результат операции превышает максимальное представимое значение, то в выходной операнд записывается это максимальное значение (происходит "насыщение").
Аналогично, если результат операции оказался меньше нижней границы допустимого диапазона, то в выходной операнд записывается минимально возможное значение.
Например, если результат меньше 8000h, то 16-разрядное слово со знаком считается равным 8000h; если получилось больше 7FFFh, то слово со знаком считается равным 7FFFh.
back Возврат к изучаемой теме

Циклическая арифметика (wraparound arithmetic)
Если команда использует циклическую арифметику и результат операции выходит за двоичную разрядную сетку используемого типа данных, то "лишние" старшие биты результата отбрасываются. Иначе говоря, если результат превышает максимально возможное значение на n единиц, то результатом считается
минимальное значение + n - 1.
Примеры:
7FFFh + 0002h = 8001h
(32767 + 2 = -32767 или 32769)
FFFFh + 0002h = 0001h
(65535 + 2 = 1 или -1 + 2 = 1)

back Возврат к изучаемой теме

Команда EMMS
Команда EMMS присваивает значение 1 всем разрядам слова состояния регистров с плавающей запятой, что соответствует состоянию Empty. Это обеспечивает переход процессора из режима исполнения MMX-команд в режим исполнения обычных команд с плавающей запятой.

Не забывайте ставить команду EMMS в конце процедур, использующих MMX-команды!

back Возврат к изучаемой теме

Команды сложения и вычитания
MMX-команды сложения и вычитания работают с упакованными байтами, словами и двойными словами. Обрабатываются данные как со знаком, так и без знака.
Команды сложенияКоманды вычитания
paddb/w/dpsubb/w/d
paddsb/w psubsb/w
paddusb/wpsubusb/w

back Возврат к изучаемой теме

Команды сдвига
MMX-команды сдвига выполняют арифметический и логический сдвиг разрядов в элементах данных выходного операнда. При логическом сдвиге освободившиеся разряды заполняются нулями. При арифметическом сдвиге крайний из сдвигаемых битов "размножается" и заполняет все освободившиеся разряды.
Команды сдвига
psllw/d/q
psraw/d
psrlw/d/q

back Возврат к изучаемой теме

Логические команды
Эта группа MMX-команд выполняет поразрядные логические операции над 64 битами данных.
Логические команды
pandpor
pandnpxor

back Возврат к изучаемой теме

Команды умножения
MMX-команды умножения вычисляют произведения 16-разрядных слов своих операндов. Команда pmulhw записывает в каждое слово выходного операнда старшие 16 разрядов этих произведений, а команда pmullw - младшие 16 разрядов. Команда pmaddwd попарно складывает произведения и записывает полученные суммы в 32-разрядные двойные слова выходного операнда.
Команды умножения
pmulhw
pmullw
pmaddwd

back Возврат к изучаемой теме

Команды сравнения
Эти MMX-команды сравнивают элементы данных в операндах и генерируют маску в выходном операнде. MMX-команды сравнения не устанавливают флагов (признаков).
Команды сравнения
pcmpeqb/w/d
pcmpgtb/w/d

back Возврат к изучаемой теме

Команды упаковки и распаковки
MMX-команды упаковки "укорачивают" элементы данных в своих операндах и записывают полученные короткие данные в выходной операнд. MMX-команды распаковки составляют из элементов данных в своих операндах новые элементы данных удвоенной длины и записывают их в выходной операнд.
Команды упаковкиКоманды распаковки
packsswb/dwpunpckhbw/wd/dq
packuswdpunpcklbw/wd/dq

back Возврат к изучаемой теме

Команды передачи данных
MMX-команды передачи данных выполняют копирование данных из одного MMX-регистра в другой, а также пересылку между MMX-регистрами, целочисленными регистрами и памятью.
Команды передачи данных
movd
movq

back Возврат к изучаемой теме


Скалярное произведение векторов
Эта операция часто используется в приложениях линейной алгебры и цифровой обработки сигналов.

Скалярное произведение a·b векторов ak и bk (k = 1,..., n) вычисляется так:
a·b = a1b1 + a2b2 + ... + anbn

back Возврат к изучаемой теме

Абсолютные величины разностей
Абсолютные величины разностей чисел используются в алгоритмах распознавания и сжатия в качестве метрики - меры "расстояния" между числами.

back Возврат к изучаемой теме

Условный выбор фрагмента изображения
Выделение фрагмента изображения по какому-либо условию - обычная операция в графических программах, например, при наложении объекта или текста на картинку-фон. Такая операция требует многих ветвлений в программе; их можно избежать, если воспользоваться MMX-командами.

back Возврат к изучаемой теме

Распаковка с "размножением" знака
Распаковка с "размножением" знакового бита часто требуется при преобразовании коротких типов данных к длинным.

back Возврат к изучаемой теме

Команда movq
Команда movq выполняет копирование 64 бит из одного MMX-регистра в другой, а также из MMX-регистра в память и обратно.

back Возврат к изучаемой теме

Команда pmaddwd
Команда pmaddwd попарно перемножает слова (со знаком) входного и выходного операнда, что дает четыре 32-разрядных произведения. Затем первое произведение складывается со вторым, а третье с четвертым. Полученные суммы записываются в 32-разрядные слова выходного операнда.

back Возврат к изучаемой теме

Команда paddd
Команда paddd складывает 32-разрядные слова входного операнда с 32-разрядными словами выходного операнда в циклической арифметике.

back Возврат к изучаемой теме

Команда pcmpeqb
Команда pcmpeqb сравнивает байты входного операнда с соответствующими байтами выходного. Если байт выходного операнда равен байту входного, такой байт заполняется единицами, а если не равен, то он заполняется нулями.

back Возврат к изучаемой теме

Команда pand
Команда pand вычисляет поразрядное логическое И входного и выходного операнда. При выполнении этой команды значение 1 остается только в тех битах выходного операнда, для которых соответствующие биты обоих операндов на входе были равны 1.

back Возврат к изучаемой теме

Команда pandn
Команда pandn вычисляет обращение (поразрядное логическое НЕ) выходного операнда, а затем поразрядное логическое И между входным операндом и обращенным значением выходного.

back Возврат к изучаемой теме

Команда por
Команда por вычисляет поразрядное логическое ИЛИ входного и выходного операнда. При выполнении этой команды значение 1 записывается в те биты выходного операнда, для которых хотя бы один из соответствующих битов обоих операндов на входе был равен 1. В остальные биты записывается 0.

back Возврат к изучаемой теме