Набор инструкций XOP (расширенные операции) , объявленный AMD 1 мая 2009 г., является расширением 128-битных инструкций ядра SSE в наборе инструкций x86 и AMD64 для Bulldozer ядро процессора, выпущенное 12 октября 2011 года. Wever AMD удалила поддержку XOP из Zen (микроархитектура) и далее.
Набор инструкций XOP содержит несколько различных типов векторных инструкций, поскольку изначально задумывался как серьезное обновление до SSE.. Большинство инструкций являются целочисленными инструкциями, но они также содержат инструкции перестановки с плавающей запятой и извлечения дроби с плавающей запятой. См. Указатель для списка типов инструкций.
XOP - это пересмотренное подмножество то, что изначально задумывалось как SSE5. Он был изменен, чтобы быть похожим, но не перекрывающимся с AVX, части, которые перекрывались с AVX, были удалены или перемещены в отдельные стандарты, такие как FMA4 (вектор с плавающей запятой умножить-накопить ) и CVT16 (Преобразование с плавающей запятой половинной точности, реализованное как F16C компанией Intel ).
Все инструкции SSE5, которые были эквивалентны или похожи на инструкции в Наборы инструкций AVX и FMA4, объявленные Intel, были изменены для использования кодировки, предложенной Intel. Инструкции Integer без эквивалентов в AVX были классифицированы как расширение XOP. Инструкции XOP имеют байт кода операции 8F (шестнадцатеричный ), но в остальном почти идентична схеме кодирования, как AVX с 3-байтовым префиксом VEX.
Комментаторы видели это как свидетельство того, что Intel не разрешила AMD использовать какую-либо часть большого пространства кодирования VEX. AMD была вынуждена использовать разные коды, чтобы избежать использования любой комбинации кода, которую Intel могла бы используя в своем конвейере разработки для чего-то еще. Схема кодирования XOP максимально приближена к схеме VEX, насколько это технически возможно, без риска перекрытия кодов AMD с будущими кодами Intel. Этот вывод является спекулятивным, поскольку публичной информации о переговорах между двумя компаниями по этому вопросу нет.
Использование байта 8F требует, чтобы m-биты (см. схему кодирования VEX ) имели значение больше или равное 8, чтобы избежать перекрытия с существующими инструкциями. Байт C4, используемый в схеме VEX, не имеет такого ограничения. Это может предотвратить использование m-битов для других целей в будущем в схеме XOP, но не в схеме VEX. Другая возможная проблема заключается в том, что биты pp имеют значение 00 в схеме XOP, в то время как они имеют значение 01 в схеме VEX для инструкций, не имеющих аналогов в устаревших версиях. Это может усложнить использование битов pp для других целей в будущем.
Аналогичная проблема совместимости заключается в различии наборов инструкций FMA3 и FMA4. Первоначально Intel предложила FMA4 в спецификации AVX / FMA версии 3, чтобы заменить FMA с 3 операндами, предложенную AMD в SSE5. После того, как AMD приняла FMA4, Intel отменила поддержку FMA4 и вернулась к FMA3 в спецификации AVX / FMA версии 5 (см. История FMA ).
В марте 2015 года AMD явно указала в описании патча для пакета GNU Binutils, что Zen, его архитектура x86-64 третьего поколения в первой итерации (znver1 - Zen, версия 1), не будет поддерживать инструкции TBM, FMA4, XOP и LWP, разработанные специально для семейства микроконтроллеров Bulldozer. -архитектуры.
Это целочисленная версия набора команд FMA. Это все четыре команды операнда, аналогичные FMA4, и все они работают с целыми числами со знаком.
Инструкция | Описание | Операция |
---|---|---|
VPMACSWW
| Умножение накопления (с насыщением) слова на слово | 2x8 слов (a0-a7, b0-b7) + 8 слов (c0-c7) → 8 слов (r0-r7) r0 = a0 * b0 + c0, r1 = a1 * b1 + c1,.. |
VPMACSWD
| Умножение накопления (с насыщением) младшего слова на двойное слово | 2x8 слов (a0-a7, b0-b7) + 4 двойных слова (c0-c3) → 4 двойных слова ( r0-r3) r0 = a0 * b0 + c0, r1 = a2 * b2 + c1,. |
VPMACSDD
| Умножение накопления (с насыщением) Двойное слово в двойное слово | 2x4 двойных слова (a0-a3, b0-b3) + 4 двойных слова (c0-c3) → 4 двойных слова (r0-r3) r0 = a0 * b0 + c0, r1 = a1 * b1 + c1,.. |
VPMACSDQL
| Умножить Накопление (с насыщенностью) Младшее двойное слово в четырехслово | 2x4 двойных слова (a0-a3, b0-b3) + 2 четверных слова (c0-c1) → 2 четверных слова (r0-r3) r0 = a0 * b0 + c0, r1 = a2 * b2 + c1 |
VPMACSDQH
| Умножение, накопление (с насыщенностью), двойное слово с высоким значением в четырехслово | Двойное слово 2x4 (a0- a3, b0-b3) + 2 четверных слова (c0-c1) → 2 четверных слова (r0-r3) r0 = a1 * b1 + c0, r1 = a3 * b3 + c1 |
VPMADCSWD
| Умножение Добавить слово накопления (с насыщенностью) к двойному слову | 2x8 слов (a0-a7, b0-b7) + 4 двойных слова (c0-c3) → 4 двойных слова (r0-r3) r0 = a0 * b0 + a1 * b1 + c0, r1 = a2 * b2 + a3 * b3 + c1,.. |
Команды горизонтального сложения добавляют друг к другу соседние значения во входном векторе. Размер вывода в приведенных ниже инструкциях описывает ширину выполняемого горизонтального сложения. Например, горизонтальный байт к слову добавляет два байта за раз и возвращает результат как вектор слов, но байт к четверному слову складывает вместе восемь байтов за раз и возвращает результат как вектор четверных слов. Шесть дополнительных команд горизонтального сложения и вычитания можно найти в SSSE3, но они работают с двумя входными векторами и выполняют только две и две операции.
Инструкция | Описание | Операция |
---|---|---|
VPHADDBW
| По горизонтали добавить два байта со знаком / без знака в слово | 16 байтов (a0-a15) → 8 слов (r0-r7) r0 = a0 + a1, r1 = a2 + a3, r2 = a4 + a5,... |
VPHADDBD
| По горизонтали добавить четыре байта со знаком / без знака к двойному слову | 16 байтов (a0-a15) → 4 двойных слова (r0-r3) r0 = a0 + a1 + a2 + a3, r1 = a4 + a5 + a6 + a7,... |
VPHADDBQ
| По горизонтали добавить восемь подписанных / беззнаковых байтов к четверному слову | 16 байтов (a0-a15) → 2 четверных слова (r0-r1) r0 = a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7,... |
VPHADDWD
| По горизонтали добавить два слова со знаком / без знака в двойное слово | 8 слов (a0-a7) → 4 двойных слова (r0-r3) r0 = a0 + a1, r1 = a2 + a3, r2 = a4 + a5,... |
VPHADDWQ
| По горизонтали добавить четыре слова со знаком / без знака в четверное слово | 8 слов (a0-a7) → 2 четверных слова (r0-r1) r0 = a0 + a1 + a2 + a3, r1 = a4 + a5 + a6 + a7 |
VPHADDDQ
| По горизонтали добавить два знаковых / беззнаковых двойных слова к четверному слову | 4 двойных слова (a0-a3) → 2 четверных слова (r0 -r1) r0 = a0 + a1, r1 = a2 + a3 |
VPHSUBBW | Горизонтальное вычитание двух байтов со знаком до слова | 16 байтов (a0 -a15) → 8 слов (r0-r7) r0 = a0-a1, r1 = a2-a3, r2 = a4-a5,... |
VPHSUBWD | Горизонтальное вычитание двух слов со знаком в двойное слово | 8 слов (a0-a7) → 4 двойных слова (r0-r3) r0 = a0-a1, r1 = a2-a3, r2 = a4-a5,... |
VPHSUBDQ | Горизонтальное вычитание двух двойных слов со знаком до четверного слова | 4 двойных слова (a0-a3) → 2 четверных слова (r0-r1) r0 = a0-a1, r1 = a2-a3 |
Этот набор инструкций векторного сравнения все принимают немедленный аргумент как дополнительный аргумент. Непосредственно контролирует, какое сравнение выполняется. Для каждой инструкции возможно восемь сравнений. Векторы сравниваются, и все сравнения, которые оцениваются как истинные, устанавливают все соответствующие биты в месте назначения на 1, а ложные сравнения устанавливают все те же биты на 0. Этот результат можно использовать непосредственно в инструкции VPCMOV для векторизованного условного перемещения.
Инструкция | Описание | Немедленное | Сравнение | |
---|---|---|---|---|
VPCOMB | Сравнить векторные подписанные байты | 000 | Меньше | |
VPCOMW | Сравнить векторные подписанные слова | 001 | Меньше или равно | |
VPCOMD | Сравнить векторные подписанные двойные слова | 010 | Больше чем | |
VPCOMQ | Сравнить Четырехзначные слова со знаком | 011 | Больше или равно | |
VPCOMUB | Сравнить векторные байты без знака | 100 | Равно | |
VPCOMUW | Сравнить векторные слова без знака | 101 | Не равно | |
VPCOMUD | Сравнить векторные беззнаковые двойные слова | 110 | Ложь | |
VPCOMUQ | Сравнить векторные четырехзначные беззнаковые слова | 111 | True |
VPCMOV работает как bitwis Вариант инструкций по смешиванию в SSE4. Для каждого бита в селекторе 1 выбирает один и тот же бит в первом источнике, а 0 выбирает такой же во втором источнике. При использовании вместе с приведенными выше инструкциями по сравнению векторов XOP это можно использовать для реализации векторизованного троичного перемещения или, если второй вход совпадает с пунктом назначения, условным перемещением (CMOV).
Инструкция | Описание |
---|---|
VPCMOV | Векторное условное перемещение |
Команды сдвига здесь отличаются от команд в SSE2 в том, что они могут сдвигать каждую единицу на разную величину, используя векторный регистр, интерпретируемый как упакованные целые числа со знаком. Знак указывает направление сдвига или поворота, при этом положительные значения вызывают сдвиг влево, а отрицательный сдвиг вправо Intel указала другой несовместимый набор инструкций сдвига вектора переменной в AVX2.
Инструкция | Описание |
---|---|
VPROTB | Упакованные байты поворота |
VPROTW | Упакованные слова поворота |
VPROTD | Упакованные двойные слова поворота |
VPROTQ | Упакованные четырехслови поворота |
VPSHAB | Арифметические байты упакованного сдвига |
VPSHAW | Арифметические слова с упакованным сдвигом |
VPSHAD | Двойные арифметические слова с упакованным сдвигом |
VPSHAQ | Квадратные арифметические слова с упакованным сдвигом |
VPSHLB | Логические байты с упакованным сдвигом |
VPSHLW | Пакетный сдвиг Логические слова |
VPSHLD | Логические двойные слова с упакованным сдвигом |
VPSHLQ | Логические четырехслова с упакованным сдвигом |
VPPERM - это отдельная инструкция, которая объединяет SSSE3 инструкция PALIGNR и PSHUFB и добавляет больше к обоим. Некоторые сравнивают это с инструкцией Altivec VPERM. В качестве входных данных он принимает три регистра, первые два - это регистры источника, а третий - регистр выбора. Каждый байт в селекторе выбирает один из байтов в одном из двух входных регистров для вывода. Селектор также может применять эффекты к выбранным байтам, такие как установка его на 0, изменение порядка следования битов и повторение самого значащего бита. Кроме того, все эффекты или вход можно инвертировать.
Инструкции VPERMIL2PD и VPERMIL2PS представляют собой две исходные версии инструкций VPERMILPD и VPERMILPS в AVX, что означает, что, как и VPPERM, они могут выбирать вывод из любого поля в двух входах.
Инструкция | Описание |
---|---|
VPPERM | Упакованный перестановочный байт |
VPERMIL2PD | Перестановка двух источников с плавающей запятой двойной точности |
VPERMIL2PS | Перестановка двух источников одиночных -Precision Floating-Point |
Эти инструкции извлекают дробную часть с плавающей запятой, то есть часть, которая будет потеряна при преобразовании в целое число.
Инструкция | Описание |
---|---|
VFRCZPD | Извлечь фракцию, упакованную с плавающей запятой двойной точности |
VFRCZPS | Извлечь фракцию, упакованную с плавающей запятой одинарной точности |
VFRCZSD | Скалярная дробная часть с плавающей запятой с двойной точностью |
VFRCZSS | Извлечение дробной скалярной числа с плавающей запятой одинарной точности |