Минимальный продуктовый набор
- 1 year ago
- 0
- 0
XOP (от англ. eXtended Operations — расширенные операции ) — расширение набора инструкций x86/AMD64, анонсированное корпорацией AMD 1 мая 2009 года.
Представляет собой расширение и развитие идей, реализованных в 128-битых инструкциях SSE в архитектурах x86 / x86-64 . Реализован начиная с микроархитектуры микропроцессоров AMD Bulldozer (12 октября 2011). Не поддерживается процессорами AMD начиная с микроархитектуры Zen (Ryzen, EPIC; 2017 год) .
В набор инструкций XOP входит несколько различных типов векторных инструкций, так как он был первоначально задуман как крупное обновление SSE . Большинство инструкций являются целочисленными, но в набор также входят инструкции для перестановки чисел с плавающей запятой и инструкции экстракции дробной части.
XOP является переработкой части идей, изначально предназначенных для SSE5 . Набор был изменен, чтобы сделать его более похожим на AVX , но при этом не дублировать инструкции. Совпадающие с AVX инструкции были удалены или перемещены в отдельные расширения, например FMA4 (векторное умножение-сложение для плавающей запятой) и (преобразования чисел половинной-точности , реализовано корпорацией Intel как F16C).
Все инструкции SSE5, для которых был аналог или эквивалент в наборах AVX и FMA3 , используют кодировки, предложенные корпорацией Intel. Целочисленные инструкции без эквивалентов в AVX были классифицированы как расширение XOP. Инструкции XOP кодируются кодами операций, начинающимися с байта 0x8F ( шестнадцатеричное значение), но в остальном используют схему кодирования, почти идентичную AVX с 3-байтовым префиксом VEX.
Отдельные эксперты (Agner Fog) расценили это как признак того, что корпорация 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.
В марте 2015 года, компания AMD раскрыла в описании патча для пакета GNU Binutils что Zen , третье поколение архитектуры x86-64, в первой редакции (znver1 — Zen, версия 1), не будет поддерживать TBM, FMA4, XOP and LWP инструкции, разработанные специально для семейства микроархитектур «Bulldozer».
Данные инструкции являются целочисленным аналогом наборов инструкций FMA . Все они — четырехоперандные инструкции, похожие на FMA4, и все они работают над знаковыми целыми числами.
Инструкция | Описание | Операция |
---|---|---|
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, . |
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 , но они работают только на двух входных векторах и производят по две операции.
Инструкция | Описание | Операция |
---|---|---|
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 — векторизованной условной пересылке.
Инструкция | Описание | 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 позволяет реализовать векторный тернарный оператор, или, если в роли второго аргумента выступает регистр назначения, векторную условную пересылку ( ).
Инструкция | Описание |
---|---|
VPCMOV
|
Vector Conditional Move |
Инструкции сдвига отличаются от подобных в наборе инструкций SSE2 в том, что они могут сдвигать каждый элемент на разное количество бит, используя упакованные знаковые целые числа из векторного регистра. Знак указывает направление сдвига или поворота, положительные значения для сдвига влево и отрицательные — для сдвига вправо Корпорация Intel реализовала иной, несовместимый набор переменных векторных сдвигов и поворотов а AVX2.
Инструкция | Описание |
---|---|
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. Она принимает три регистра на вход: два источника и селектор (третий). Каждый байт в селекторе выбирает один из байтов в одном из двух источников для записи в выходной регистр. Селектор может выбирать нулевой байт, менять порядок бит на обратный, повторять наиболее значащий бит. Все эффекты или входы дополнительно могут быть инвертированы.
Инструкции VPPERMIL2PD и VPPERMIL2PS — двухоперандные варианты инструкций VPERMILPD и VPERMILPS из набора AVX . Они как и VPPERM могут выбрать выходное значение из любых полей двух входных регистров.
Инструкция | Описание |
---|---|
VPPERM
|
Packed Permute Byte |
VPPERMIL2PD
|
Permute Two-Source Double-Precision Floating-Point |
VPPERMIL2PS
|
Permute Two-Source Single-Precision Floating-Point |
Эти инструкции выделяют дробную часть из упакованных чисел с плавающей запятой. Такая часть числа может быть потеряна при преобразовании их в целое.
Инструкция | Описание |
---|---|
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 |
{{
citation
}}
:
Неизвестный параметр
|archivelink=
игнорируется (
справка
)
. Дата обращения: 12 января 2020. Архивировано 9 ноября 2013 года.