Вычитание с помощью инструкций SSE/AVX

Последнее обновление: 03.07.2023

Для вычитания соответствующих элементов векторов применяются следующие инструкции:

  • 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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850