Для вычитания соответствующих элементов векторов применяются следующие инструкции:
psubb
: вычитание байтов в 16 дорожках
vpsubb
: вычитание байтов в 16 дорожках (для 128-битной версии) и в 32 дорожках (для 256-битной версии)
psubw
: вычитание слов (значений word) в 8 дорожках
vpsubw
: вычитание слов в 8 дорожках (для 128-битной версии) и в 16 дорожках (для 256-битной версии)
psubd
: вычитание двойных слов (значений dword) в 4 дорожках
vpsubd
: вычитание двойных слов в 4 дорожках (для 128-битной версии) и в 8 дорожках (для 256-битной версии)
psubq
: вычитание четверных слов (тип qword) в 2 дорожках
vpsubq
: вычитание четверных слов в 2 дорожках (128-битной версии) и в 4 дорожках (для 256-битной версии)
Синтаксис инструкций:
psubb xmmdest, xmmsrc/mem128 vpsubb xmmdest, xmmsrc1, xmmsrc2/mem128 vpsubb ymmdest, ymmsrc1, ymmsrc2/mem256 psubw xmmdest, xmmsrc/mem128 vpsubw xmmdest, xmmsrc1, xmmsrc2/mem128 vpsubw ymmdest, ymmsrc1, ymmsrc2/mem256 psubd xmmdest, xmmsrc/mem128 vpsubd xmmdest, xmmsrc1, xmmsrc2/mem128 vpsubd ymmdest, ymmsrc1, ymmsrc2/mem256 psubq xmmdest, xmmsrc/mem128 vpsubq xmmdest, xmmsrc1, xmmsrc2/mem128 vpsubq ymmdest, ymmsrc1, ymmsrc2/mem256
Инструкции с двумя операндами вычитают из первого операнда соответствующие дорожки второго операнда и результат помещают в первый операнд. Инструкции с тремя операндами вычитают из второго соответствующие дорожки третьего операнда и результат помещают в первый. Пример вычитания:
.data nums0 dword 1, 2, 4, 8 nums1 dword 2, 3, 5, 9 .code main proc movaps xmm0, nums0 movaps xmm1, nums1 psubd xmm0, xmm1 ; XMM0 = XMM0 - XMM1 ret main endp end
Инструкции вычитания не влияют ни на какие флаги, и любая информация о переносе, заимствовании, переполнении или недостатке будет потеряна. Эти инструкции вычитают второй операнд-источник из первого операнда-источника (который также является операндом-назначением для инструкций только для SSE) и сохраняют результат в операнде-назначении.
И аналогично сложению расширения SSE/AVX предоставляют инструкции для вычитания с насыщением:
psubsb
: вычитание байтов со знаком в 16 дорожках
vpsubsb
: вычитание байтов со знаком в 16 дорожках
vpsubsb
: вычитание байтов со знаком в 32 дорожках
psubsw
: вычитание слов со знаком в 8 дорожках
vpsubsw
: вычитание слов со знаком в 8 дорожках
vpsubsw
: вычитание слов со знаком в 16 дорожках
psubusb
: вычитание беззнаковых байтов в 16 дорожках
vpsubusb
: вычитание беззнаковых байтов в 16 дорожках
vpsubusb
: вычитание беззнаковых байтов в 32 дорожках
psubusw
: вычитание беззнаковых слов в 8 дорожках
vpsubusw
: вычитание беззнаковых слов в 8 дорожках
vpsubusw
: вычитание беззнаковых слов в 16 дорожках
Синтаксис инструкций:
psubsb xmmdest, xmmsrc/mem128 vpsubsb xmmdest, xmmsrc1, xmmsrc2/mem128 vpsubsb ymmdest, ymmsrc1, ymmsrc2/mem256 psubsw xmmdest, xmmsrc/mem128 vpsubsw xmmdest, xmmsrc1, xmmsrc2/mem128 vpsubsw ymmdest, ymmsrc1, ymmsrc2/mem256 psubusb xmmdest, xmmsrc/mem128 vpsubusb xmmdest, xmmsrc1, xmmsrc2/mem128 vpsubusb ymmdest, ymmsrc1, ymmsrc2/mem256 psubusw xmmdest, xmmsrc/mem128 vpsubusw xmmdest, xmmsrc1, xmmsrc2/mem128 vpsubusw ymmdest, ymmsrc1, ymmsrc2/mem256
Инструкций для вычитания однобайтовых чисел со знаком насыщают положительное переполнение до 7Fh (+127) и отрицательное переполнение до 80h (-128). Инструкции для вычитания 2-байтных чисел (слов) насыщаются до 7FFFh (+32 767) и до 8000h (-32 768) соответственно. Инструкции насыщения без знака насыщают до 0FFFFh (+65 535) и 0 соответственно.
Пример использования инструкции вычитания:
.data nums0 sword -1, -32768, 5, 10, 20, 40, 80, 160 nums1 sword -1, 10, 4, 8, 16, 32, 64, 128 .code main proc movdqa xmm0, oword ptr nums0 movdqa xmm1, oword ptr nums1 psubsw xmm0, xmm1 ; XMM0 = XMM0 - XMM1 ; XMM0 = 0, -32768, 1, 2, 4, 8, 16, 32 ret main endp end