Команды сложения и вычитания

Команды сложения делятся на две подгруппы исходя из того, как формируется результат при возникновении переполнения — по принципу насыщения или циклического переноса.

paddb | paddw | paddd приемник, источник — сложение беззнаковых упакованных байт, слов, двойных слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении переполнения результат формируется по принципу циклического переноса. Перенос теряется и нигде не учитывается.

paddsb | paddsw приемник, источник — сложение упакованных байт и слов со знаком. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении переполнения результат формируется по принципу знакового насыщения.

paddusb | paddusw приемник, источник — сложение беззнаковых упакованных байт и слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении переполнения результат формируется по принципу

psubb | psubw | psubd приемник, исто чник —вычитание беззнаковых упакованных байтов, слов, двойных слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник — либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении переполнения результат формируется по принципу циклического переноса, то есть так, как это делается командами sub и sbb микропроцессора. Заем из старшего разряда, естественно, теряется и нигде не учитывается.

psubusb | psubusw приемник,источник — вычитание беззнаковых упакованных байтов и слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник — либо ММХ-регистр, либо 64-разрядная ячейка памяти. При возникновении ситуации, когда результат вычитания получается меньше 00h (0000h), поле соответствующего байта или слова формируется по принципу беззнакового насыщения (в нем остается значение 00h (0000h)).

В качестве примера использования MMX-расширения команд процессора рассмотрим задачу нахождения суммы двух 1024-байтных векторов. Пусть, t1 и t2 – 1024-байтные массивы, nmax=1023. Классически, данная задача решалась бы следующим образом:

asm

mov ecx,nmax+1

xor esi,esi

@l:

mov al, byte ptr t1+[esi];

add al, byte ptr t2+[esi];

mov byte ptr t3+[esi],al

inc esi

loop @l

end;

Используя MMX-расширения разбиваем массивы t1,t2 и t3 на восьмерки байт и выполняем аналогичные операции:

c:=(nmax div 8)+1;

asm

mov ecx,c

xor esi,esi

@l:

movq mm0, qword ptr t1+[esi];

paddb mm0, qword ptr t2+[esi];

movq qword ptr t3+[esi],mm0

add esi,8

loop @l

emms ; Очистка стека сопроцессора.

; Обязательно в Delphi и C++ Builder

end;

Команды умножения

Команды ММХ-умножения предназначены только для умножения 16-битных элементов, причем реализация этих команд сделана несколько непривычно. Команды умножения целочисленного устройства формируют результат, размер которого вдвое превышает размер исходных операндов. Команды умножения MMX-расширения реализуют это действие несколько иначе:

умножению подвергаются одновременно 4 слова со знаком;

для получения полного результата умножения (размером в двойное слово) необходимо применение двух команд pmulhw и pmullw. С помощью этих команд формируются, соответственно, старшая и младшая части произведения. Для их объединения в единое двойное слово можно использовать команды расширения punpckhwd или punpcklwd.

pmulhw приемник, источник— умножение четырех знаковых упакованных слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник— либо ММХ-регистр, либо 64-разрядная ячейка памяти. В приемник записываются не все 32 бита произведения, а только старшие 16 бит. Младшие 16 бит можно получить, используя команду pmullw.

pmullw приемник, источник — умножение знаковых упакованных слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник — либо ММХ-регистр, либо 64-разрядная ячейка памяти. В приемник записываются не все 32 бита произведения, а только младшие 16 бит. Старшие 16 бит можно получить, используя команду pmulhw.

Для иллюстрации работы этих двух команд рассмотрим пример умножения четырех знаковых слов.

.data ;сегмент данныхmem dw 5h df 7ffb22223382hmem1 dw 8008h df 7ffe0f7d0ffahmem2 dw 0 df 0mem3 dw 0 df 0.code... ... ... movq rmmx0, mem ;rmmx0=7ffb 2222 3382 0005 ;mem1 =7ffe 0f7d 0ffa 8008 ;получим младшие части произведений pmullw rmmx0, mem1 ;rmmx0=800a ab9a eaf4 8028 movq rmmx1, mem ;rmmx1=7ffb 2222 3382 0005 ;mem1 =7ffe 0f7d 0ffa 8003 ;получим старшие части произведений pmulhw rmmx1, mem1 ;rmmx1=3ffc 0210 0336 fffd ;сохраним rmmx0 для последующих действий movq rmmx2, rmmx0 ;rmmx2=800a ab9a eaf4 8028;в поле mem2 содержится результат произведений;операндов младших половин исходных операндов punpcklwd rmmx0, rmmx1 ;rmmx0=0336 eaf4 fffd 8028 movq mem2, rmmx0 ;mem2=0336 eaf4 fffd 8028;в поле mem3 полный результат произведений ;операндов старших половин исходных операндов punpckhwd rmmx2, rmmx1 ;rmmx2=3ffc 800a 0210 a89a movq mem3, rmmx2 ;mem3=3ffc 800a 0210 a89a... ... ...

С помощью программы-калькулятора Windows вы можете проверить полученные произведения. Вычислите с его помощью произведение 7ffb*7ffe = 3ffc 800а. Такое же значение мы получили в поле mem3. Аналогично можно проверить и другие результаты.

pmaddwd приемник, источник— умножение четырех знаковых упакованных слов. Результат помещается в приемник, который является одним из ММХ-регистров. Источник — либо ММХ-регистр, либо 64-разрядная ячейка памяти. Формирование результата осуществляется по схеме, представленной на рис. 2.5.

Результат работы команды pmaddwd представляет собой сумму произведений двух старших и двух младших слов операндов приемники ИСТОЧНИК. Результат получается в виде двух двойных упакованных слов. Ниже показаны схема работы (рис. 2.5) и пример использования команды pmaddwd.

.data ;сегмент данныхmem dw 5h df 7ffb22223382hmem1 dw 8008h df 7ffe0f7d0ffahmem2 dw 0 df 0mem3 dw 0 df 0.code... ... ...movq rmmx0, mem ;rmmx0=7ffb 2222 3382 0005 ;mem =7ffe 0f7d 0ffa 8008 pmaddwd rmmx0, mem1 ;rmmx0=420d 28a4 0334 6b1c... ... ...

Команды сложения и вычитания - student2.ru

Рис. 2.5. Схема работы команды pmaddwd

Команды сравнения

Группа команд сравнения MMX-расширения содержит команды сравнения двух типов:

простого сравнения — pcmpeqb | pcmpeqw | pcmpeqd. Команды характеризуются тем, что устанавливают только факт равенства операндов — «равно-не равно»;

сравнения по величине — cmpgtb | pcmpgtw | pcmpgtd. Команды устанавливают соотношение операндов по величине.

pcmpeqb | pcmpeqw | pcmpeqd операнд_1,операнд_2 — сравнение упакованных байтов, слов или двойных слов. Результат формируется в операнд_ 1, который является одним из ММХ-регистров. Операнд_2— либо ММХ-регистр, либо 64-разрядная ячейка памяти. Элементы формируемого результата представляются в виде единичных или нулевых байтов, слов или двойных слов. Единичные байты, слова или двойные слова формируются, если соответствующие байты, слова или двойные слова исходных операндов равны. Нулевые байты, слова, двойные слова формируются в случае, если соответствующие байты, слова или двойные слова исходных операндов не равны.

.data ;сегмент данныхmem dw 5h df 7fff22223382hmem1 dw 5h df 7ffe0f7d0ffah .code... ... ...movq rmmx0, mem ;rmmx0=7fff 2222 3382 0005 ;mem1 =7ffe 0f7d 0ffa 0005pcmpeqw rmmx0, mem1 ;rmmx0=0000 0000 0000 ffff... ... ...

pcmpgtb | pcmpgtw | pcmpgtd операнд_1,операнд_2— сравнение по величине упакованных байтов, слов или двойных слов. Результат формируется в оперенд_ 1, который является одним из ММХ-регистров. Операнд_2 — либо ММХ-регистр, либо 64-разрядная ячейка памяти. Элементы формируемого результата представляются в виде единичных или нулевых байтов, слов или двойных слов. Единичные байты, слова, двойные слова формируются в случае, если байты, слова или двойные слова исходного операнда операнд_1 были больше соответствующих байтов, слов или двойных слов операнд_2. Иначе формируются нулевые байты, слова или двойные слова.

Пример ниже наглядно показывает, что единичные элементы получаются только в случае, если элементы первого операнда (всегда находящегося в ММХ-регист-ре) больше соответствующих элементов второго операнда.

Наши рекомендации