XOP (набор инструкций)
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, <http://developer.amd.com/community/blog/2009/05/06/striking-a-balance/>. Проверено 4 ноября 2013. Архивировано 9 ноября 2013 года.
- ↑ 1 2 AMD64 Architecture Programmer’s Manual Volume 6: 128-Bit and 256-Bit XOP, FMA4 and CVT16 Instructions, AMD, May 1, 2009, <http://support.amd.com/TechDocs/43479.pdf> Архивная копия от 21 августа 2018 на Wayback Machine
- ↑ [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, December 5, 2009, <http://www.agner.org/optimize/blog/read.php?i=25> Архивная копия от 12 мая 2022 на Wayback Machine
- ↑ Intel AVX Programming Reference, March 2008, <http://softwarecommunity.intel.com/isn/downloads/intelavx/Intel-AVX-Programming-Reference-31943302.pdf>. Проверено 17 января 2012. Архивная копия от 7 августа 2011 на Wayback Machine
- ↑ Intel Advanced Vector Extensions Programming Reference, January 2009, <http://software.intel.com/file/10069>. Проверено 17 января 2012. Архивная копия от 29 февраля 2012 на Wayback Machine
- ↑ [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 года.