Набор инструкций XOP
XOP операции ( расширенные [1] 1 Набор инструкций , анонсированный компанией AMD мая 2009 года, представляет собой расширение 128-битных инструкций ядра SSE в наборе инструкций x86 и AMD64 для ядра процессора Bulldozer , который был выпущен 12 октября 2011 года. [2] Однако AMD удалила поддержку XOP из Zen (микроархитектуры) . [3]
Набор инструкций XOP содержит несколько различных типов векторных инструкций, поскольку изначально он задумывался как серьезное обновление SSE . Большинство инструкций являются целочисленными, но они также содержат инструкции по перестановке с плавающей запятой и извлечению дробей с плавающей запятой. См. указатель списка типов инструкций.
История
[ редактировать ]XOP — это переработанное подмножество того, что изначально задумывалось как SSE5 . Он был изменен, чтобы быть похожим, но не пересекающимся с AVX , части, которые перекрывались с AVX, были удалены или перенесены в отдельные стандарты, такие как FMA4 векторов с плавающей запятой ( умножение-накопление ) и CVT16 ( преобразование с плавающей запятой половинной точности , реализованное как F16C с помощью Интел ). [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, чтобы избежать перекрытия с существующими инструкциями. [Примечание 1] Байт C4, используемый в схеме VEX, не имеет такого ограничения. Это может помешать использованию m-битов для других целей в будущем в схеме XOP, но не в схеме VEX. Другая возможная проблема заключается в том, что биты pp имеют значение 00 в схеме XOP, тогда как в схеме VEX они имеют значение 01 для инструкций, не имеющих устаревшего эквивалента. Это может затруднить использование битов pp для других целей в будущем.
Аналогичная проблема совместимости — разница между наборами инструкций FMA3 и FMA4 . Первоначально Intel предложила FMA4 в версии 3 спецификации AVX/FMA, чтобы заменить FMA с 3 операндами, предложенный AMD в SSE5. После того как AMD приняла FMA4, Intel отменила поддержку FMA4 и вернулась к FMA3 в спецификации AVX/FMA версии 5 (см. историю FMA ). [1] [5] [6]
В марте 2015 года AMD прямо сообщила в описании патча для пакета GNU Binutils, что Zen , ее архитектура x86-64 третьего поколения в первой итерации (znver1 — Zen, версия 1), не будет поддерживать TBM
, FMA4
, XOP
и LWP
инструкции, разработанные специально для семейства микроархитектур «Бульдозер». [7] [8]
Инструкции целочисленного векторного умножения-накопления
[ редактировать ]Это целочисленная версия набора инструкций FMA . Все эти инструкции с четырьмя операндами аналогичны FMA4 , и все они работают с целыми числами со знаком.
Инструкция | Описание [9] | Операция |
---|---|---|
VPMACSWW , VPMACSSWW | Умножение-накопление (с насыщением) слово в слово | 2х8 слов ( а0-а7 , b0-b7 ) + 8 слов ( c0-c7 ) → 8 слов ( р0-р7 ) г0 = а0 * b0 + с0 , r1 = a1 * b1 + c1 , .. |
VPMACSWD , VPMACSSWD | Умножение накопления (с насыщением) от младшего слова к двойному слову | 2х8 слов ( а0-а7 , b0-b7 ) + 4 двойных слова ( c0-c3 ) → 4 двойных слова ( р0-р3 ) г0 = а0 * b0 + с0 , r1 = a2 * b2 + c1 , . [2] |
VPMACSDD , VPMACSSDD | Умножение и накопление (с насыщением) двойного слова в двойное слово | 2х4 двойных слова ( а0-а3 , b0-b3 ) + 4 двойных слова ( c0-c3 ) → 4 двойных слова ( р0-р3 ) г0 = а0 * b0 + с0 , r1 = a1 * b1 + c1 , .. |
VPMACSDQL , VPMACSSDQL | Умножение накопления (с насыщением) низкого двойного слова в четверное слово | 2х4 двойных слова ( а0-а3 , b0-b3 ) + 2 четверных слова ( c0-c1 ) → 2 четверных слова ( р0-р3 ) г0 = а0 * b0 + с0 , r1 = a2 * b2 + c1 |
VPMACSDQH , VPMACSSDQH | Умножить накопление (с насыщением) высокого двойного слова в четверное слово | 2х4 двойных слова ( а0-а3 , b0-b3 ) + 2 четверных слова ( c0-c1 ) → 2 четверных слова ( р0-р3 ) г0 = а1 * b1 + с0 , r1 = a3 * b3 + c1 |
VPMADCSWD , VPMADCSSWD | Умножение, добавление накопления (с насыщением) слова в двойное слово | 2х8 слов ( а0-а7 , b0-b7 ) + 4 двойных слова ( c0-c3 ) → 4 двойных слова ( р0-р3 ) r0 = a0 * b0 + a1 * b1 + c0 , r1 = а2 * b2 + а3*b3+c1 , .. |
Целочисленное векторное горизонтальное сложение
[ редактировать ]Инструкции горизонтального сложения складывают соседние значения во входном векторе друг с другом. Выходной размер в приведенных ниже инструкциях описывает ширину выполняемого горизонтального сложения. Например, горизонтальное преобразование байт в слово добавляет по два байта за раз и возвращает результат в виде вектора слов, а преобразование байт в четверное слово одновременно складывает восемь байтов и возвращает результат в виде вектора из четверных слов. Шесть дополнительных инструкций горизонтального сложения и вычитания можно найти в SSSE3 , но они работают с двумя входными векторами и выполняют только две и две операции.
Инструкция | Описание [9] | Операция |
---|---|---|
VPHADDBW , VPHADDUBW | Горизонтально добавить в слово два байта со знаком/без знака | 16 байт ( а0-а15 ) → 8 слов ( р0-р7 ) г0 = а0+а1 , г1 = а2+а3 , г2 = а4+а5 , ... |
VPHADDBD , VPHADDUBD | По горизонтали добавляет четыре байта со знаком/без знака в двойное слово. | 16 байт ( a0-a15 ) → 4 двойных слова ( р0-р3 ) г0 = а0+а1+а2+а3 , r1 = a4+a5+a6+a7 , ... |
VPHADDBQ , VPHADDUBQ | Горизонтальное добавление восьми байтов со знаком/без знака в четверное слово. | 16 байт ( a0-a15 ) → 2 четверных слова ( р0-р1 ) r0 = a0+a1+a2+a3+a4+a5+a6+a7 , ... |
VPHADDWD , VPHADDUWD | По горизонтали добавить два слова со знаком/без знака в двойное слово | 8 слов ( a0-a7 ) → 4 doublewords ( р0-р3 ) г0 = а0+а1 , г1 = а2+а3 , г2 = а4+а5 , ... |
VPHADDWQ , VPHADDUWQ | По горизонтали добавить четыре слова со знаком/без знака в четверное слово | 8 слов ( a0-a7 ) → 2 четверных слова ( р0-р1 ) г0 = а0+а1+а2+а3 , r1 = а4+а5+а6+а7 |
VPHADDDQ , VPHADDUDQ | По горизонтали добавить два знаковых/беззнаковых двойных слова в четверное слово. | 4 двойных слова ( a0-a3 ) → 2 четверных слова ( р0-р1 ) г0 = а0+а1 , г1 = а2+а3 |
VPHSUBBW | Горизонтальное вычитание двух байтов со знаком в слово | 16 байт ( а0-а1 5) → 8 слов ( р0-р7 ) г0 = а0-а1 , г1 = а2-а3 , г2 = а4-а5 , ... |
VPHSUBWD | Горизонтальное вычитание двух слов со знаком в двойное слово | 8 слов ( a0-a7 ) → 4 doublewords ( р0-р3 ) г0 = а0-а1 , г1 = а2-а3 , г2 = а4-а5 , ... |
VPHSUBDQ | Горизонтальное вычитание двух двойных слов со знаком в четверное слово | 4 двойных слова ( a0-a3 ) → 2 четверных слова ( р0-р1 ) г0 = а0-а1 , г1 = а2-а3 |
Целочисленное векторное сравнение
[ редактировать ]Все эти инструкции векторного сравнения принимают немедленный результат в качестве дополнительного аргумента. Непосредственный контроль определяет, какой тип сравнения выполняется. Для каждой инструкции возможно восемь сравнений. Векторы сравниваются, и все сравнения, которые оцениваются как true, устанавливают все соответствующие биты в пункте назначения в 1, а ложные сравнения устанавливают все те же биты в 0. Этот результат можно использовать непосредственно в инструкции VPCMOV для векторизованного условного перемещения .
Инструкция | Описание [9] |
---|---|
VPCOMB | Сравнить векторные байты со знаком |
VPCOMW | Сравните слова с векторным знаком |
VPCOMD | Сравните векторные двойные слова со знаком |
VPCOMQ | Сравните векторные четверные слова со знаком |
VPCOMUB | Сравните векторные беззнаковые байты |
VPCOMUW | Сравните векторные слова без знака |
VPCOMUD | Сравните векторные двойные слова без знака |
VPCOMUQ | Сравните векторные четверные слова без знака |
Немедленный | Сравнение |
---|---|
000 | Меньше, чем |
001 | Меньше или равно |
010 | Больше, чем |
011 | Больше или равно |
100 | Равный |
101 | Не равно |
110 | ЛОЖЬ |
111 | Истинный |
Векторный условный ход
[ редактировать ]VPCMOV
работает как побитовый вариант инструкций смешивания в SSE4 . Как и инструкция AVX VPBLENDVB, это инструкция с четырьмя операндами, тремя исходными операндами и пунктом назначения. Для каждого бита в третьем операнде (который действует как селектор) 1 выбирает тот же бит в первом источнике, а 0 выбирает тот же бит во втором источнике. При использовании вместе с приведенными выше инструкциями сравнения векторов XOP это может использоваться для реализации векторизованного троичного перемещения или, если второй входной сигнал совпадает с пунктом назначения, условного перемещения ( CMOV
).
Инструкция | Описание [9] |
---|---|
VPCMOV | Векторный условный ход |
Инструкции целочисленного векторного сдвига и поворота
[ редактировать ]Инструкции сдвига здесь отличаются от инструкций в SSE2 тем, что они могут сдвигать каждую единицу на разную величину, используя векторный регистр, интерпретируемый как упакованные целые числа со знаком. Знак указывает направление смещения или поворота: положительные значения вызывают сдвиг влево, а отрицательный сдвиг вправо. [10] Intel указала другой несовместимый набор инструкций векторного сдвига переменных в AVX2. [11]
Инструкция | Описание [9] |
---|---|
VPROTB | Упакованные байты поворота |
VPROTW | Упакованные вращающиеся слова |
VPROTD | Упакованные двойные слова с ротацией |
VPROTQ | Упакованные четверные слова поворота |
VPSHAB | Упакованные байты арифметических операций сдвига |
VPSHAW | Упакованные арифметические слова сдвига |
VPSHAD | Двойные слова арифметики упакованного сдвига |
VPSHAQ | Четверные арифметические слова упакованного сдвига |
VPSHLB | Упакованные логические байты сдвига |
VPSHLW | Логические слова с упакованным сдвигом |
VPSHLD | Логические двойные слова с упакованным сдвигом |
VPSHLQ | Логические четверные слова упакованного сдвига |
Векторная перестановка
[ редактировать ]VPPERM
— это одна инструкция, которая объединяет инструкции SSSE3 PALIGNR и PSHUFB и дополняет обе. Некоторые сравнивают это с Altivec инструкцией VPERM
. [12] В качестве входных данных используются три регистра: первые два — исходные, а третий — селекторный. Каждый байт в селекторе выбирает один из байтов в одном из двух входных регистров для вывода. Селектор также может применять эффекты к выбранным байтам, например, устанавливать его в 0, менять порядок битов и повторять наиболее значимый бит. Кроме того, все эффекты или вход можно инвертировать.
The VPERMIL2PD
и VPERMIL2PS
инструкции представляют собой две исходные версии VPERMILPD
и VPERMILPS
инструкции в AVX, что означает типа VPPERM
они могут выбрать вывод из любого поля двух входов.
Инструкция | Описание [9] |
---|---|
VPPERM | Упакованный байт перестановки |
VPERMIL2PD | Перестановка двух источников с плавающей запятой двойной точности |
VPERMIL2PS | Перестановка двух источников одинарной точности с плавающей запятой |
Извлечение дробей с плавающей запятой
[ редактировать ]Эти инструкции извлекают дробную часть числа с плавающей запятой, то есть ту часть, которая будет потеряна при преобразовании в целое число.
Инструкция | Описание [9] |
---|---|
VFRCZPD | Извлечь упакованную дробь с плавающей запятой двойной точности |
VFRCZPS | Извлечение упакованных фракций с плавающей запятой одинарной точности |
VFRCZSD | Извлечение скалярной дроби двойной точности с плавающей запятой |
VFRCZSS | Извлечение скалярной дроби с плавающей запятой одинарной точности |
Процессоры с XOP
[ редактировать ]- АМД :
- Процессоры «Тяжелое оборудование»
- Процессоры на базе Bulldozer , IV квартал 2011 г. [13]
- Процессоры на базе Piledriver , IV квартал 2012 г. [14]
- Процессоры на базе Steamroller , 1 квартал 2014 г.
- Процессоры на базе Экскаватора (в том числе «v2»), 2015 г.
- Процессоры «Тяжелое оборудование»
См. также
[ редактировать ]Примечания
[ редактировать ]- ^ Значение байта 0x8F — это существующий код операции для инструкции POP. Эта инструкция использует байт ModR/M, который следует за кодом операции, но не использует поле «reg» (регистр), которое представляет собой биты 3–5. Некоторые коды операций, которые не используют мультиплексные инструкции «reg», используя эти биты для обозначения восьми различных инструкций (среди прочих 0x80-0x83 и 0xD0-0xDF); 0x8F нет. Это означает, что для стандартной инструкции POP биты 3–5 всегда должны быть равны нулю. Поскольку m-биты представляют собой биты 0–4, требование значения 8 или выше устанавливает бит 3 байта после 0x8F.
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с д Дэйв Кристи (07 мая 2009 г.), Поддерживая баланс , Блоги разработчиков AMD, заархивировано из оригинала 4 ноября 2013 г. , получено 4 ноября 2013 г.
- ^ Перейти обратно: а б Руководство программиста по архитектуре AMD64, том 6: 128-битные и 256-битные инструкции XOP, FMA4 и CVT16 (PDF) , AMD , 1 мая 2009 г.
- ^ Майкл Ларабель (3 марта 2017 г.). «Влияние настройки компилятора GCC Zen на производительность AMD Ryzen» . Фороникс .
Но поскольку Zen представляет собой дизайн с чистого листа, в процессорах Bulldozer есть некоторые расширения набора команд, которых нет в Zen/znver1. К числу отсутствующих больше относятся FMA4 и XOP.
- ^ Агнер Фог (5 декабря 2009 г.), Остановите войну наборов команд
- ^ Справочник по программированию Intel AVX (PDF) , март 2008 г. , получено 17 января 2012 г.
- ^ Справочник по программированию Intel Advanced Vector Extensions , январь 2009 г., заархивировано из оригинала 29 февраля 2012 г. , получено 17 января 2012 г.
- ^ Ганеш Гопаласубраманиан (10 марта 2015 г.). «[ИСПРАВЛЕНИЕ] добавить процессор znver1» . [электронная почта защищена] (список рассылки).
- ^ Амит Павар (7 августа 2015 г.). «[ИСПРАВЛЕНИЕ] Удалить CpuFMA4 из флагов ЦП Znver1» . [электронная почта защищена] (список рассылки).
- ^ Перейти обратно: а б с д и ж г «Руководство программиста по архитектуре AMD64, том 4: инструкции для 128-битных и 256-битных носителей» (PDF) . АМД . Проверено 13 января 2014 г.
- ^ «Новые инструкции для «Бульдозера» и «Сваебойщика»» (PDF) . АМД . Проверено 13 января 2014 г.
- ^ «Справочник по программированию расширений набора команд архитектуры Intel» . Интел . Архивировано из оригинала (PDF) 1 февраля 2014 года . Проверено 29 января 2014 г.
- ^ «Оптимизация бульдозера x264» . Проверено 13 января 2014 г.
- ^ Дэйв Кристи (07 мая 2009 г.), Поддерживая баланс , Блоги разработчиков AMD, заархивировано из оригинала 9 ноября 2013 г. , получено 17 января 2012 г.
- ^ Новые инструкции для «Бульдозера» и «Сваедрайвера» (PDF) , AMD, октябрь 2012 г.