Команды MMX ( начиная с Pentium MMX, K6 )
Команды технологии MMX работают с 64-разрядными целочисленными данными, а также с данными, упакованными в группы (векторы) общей длиной 64 бита. Такие данные могут находиться в памяти или в восьми MMX-регистрах. Эти регистры называются MM0, MM1, :, MM7. Команды технологии MMX работают со следующими типами данных:
- упакованные байты (восемь байтов в одном 64-разрядном регистре)
- упакованные слова (четыре 16-разрядных слова в 64-разрядном регистре)
- упакованные двойные слова (два 32-разрядных слова в 64-разрядном регистре)
- 64-разрядные слова.
По-английски эти типы данных называются, соответственно, packed byte, packed word, packed doubleword и quadword.
MMX-команды имеют следующий синтаксис:
instruction [dest, src]
Здесь instruction - имя команды, dest обозначает выходной операнд, src - входной операнд.
Большинство команд имеют суффикс, который определяет тип данных и используемую арифметику:
- US(unsigned saturation) - арифметика с насыщением, данные без знака.
- S или SS(signed saturation) - арифметика с насыщением, данные со знаком. Если в суффиксе нет ни S, ни SS, используется циклическая арифметика (wraparound).
- B, W, D, Q указывают тип данных. Если в суффиксе есть две из этих букв, первая соответствует входному операнду, а вторая - выходному.
MMX-команды исполняются в том же режиме процессора, что и команды с плавающей запятой. Поэтому при исполнении всех MMX-команд (кроме EMMS) "портится" слово состояния регистров с плавающей запятой. Доступны следующие MMX-команды (обозначения: mm - MMX-регистр; m32, m64 - память объема 32 и 64 бит соответственно; imm - непосредственный операнд; ir32 - целочисленный регистр):
EMMS | команда обеспечивает переход процессора от исполнения MMX-команд к исполнению обычных команд с плавающей запятой: она устанавливает значение 1 во всех разрядах слова состояния. |
PADDB mm, mm/m64; PADDW mm, mm/m64; PADDD mm, mm/m64 | команды складывают элементы данных (байты, слова или двойные слова) входного и выходного операнда. Если сумма выходит за границу допустимого диапазона, то по правилам циклической арифметики избыток отсчитывается от другой границы диапазона. "Переноса" единицы из одного элемента данных в другой не происходит. |
PADDSB mm, mm/m64; PADDSW mm, mm/m64 | команды складывают элементы данных (байты или слова) входного и выходного операнда. Если сумма выходит за граничное значение допустимого диапазона, то результатом считается это граничное значение. |
PADDUSB mm, mm/m64; PADDUSW mm, mm/m64 | команды складывают элементы данных (байты или слова) входного и выходного операнда. Если сумма выходит за граничное значение допустимого диапазона, то результатом считается это граничное значение. |
PSUBB mm, mm/m64; PSUBW mm, mm/m64; PSUBD mm, mm/m64 | команды вычитают элементы данных (байты, слова или двойные слова) входного операнда из элементов данных выходного операнда. Если результат выходит за границу допустимого диапазона, то по правилам циклической арифметики соответствующее число единиц отсчитывается от другой границы диапазона. "Переноса" единицы из одного элемента данных в другой не происходит. |
PSUBSB mm, mm/m64; PSUBSW mm, mm/m64 | команды вычитают элементы данных (байты или слова) входного операнда из элементов данных выходного операнда. Если разность выходит за граничное значение допустимого диапазона, то результатом считается это граничное значение. |
PSUBUSB mm, mm/m64; PSUBUSW mm, mm/m64 | команды вычитают элементы данных входного операнда из элементов данных выходного операнда. Если разность выходит за граничное значение допустимого диапазона, то результатом считается это граничное значение. |
PSLLW mm, mm/m64/imm; PSLLD mm, mm/m64/imm; PSLLQ mm, mm/m64/imm | команды выполняют сдвиг элементов данных (16-, 32- или 64-разрядных слов) в выходном операнде на число бит, задаваемое входным операндом. Освободившиеся младшие разряды заполняются нулями. |
PSRAW mm, mm/m64/imm; PSRAD mm, mm/m64/imm | команды выполняют сдвиг элементов данных (16- или 32-разрядных слов) в выходном операнде на число бит, задаваемое входным операндом. Если сдвигается положительное число, то освободившиеся старшие разряды заполняются нулями, а если отрицательное, то единицами. |
PSRLW mm, mm/m64/imm; PSRLD mm, mm/m64/imm; PSRLQ mm, mm/m64/imm | команды выполняют сдвиг элементов данных (16-, 32- или 64-разрядных слов) в выходном операнде на число бит, задаваемое входным операндом. Освободившиеся старшие разряды заполняются нулями. |
PAND mm, mm/m64 | команда вычисляет поразрядное логическое И своих операндов. |
PANDN mm, mm/m64 | команда вычисляет обращение (поразрядное НЕ) выходного операнда, а затем поразрядное логическое И между входным операндом и обращенным значением выходного. |
POR mm, mm/m64 | команда вычисляет поразрядное логическое ИЛИ своих операндов. |
PXOR mm, mm/m64 | команда вычисляет поразрядное логическое исключающее ИЛИ своих операндов. |
PMADDWD mm, mm/m64 | команда попарно перемножает 16-разрядные слова со знаком входного и выходного операндов. Это дает четыре 32-разрядных произведения. Затем первое произведение складывается со вторым, а третье с четвертым. Суммы записываются в 32-разрядные слова выходного операнда. Если все слова на входе равны 8000h, результатом будет 80000000h (это единственный случай, когда перемножение отрицательных чисел дает отрицательный результат). |
PMULHW mm, mm/m64 | команда попарно перемножает 16-разрядные слова со знаком входного и выходного операндов, что дает четыре 32-разрядных произведения. Старшие разряды произведений записываются в 16-разрядные слова выходного операнда. Младшие разряды произведений теряются. |
PMULLW mm, mm/m64 | команда попарно перемножает 16-разрядные слова со знаком входного и выходного операндов, что дает четыре 32-разрядных произведения. Младшие разряды произведений записываются в 16-разрядные слова выходного операнда. Старшие разряды произведений теряются. |
PCMPEQB mm, mm/m64; PCMPEQW mm, mm/m64; PCMPEQD mm, mm/m64 | команды попарно сравнивают элементы данных (байты, 16- или 32-разрядные слова) входного и выходного операндов. Если элемент данных выходного операнда равен соответствующему элементу входного, такой элемент выходного операнда заполняется единицами. Если равенства нет, он заполняется нулями. |
PCMPGTB mm, mm/m64; PCMPGTW mm, mm/m64; PCMPGTD mm, mm/m64 | команды попарно сравнивают элементы данных (байты, 16- или 32-разрядные слова со знаком) входного и выходного операндов. Если элемент данных выходного операнда больше соответствующего элемента входного, такой элемент выходного операнда заполняется единицами; если же он не больше входного, то он заполняется нулями. |
PACKSSWB mm, mm/m64; PACKSSDW mm, mm/m64 | команды преобразуют длинные элементы данных (16- и 32-разрядные слова со знаком) в более короткие (байты или 16-разрядные слова со знаком). Если исходное значение было за пределами допустимого диапазона для выходного типа данных, то результатом упаковки считается ближайшее граничное значение диапазона. |
PACKUSWB mm, mm/m64 | команда преобразует 16-разрядные слова со знаком из обоих операндов в байты без знака и записывает их в выходной операнд. Если исходное слово со знаком было больше FFh, результатом преобразования считается FFh. Если исходное слово со знаком отрицательно, результатом преобразования считается 00h. |
PUNPCKHBW mm, mm/m64; PUNPCKHWD mm, mm/m64; PUNPCKHDQ mm, mm/m64 | команды попарно объединяют исходные элементы данных (байты, 16- или 32-разрядные слова), находившиеся в старших 32 разрядах обоих операндов. Полученные в результате более длинные элементы данных записываются в выходной операнд. Исходные значения младших разрядов операндов на результат не влияют. |
PUNPCKLBW mm, mm/m64; PUNPCKLWD mm, mm/m64; PUNPCKLDQ mm, mm/m64 | команды попарно объединяют исходные элементы данных (байты, 16- или 32-разрядные слова), находившиеся в младших 32 разрядах обоих операндов. Полученные в результате более длинные элементы данных записываются в выходной операнд. Исходные значения старших разрядов операндов на результат не влияют. |
MOVD mm, mm/m32/ir32 | команда копирует 32 бита из младших разрядов MMX-регистра, либо из памяти, либо из целочисленного регистра в младшие 32 разряда MMX-регистра (старшие разряды заполняются нулями). |
MOVD m32/ir32, mm | команда копирует 32 бита из младших разрядов MMX-регистра в память либо в целочисленный регистр. |
MOVQ mm, mm/m64 | команда пересылки данных в MMX-регистр. |
MOVQ mm/m64, mm | команда пересылки данных из MMX-регистра. |