Команды технологии 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-регистра в память либо в целочисленный регистр.
Дата проведения: 28 октября 2008 г.; Место проведения: Амбер Плаза, Москва,
Россия. Конференция для веб-разработчиков и разработчиков мобильных приложений в
Москве. Узнайте, как наилучшим образом использовать инструменты разработки и API
от Google, чтобы создавать социальные, мобильные и картографические приложения,
как использовать AJAX/JavaScript инструменты и библиотеки от Google и многое
другое из первых уст.
ТОП 10 самых раздражающих факторов для программиста.
Совсем недавно наткнулся в интернете на забавный "хит-парад" наиболее
раздражающих вещей для программиста. Поскольку он был на английском — решил
перевести текст и несколько адаптировать к нашим реалиям…
К написанию этой статьи меня побудили недавние изыскания Мэри Джо Фоли
(Mary Jo Foley) по поводу Windows 7 Server и Windows Server 2008 R2. Если бы не
она, я, наверное, и не вспомнил бы о массе информации, имеющейся по этому поводу
у меня. Если вы не слышали, Microsoft удалось смутить львиную долю пользователей
своим заявлением о том, что Windows Server 2008 R2, чей релиз должен состояться
в 2010 году, есть ничто иное, как Windows 7 Server.