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

VPMACSSWW

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

VPMACSSWD

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

VPMACSSDD

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

VPMACSSDQL

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

VPMACSSDQH

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

VPMADCSSWD

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

VPHADDUBW

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

VPHADDUBD

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

VPHADDUBQ

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

VPHADDUWD

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

VPHADDUWQ

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

VPHADDUDQ

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. 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 года.
  2. 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 года.
  3. [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."
  4. Stop the instruction set war, Agner Fog, 2009-12-05, Архивировано 12 мая 2022, Дата обращения: 21 ноября 2016 Источник. Дата обращения: 21 ноября 2016. Архивировано 12 мая 2022 года.
  5. Intel AVX Programming Reference, March 2008, Архивировано из оригинала (PDF) 7 августа 2011, Дата обращения: 17 января 2012 Источник. Дата обращения: 21 ноября 2016. Архивировано из оригинала 7 августа 2011 года.
  6. Intel Advanced Vector Extensions Programming Reference, January 2009, Архивировано из оригинала 29 февраля 2012, Дата обращения: 17 января 2012 Источник. Дата обращения: 21 ноября 2016. Архивировано 29 февраля 2012 года.
  7. [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]
  8. [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]
  9. 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 года.
  10. New "Bulldozer" and "Piledriver" Instructions (PDF). AMD. Дата обращения: 13 января 2014. Архивировано 7 января 2013 года.
  11. Intel Architecture Instruction Set Extensions Programming Reference (PDF). Intel. Дата обращения: 29 января 2014. Архивировано из оригинала 1 февраля 2014 года.
  12. Buldozer x264 optimisations. Дата обращения: 13 января 2014. Архивировано из оригинала 15 января 2014 года.