Математические инструкции SSE/AVX

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

Среднее значение

Инструкции (v)pavgb и (v)pavgw вычисляют среднее значение двух соответствующих дорожек операндов:

pavgb xmmdest, xmmsrc/mem128
vpavgb xmmdest, xmmsrc1, xmmsrc2/mem128
vpavgb ymmdest, ymmsrc1, ymmsrc2/mem256
pavgw xmmdest, xmmsrc/mem128
vpavgw xmmdest, xmmsrc1, xmmsrc2/mem128
vpavgw ymmdest, ymmsrc1, ymmsrc2/mem256

128-битные инструкции pavgb и vpavgb берут два байта из соответствующих 16 дорожек первого и второго операндах и вычисляют среднее этих двух чисел. Среднее значение помещается в первый операнж. 256-битный вариант инструкции vpavgb вычисляет средние значения для 32 дорожек.

128-битные инструкции pavgw и vpavgw вычисляют 8 средних значений для каждой пары слов из 8 дорожек первого и второго операнда. 256-битный вариант инструкции vpavgw вычисляет средние значения для 16 дорожек.

Пример применения:

.data
    nums0 word 1, 3, 4, 6, 7, 8, 9, 10
    nums1 word 2, 2, 3, 4, 5, 6, 7, 8
.code
main proc 
    movdqa xmm0, oword ptr nums0 
    movdqa xmm1, oword ptr nums1
    pavgw xmm0, xmm1       ; XMM0 = (XMM0 + XMM1) / 2 
    ; XMM0 = 2, 3, 4, 5, 6, 7, 8, 9 
    ret
main endp
end

Если результат дробный, то он округляется.

Максимальное и минимальное значения

Расширения SSE4.1 добавили восемь инструкций для поиска минимума и максимума из двух соответствующих дорожек:

  • (v)pmaxsb: выбирает максимальное однобайтовое число со знаком из соответствующих дорожек операндов.

  • (v)pmaxsw: выбирает максимальное 16-битное число со знаком из соответствующих дорожек операндов.

  • (v)pmaxsd: выбирает максимальное 32-битное число со знаком (sdword).

  • vpmaxsq: выбирает максимальное 64-битное число со знаком.

  • (v)pmaxub: выбирает максимальное беззнаковое 8-битное число из соответствующих дорожек операндов.

  • (v)pmaxuw: выбирает максимальное беззнаковое 16-битное число.

  • (v)pmaxud: выбирает максимальное беззнаковое 32-битное число.

  • vpmaxuq: выбирает максимальное беззнаковое 64-битное число.

  • (v)pminsb: выбирает минимальное однобайтовое число со знаком из соответствующих дорожек операндов.

  • (v)pminsw: выбирает минимальное 16-битное число со знаком из соответствующих дорожек операндов.

  • (v)pminsd: выбирает минимальное 32-битное число со знаком (sdword).

  • vpminsq: выбирает минимальное 64-битное число со знаком.

  • (v)pminub: выбирает минимальное беззнаковое 8-битное число из соответствующих дорожек операндов.

  • (v)pminuw: выбирает минимальное беззнаковое 16-битное число.

  • (v)pminud: выбирает минимальное беззнаковое 32-битное число.

  • vpminuq: выбирает минимальное беззнаковое 64-битное число.

Общий синтаксис инструкций на примере pmaxuw и vpmaxuw (остальные инструкции имеют аналогичный синтаксис)

pmaxuw xmmdest, xmmsrc/mem128
vpmaxuw xmmdest, xmmsrc1, xmmsrc2/mem128
vpmaxuw ymmdest, ymmsrc1, ymmsrc2/mem256

Эти инструкции сканируют дорожки пары 128- или 256-битных операндов и копируют максимальное или минимальное значение из этой дорожки в ту же дорожку первого операнда. Пример нахожжения максимальных слов в дорожках:

.data
    nums0 word 1, 2, 4, 8, 16, 32, 64, 128
    nums1 word 1, 3, 5, 7, 11, 13, 17, 19
.code
main proc 
    movdqa xmm0, oword ptr nums0 
    movdqa xmm1, oword ptr nums1
    pmaxuw xmm0, xmm1       ; XMM0 = MAX (XMM0, XMM1)
    ; XMM0 = 1, 3, 5, 8, 16, 32, 64, 128 
    ret
main endp
end

Абсолютное значение

SSE/AVX предоставляют несколько инструкций для вычисления абсолютных значений целых чисел со знаком: (v)pabsb (для байтов), (v)pabsw (для слов) и (v)pabsd (для двойных слов). Их синтаксис:

pabsb xmmdest, xmmsrc/mem128
vpabsb xmmdest, xmmsrc/mem128
vpabsb ymmdest, ymmsrc/mem256

pabsw xmmdest, xmmsrc/mem128
vpabsw xmmdest, xmmsrc/mem128
vpabsw ymmdest, ymmsrc/mem256

pabsd xmmdest, xmmsrc/mem128
vpabsd xmmdest, xmmsrc/mem128
vpabsd ymmdest, ymmsrc/mem256

Инструкции pabsb, pabsw и pabsd не изменяют старшие 128 битов регистров YMM, а 128-битные версии инструкций vpabsb, vpabsw и vpabsd заполняют нулями старшие 128 битов регистров YMM.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850