Команды упаковки и упаковки.
Команды упаковкиpacksswb, packssdw - преобразуют длинные элементы данных (16- и 32-разрядные слова со знаком) в более короткие (байты или 16-разрядные слова со знаком). На рис. 3.6 иллюстрируется выполнение команды packssdw MM0,MM1.
Команда упаковки packuswb - выполняет преобразование 16-разрядных слов со знаком из обоих операндов в байты без знака и записывает их в выходной операнд. Если исходное слово со знаком было больше FFh, результатом преобразования считается FFh. Если исходное слово со знаком отрицательно, результатом преобразования считается 0h.
Рис. 3.6. Выполнение команды упаковки packssdw MM0,ММ1.
Команды распаковкиpunpckhbw, punpckhwd, punpckhdq - попарно объединяют исходные элементы данных (байтов, 16- или 32-разрядных слов), находящиеся в старших 32 разрядах обоих операндов. Полученные в результате длинные элементы записываются в выходной операнд. Исходные значения младших разрядов операндов на результат не влияют.
Рис. 3.7. Выполнение команды распаковки punpckhbw MM0,MM1.
На рис. 3.7 проиллюстрирован механизм работы команды punpckhbw. Суть работы команд punpckhwd и punpckhdq аналогична, с той лишь разницей, что punpckhwd распаковывает старшие два слова обоих регистров, а punpckhdq старшие двойные слова.
Команды распаковкиpunpcklbw, punpcklwd, punpckldq - попарно объединяют исходные элементы данных (байтов, 16- или 32-разрядных слов), находящиеся в младших 32 разрядах обоих операндов. Полученные в результате длинные элементы данных записываются в выходной операнд. Исходные значения старших разрядов операндов на результат не влияют.
Механизм работы команды распаковки punpcklwd проиллюстрирован на рис. 3.8.
Рис. 3.8. Выполнение команды распаковки punpcklwd MM0,MM1.
Суть работы команд punpcklbw и punpckldq аналогична, с той разницей, что punpcklbw распаковывает младшие четыре байта, а punpckldq – младшие двойные слова.
Специальные командыне имеют специфики какой-либо из рассмотренных выше групп.
Команды pavgb, pavdw - вычисляют среднее значение двух чисел, представленных байтами или словами. Значения операндов рассматриваются как беззнаковые целые числа. В качестве входного операнда может выступать ММХ-регистр или 64-разрядная ячейка памяти, выходным операндом служит один из ММХ-регистров.
Команда pextrw - извлекает одно из четырех упакованных слов входного операнда и имеет три аргумента: входной операнд, выходной операнд и маска. Младшие два бита маски задают во входном операнде номер упакованного слова, подлежащего извлечению. Извлеченное слово сохраняется в младшем слове выходного операнда. Выходным операндом этой команды может выступать один из 32-разрядных регистров общего назначения. Старшее слово выходного операнда обнуляется.
Команда pinsrw - вставляет слово в одно из четырех упакованных слов выходного операнда. Выходным операндом является один из ММХ-регистров, а входным операндом может выступать один из 32-разрядных регистров общего назначения, младшее слово которого будет вставлено в выходной операнд. Номер позиции, куда помещается операнд, определяется младшими двумя битами маски.
Команды pmaxusb, pmaxsw, (pminusb, pminsw) - извлекают максимальное (минимальное) значение из каждой пары упакованных элементов в выходном и входном операндах. В качестве выходного операнда может выступать ММХ-регистр, а в качестве входного - ММХ-регистр или 64-разрядная ячейка памяти.
Команда pmovmskb - формирует байт, содержащий знаковые биты восьми байтов, содержащихся во входном операнде, в качестве которого может выступать один из ММХ-регистров. Выходным операндом является 32-разрядный регистр общего назначения, младший байт которого будет содержать результат.
Команда psadbw - вычисляет суммарную разность значений беззнаковых байтов входного и выходного операндов. Входным операндом может выступать ММХ-регистр или 64-разрядная ячейка памяти, а выходным - один из ММХ-регистров.
Дата добавления: 2018-11-26; просмотров: 767;