Набор инструкций для манипуляций с битами x86
Наборы инструкций битовой манипуляции ( наборы BMI расширениями x86 архитектуры набора команд для микропроцессоров Intel ) являются и AMD . Целью этих наборов команд является повышение скорости манипуляций с битами . Все инструкции в этих наборах не являются SIMD общего назначения и работают только с регистрами .
Intel опубликовала два набора: BMI (теперь называемый BMI1) и BMI2; оба они были представлены на микроархитектуре Haswell с функциями соответствия BMI1, предлагаемыми набором инструкций AMD ABM, и BMI2, расширяющим их. Еще два набора были опубликованы AMD: ABM ( Advanced Bit Manipulation , которое также является подмножеством SSE4a, реализованным Intel как часть SSE4.2 и BMI1), и TBM ( Trailing Bit Manipulation , расширение, представленное в Piledriver процессорах на базе как расширение BMI1, но снова исключено из процессоров на базе Zen ). [1]
ABM (расширенное управление битами)
[ редактировать ]AMD была первой, кто представил инструкции, которые теперь образуют Intel BMI1, как часть своего набора инструкций ABM ( Advanced Bit Manipulation ), а позже добавила поддержку новых инструкций Intel BMI2. Сегодня AMD рекламирует доступность этих функций через процессорные флаги Intel BMI1 и BMI2 и инструктирует программистов использовать их соответствующим образом. [2]
Хотя Intel считает POPCNT
как часть SSE4.2 и LZCNT
в рамках BMI1 и Intel, и AMD объявляют о наличии этих двух инструкций по отдельности. POPCNT
имеет отдельный флаг CPUID с тем же именем, а Intel и AMD используют флаг AMD ABM
флаг для обозначения LZCNT
поддержка (поскольку LZCNT
в сочетании с BMI1 и BMI2 завершает расширенный набор команд ABM). [2] [3]
Кодирование | Инструкция | Описание [4] |
---|---|---|
F3 0F B8 /r
|
POPCNT
|
Численность населения |
F3 0F BD /r
|
LZCNT
|
Ведущие нули считаются |
LZCNT
связано с обратным битовым сканированием ( BSR
), но устанавливает флаги ZF (если результат равен нулю) и CF (если источник равен нулю), а не устанавливает флаги ZF (если источник равен нулю). Кроме того, он выдает определенный результат (размер исходного операнда в битах), если исходный операнд равен нулю. Для ненулевого аргумента сумма LZCNT
и BSR
результатом является разрядность аргумента минус 1 (например, если 32-битный аргумент 0x000f0000
, LZCNT дает 12, а BSR дает 19).
Кодировка LZCNT
такова, что если ABM не поддерживается, то BSR
Вместо этого выполняется инструкция. [4] : 227
BMI1 (Набор инструкций битового управления 1)
[ редактировать ]Инструкции, приведенные ниже, включены с помощью BMI
бит в CPUID. Intel официально считает LZCNT
как часть BMI, но рекламирует LZCNT
поддержка с помощью ABM
Флаг функции CPUID. [3] BMI1 доступен в AMD Jaguar , [5] Пиледрайвер [6] и более новых процессорах, а также в процессорах Intel Haswell [7] и новые процессоры.
Кодирование | Инструкция | Описание [3] | Эквивалентное выражение C [8] [9] [10] |
---|---|---|---|
VEX.LZ.0F38 F2 /r
|
ANDN
|
Логично и нет | ~x & y
|
VEX.LZ.0F38 F7 /r
|
BEXTR
|
Извлечение битового поля (с регистром) | (src >> start) & ((1 << len) - 1)
|
VEX.LZ.0F38 F3 /3
|
BLSI
|
Извлечь младший изолированный бит | x & -x
|
VEX.LZ.0F38 F3 /2
|
BLSMSK
|
Получить маску до самого низкого установленного бита | x ^ (x - 1)
|
VEX.LZ.0F38 F3 /1
|
BLSR
|
Сбросить младший установленный бит | x & (x - 1)
|
F3 0F BC /r
|
TZCNT
|
Подсчитайте количество конечных нулевых битов | 31 + (!x)
- (((x & -x) & 0x0000FFFF) ? 16 : 0)
- (((x & -x) & 0x00FF00FF) ? 8 : 0)
- (((x & -x) & 0x0F0F0F0F) ? 4 : 0)
- (((x & -x) & 0x33333333) ? 2 : 0)
- (((x & -x) & 0x55555555) ? 1 : 0)
|
TZCNT
практически идентично Bit Scan Forward ( BSF
), но устанавливает флаги ZF (если результат равен нулю) и CF (если источник равен нулю), а не устанавливает флаги ZF (если источник равен нулю). Для ненулевого аргумента результат TZCNT
и BSF
равен.
Как и в случае с LZCNT
, кодировка TZCNT
такова, что если ИМТ1 не поддерживается, то BSF
Вместо этого выполняется инструкция. [4] : 352
BMI2 (Набор инструкций битового управления 2)
[ редактировать ]Intel представила BMI2 вместе с BMI1 в своей линейке процессоров Haswell. Только AMD выпустила процессоры с поддержкой BMI1 без BMI2; BMI2 поддерживается архитектурой AMD Excavator и более новыми версиями. [11]
Кодирование | Инструкция | Описание |
---|---|---|
VEX.LZ.0F38 F5 /r
|
BZHI
|
Нулевые старшие биты, начиная с указанной позиции бита [src & (1 << inx)-1]; |
VEX.LZ.F2.0F38 F6 /r
|
MULX
|
Беззнаковое умножение, не затрагивающее флаги и произвольные регистры назначения. |
VEX.LZ.F2.0F38 F5 /r
|
PDEP
|
Параллельный депозит битов |
VEX.LZ.F3.0F38 F5 /r
|
PEXT
|
Извлечение параллельных битов |
VEX.LZ.F2.0F3A F0 /r ib
|
RORX
|
Логический поворот вправо, не затрагивая флаги |
VEX.LZ.F3.0F38 F7 /r
|
SARX
|
Сдвинуть арифметику вправо, не затрагивая флаги |
VEX.LZ.F2.0F38 F7 /r
|
SHRX
|
Логический сдвиг вправо, не затрагивая флаги |
VEX.LZ.66.0F38 F7 /r
|
SHLX
|
Логический сдвиг влево, не затрагивая флаги |
Параллельное внесение и извлечение битов
[ редактировать ]The PDEP
и PEXT
инструкции — это новые обобщенные инструкции сжатия и расширения на уровне битов. Они принимают два входа; один является источником, а другой — селектором. Селектор — это растровое изображение, выбирающее биты, которые необходимо упаковать или распаковать. PEXT
копирует выбранные биты из источника в смежные младшие биты места назначения; биты назначения более высокого порядка очищаются. PDEP
делает обратное для выбранных битов: смежные младшие биты копируются в выбранные биты места назначения; другие биты назначения очищаются. Это можно использовать для извлечения любого битового поля входных данных и даже для выполнения большого количества перетасовок на уровне битов, которые раньше были бы дорогостоящими. Хотя то, что делают эти инструкции, похоже на сбора и рассеяния на уровне битов, SIMD-инструкции PDEP
и PEXT
инструкции (как и остальные наборы инструкций BMI) работают с регистрами общего назначения. [12]
Инструкции доступны в 32-битной и 64-битной версиях. Пример использования произвольного источника и селектора в 32-битном режиме:
Инструкция | Маска выбора | Источник | Место назначения |
---|---|---|---|
PEXT |
0xff00fff0 |
0x12345678 |
0x00012567
|
PDEP |
0xff00fff0 |
0x00012567 |
0x12005670
|
Процессоры AMD до Zen 3 [13] реализующие PDEP и PEXT, делают это в микрокоде с задержкой 18 тактов. [14] вместо (Дзен 3) 3 цикла. [15] В результате на этих процессорах зачастую быстрее использовать другие инструкции. [16]
TBM (манипуляция завершающими битами)
[ редактировать ]TBM состоит из инструкций, дополняющих набор команд, запущенный BMI1; их взаимодополняющий характер означает, что их не обязательно нужно использовать напрямую, но они могут быть созданы оптимизирующим компилятором, если он поддерживается. AMD представила TBM вместе с BMI1 в своем Piledriver [6] линейка процессоров; более поздние процессоры AMD Jaguar и Zen не поддерживают TBM. [5] Никакие процессоры Intel (по крайней мере, через Alder Lake ) не поддерживают TBM.
Кодирование | Инструкция | Описание [4] | Эквивалентное выражение C [17] [9] |
---|---|---|---|
XOP.LZ.0A 10 /r id
|
BEXTR
|
Извлечение битового поля (с немедленным) | (src >> start) & ((1 << len) - 1)
|
XOP.LZ.09 01 /1
|
BLCFILL
|
Заполнить с самого низкого чистого бита | x & (x + 1)
|
XOP.LZ.09 02 /6
|
BLCI
|
Изолировать самый низкий чистый бит | x | ~(x + 1)
|
XOP.LZ.09 01 /5
|
BLCIC
|
Изолировать младший чистый бит и дополнить | ~x & (x + 1)
|
XOP.LZ.09 02 /1
|
BLCMSK
|
Маска из младшего чистого бита | x ^ (x + 1)
|
XOP.LZ.09 01 /3
|
BLCS
|
Установить младший бит очистки | x | (x + 1)
|
XOP.LZ.09 01 /2
|
BLSFILL
|
Заполнить с наименьшего установленного бита | x | (x - 1)
|
XOP.LZ.09 01 /6
|
BLSIC
|
Изолировать младший установленный бит и дополнить | ~x | (x - 1)
|
XOP.LZ.09 01 /7
|
T1MSKC
|
Обратная маска из замыкающих | ~x | (x + 1)
|
XOP.LZ.09 01 /4
|
TZMSK
|
Маска от конечных нулей | ~x & (x - 1)
|
Поддержка процессоров
[ редактировать ]- Интел
- Процессоры Intel Nehalem и новее (например, Sandy Bridge , Ivy Bridge ) (поддерживается POPCNT)
- Процессоры Intel Silvermont (поддержка POPCNT)
- Процессоры Intel Haswell и новее (например, Skylake , Broadwell ) (поддерживаются ABM, BMI1 и BMI2) [7]
- АМД
- Процессоры на базе K10 (поддержка ABM)
- «Кошачьи» маломощные процессоры
- Процессоры на базе Bobcat (поддержка ABM) [18]
- Процессоры на базе Jaguar и новее (поддерживаются ABM и BMI1) [5]
- Процессоры на базе Puma и новее (поддерживаются ABM и BMI1) [5]
- Процессоры «Тяжелое оборудование»
- Процессоры на базе Bulldozer (поддержка ABM)
- Процессоры на базе Piledriver (поддерживаются ABM, BMI1 и TBM) [1]
- Процессоры на базе Steamroller (поддерживаются ABM, BMI1 и TBM)
- Процессоры на базе экскаваторов и новее (поддерживаются ABM, BMI1, BMI2 и TBM; микрокодирование PEXT и PDEP) [11]
- На основе Zen , на основе Zen+ и на основе Zen 2 [19] процессоры (поддерживаются ABM, BMI1 и BMI2; PEXT и PDEP с микрокодированием)
- Процессоры Zen 3 и новее (поддерживаются ABM, BMI1 и BMI2; полная аппаратная реализация)
Обратите внимание, что поддержка расширения инструкций означает, что процессор способен выполнять поддерживаемые инструкции в целях совместимости программного обеспечения. При этом процессор может работать неэффективно. Например, процессоры Excavator с процессорами Zen 2 реализуют инструкции PEXT и PDEP с использованием микрокода, в результате чего инструкции выполняются значительно медленнее, чем такое же поведение, воссозданное с использованием других инструкций. [20] (Программный метод под названием «zp7» на этих машинах фактически работает быстрее.) [21] Для достижения оптимальной производительности разработчикам компиляторов рекомендуется использовать отдельные инструкции в расширениях на основе профилей производительности конкретной архитектуры, а не доступности расширений.
См. также
[ редактировать ]- Расширенные векторные расширения (AVX)
- Набор инструкций AES
- Набор инструкций CLMUL
- F16C
- Набор инструкций FMA
- Intel ADX
- Набор инструкций XOP
- Коды операций Intel BCD (также используются для продвинутых методов манипуляции битами)
Ссылки
[ редактировать ]- ^ Перейти обратно: а б «Новые инструкции для «Бульдозера» и «Сваебойщика»» (PDF) . Проверено 3 января 2014 г.
- ^ Перейти обратно: а б «Руководство программиста по архитектуре AMD64, том 3: универсальные и системные инструкции» (PDF) . Проверено 20 июля 2022 г.
- ^ Перейти обратно: а б с «Справочник по программированию Intel Advanced Vector Extensions» (PDF) . intel.com . Интел . Июнь 2011 года . Проверено 3 января 2014 г.
- ^ Перейти обратно: а б с д «Руководство программиста по архитектуре AMD64, том 3: универсальные и системные инструкции» (PDF) . Версия 3.32. АМД . Март 2021 г. Архивировано (PDF) из оригинала 8 апреля 2021 г. Проверено 8 апреля 2021 г.
- ^ Перейти обратно: а б с д «Техническое описание семейства AMD серии A на 16 часов» (PDF) . amd.com . АМД . Октябрь 2013 года . Проверено 2 января 2014 г.
- ^ Перейти обратно: а б Холлингсворт, Брент. «Новые инструкции «Бульдозер» и «Сваебойщик»» (PDF) . Advanced Micro Devices, Inc. Проверено 11 декабря 2014 г.
- ^ Перейти обратно: а б Локтюхин, Макс. «Как обнаружить поддержку новых инструкций в семействе процессоров Intel® Core™ 4-го поколения» . www.intel.com . Интел . Проверено 11 декабря 2014 г.
- ^ «bmiintrin.h из GCC 4.8» . Проверено 17 марта 2014 г.
- ^ Перейти обратно: а б «sandpile.org — архитектура x86 — биты» . Проверено 17 марта 2014 г.
- ^ «Абсель — общие библиотеки C++» . Гитхаб . 4 ноября 2021 г.
- ^ Перейти обратно: а б «Ядро AMD Excavator может привести к значительному увеличению производительности» . X-битные лаборатории. 18 октября 2013. Архивировано из оригинала 23 октября 2013 года . Проверено 24 ноября 2013 г.
- ^ Едидия Хилевиц; Руби Б. Ли (август 2009 г.). «Новая основа для сдвигов в процессорах общего назначения для существующих и усовершенствованных битовых манипуляций» (PDF) . Palms.princeton.edu . Транзакции IEEE на компьютерах. стр. 1035–1048 . Проверено 10 февраля 2014 г.
- ^ «Дзен 3 — Микроархитектуры — AMD — WikiChip» .
- ^ «Таблицы инструкций» (PDF) . Проверено 9 сентября 2023 г.
- ^ «Руководство по оптимизации программного обеспечения для процессоров AMD семейства 19h» . Центр разработчиков AMD . Проверено 22 июля 2022 г.
- ^ «Сохранение частного Ryzen: функции замены PEXT/PDEP 32/64b для процессоров #AMD (BR/#Zen/Zen+/#Zen2) на основе zp7 @zwegner» . Твиттер . Проверено 21 февраля 2022 г.
- ^ «tbmintrin.h из GCC 4.8» . Проверено 17 марта 2014 г.
- ^ «Руководство разработчика BIOS и ядра для семейства AMD 14h» (PDF) . Проверено 3 января 2014 г.
- ^ «Глубокий обзор AMD Zen 3 Ryzen: протестированы 5950X, 5900X, 5800X и 5600X» . Проверено 26 декабря 2021 г.
- ^ «Отчет о ходе работы Dolphin: декабрь 2019 г. и январь 2020 г.» . Эмулятор Дельфина . 7 февраля 2020 г. Проверено 7 февраля 2020 г.
- ^ Вегнер, Зак (4 ноября 2020 г.). "цвегнер/zp7" . Гитхаб .
Дальнейшее чтение
[ редактировать ]- Уоррен младший, Генри С. (2013). Хакерское наслаждение (2-е изд.). Аддисон Уэсли - Pearson Education, Inc. ISBN 978-0-321-84268-8 .