WikiDer > Набор инструкций XOP

XOP instruction set

В XOP (Расширенные операции[1]) Набор инструкций, объявленный AMD 1 мая 2009 г., является расширением 128-битной SSE основные инструкции в x86 и AMD64 набор инструкций для Бульдозер ядро процессора, выпущенное 12 октября 2011 года.[2] Однако AMD удалила поддержку XOP из Дзен (микроархитектура) вперед.[3]

Набор инструкций XOP содержит несколько различных типов векторных инструкций, поскольку изначально задумывался как серьезное обновление до SSE. Большинство инструкций являются целочисленными инструкциями, но они также содержат инструкции перестановки с плавающей запятой и извлечения дроби с плавающей запятой. См. Указатель для списка типов инструкций.

История

XOP - это переработанное подмножество того, что изначально задумывалось как SSE5. Он был изменен, чтобы быть похожим, но не пересекающимся с AVX, части, которые перекрывали AVX, были удалены или перемещены в отдельные стандарты, такие как FMA4 (вектор с плавающей запятой умножать – накапливать) и CVT16 (Половинная точность преобразование с плавающей запятой реализовано как F16C Intel).[1]

Все инструкции SSE5, которые были эквивалентны или похожи на инструкции в AVX и FMA4 Наборы инструкций, объявленные Intel, были изменены для использования кодировки, предложенной Intel. Целое число инструкции без эквиваленты в AVX были классифицированы как расширение XOP.[1] Инструкции XOP имеют байт кода операции 8F (шестнадцатеричный), но в остальном почти идентичная схема кодирования как AVX с 3-байтовым префиксом VEX.

Комментаторы[4] рассматривают это как доказательство того, что 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).[1][5][6]

В марте 2015 года AMD явно указала в описании патча для пакета GNU Binutils, что Дзен, его архитектура x86-64 третьего поколения в первой итерации (znver1 - Zen, версия 1), не будет поддерживать инструкции TBM, FMA4, XOP и LWP, разработанные специально для семейства микроархитектур Bulldozer.[7][8]

Инструкции умножения-накопления целочисленных векторов

Это целочисленная версия Набор инструкций FMA. Это все четыре команды операнда, похожие на FMA4 и все они работают с целыми числами со знаком.

ИнструкцияОписание[9]Операция
VPMACSWW

VPMACSSWW

Умножение накопления (с насыщением) слова в слово2x8 слов (a0-a7, b0-b7) + 8 слов (c0-c7) → 8 слов (r0-r7)

r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, ..

VPMACSWD

VPMACSSWD

Умножение накопления (с насыщением) младшего слова на двойное слово2x8 слов (a0-a7, b0-b7) + 4 двойных слова (c0-c3) → 4 двойных слова (r0-r3)

r0 = a0 * b0 + c0, r1 = a2 * b2 + c1, .[2]

VPMACSDD

VPMACSSDD

Умножение накопления (с насыщением) двойного слова на двойное слово2х4 двойных слова (a0-a3, b0-b3) + 4 двойных слова (c0-c3) → 4 двойных слова (r0-r3)

r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, ..

VPMACSDQL

VPMACSSDQL

Умножение накопления (с насыщением) младшего двойного слова на четверное слово2х4 двойных слова (a0-a3, b0-b3) + 2 четверных слова (c0-c1) → 2 четверных слова (r0-r3)

r0 = a0 * b0 + c0, r1 = a2 * b2 + c1

VPMACSDQH

VPMACSSDQH

Умножение накопления (с насыщением) высокого двойного слова на четверное слово2х4 двойных слова (a0-a3, b0-b3) + 2 четверных слова (c0-c1) → 2 четверных слова (r0-r3)

r0 = a1 * b1 + c0, r1 = a3 * b3 + c1

VPMADCSWD

VPMADCSSWD

Умножение Добавить Накапливаемое (с насыщением) слово в двойное слово2x8 слов (a0-a7, b0-b7) + 4 двойных слова (c0-c3) → 4 двойных слова (r0-r3)

r0 = a0 * b0 + a1 * b1 + c0, r1 = a2 * b2 + a3 * b3 + c1, ..

Горизонтальное сложение целочисленных векторов

Команды горизонтального сложения добавляют друг к другу соседние значения во входном векторе. Размер вывода в приведенных ниже инструкциях описывает ширину выполняемого горизонтального сложения. Например, горизонтальный байт к слову добавляет два байта за раз и возвращает результат как вектор слов, но байт к четверному слову складывает вместе восемь байтов за раз и возвращает результат как вектор четверных слов. Шесть дополнительных инструкций по горизонтальному сложению и вычитанию можно найти в SSSE3, но они работают с двумя входными векторами и выполняют только две и две операции.

ИнструкцияОписание[9]Операция
VPHADDBW

VPHADDUBW

По горизонтали добавить к слову два байта со знаком / без знака16 байт (a0-a15) → 8 слов (r0-r7)

г0 = а0 + а1, г1 = а2 + а3, г2 = а4 + а5, ...

VPHADDBD

VPHADDUBD

По горизонтали добавить четыре байта со знаком / без знака в двойное слово16 байт (a0-a15) → 4 двойных слова (r0-r3)

г0 = а0 + а1 + а2 + а3, г1 = а4 + а5 + а6 + а7, ...

VPHADDBQ

VPHADDUBQ

По горизонтали добавить восемь подписанных / беззнаковых байтов к четверному слову16 байт (a0-a15) → 2 четверных слова (r0-r1)

г0 = а0 + а1 + а2 + а3 + а4 + а5 + а6 + а7, ...

VPHADDWD

VPHADDUWD

По горизонтали добавить два слова со знаком / без знака в двойное слово8 слов (a0-a7) → 4 двойных слова (r0-r3)

г0 = а0 + а1, г1 = а2 + а3, г2 = а4 + а5, ...

VPHADDWQ

VPHADDUWQ

По горизонтали добавить четыре знаковых / беззнаковых слова в четверное слово8 слов (a0-a7) → 2 четверных слова (r0-r1)

г0 = а0 + а1 + а2 + а3, г1 = а4 + а5 + а6 + а7

VPHADDDQ

VPHADDUDQ

По горизонтали добавить два знаковых / беззнаковых двойных слова в четверное слово4 двойных слова (a0-a3) → 2 четверных слова (r0-r1)

г0 = а0 + а1, г1 = а2 + а3

VPHSUBBWГоризонтальное вычитание двух байтов со знаком до слова16 байт (a0-a15) → 8 слов (r0-r7)

r0 = a0-a1, г1 = а2-а3, г2 = а4-а5, ...

VPHSUBWDГоризонтальное вычитание двух подписанных слов в двойное слово8 слов (a0-a7) → 4 двойных слова (r0-r3)

г0 = а0-а1, г1 = а2-а3, г2 = а4-а5, ...

VPHSUBDQГоризонтальное вычитание двух двойных слов со знаком в четверное слово4 двойных слова (a0-a3) → 2 четверных слова (r0-r1)

r0 = a0-a1, г1 = а2-а3

Целочисленное сравнение векторов

Этот набор команд сравнения векторов принимает немедленный дополнительный аргумент. Непосредственно контролирует, какое сравнение выполняется. Для каждой инструкции возможно восемь сравнений. Векторы сравниваются, и все сравнения, которые оцениваются как истинные, устанавливают все соответствующие биты в адресате на 1, а ложные сравнения устанавливают все те же биты на 0. Этот результат можно использовать непосредственно в инструкции VPCMOV для векторизованного условный ход.

ИнструкцияОписание[9]НемедленныйСравнение
VPCOMBСравнить векторные подписанные байты000Меньше, чем
VPCOMWСравнить векторные подписанные слова001Меньше или равно
VPCOMDСравнить двойные слова с векторной подписью010Лучше чем
VPCOMQСравнить четырехзначные слова со знаком011Больше или равно
VPCOMUBСравнить векторные беззнаковые байты100Равный
VPCOMUWСравнить векторные беззнаковые слова101Не равный
VPCOMUDСравнить векторные беззнаковые двойные слова110Ложь
VPCOMUQСравнить векторные беззнаковые четырехслова111Истинный

Векторный условный ход

VPCMOV работает как побитовый вариант инструкций смешивания в SSE4. Для каждого бита в селекторе 1 выбирает один и тот же бит в первом источнике, а 0 выбирает такой же во втором источнике. При использовании вместе с приведенными выше инструкциями по сравнению векторов XOP это можно использовать для реализации векторизованного троичного перемещения или, если второй вход совпадает с местом назначения, условным перемещением (CMOV).

ИнструкцияОписание[9]
VPCMOVВекторный условный ход

Инструкции по сдвигу и повороту целочисленного вектора

Инструкции по смене здесь отличаются от приведенных здесь. SSE2 в том, что они могут сдвигать каждую единицу на разную величину, используя векторный регистр, интерпретируемый как упакованные целые числа со знаком. Знак указывает направление сдвига или поворота, при этом положительные значения вызывают сдвиг влево, а отрицательные - вправо.[10]Intel указала другой несовместимый набор инструкций переменного векторного сдвига в AVX2.[11]

ИнструкцияОписание[9]
ВПРОТБУпакованные байты поворота
VPROTWУпакованные слова поворота
ВПРОТДУпакованные двойные слова поворота
VPROTQУпакованное вращение четырех слов
VPSHABУпакованные арифметические байты сдвига
VPSHAWАрифметические слова с упакованным сдвигом
ВПШАДДвойные арифметические слова со сдвигом
VPSHAQАрифметические четырехслова с упакованным сдвигом
ВПШЛБЛогические байты упакованного сдвига
VPSHLWЛогические слова упакованного сдвига
VPSHLDЛогические двойные слова с упакованным сдвигом
VPSHLQЛогические четверные слова с упакованным сдвигом

Вектор перестановка

VPPERM - это отдельная инструкция, которая объединяет SSSE3 инструкция PALIGNR и PSHUFB и добавляет больше к обоим. Некоторые сравнивают это Altivec инструкция ВПЕРМ.[12] В качестве входных данных он принимает три регистра, первые два - это регистры источника, а третий - регистр выбора. Каждый байт в селекторе выбирает один из байтов в одном из двух входных регистров для вывода. Селектор также может применять эффекты к выбранным байтам, такие как установка его на 0, изменение порядка следования битов и повторение самого значащего бита. Кроме того, все эффекты или вход можно инвертировать.

Инструкции VPERMIL2PD и VPERMIL2PS - это две исходные версии инструкций VPERMILPD и VPERMILPS в AVX что означает, что, как и VPPERM, они могут выбирать вывод из любого поля в двух входах.

ИнструкцияОписание[9]
ВПЕРМУпакованный перестановочный байт
VPERMIL2PDПерестановка двух источников с плавающей запятой двойной точности
VPERMIL2PSПерестановка двух источников с плавающей запятой одинарной точности

Извлечение фракции с плавающей запятой

Эти инструкции извлекают дробную часть с плавающей запятой, то есть ту часть, которая будет потеряна при преобразовании в целое число.

ИнструкцияОписание[9]
VFRCZPDИзвлечение фракций с плавающей запятой двойной точности
VFRCZPSИзвлечение фракций с плавающей запятой одинарной точности
VFRCZSDИзвлечь фракцию Скалярная двойная точность с плавающей запятой
VFRCZSSИзвлечь фракцию Скалярная числа с плавающей запятой одинарной точности

Процессоры с XOP

Смотрите также

Рекомендации

  1. ^ а б c d Дэйв Кристи (2007-05-07), Достижение баланса, Блоги разработчиков AMD, заархивированные с оригинал на 2013-11-04, получено 2013-11-04
  2. ^ а б Руководство программиста по архитектуре AMD64, том 6: 128-битные и 256-битные инструкции XOP, FMA4 и CVT16 (PDF), AMD, 1 мая 2009 г.
  3. ^ Майкл Ларабель (3 марта 2017 г.). «Влияние настройки компилятора GCC Zen на производительность AMD Ryzen». Фороникс. Но поскольку Zen представляет собой дизайн с чистого листа, в процессорах Bulldozer есть некоторые расширения набора команд, которых нет в Zen / znver1. Те, кого больше нет, включают FMA4 и XOP.
  4. ^ Агнер Туман (5 декабря 2009 г.), Остановите войну набора инструкций
  5. ^ Справочник по программированию Intel AVX (PDF), Март 2008 г., получено 2012-01-17
  6. ^ Справочник по программированию Intel Advanced Vector Extensions, Январь 2009 г., архивировано из оригинал 29 февраля 2012 г., получено 2012-01-17
  7. ^ Ганеш Гопаласубраманян (10 марта 2015 г.). "[ПАТЧ] добавить процессор znver1". [email protected] (Список рассылки).
  8. ^ Амит Павар (7 августа 2015 г.). "[ПАТЧ] Удалить CpuFMA4 из флагов процессора Znver1". [email protected] (Список рассылки).
  9. ^ а б c d е ж грамм "Руководство программиста по архитектуре AMD64, том 4: 128-битные и 256-битные мультимедийные инструкции" (PDF). AMD. Получено 2014-01-13.
  10. ^ "Новые" Бульдозер "и" Пиледривер "Инструкции" (PDF). AMD. Получено 2014-01-13.
  11. ^ «Справочник по программированию расширений набора команд архитектуры Intel». Intel. Архивировано из оригинал (PDF) 1 февраля 2014 г.. Получено 2014-01-29.
  12. ^ "Оптимизация Buldozer x264". Получено 2014-01-13.
  13. ^ Дэйв Кристи (2007-05-07), Достижение баланса, Блоги разработчиков AMD, заархивированные с оригинал на 2013-11-09, получено 2012-01-17
  14. ^ Новые инструкции "Бульдозер" и "Пиледривер" (PDF), AMD, октябрь 2012 г.