SSE4 — набор команд микроархитектуры Intel Core, впервые реализованный в процессорах серии Penryn (не следует путать с SSE4A компании AMD).

Набор был анонсирован 27 сентября 2006 года, однако детальное описание стало доступно только весной 2007 года.

Набор команд SSE4 состоит из 54 инструкций, 47 из них относят к SSE4.1 (есть в процессорах Penryn). Полный набор команд (SSE4.1 и SSE4.2, то есть 47 и оставшиеся 7 команд) доступен в процессорах Intel с микроархитектурой Nehalem, которые были выпущены в середине ноября 2008 года и более поздних редакциях. Ни одна из SSE4 инструкций не работает с 64-битными mmx-регистрами (только со 128-битными xmm0-15).

Подгруппа Процессорные команды Описание Ожидаемые улучшения в работе приложения Различные упакованные операции DWORD PMULLD, PMULDQ Новая поддержка четырех знаковых (и без знака) 32x32 битных умножений за одну инструкцию, так же как знаковые умножения вида 32x32->64. Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran). Скалярное произведение с плавающей точкой DPPS, DPPD Повышенная производительность обработки данных типа AOS (массив структур) посредством поддержки скалярных произведений с одинарной и двойной точностью. Создание трехмерного контента, игр. Поддержка языков программирования, таких как CG и HLSL. Упакованное сопряжение BLENDPS, BLENDPD, BLENDVPS, BLENDVPD, PBLENDVB, PBLENDDW Условно операция сопряжения копирует одно поле от источника и переносит его в место назначения. Эти новые процессорные команды повысят производительность операций сопряжения для большинства размеров полей, посредством упаковки операций умножения в единую инструкцию. Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. Мультимедиа и игровые ресурсы. Упакованные целочисленные максимальные и минимальные значения PMINSB, PMAXSB, PMINUW, PMAXUW, PMINUD, PMAXUD, PMINDS, PMAXSD Сравнивает упакованные знаковые/без знака на уровне байт/слов/двойных слов целочисленные значения в операнде назначения и в исходном операнде и возвращает минимальное или максимальное значение за одну инструкцию для каждого запакованного операнда в операнде назначения. Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации.Округление значений с плавающей запятой ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD Эффективно округляет скаляр и упакованный операнд с одинарной или двойной точностью до целочисленного значения с поддержкой требований языков программирования Fortran, Java и C99. Обработка изображений, графики, видеоинформации. Приложения с двухмерной/трехмерной мультимедиа и игровые ресурсы.Вставка/извлечение регистров INSERTPS, PINSRB, PINSRD, PINSRQ, EXTRACTPS, PEXTRB, PEXTRD, PEXTRW, PEXTRQ Эти новые процессорные команды упрощают процесс вставки и извлечения между регистрами GPR (или памятью) и XMM. Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации.Упакованное преобразование форматов PMOVSXBW, PMOVZXBW, PMOVSXBD, PMOVZXBD, PMOVSXBQ, PMOVZXBQ, PMOVSXWD, PMOVZXWD, PMOVSXWQ, PMOVZXWQ, PMOVSXDQ, PMOVZXDQ Преобразует упакованное целочисленное значение (из регистра XMM или памяти) в целочисленное значение более широкого типа со знаковым или нулевым расширением. Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации.Упакованная проверка и установка PTEST Более быстрое ветвление архитектуры SIMD, осуществляемое для поддержки векторизированного кода. Применимо для автоматизации компиляторной векторизации обработки данных, обработки изображений и видеоинформации, создания трехмерного контента. Мультимедиа и игровые ресурсы.Упакованное определение идентичности PCMPEQQ, PCMPGTQ Архитектура SIMD определяет идентичность упакованных значений QWORDs в операнде назначения и в исходном операнде. Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. Мультимедиа и игровые ресурсы.Упаковка DWORD в беззнаковый формат WORD PACKUSDW Преобразует упакованный знаковый DWORD в упакованный формат WORD без знака посредством беззнакового сосредоточения для обработки условий переполнения. Эта новая процессорная команда завершает набор других команд в этом формате. Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. Мультимедиа и игровые ресурсы.Улучшенные строковые операции PCMPESTRI, PCMPESTRM, PCMPISTRI, PCMPISTRM Эти новые процессорные команды содержат в себе большое количество возможностей обработки строк и текста, которые обычно требуют участия большего количества кодов операции. Повышенная производительность для сканирования вирусов, поиска текста, строковой обработки библиотек, таких как ZLIB, базы данных, компиляторы и приложения, предназначенные для конечного автомата.

Компилятор языка Си корпорации Intel, начиная с версии 10, генерирует инструкции SSE4 при задании опции -QxS. Компилятор Sun Studio Sun Microsystems с версии 12 update 1 генерирует инструкции SSE4 с помощью опций -xarch=sse4_1 (SSE4.1) и -xarch=sse4_2 (SSE4.2). Компилятор GCC поддерживает SSE4.1 и SSE4.2 с версии 4.3, опции -msse4.1 и -msse4.2, или -msse4, включающая оба варианта.

Изменения Добавлены инструкции, ускоряющие компенсацию движения в видеокодеках, быстрое чтение из USWC-памяти, множество инструкций для упрощения векторизации программ компиляторами. Кроме того, в SSE4.2 добавлены инструкции обработки строк 8/16-битных символов, вычисления CRC32, POPCNT. Впервые в SSE4 регистр xmm0 стал использоваться как неявный аргумент для некоторых инструкций.

Новые инструкции 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 определяется тремя битами непосредственного аргумента imm8. s1 = imm8*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 PMOVZXWW PMOVSXBD PMOVSXWD 32 бита PMOVZXBD PMOVZXWD PMOVSXDD PMOVSXBQ PMOVSXWQ PMOVSXDQ64 бита 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-битное поле результата.

Проверки бит