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, и все они работают над знаковыми целыми числами.
Целочисленное векторное горизонтальное суммированиеИнструкции горизонтального суммирования, складывают соседние значения входного вектора друг с другом. Выходной размер в приведенных ниже инструкциях указывает, насколько широкие операции суммирования выполнять. Например, горизонтальная сумма «байт в слово» складывает по два байта за раз и возвращает результат в виде вектора слов; «байт в четверное слово» складывает восемь байт вместе за один шаг и возвращает результат в виде вектора quadword. Шесть дополнительных операций горизонтального сложения и вычитания были реализованы в SSSE3, но они работают только на двух входных векторах и производят по две операции.
Целочисленное векторное сравнениеЭтот набор векторных инструкций использует поле immediate кодировки в качестве дополнительного аргумента, который определяет какое именно сравнение выполнять. Есть восемь возможных вариантов сравнения для каждой инструкции. Векторы сравниваются и все сравнения, оказавшиеся истинными устанавливают все биты в соответствующем регистре назначения в 1, а ложные сравнения — устанавливают биты в 0. Этот результат может быть непосредственно использован в инструкции VPCMOV — векторизованной условной пересылке.
Векторная условная пересылкаVPCMOV работает как побитовый вариант инструкций blend из SSE4. Для каждого бита операнда-селектора, равного 1, выделяет итоговый бит из первого источника, если же бит в селекторе равен 0, выбирает итоговый бит из второго источника. При использовании совместно с векторными операциями сравнения XOP позволяет реализовать векторный тернарный оператор, или, если в роли второго аргумента выступает регистр назначения, векторную условную пересылку (CMOV).
Целочисленный векторный сдвиг и поворотИнструкции сдвига отличаются от подобных в наборе инструкций SSE2 в том, что они могут сдвигать каждый элемент на разное количество бит, используя упакованные знаковые целые числа из векторного регистра. Знак указывает направление сдвига или поворота, положительные значения для сдвига влево и отрицательные — для сдвига вправо[10] Корпорация Intel реализовала иной, несовместимый набор переменных векторных сдвигов и поворотов а AVX2.[11]
Векторная перестановкаVPPERM — единая инструкция, которая сочетает в себе инструкции PALIGNR и PSHUFB из SSSE3 и расширяет их. Некоторые сравнивают её с AltiVec инструкцией VPERM.[12] Она принимает три регистра на вход: два источника и селектор (третий). Каждый байт в селекторе выбирает один из байтов в одном из двух источников для записи в выходной регистр. Селектор может выбирать нулевой байт, менять порядок бит на обратный, повторять наиболее значащий бит. Все эффекты или входы дополнительно могут быть инвертированы. Инструкции VPPERMIL2PD и VPPERMIL2PS — двухоперандные варианты инструкций VPERMILPD и VPERMILPS из набора AVX. Они как и VPPERM могут выбрать выходное значение из любых полей двух входных регистров.
Выделение дробной части чисел с плавающей запятойЭти инструкции выделяют дробную часть из упакованных чисел с плавающей запятой. Такая часть числа может быть потеряна при преобразовании их в целое.
См. такжеПримечания
|