Одни и те же 64 бита могут трактоваться одной MMX-командой как 8 байт, другой командой - как 4 слова, и т.д. Тип данных определяется суффиксом команды.
тип данных | минимальное значение | максимальное значение |
Байт со знаком | 80h (-128) | 7Fh (127) |
Байт без знака | 00h | FFh (256) |
Слово со знаком | 8000h (-32768) | 7FFFh (32767) |
Слово без знака | 0000h | FFFFh (65535) |
Двойное слово со знаком | 80000000h (-2147483648) | 7FFFFFFFh (2147483647) |
Двойное слово без знака | 00000000h | FFFFFFFFh (4294967295) |
Операнд
Большинство MMX-команд имеет два операнда: выходной и входной.
Обычно входная информация берется из обоих операндов;
результат записывается в выходной операнд.
Пример:
pand MM2,MM4
Здесь регистр MM2 - выходной операнд,
регистр MM4 - входной.
Эта команда вычисляет поразрядное логическое И между значениями
в регистрах MM2 и MM4 и записывает результат в регистр
MM2.
Арифметика с насыщением
(saturation arithmetic)
Если команда использует арифметику с насыщением и
результат операции превышает максимальное представимое значение,
то в выходной операнд записывается это максимальное значение
(происходит "насыщение").
Аналогично, если результат операции оказался меньше нижней границы допустимого
диапазона, то в выходной операнд записывается минимально возможное значение.
Например, если результат меньше 8000h,
то 16-разрядное слово со знаком считается равным 8000h; если получилось больше 7FFFh,
то слово со знаком считается равным 7FFFh.
Возврат к изучаемой теме
Циклическая арифметика (wraparound arithmetic)
Если команда использует циклическую арифметику и
результат операции выходит за двоичную разрядную сетку
используемого типа данных, то "лишние" старшие биты результата отбрасываются.
Иначе говоря, если результат
превышает максимально возможное значение на
n единиц, то результатом считается
минимальное значение + n - 1.
Примеры:
7FFFh + 0002h = 8001h
(32767 + 2 = -32767 или 32769)
FFFFh + 0002h = 0001h
(65535 + 2 = 1 или -1 + 2 = 1)
Команда EMMS
Команда EMMS присваивает значение 1 всем разрядам слова состояния
регистров с плавающей запятой, что соответствует состоянию Empty.
Это обеспечивает переход процессора из режима исполнения
MMX-команд в режим исполнения обычных команд с плавающей запятой.
Не забывайте ставить команду EMMS в конце процедур, использующих MMX-команды!
Команды сложения и вычитания
MMX-команды сложения и вычитания работают с упакованными байтами, словами и
двойными словами. Обрабатываются данные как со знаком, так и без знака.
Команды сложения | Команды вычитания |
paddb/w/d | psubb/w/d |
paddsb/w | psubsb/w |
paddusb/w | psubusb/w |
Команды сдвига
MMX-команды сдвига выполняют арифметический и логический сдвиг разрядов в элементах данных выходного операнда.
При логическом сдвиге освободившиеся разряды заполняются нулями.
При арифметическом сдвиге крайний из сдвигаемых битов "размножается"
и заполняет все освободившиеся разряды.
Команды сдвига |
psllw/d/q |
psraw/d |
psrlw/d/q |
Логические команды
Эта группа MMX-команд выполняет поразрядные логические операции над 64 битами данных.
Логические команды | |
pand | por |
pandn | pxor |
Команды умножения
MMX-команды умножения вычисляют произведения 16-разрядных слов своих операндов.
Команда pmulhw записывает в каждое слово выходного операнда старшие
16 разрядов этих произведений, а команда
pmullw - младшие 16 разрядов.
Команда pmaddwd попарно складывает произведения и записывает
полученные суммы в 32-разрядные двойные слова выходного операнда.
Команды умножения |
pmulhw |
pmullw |
pmaddwd |
Команды сравнения
Эти MMX-команды сравнивают элементы данных в операндах и генерируют маску
в выходном операнде. MMX-команды сравнения не устанавливают флагов (признаков).
Команды сравнения |
pcmpeqb/w/d |
pcmpgtb/w/d |
Команды упаковки и распаковки
MMX-команды упаковки "укорачивают" элементы данных в своих операндах
и записывают полученные короткие данные в выходной операнд.
MMX-команды распаковки составляют из элементов данных в своих операндах
новые элементы данных удвоенной длины и записывают их в выходной операнд.
Команды упаковки | Команды распаковки |
packsswb/dw | punpckhbw/wd/dq |
packuswd | punpcklbw/wd/dq |
Команды передачи данных
MMX-команды передачи данных выполняют копирование данных
из одного MMX-регистра в другой, а также пересылку между
MMX-регистрами, целочисленными регистрами и памятью.
Команды передачи данных |
movd |
movq |
Скалярное произведение векторов
Эта операция часто используется в приложениях линейной алгебры
и цифровой обработки сигналов.
Скалярное произведение a·b векторов
ak и
bk (k = 1,..., n) вычисляется так:
a·b =
a1b1 +
a2b2 + ... +
anbn
Абсолютные величины разностей
Абсолютные величины разностей чисел используются в
алгоритмах распознавания и сжатия в качестве метрики -
меры "расстояния" между числами.
Условный выбор фрагмента изображения
Выделение фрагмента изображения по какому-либо условию -
обычная операция в графических программах, например,
при наложении объекта или текста на картинку-фон.
Такая операция требует многих ветвлений в программе;
их можно избежать, если воспользоваться MMX-командами.
Распаковка с "размножением" знака
Распаковка с "размножением" знакового бита часто требуется при
преобразовании коротких типов данных к длинным.
Команда movq
Команда movq выполняет копирование 64 бит из одного MMX-регистра в
другой, а также из MMX-регистра в память и обратно.
Команда pmaddwd
Команда pmaddwd попарно перемножает слова (со знаком) входного и
выходного операнда, что дает четыре 32-разрядных произведения.
Затем первое произведение складывается со вторым, а третье с четвертым.
Полученные суммы записываются в 32-разрядные слова выходного операнда.
Команда paddd
Команда paddd складывает 32-разрядные слова входного операнда с
32-разрядными словами выходного операнда в
циклической арифметике.
Команда pcmpeqb
Команда pcmpeqb сравнивает байты входного операнда с соответствующими
байтами выходного. Если байт выходного операнда равен байту входного, такой
байт заполняется единицами, а если не равен, то он заполняется нулями.
Команда pand
Команда pand
вычисляет поразрядное логическое И входного и выходного операнда.
При выполнении этой команды
значение 1 остается только в тех битах выходного операнда,
для которых соответствующие биты обоих операндов на входе были равны 1.
Команда pandn
Команда pandn
вычисляет обращение (поразрядное логическое НЕ) выходного операнда,
а затем поразрядное логическое И между входным операндом и
обращенным значением выходного.
Команда por
Команда por
вычисляет поразрядное логическое ИЛИ входного и выходного операнда.
При выполнении этой команды
значение 1 записывается в те биты выходного операнда,
для которых хотя бы один из соответствующих битов обоих
операндов на входе был равен 1. В остальные биты записывается 0.