XOP (набор инструкций)

30.05.2022


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 (векторное умножение-сложение для плавающей запятой) и 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 and LWP инструкции, разработанные специально для семейства микроархитектур «Bulldozer».

Целочисленное векторное умножение-сложение

Данные инструкции являются целочисленным аналогом наборов инструкций FMA. Все они — четырехоперандные инструкции, похожие на FMA4, и все они работают над знаковыми целыми числами.

Целочисленное векторное горизонтальное суммирование

Инструкции горизонтального суммирования, складывают соседние значения входного вектора друг с другом. Выходной размер в приведенных ниже инструкциях указывает, насколько широкие операции суммирования выполнять. Например, горизонтальная сумма «байт в слово» складывает по два байта за раз и возвращает результат в виде вектора слов; «байт в четверное слово» складывает восемь байт вместе за один шаг и возвращает результат в виде вектора quadword. Шесть дополнительных операций горизонтального сложения и вычитания были реализованы в SSSE3, но они работают только на двух входных векторах и производят по две операции.

Целочисленное векторное сравнение

Этот набор векторных инструкций использует поле immediate кодировки в качестве дополнительного аргумента, который определяет какое именно сравнение выполнять. Есть восемь возможных вариантов сравнения для каждой инструкции. Векторы сравниваются и все сравнения, оказавшиеся истинными устанавливают все биты в соответствующем регистре назначения в 1, а ложные сравнения — устанавливают биты в 0. Этот результат может быть непосредственно использован в инструкции VPCMOV — векторизованной условной пересылке.

Векторная условная пересылка

VPCMOV работает как побитовый вариант инструкций blend из SSE4. Для каждого бита операнда-селектора, равного 1, выделяет итоговый бит из первого источника, если же бит в селекторе равен 0, выбирает итоговый бит из второго источника. При использовании совместно с векторными операциями сравнения XOP позволяет реализовать векторный тернарный оператор, или, если в роли второго аргумента выступает регистр назначения, векторную условную пересылку (CMOV).

Целочисленный векторный сдвиг и поворот

Инструкции сдвига отличаются от подобных в наборе инструкций SSE2 в том, что они могут сдвигать каждый элемент на разное количество бит, используя упакованные знаковые целые числа из векторного регистра. Знак указывает направление сдвига или поворота, положительные значения для сдвига влево и отрицательные — для сдвига вправо Корпорация Intel реализовала иной, несовместимый набор переменных векторных сдвигов и поворотов а AVX2.

Векторная перестановка

VPPERM — единая инструкция, которая сочетает в себе инструкции PALIGNR и PSHUFB из SSSE3 и расширяет их. Некоторые сравнивают её с AltiVec инструкцией VPERM. Она принимает три регистра на вход: два источника и селектор (третий). Каждый байт в селекторе выбирает один из байтов в одном из двух источников для записи в выходной регистр. Селектор может выбирать нулевой байт, менять порядок бит на обратный, повторять наиболее значащий бит. Все эффекты или входы дополнительно могут быть инвертированы.

Инструкции VPPERMIL2PD и VPPERMIL2PS — двухоперандные варианты инструкций VPERMILPD и VPERMILPS из набора AVX. Они как и VPPERM могут выбрать выходное значение из любых полей двух входных регистров.

Выделение дробной части чисел с плавающей запятой

Эти инструкции выделяют дробную часть из упакованных чисел с плавающей запятой. Такая часть числа может быть потеряна при преобразовании их в целое.