XOP (набор инструкций) (XOP (ugQkj nuvmjrtenw))
XOP (от англ. eXtended Operations — расширенные операции[1]) — расширение набора инструкций x86/AMD64, анонсированное корпорацией AMD 1 мая 2009 года.
Представляет собой расширение и развитие идей, реализованных в 128-битых инструкциях SSE в архитектурах x86/x86-64. Реализован начиная с микроархитектуры микропроцессоров AMD Bulldozer (12 октября 2011).[2] Не поддерживается процессорами AMD начиная с микроархитектуры Zen (Ryzen, EPIC; 2017 год)[3].
В набор инструкций XOP входит несколько различных типов векторных инструкций, так как он был первоначально задуман как крупное обновление SSE. Большинство инструкций являются целочисленными, но в набор также входят инструкции для перестановки чисел с плавающей запятой и инструкции экстракции дробной части.
История
[править | править код]XOP является переработкой части идей, изначально предназначенных для SSE5. Набор был изменён, чтобы сделать его более похожим на AVX, но при этом не дублировать инструкции. Совпадающие с AVX инструкции были удалены или перемещены в отдельные расширения, например FMA4 (векторное умножение-сложение для плавающей запятой) и CVT16 (преобразования чисел половинной-точности, реализовано корпорацией Intel как F16C).[1]
Все инструкции SSE5, для которых был аналог или эквивалент в наборах AVX и FMA3, используют кодировки, предложенные корпорацией Intel. Целочисленные инструкции без эквивалентов в AVX были классифицированы как расширение XOP.[1] Инструкции XOP кодируются кодами операций, начинающимися с байта 0x8F (шестнадцатеричное значение), но в остальном используют схему кодирования, почти идентичную AVX с 3-байтовым префиксом VEX.
Отдельные эксперты (Agner Fog)[4] расценили это как признак того, что корпорация Intel не позволила AMD использовать какую-либо часть большого кодового пространства VEX. Компания AMD, вероятно, была вынуждена использовать отличные коды для того, чтобы избежать появления какой-либо комбинации, которую мог бы в будущем использовать Intel. Схема кодирования XOP максимально приближена к VEX, но устраняет риск пересечения с будущими опкодами Intel.
Использование байта 8F требует, чтобы m-бит (см. схема кодирования VEX) имел значение большее или равное 8, для того чтобы избежать пересечения с инструкциями, определёнными на данный момент. Байт 0xC4, используемый в схеме VEX не имеет такого ограничения. Из-за этого использование m-битов для других целей в будущем в XOP схеме может быть затруднено (VEX не имеет ограничений на m-биты). Другая возможная проблема заключается в том, что биты pp в XOP всегда имеют значение 00, в то время как в VEX они устанавливаются в значение 01 для указания, что у инструкции нет устаревших эквивалентов. Это может усложнить использование pp битов для других целей в будущем.
Аналогичная проблема совместимости — различия реализаций расширений FMA3 и FMA4. Intel изначально предложил расширение FMA4 в рамках спецификации AVX/FMA версии 3, чтобы заменить 3-операндный вариант FMA, предложенный AMD в SSE5. После того как AMD реализовала FMA4, Intel отказался от FMA4 и вернулся к FMA3 в 5 версии спецификации AVX/FMA.[1][5][6]
В марте 2015 года, компания AMD раскрыла в описании патча для пакета GNU Binutils что Zen, третье поколение архитектуры x86-64, в первой редакции (znver1 — Zen, версия 1), не будет поддерживать TBM, FMA4, XOP and LWP инструкции, разработанные специально для семейства микроархитектур «Bulldozer».[7][8]
Целочисленное векторное умножение-сложение
[править | править код]Данные инструкции являются целочисленным аналогом наборов инструкций FMA. Все они — четырёхоперандные инструкции, похожие на FMA4, и все они работают над знаковыми целыми числами.
Инструкция | Описание[9] | Операция |
---|---|---|
VPMACSWW
|
Multiply Accumulate (with Saturation) Word to Word | 2x8 words (a0-a7, b0-b7) + 8 words (c0-c7) → 4 words (r0-r7)
r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSWD
|
Multiply Accumulate (with Saturation) Low Word to Doubleword | 2x8 words (a0-a7, b0-b7) + 4 doublewords (c0-c3) → 4 doublewords (r0-r3)
r0 = a0 * b0 + c0, r1 = a2 * b2 + c1, .[2] |
VPMACSDD
|
Multiply Accumulate (with Saturation) Doubleword to Doubleword | 2x4 doublewords (a0-a3, b0-b3) + 4 doublewords (c0-c3) → 4 doublewords (r0-r3)
r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSDQL
|
Multiply Accumulate (with Saturation) Low Doubleword to Quadword | 2x4 doublewords (a0-a3, b0-b3) + 2 quadwords (c0-c1) → 2 quadwords (r0-r3)
r0 = a0 * b0 + c0, r1 = a2 * b2 + c1 |
VPMACSDQH
|
Multiply Accumulate (with Saturation) High Doubleword to Quadword | 2x4 doublewords (a0-a3, b0-b3) + 2 quadwords (c0-c1) → 2 quadwords (r0-r3)
r0 = a1 * b1 + c0, r1 = a3 * b3 + c1 |
VPMADCSWD
|
Multiply Add Accumulate (with Saturation) Word to Doubleword | 2x8 words (a0-a7, b0-b7) + 4 doublewords (c0-c3) → 4 doublewords (r0-r3)
r0 = a0 * b0 + a1 * b1 + c0, r1 = a2 * b2 + a3 * b3 + c1, .. |
Целочисленное векторное горизонтальное суммирование
[править | править код]Инструкции горизонтального суммирования, складывают соседние значения входного вектора друг с другом. Выходной размер в приведенных ниже инструкциях указывает, насколько широкие операции суммирования выполнять. Например, горизонтальная сумма «байт в слово» складывает по два байта за раз и возвращает результат в виде вектора слов; «байт в четверное слово» складывает восемь байт вместе за один шаг и возвращает результат в виде вектора quadword. Шесть дополнительных операций горизонтального сложения и вычитания были реализованы в SSSE3, но они работают только на двух входных векторах и производят по две операции.
Инструкция | Описание[9] | Операция |
---|---|---|
VPHADDBW
|
Horizontal add two signed/unsigned bytes to word | 16 bytes (a0-a15) → 8 words (r0-r7)
r0 = a0+a1, r1 = a2+a3, r2 = a4+a5, … |
VPHADDBD
|
Horizontal add four signed/unsigned bytes to doubleword | 16 bytes (a0-a15) → 4 doublewords (r0-r3)
r0 = a0+a1+a2+a3, r1 = a4+a5+a6+a7, … |
VPHADDBQ
|
Horizontal add eight signed/unsigned bytes to quadword | 16 bytes (a0-a15) → 2 quadwords (r0-r1)
r0 = a0+a1+a2+a3+a4+a5+a6+a7, … |
VPHADDWD
|
Horizontal add two signed/unsigned words to doubleword | 8 words (a0-a7) → 4 doublewords (r0-r3)
r0 = a0+a1, r1 = a2+a3, r2 = a4+a5, … |
VPHADDWQ
|
Horizontal add four signed/unsigned words to quadword | 8 words (a0-a7) → 2 quadwords (r0-r1)
r0 = a0+a1+a2+a3, r1 = a4+a5+a6+a7 |
VPHADDDQ
|
Horizontal add two signed/unsigned doublewords to quadword | 4 doublewords (a0-a3) → 2 quadwords (r0-r1)
r0 = a0+a1, r1 = a2+a3 |
VPHSUBBW
|
Horizontal subtract two signed bytes to word | 16 bytes (a0-a15) → 8 words (r0-r7)
r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, … |
VPHSUBWD
|
Horizontal subtract two signed words to doubleword | 8 words (a0-a7) → 4 doublewords (r0-r3)
r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, … |
VPHSUBDQ
|
Horizontal subtract two signed doublewords to quadword | 4 doublewords (a0-a3) → 2 quadwords (r0-r1)
r0 = a0-a1, r1 = a2-a3 |
Целочисленное векторное сравнение
[править | править код]Этот набор векторных инструкций использует поле immediate кодировки в качестве дополнительного аргумента, который определяет какое именно сравнение выполнять. Есть восемь возможных вариантов сравнения для каждой инструкции. Векторы сравниваются и все сравнения, оказавшиеся истинными устанавливают все биты в соответствующем регистре назначения в 1, а ложные сравнения — устанавливают биты в 0. Этот результат может быть непосредственно использован в инструкции VPCMOV — векторизованной условной пересылке.
Инструкция | Описание[9] | immediate | Сравнение | |
---|---|---|---|---|
VPCOMB
|
Compare Vector Signed Bytes | 000 | Меньше | |
VPCOMW
|
Compare Vector Signed Words | 001 | Меньше или равно | |
VPCOMD
|
Compare Vector Signed Doublewords | 010 | Больше | |
VPCOMQ
|
Compare Vector Signed Quadwords | 011 | Больше чем или равный | |
VPCOMUB
|
Compare Vector Unsigned Bytes | 100 | Равны | |
VPCOMUW
|
Compare Vector Unsigned Words | 101 | Не Равны | |
VPCOMUD
|
Compare Vector Unsigned Doublewords | 110 | Всегда ложное | |
VPCOMUQ
|
Compare Vector Unsigned Quadwords | 111 | Всегда истинное |
Векторная условная пересылка
[править | править код]VPCMOV работает как побитовый вариант инструкций blend из SSE4. Для каждого бита операнда-селектора, равного 1, выделяет итоговый бит из первого источника, если же бит в селекторе равен 0, выбирает итоговый бит из второго источника. При использовании совместно с векторными операциями сравнения XOP позволяет реализовать векторный тернарный оператор, или, если в роли второго аргумента выступает регистр назначения, векторную условную пересылку (CMOV).
Инструкция | Описание[9] |
---|---|
VPCMOV
|
Vector Conditional Move |
Целочисленный векторный сдвиг и поворот
[править | править код]Инструкции сдвига отличаются от подобных в наборе инструкций SSE2 в том, что они могут сдвигать каждый элемент на разное количество бит, используя упакованные знаковые целые числа из векторного регистра. Знак указывает направление сдвига или поворота, положительные значения для сдвига влево и отрицательные — для сдвига вправо[10] Корпорация Intel реализовала иной, несовместимый набор переменных векторных сдвигов и поворотов а AVX2.[11]
Инструкция | Описание[9] |
---|---|
VPROTB
|
Packed Rotate Bytes |
VPROTW
|
Packed Rotate Words |
VPROTD
|
Packed Rotate Doublewords |
VPROTQ
|
Packed Rotate Quadwords |
VPSHAB
|
Packed Shift Arithmetic Bytes |
VPSHAW
|
Packed Shift Arithmetic Words |
VPSHAD
|
Packed Shift Arithmetic Doublewords |
VPSHAQ
|
Packed Shift Arithmetic Quadwords |
VPSHLB
|
Packed Shift Logical Bytes |
VPSHLW
|
Packed Shift Logical Words |
VPSHLD
|
Packed Shift Logical Doublewords |
VPSHLQ
|
Packed Shift Logical Quadwords |
Векторная перестановка
[править | править код]VPPERM — единая инструкция, которая сочетает в себе инструкции PALIGNR и PSHUFB из SSSE3 и расширяет их. Некоторые сравнивают её с AltiVec инструкцией VPERM.[12] Она принимает три регистра на вход: два источника и селектор (третий). Каждый байт в селекторе выбирает один из байтов в одном из двух источников для записи в выходной регистр. Селектор может выбирать нулевой байт, менять порядок бит на обратный, повторять наиболее значащий бит. Все эффекты или входы дополнительно могут быть инвертированы.
Инструкции VPPERMIL2PD и VPPERMIL2PS — двухоперандные варианты инструкций VPERMILPD и VPERMILPS из набора AVX. Они как и VPPERM могут выбрать выходное значение из любых полей двух входных регистров.
Инструкция | Описание[9] |
---|---|
VPPERM
|
Packed Permute Byte |
VPPERMIL2PD
|
Permute Two-Source Double-Precision Floating-Point |
VPPERMIL2PS
|
Permute Two-Source Single-Precision Floating-Point |
Выделение дробной части чисел с плавающей запятой
[править | править код]Эти инструкции выделяют дробную часть из упакованных чисел с плавающей запятой. Такая часть числа может быть потеряна при преобразовании их в целое.
Инструкция | Описание[9] |
---|---|
VFRCZPD
|
Extract Fraction Packed Double-Precision Floating-Point |
VFRCZPS
|
Extract Fraction Packed Single-Precision Floating-Point |
VFRCZSD
|
Extract Fraction Scalar Double-Precision Floating-Point |
VFRCZSS
|
Extract Fraction Scalar Single-Precision Floating Point |
См. также
[править | править код]Примечания
[править | править код]- ↑ 1 2 3 4 Dave Christie (2009-05-07), Striking a balance, AMD Developer blogs, Архивировано 4 ноября 2013, Дата обращения: 4 ноября 2013
{{citation}}
: Неизвестный параметр|archivelink=
игнорируется (справка) Источник . Дата обращения: 12 января 2020. Архивировано 9 ноября 2013 года. - ↑ 1 2 AMD64 Architecture Programmer’s Manual Volume 6: 128-Bit and 256-Bit XOP, FMA4 and CVT16 Instructions (PDF), AMD, 2009-05-01, Архивировано (PDF) 21 августа 2018, Дата обращения: 21 ноября 2016 Источник . Дата обращения: 21 ноября 2016. Архивировано 21 августа 2018 года.
- ↑ [1] Архивная копия от 14 сентября 2017 на Wayback Machine "But with Zen being a clean-sheet design, there are some instruction set extensions found in Bulldozer processors not found in Zen/znver1. Those no longer present include FMA4 and XOP."
- ↑ Stop the instruction set war, Agner Fog, 2009-12-05, Архивировано 12 мая 2022, Дата обращения: 21 ноября 2016 Источник . Дата обращения: 21 ноября 2016. Архивировано 12 мая 2022 года.
- ↑ Intel AVX Programming Reference, March 2008, Архивировано из оригинала (PDF) 7 августа 2011, Дата обращения: 17 января 2012 Источник . Дата обращения: 21 ноября 2016. Архивировано из оригинала 7 августа 2011 года.
- ↑ Intel Advanced Vector Extensions Programming Reference, January 2009, Архивировано из оригинала 29 февраля 2012, Дата обращения: 17 января 2012 Источник . Дата обращения: 21 ноября 2016. Архивировано 29 февраля 2012 года.
- ↑ [https://web.archive.org/web/20160304033017/https://sourceware.org/ml/binutils/2015-03/msg00078.html Архивная копия от 4 марта 2016 на Wayback Machine Gopalasubramanian, G — [PATCH] add znver1 processor]
- ↑ [https://web.archive.org/web/20160307134059/https://sourceware.org/ml/binutils/2015-08/msg00039.html Архивная копия от 7 марта 2016 на Wayback Machine Pawar, Amit — [PATCH] Remove CpuFMA4 From Znver1 CPU Flags]
- ↑ 1 2 3 4 5 6 7 AMD64 Architecture Programmer's Manual, Volume4: 128-Bit and 256-Bit Media Instructions (PDF). AMD. Дата обращения: 13 января 2014. Архивировано 14 ноября 2021 года.
- ↑ New "Bulldozer" and "Piledriver" Instructions (PDF). AMD. Дата обращения: 13 января 2014. Архивировано 7 января 2013 года.
- ↑ Intel Architecture Instruction Set Extensions Programming Reference (PDF). Intel. Дата обращения: 29 января 2014. Архивировано из оригинала 1 февраля 2014 года.
- ↑ Buldozer x264 optimisations . Дата обращения: 13 января 2014. Архивировано из оригинала 15 января 2014 года.