Новые инструкции SSE4.1[]
Ускорение видео[]
- MPSADBW xmm1, xmm2/m128, imm8 — (Multiple Packed Sums of Absolute Difference)
- Input — { A0, A1,… A14 }, { B0, B1,… B15 }, Shiftmode
- Output — { SAD0, SAD1, SAD2,… SAD7 }
Вычисление восьми сумм абсолютных значений разностей (SAD) смещённых 4-х байтных беззнаковых групп. Расположение операндов для 16-ти битных SAD определяется 3-мя битами непосредственного аргумента imm8.
s1 = imm8[2]*4 s2 = imm8[1:0]*4 SAD0 = |A(s1+0)-B(s2+0)| + |A(s1+1)-B(s2+1)| + |A(s1+2)-B(s2+2)| + |A(s1+3)-B(s2+3)| SAD1 = |A(s1+1)-B(s2+0)| + |A(s1+2)-B(s2+1)| + |A(s1+3)-B(s2+2)| + |A(s1+4)-B(s2+3)| SAD2 = |A(s1+2)-B(s2+0)| + |A(s1+3)-B(s2+1)| + |A(s1+4)-B(s2+2)| + |A(s1+5)-B(s2+3)| ... SAD7 = |A(s1+7)-B(s2+0)| + |A(s1+8)-B(s2+1)| + |A(s1+9)-B(s2+2)| + |A(s1+10)-B(s2+3)|
- PHMINPOSUW xmm1, xmm2/m128 — (Packed Horizontal Word Minimum)
- Input — { A0, A1,… A7 }
- Output — { MinVal, MinPos, 0, 0… }
Поиск среди 16-ти битных беззнаковых полей A0…A7 такого, который имеет минимальное значение (и позицию с меньшим номером, если таких полей несколько). Возвращается 16-ти битное значение и его позиция.
- PMOV{SX,ZX}{B,W,D} xmm1, xmm2/m{64,32,16} — (Packed Move with Sign/Zero Extend)
Группа из 12-ти инструкций для расширения формата упакованных полей. Упакованные 8, 16, или 32-х битные поля из младшей части аргумента расширяются (со знаком или без) в 16, 32 или 64-х битные поля результата.
Входной формат | Результирующий формат | ||
---|---|---|---|
8 бит | 16 бит | 32 бита | |
PMOVSXBW | 16 бит | ||
PMOVZXBW | |||
PMOVSXBD | PMOVSXWD | 32 бита | |
PMOVZXBD | PMOVZXWD | ||
PMOVSXBQ | PMOVSXWQ | PMOVSXDQ | 64 бита |
PMOVZXBQ | PMOVZXWQ | PMOVZXDQ |
Векторные примитивы[]
- P{MIN,MAX}{SB,UW,SD,UD} xmm1, xmm2/m128 — (Minimum/Maximum of Packed Signed/Unsigned Byte/Word/DWord Integers)
Каждое поле результата есть минимальное/максимальное значение соответствующих полей двух аргументов. Байтовые поля рассматриваются только как числа со знаком, 16-ти битные — только как числа без знака. Для 32-х битных упакованных полей предусмотрен вариант как со знаком, так и без.
- PMULDQ xmm1, xmm2/m128 — (Multiply Packed Signed Dword Integers)
- Input — { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
- Output — { A0*B0, A2*B2 }
Перемножение 32-х битных полей со знаком с выдачей полных 64-х бит результата (две операции умножения над 0 и 2 полями аргументов).
- PMULLD xmm1, xmm2/m128 — (Multiply Packed Signed Dword Integers and Store Low Result)
- Input — { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
- Output — { low32(A0*B0), low32(A1*B1), low32(A2*B2), low32(A3*B3) }
Перемножение 32-х битных полей со знаком с выдачей младших 32-х бит результатов (четыре операции умножения над всеми полями аргументов).
- PACKUSDW xmm1, xmm2/m128 — (Pack with Unsigned Saturation)
Упаковка 32-х битных полей со знаком в 16-ти битные поля без знака с насыщением.
- PCMPEQQ xmm1, xmm2/m128 — (Compare Packed Qword Data for Equal)
Проверка 64-х битных полей на равенство и выдача 64-х битных масок.
Вставки/извлечения[]
- INSERTPS xmm1, xmm2/m32, imm8 — (Insert Packed Single Precision Floating-Point Value)
Вставка 32-х битного поля из xmm2 (возможно выбрать любой из 4 полей этого регистра) или из 32-х битной ячейки памяти в произвольное поле результата. Кроме того, для каждого из полей результата можно задать сброс его в +0.0.
- EXTRACTPS r/m32, xmm, imm8 — (Extract Packed Single Precision Floating-Point Value)
Извлечение 32-х битного поля из xmm регистра, номер поля указывается в младших 2 битах imm8. Если в качестве результата указан 64-х битный регистр, то его старшие 32 бита сбрасываются (расширение без знака).
- PINSR{B,D,Q} xmm, r/m*, imm8 — (Insert Byte/Dword/Qword)
Вставка 8, 32, или 64-х битного значения в указанное поле xmm регистра (остальные поля не изменяются).
- PEXTR{B,W,D,Q} r/m*, xmm, imm8 — (Extract Byte/Word/Dword/Qword)
Извлечение 8, 16, 32, 64 битного поля из указанного в imm8 поля xmm регистра. Если в качестве результата указан регистр, то его старшая часть сбрасывается (расширение без знака).
Скалярное умножение векторов[]
- DPPS xmm1, xmm2/m128, imm8 — (Dot Product of Packed Single Precision Floating-Point Values)
- DPPD xmm1, xmm2/m128, imm8 — (Dot Product of Packed Double Precision Floating-Point Values)
Скалярное умножение векторов (dot product) 32/64 битных полей. Посредством битовой маски в imm8 указывается, какие произведения полей должны суммироваться и что следует прописать в каждое поле результата: сумму указанных произведений или +0.0.
Смешивания[]
- BLENDV{PS,PD} xmm1, xmm2/m128, <xmm0> — (Variable Blend Packed Single/Double Precision Floating-Point Values)
Выбор каждого 32/64-битного поля результата осуществляется в зависимости от знака такого же поля в неявном аргументе xmm0: либо из первого, либо из второго аргумента.
- BLEND{PS,PD} xmm1, xmm2/m128, imm8 — (Blend Packed Single/Double Precision Floating-Point Values)
Битовая маска (4 или 2 бита) в imm8 указывает из какого аргумента следует взять каждое 32/64-битное поле результата.
- PBLENDVB xmm1, xmm2/m128, <xmm0> — (Variable Blend Packed Bytes)
Выбор каждого байтового поля результата осуществляется в зависимости от знака байта такого же поля в неявном аргументе xmm0: либо из первого, либо из второго аргумента.
- PBLENDW xmm1, xmm2/m128, imm8 — (Blend Packed Words)
Битовая маска (8 бит) в imm8 указывает из какого аргумента следует взять каждое 16-битное поле результата.
Проверки бит[]
- PTEST xmm1, xmm2/m128 — (Logical Compare)
Установить флаг ZF, если только в xmm2/m128 все биты помеченные маской из xmm1 равны нулю. Если все не помеченные биты равны нулю, то установить флаг CF. Остальные флаги (AF, OF, PF, SF) всегда сбрасываются. Инструкция не модифицирует xmm1.
Округления[]
- ROUND{PS, PD} xmm1, xmm2/m128, imm8 — (Round Packed Single/Double Precision Floating-Point Values)
Округление всех 32/64-х битных полей. Режим округления (4 варианта) выбирается либо из MXCSR.RC, либо задаётся непосредственно в imm8. Также можно подавить генерацию исключения потери точности.
- ROUND{SS, SD} xmm1, xmm2/m128, imm8 — (Round Scalar Single/Double Precision Floating-Point Values)
Округление только младшего 32/64-х битного поля (остальные биты остаются неизменными).
Чтение WC памяти[]
- MOVNTDQA xmm1, m128 — (Load Double Quadword Non-Temporal Aligned Hint)
Операция чтения, позволяющая ускорить (до 7.5 раз) работу с write-combining областями памяти.