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

Он был анонсирован 27 сентября 2006 года, однако детальное описание стало доступно только весной 2007 года. Более подробное описание новых возможностей процессоров для программистов можно найти на сайте Intel.

Набор команд

[править | править код]

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


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

Изменения

[править | править код]

Добавлены инструкции, ускоряющие компенсацию движения в видеокодеках, быстрое чтение из USWC памяти, множество инструкций для упрощения векторизации программ компиляторами.

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

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

[править | править код]

Ускорение видео

[править | править код]

Вычисление восьми сумм абсолютных значений разностей (SAD) смещённых 4-байтных беззнаковых групп. Расположение операндов для 16-битных SAD определяется тремя битами непосредственного аргумента 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)|

Поиск среди 16-битных беззнаковых полей A0…A7 такого, который имеет минимальное значение (и позицию с меньшим номером, если таких полей несколько). Возвращается 16-битное значение и его позиция.

Группа из 12-и инструкций для расширения формата упакованных полей. Упакованные 8, 16, или 32-битные поля из младшей части аргумента расширяются (со знаком или без) в 16, 32 или 64-битные поля результата.

Входной формат Результирующий
формат
8 бит 16 бит 32 бита
PMOVSXBW 16 бит
PMOVZXBW PMOVZXWW
PMOVSXBD PMOVSXWD 32 бита
PMOVZXBD PMOVZXWD PMOVSXDD
PMOVSXBQ PMOVSXWQ PMOVSXDQ 64 бита
PMOVZXBQ PMOVZXWQ PMOVZXDQ

Векторные примитивы

[править | править код]

Каждое поле результата есть минимальное/максимальное значение соответствующих полей двух аргументов. Байтовые поля рассматриваются только как числа со знаком, 16-битные — только как числа без знака. Для 32-битных упакованных полей предусмотрен вариант как со знаком, так и без.

Перемножение 32-битных полей со знаком с выдачей полных 64 бит результата (две операции умножения над 0 и 2 полями аргументов).

Перемножение 32-битных полей со знаком с выдачей младших 32 бит результатов (четыре операции умножения над всеми полями аргументов).

Упаковка 32-битных полей со знаком в 16-битные поля без знака с насыщением.

Проверка 64-битных полей на равенство и выдача 64-битных масок.

Вставки/извлечения

[править | править код]

Вставка 32-битного поля из xmm2 (возможно выбрать любой из 4 полей этого регистра) или из 32-битной ячейки памяти в произвольное поле результата. Кроме того, для каждого из полей результата можно задать сброс его в +0.0.

Извлечение 32-битного поля из xmm регистра, номер поля указывается в младших 2 битах imm8. Если в качестве результата указан 64-битный регистр, то его старшие 32 бита сбрасываются (расширение без знака).

Вставка 8, 32, или 64-битного значения в указанное поле xmm регистра (остальные поля не изменяются).

Извлечение 8, 16, 32, 64-битного поля из указанного в imm8 поля xmm регистра. Если в качестве результата указан регистр, то его старшая часть сбрасывается (расширение без знака).

Скалярное умножение векторов

[править | править код]

Скалярное умножение векторов (dot product) 32/64-битных полей. Посредством битовой маски в imm8 указывается, какие произведения полей должны суммироваться и что следует прописать в каждое поле результата: сумму указанных произведений или +0.0.

Смешивания

[править | править код]

Выбор каждого 32/64-битного поля результата осуществляется в зависимости от знака такого же поля в неявном аргументе xmm0: либо из первого, либо из второго аргумента.

Битовая маска (4 или 2 бита) в imm8 указывает из какого аргумента следует взять каждое 32/64-битное поле результата.

Выбор каждого байтового поля результата осуществляется в зависимости от знака байта такого же поля в неявном аргументе xmm0: либо из первого, либо из второго аргумента.

Битовая маска (8 бит) в imm8 указывает из какого аргумента следует взять каждое 16-битное поле результата.

Проверки бит

[править | править код]

Установить флаг ZF, если только в xmm2/m128 все биты помеченные маской из xmm1 равны нулю. Если все не помеченные биты равны нулю, то установить флаг CF. Остальные флаги (AF, OF, PF, SF) всегда сбрасываются. Инструкция не модифицирует xmm1.

Округления

[править | править код]

Округление всех 32/64-битных полей. Режим округления (4 варианта) выбирается либо из MXCSR.RC, либо задаётся непосредственно в imm8. Также можно подавить генерацию исключения потери точности.

Округление только младшего 32/64-битного поля (остальные биты остаются неизменными).

Чтение WC памяти

[править | править код]

Операция чтения, позволяющая ускорить (до 7.5 раз) работу с write-combining областями памяти.

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

[править | править код]

Обработка строк

[править | править код]

Эти инструкции выполняют арифметические сравнения между всеми возможными парами полей (64 или 256 сравнений) из обеих строк, заданных содержимым xmm1 и xmm2/m128. Затем булевые результаты сравнений обрабатываются для получения нужных результатов. Непосредственный аргумент imm8 управляет размером (байтовые или unicode строки, до 16/8 элементов каждая), знаковостью полей (элементов строк), типом сравнения и интерпретацией результатов.

Ими можно производить в строке (области памяти) поиск символов из заданного набора или в заданных диапазонах. Можно сравнивать строки (области памяти) или производить поиск подстрок.

Все они оказывают влияние на флаги процессора: SF устанавливается если в xmm1 не полная строка, ZF — если в xmm2/m128 не полная строка, CF — если результат не нулевой, OF — если младший бит результата не нулевой. Флаги AF и PF сбрасываются.

Явное задание размера строк в <eax>, <edx> (берётся абсолютная величина регистров с насыщение до 8/16, в зависимости от размера элементов строк. Результат в регистре ecx.

Явное задание размера строк в <eax>, <edx> (берётся абсолютная величина регистров с насыщение до 8/16, в зависимости от размера элементов строк. Результат в регистре xmm0.

Неявное задание размера строк (производится поиск нулевых элементов к каждой из строк). Результат в регистре ecx.

Неявное задание размера строк (производится поиск нулевых элементов к каждой из строк). Результат в регистре xmm0.

Подсчет CRC32

[править | править код]

Накопление значения CRC-32C (другие обозначения CRC-32/ISCSI CRC-32/CASTAGNOLI) для 8, 16, 32 или 64-битного аргумента (используется полином 0x1EDC6F41).

Подсчет популяции единичных битов

[править | править код]

Подсчет числа единичных битов. Три варианта инструкции: для 16, 32 и 64-битных регистров. Также присутствует в SSE4A от AMD.

Векторные примитивы

[править | править код]

Проверка 64-битных полей на «больше чем» и выдача 64-битных масок.

SSE4a

[править | править код]

Набор инструкций SSE4a был введен компанией AMD в процессоры на архитектуре Barcelona. Это расширение не доступно в процессорах Intel. Поддержка определяется через CPUID.80000001H:ECX.SSE4A[Bit 6] флаг.[4]

Инструкция Описание
LZCNT/POPCNT Подсчет числа нулевых/единичных битов.
EXTRQ/INSERTQ Комбинированные инструкции маскирования и сдвига[5]
MOVNTSD/MOVNTSS Скалярные инструкции потоковой записи[6]

Процессоры с поддержкой SSE4

[править | править код]

Литература

[править | править код]

Примечания

[править | править код]
  1. Инновационный набор команд Streaming SIMD Extensions 4 (SSE4). Дата обращения: 21 февраля 2010. Архивировано из оригинала 29 мая 2010 года.
  2. Sun Studio 12 Update 1: C Compiler 5.10 Readme. Дата обращения: 8 февраля 2010. Архивировано 7 ноября 2009 года.
  3. GCC 4.3 Release Series — Changes, New Features, and Fixes — GNU Project — Free Software Foundation (FSF). Дата обращения: 27 мая 2010. Архивировано 9 мая 2012 года.
  4. AMD CPUID Specification. Дата обращения: 7 мая 2011. Архивировано 16 мая 2011 года.
  5. Rahul Chaturvedi. “Barcelona” Processor Feature: SSE4a Instruction Set (англ.) (17 сентября 2007). Архивировано из оригинала 25 октября 2013 года.
  6. Rahul Chaturvedi. “Barcelona” Processor Feature: SSE4a, part 2 (англ.) (2 октября 2007). Архивировано из оригинала 25 октября 2013 года.