Введение

Набор инструкций SIMD Supplemental Streaming SIMD Extensions 3 (SSSE3 или SSE3S) — это набор инструкций SIMD, разработанный компанией Intel и представляющий собой четвертое поколение технологии SSE.

История

SSSE3 был впервые представлен с процессорами Intel на базе микроархитектуры Core 26 июня 2006 года вместе с процессорами "Woodcrest" Xeon. При первых разработках процессоров, предназначенных для его поддержки, SSSE3 именовался кодовыми именами Tejas New Instructions (TNI) или Merom New Instructions (MNI). SSSE3 был усовершенствован для декодирования и кодирования HD-аудио и видео, например, AAC.

Функциональность

SSSE3 содержит 16 новых дискретных инструкций. Каждая инструкция может работать с 64-битными MMX или 128-битными XMM регистрами. Поэтому в материалах Intel упоминается 32 новые инструкции. Они включают в себя: двенадцать инструкций, выполняющих горизонтальное сложение или вычитание; шесть инструкций, вычисляющих абсолютные значения; две инструкции, выполняющие операции умножения и сложения и ускоряющие вычисление скалярного произведения; две инструкции, ускоряющие операции умножения упакованных целых чисел и генерирующие целые значения с масштабированием; две инструкции, выполняющие побайтовую перестановку на месте в соответствии со вторым операндом управления перестановкой; шесть инструкций, отрицающих упакованные целые числа в операнде назначения, если соответствующий элемент в операнде-источнике отрицателен; две инструкции, выравнивающие данные, полученные из комбинации двух операндов.

Новые инструкции

В таблице ниже, satsw(X) (читается как "насыщение до знакового слова") принимает целое число X со знаком и преобразует его в −32768, если оно меньше −32768, в +32767, если оно больше 32767, и оставляет без изменений в противном случае. Как обычно для архитектуры Intel, байты состоят из 8 бит, слова – из 16 бит, а dwords – из 32 бит; "регистр" относится к MMX или XMM векторному регистру. Определение инструкции Объяснение PSIGNB, PSIGNW, PSIGND Упакованное изменение знака Отрицание элементов регистра байтов, слов или dwords, если знак соответствующих элементов другого регистра отрицательный. PABSB, PABSW, PABSD Упакованное абсолютное значение Заполнение элементов регистра байтов, слов или dwords абсолютными значениями элементов другого регистра. PALIGNR Упакованное выравнивание вправо Принять два регистра, объединить их значения и извлечь секцию длиной в регистр, начиная со смещения, заданного непосредственным значением, закодированным в инструкции. PSHUFB Упакованный перенос байтов Принимает регистры байтов A = [a0 a1 a2 ] и B = [b0 b1 b2 ] и заменяет A на [ab0 ab1 ab2 ], за исключением того, что i-я запись заменяется на 0, если установлен старший бит bi. PMULHRSW Упакованное умножение старшего разряда с округлением и масштабированием Рассматривает 16-битные слова в регистрах A и B как знаковые 16-битные числа с фиксированной точкой между −1.00000000 и +0.99996948 (например, 0x4000 рассматривается как +0.5, а 0xA000 как −0.75) и умножает их вместе с правильным округлением. PMADDUBSW Умножение и сложение упакованных знаковых и беззнаковых байтов Берет байты в регистрах A и B, умножает их вместе, складывает пары, насыщает до знакового значения и сохраняет. Т.е. [a0 a1 a2 ] PMADDUBSW [b0 b1 b2 ] = [satsw(a0b0 + a1b1) satsw(a2b2 + a3b3) ] PHSUBW, PHSUBD Упакованное горизонтальное вычитание (слова или двойные слова) Принимает регистры A = [a0 a1 a2 ] и B = [b0 b1 b2 ] и выдает [a0−a1 a2−a3 b0−b1 b2−b3 ]. PHSUBSW Упакованное горизонтальное вычитание и насыщение слов Как PHSUBW, но выдает [satsw(a0−a1) satsw(a2−a3) satsw(b0−b1) satsw(b2−b3) ]. PHADDW, PHADDD Упакованное горизонтальное сложение (слова или двойные слова) Принимает регистры A = [a0 a1 a2 ] и B = [b0 b1 b2 ] и выдает [a0+a1 a2+a3 b0+b1 b2+b3 ]. PHADDSW Упакованное горизонтальное сложение и насыщение слов Как PHADDW, но выдает [satsw(a0+a1) satsw(a2+a3) satsw(b0+b1) satsw(b2+b3) ].