XOP (от — расширенные операции) — расширение набора инструкций x86/AMD64, анонсированное корпорацией AMD 1 мая 2009 года.
Представляет собой расширение и развитие идей, реализованных в 128-битых инструкциях SSE в архитектурах x86/x86-64. Реализован начиная с микроархитектуры микропроцессоров AMD Bulldozer (12 октября 2011). Не поддерживается процессорами AMD начиная с микроархитектуры Zen (Ryzen, EPYC; 2017 год) "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.".
В набор инструкций XOP входит несколько различных типов векторных инструкций, так как он был первоначально задуман как крупное обновление SSE. Большинство инструкций являются целочисленными, но в набор также входят инструкции для перестановки чисел с плавающей запятой и инструкции экстракции дробной части.
История
XOP является переработкой части идей, изначально предназначенных для SSE5. Набор был изменён, чтобы сделать его более похожим на AVX, но при этом не дублировать инструкции. Совпадающие с AVX инструкции были удалены или перемещены в отдельные расширения, например FMA4 (векторное умножение-сложение для плавающей запятой) и CVT16 (преобразования чисел половинной-точности, реализовано корпорацией 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 и LWP инструкции, разработанные специально для семейства микроархитектур «Bulldozer». Gopalasubramanian, G — [PATCH] add znver1 processor Pawar, Amit — [PATCH] Remove CpuFMA4 From Znver1 CPU Flags
Целочисленное векторное умножение-сложение Данные инструкции являются целочисленным аналогом наборов инструкций FMA. Все они — четырёхоперандные инструкции, похожие на FMA4, и все они работают над знаковыми целыми числами.
Инструкция Описание Операция 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, . 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, но они работают только на двух входных векторах и производят по две операции.
Инструкция Описание Операция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 — векторизованной условной пересылке.
Инструкция Описание 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).
Инструкция Описание 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
См. также AVX CVT16 FMA4 SSE5
Примечания
Категория:Инструкции x86 Категория:Расширения архитектуры x86 Категория:AMD