Битовые инструкции манипуляции наборы ( BMI наборы ) являются расширениями x86 архитектуру набора инструкций для микропроцессоров от Intel и AMD . Целью этих наборов команд является повышение скорости обработки битов . Все инструкции в этих наборах являются не- SIMD и действуют только общее назначение регистров .
Intel опубликовала два набора: BMI (здесь обозначается как BMI1) и BMI2; они оба были представлены с микроархитектурой Haswell . Еще два набора были опубликованы AMD: ABM ( Advanced Bit Manipulation , который также является подмножеством SSE4a, реализованным Intel как часть SSE4.2 и BMI1) и TBM ( Trailing Bit Manipulation , расширение, представленное для процессоров на базе Piledriver как расширение BMI1, но снова упало в процессорах на базе Zen ). [1]
ABM (Advanced Bit Manipulation) [ править ]
ABM реализована AMD только как единый набор инструкций; все процессоры AMD поддерживают обе инструкции или ни одну из них. Intel считает POPCNT
как часть SSE4.2, так и LZCNT
часть BMI1. POPCNT
имеет отдельный флаг CPUID ; однако Intel использует ABM
флаг AMD для обозначения LZCNT
поддержки (поскольку LZCNT
завершает ABM). [2]
Кодирование | Инструкция | Описание [3] |
---|---|---|
F3 0F B8 /r | POPCNT | Количество населения |
F3 0F BD /r | LZCNT | Количество ведущих нулей |
LZCNT
связан с BSR
инструкцией Bit Scan Reverse ( ), но устанавливает флаги ZF (если результат равен нулю) и CF (если источник равен нулю), а не устанавливает ZF (если источник равен нулю). Кроме того, он дает определенный результат (размер исходного операнда в битах), если исходный операнд равен нулю. Для ненулевого аргумента сумма LZCNT
и BSR
результаты равны разрядности аргумента минус 1 (например, если 32-битный аргумент равен 0x000f0000
, LZCNT дает 12, а BSR дает 19).
Кодировка LZCNT
такова, что если ABM не поддерживается, BSR
вместо этого выполняется инструкция. [3] : 227
BMI1 (набор инструкций по манипулированию битами 1) [ редактировать ]
Приведенные ниже инструкции разрешены BMI
битом в CPUID. Intel официально считает его LZCNT
частью BMI, но рекламирует LZCNT
поддержку с помощью ABM
флага функции CPUID. [2] BMI1 доступен в процессорах AMD Jaguar , [4] Piledriver [5] и более новых, а также в процессорах Intel Haswell [6] и более новых.
Кодирование | Инструкция | Описание [2] | Эквивалентное выражение C [7] [8] |
---|---|---|---|
VEX.LZ.0F38 F2 /r | ANDN | Логично, а не | ~ x & y |
VEX.LZ.0F38 F7 /r | BEXTR | Извлечение битового поля (с регистром) | (src >> начало) & ((1 << len) - 1) |
VEX.LZ.0F38 F3 /3 | BLSI | Извлечь наименьший установленный изолированный бит | х & -x |
VEX.LZ.0F38 F3 /2 | BLSMSK | Поднимите маску до самого низкого установленного бита | х ^ (х - 1) |
VEX.LZ.0F38 F3 /1 | BLSR | Сбросить самый низкий установленный бит | х & (х - 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
таково, что если BMI1 не поддерживается, BSF
вместо этого выполняется инструкция. [3] : 352
BMI2 (набор инструкций по манипулированию битами 2) [ править ]
Intel представила BMI2 вместе с BMI1 в своей линейке процессоров Haswell. Только AMD произвела процессоры, поддерживающие BMI1 без BMI2; BMI2 поддерживается архитектурой AMD Excavator и новее. [9]
Кодирование | Инструкция | Описание |
---|---|---|
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 | Логический сдвиг влево, не затрагивая флаги |
Параллельное внесение и извлечение битов [ править ]
PDEP
И PEXT
инструкции новый обобщенный бит уровня компресс и расширить инструкции. Они принимают два входа; один - источник, а другой - селектор. Селектор - это битовая карта, выбирающая биты, которые должны быть упакованы или распакованы. PEXT
копирует выбранные биты из источника в смежные младшие биты места назначения; биты назначения более высокого порядка очищаются. PDEP
делает обратное для выбранных битов: смежные младшие биты копируются в выбранные биты места назначения; другие биты назначения очищаются. Это можно использовать для извлечения любого битового поля ввода и даже выполнения большого количества перетасовок на уровне битов, которое раньше было бы дорогостоящим. Хотя то, что делают эти инструкции, аналогично инструкциям SIMD по сбору-разбросу на уровне битов ,PDEP
а PEXT
инструкции (как и остальные наборы инструкций BMI) работают с регистрами общего назначения. [10]
Инструкции доступны в 32-битной и 64-битной версиях. Пример использования произвольного источника и селектора в 32-битном режиме:
Инструкция | Селекторная маска | Источник | Назначения |
---|---|---|---|
PEXT | 0xff00fff0 | 0x12345678 | 0x00012567 |
PDEP | 0xff00fff0 | 0x00012567 | 0x12005670 |
Процессоры AMD до Zen 3 [11], которые реализуют PDEP и PEXT, делают это в микрокоде с задержкой 18 циклов [12], а не одним циклом. В результате, если маска известна, часто бывает быстрее использовать другие инструкции AMD.
TBM (манипуляция конечными битами) [ править ]
TBM состоит из инструкций, дополняющих набор инструкций, запущенных BMI1; их взаимодополняющий характер означает, что их не обязательно использовать напрямую, но они могут быть сгенерированы оптимизирующим компилятором при поддержке. AMD представила TBM вместе с BMI1 в своей линейке процессоров Piledriver [5] ; более поздние процессоры AMD Jaguar и Zen не поддерживают TBM. [4] Ни один из процессоров Intel (по крайней мере, через Coffee Lake) не поддерживает TBM.
Кодирование | Инструкция | Описание [3] | Эквивалентное выражение C [13] |
---|---|---|---|
XOP.LZ.0A 10 /r id | BEXTR | Извлечение битового поля (с немедленным) | (src >> начало) & ((1 << len) - 1) |
XOP.LZ.09 01 /1 | BLCFILL | Заполните с самого нижнего бита | х & (х + 1) |
XOP.LZ.09 02 /6 | BLCI | Изолировать самый низкий бит | х | ~ (х + 1) |
XOP.LZ.09 01 /5 | BLCIC | Изолировать самый низкий бит и дополнить | ~ х & (х + 1) |
XOP.LZ.09 02 /1 | BLCMSK | Маска от самого нижнего бита очистки | х ^ (х + 1) |
XOP.LZ.09 01 /3 | BLCS | Установить самый низкий бит очистки | х | (х + 1) |
XOP.LZ.09 01 /2 | BLSFILL | Заполните с самого низкого установленного бита | х | (х - 1) |
XOP.LZ.09 01 /6 | BLSIC | Изолировать младший установленный бит и дополнить | ~ x | (х - 1) |
XOP.LZ.09 01 /7 | T1MSKC | Обратная маска от замыкающих | ~ x | (х + 1) |
XOP.LZ.09 01 /4 | TZMSK | Маска из конечных нулей | ~ х & (х - 1) |
Поддерживающие процессоры [ править ]
- Intel
- Процессоры Intel Nehalem и новее (например, Sandy Bridge , Ivy Bridge ) (поддерживается POPCNT)
- Процессоры Intel Silvermont (с поддержкой POPCNT)
- Процессоры Intel Haswell и новее (такие как Skylake , Broadwell ) (поддерживаются ABM, BMI1 и BMI2) [6]
- AMD
- Процессоры на базе K10 (поддерживается ABM)
- "Кошачьи" маломощные процессоры
- Процессоры на базе Bobcat (поддерживается ABM) [14]
- Процессоры на базе Jaguar и новее (поддерживаются ABM и BMI1) [4]
- Процессоры на базе Puma и новее (поддерживаются ABM и BMI1) [4]
- Переработчики "тяжелого оборудования"
- Процессоры на базе Bulldozer (с поддержкой ABM)
- Процессоры на основе Piledriver (поддерживаются ABM, BMI1 и TBM) [1]
- Процессоры на базе Steamroller (поддерживаются ABM, BMI1 и TBM)
- Процессоры на базе экскаваторов и более новые (поддерживаются ABM, BMI1, BMI2 и TBM; микрокодированные PEXT и PDEP) [9]
- Zen основе , Zen + основанное , и процессоры (АВМ, Bmi1 и BMI2 поддерживается; microcoded Pext и PDEP)
- Процессоры Zen 3 и новее (поддерживаются ABM, BMI1 и BMI2; полная аппаратная реализация)
Обратите внимание, что поддержка расширения инструкций означает, что процессор способен выполнять поддерживаемые инструкции в целях совместимости программного обеспечения. При этом процессор может работать некорректно. Например, процессоры Excavator и Zen 2 реализуют инструкции PEXT и PDEP с использованием микрокода, в результате чего инструкции выполняются значительно медленнее, чем такое же поведение, воссозданное с использованием других инструкций. [15] (Программный метод под названием «zp7» на самом деле быстрее на этих машинах.) [16] Для достижения оптимальной производительности рекомендуется, чтобы разработчики компилятора использовали отдельные инструкции в расширениях на основе профилей производительности для конкретной архитектуры, а не при наличии расширения.
См. Также [ править ]
- Расширенные векторные расширения (AVX)
- Набор инструкций AES
- Набор инструкций CLMUL
- F16C
- Набор инструкций FMA
- Intel ADX
- Набор инструкций XOP
- Коды операций Intel BCD (также используются для расширенных методов обработки битов)
Ссылки [ править ]
- ^ a b «Инструкции по новому« Бульдозеру »и« Пиледриверу » (PDF) . Проверено 3 января 2014 .
- ^ a b c «Справочник по программированию расширенных векторных расширений Intel» (PDF) . intel.com . Intel . Июнь 2011 . Проверено 3 января 2014 .
- ^ a b c d "Руководство программиста по архитектуре AMD64, том 3: Общие и системные инструкции" (PDF) . Версия 3.32. AMD . Март 2021 года. Архивировано (PDF) из оригинала 8 апреля 2021 года . Проверено 8 апреля 2021 .
- ^ a b c d «Семейство 16h AMD A-Series Data Sheet» (PDF) . amd.com . AMD . Октябрь 2013 . Проверено 2 января 2014 .
- ^ a b Холлингсворт, Брент. "Новые" Бульдозеры "и" Пиледриверы "инструкции" (pdf) . Advanced Micro Devices, Inc . Проверено 11 декабря 2014 .
- ^ а б Локтюхин Макс. «Как определить поддержку новых инструкций в семействе процессоров Intel® Core ™ 4-го поколения» . www.intel.com . Intel . Проверено 11 декабря 2014 .
- ^ "bmiintrin.h из GCC 4.8" . Проверено 17 марта 2014 .
- ^ https://github.com/abseil/abseil-cpp/blob/ce4bc927755fdf0ed03d679d9c7fa041175bb3cb/absl/base/internal/bits.h#L188
- ^ a b «Ядро экскаватора AMD может значительно повысить производительность» . X-bit labs. 18 октября, 2013. Архивировано из оригинального 23 октября 2013 года . Проверено 24 ноября 2013 года .
- ^ Yedidya Hilewitz; Руби Б. Ли (август 2009 г.). «Новая основа для переключателей в универсальных процессорах для существующих и расширенных операций с битами» (PDF) . palms.princeton.edu . Транзакции IEEE на компьютерах. С. 1035–1048 . Проверено 10 февраля 2014 .
- ^ https://en.wikichip.org/wiki/amd/microarchitectures/zen_3#Key_changes_from_Zen_2
- ^ https://www.agner.org/optimize/instruction_tables.pdf
- ^ "tbmintrin.h из GCC 4.8" . Проверено 17 марта 2014 .
- ^ «Руководство разработчика BIOS и ядра для семейства AMD 14h» (PDF) . Проверено 3 января 2014 .
- ^ «Отчет о развитии дельфинов: декабрь 2019 г. и январь 2020 г.» . Эмулятор дельфинов . Проверено 7 февраля 2020 .
- ↑ Вегнер, Зак (4 ноября 2020 г.). "zwegner / zp7" .
Дальнейшее чтение [ править ]
- Уоррен-младший, Генри С. (2013). Восторг хакера (2-е изд.). Эддисон Уэсли - ISBN Pearson Education, Inc. 978-0-321-84268-8.
Внешние ссылки [ править ]
- Руководство Intel по внутренним функциям