X86ビット操作命令セット


X86_Bit_manipulation_instruction_set
ビット操作命令セット(BMIセット)は、IntelおよびAMDのマイクロプロセッサ用のx86 命令セットアーキテクチャの拡張機能です。これらの命令セットの目的は、ビット操作の速度を向上させることです。これらのセットのすべての命令は非SIMDであり、汎用レジスタでのみ動作します。
Intelによって公開されている2つのセットがBMI(ここではBMI1と呼びます)とBMI2です。それらは両方ともHaswellマイクロアーキテクチャで導入されました。別の2つのセットがAMDによって公開されました:ABM(Advanced Bit Manipulation、これはSSE4.2およびBMI1の一部としてIntelによって実装されたSSE4aのサブセットでもあります)、およびTBM(Trailing Bit Manipulation、Piledriverベースのプロセッサで導入された拡張機能)BMI1の拡張機能ですが、Zenベースのプロセッサでは再び削除されました)。

コンテンツ
1 ABM(高度なビット操作)
2 BMI1(ビット操作命令セット1)
3 BMI2(ビット操作命令セット2)
3.1 並列ビットのデポジットと抽出
4 TBM(トレーリングビット操作)
5 CPUのサポート
6 も参照してください
7 参考文献
8 参考文献
9 外部リンク

ABM(高度なビット操作)
ABMは、AMDによって設定された単一の命令としてのみ実装されます。すべてのAMDプロセッサは、両方の命令をサポートするか、どちらもサポートしません。IntelPOPCNTは、SSE4.2の一部、およびLZCNTBMI1の一部と見なしています。POPCNT個別のCPUIDフラグがただし、IntelはAMDのABMフラグを使用してLZCNTサポートを示します(LZCNTABMが完了したため)。
エンコーディング 命令 説明
F3 0F B8 /r POPCNT 人口数
F3 0F BD /r LZCNT 先行ゼロはカウントされます
LZCNTはビットスキャンリバース(BSR)命令に関連していますが、ZF(ソースがゼロの場合)を設定するのではなく、ZF(結果がゼロの場合)およびCF(ソースがゼロの場合)フラグを設定します。また、ソースオペランドがゼロの場合、定義された結果(ビット単位のソースオペランドサイズ)が生成されます。ゼロ以外の引数の場合、結果の合計は引数のビット幅から1を引いたものにLZCNTなりBSRます(たとえば、32ビットの引数がの0x000f0000場合、LZCNTは12になり、BSRは19になります)。
のエンコーディングはLZCNT、ABMがサポートBSRされていない場合、代わりに命令が実行されるようになっています。

BMI1(ビット操作命令セット1)
以下の手順はBMI、CPUIDのビットによって有効になる手順です。Intelは公式にLZCNTはBMIの一部と見なしていますがLZCNT、ABMCPUID機能フラグを使用してサポートをアドバタイズしています。 BMI1は、AMDのJaguar、 Piledriver 以降のプロセッサ、およびIntelのHaswell 以降のプロセッサで利用できます。
エンコーディング 命令 説明
同等のC式
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はビットスキャンフォワード(BSF)命令とほぼ同じですが、ZF(ソースがゼロの場合)を設定するのではなく、ZF(結果がゼロの場合)およびCF(ソースがゼロの場合)フラグを設定します。非ゼロの引数に、結果TZCNTとはBSF同一です。
と同様にLZCNT、のエンコーディングはTZCNT、BMI1がサポートBSFされていない場合、代わりに命令が実行されるようになっています。

BMI2(ビット操作命令セット2)
Intelは、HaswellプロセッサのラインにBMI1と一緒にBMI2を導入しました。AMDだけがBMI2なしでBMI1をサポートするプロセッサを製造しています。BMI2は、AMDの掘削機アーキテクチャ以降でサポートされています。
エンコーディング 命令 説明
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 フラグに影響を与えずに論理を左にシフト

並列ビットのデポジットと抽出
命令は、新たなビットレベルの圧縮を一般化し、指示に拡大しています。それらは2つの入力を取ります。1つはソースで、もう1つはセレクターです。セレクターは、パックまたはアンパックされるビットを選択するビットビットです。選択したビットをソースから宛先の連続する下位ビットにコピーします。上位のデスティネーションビットがクリアされます。選択されたビットに対して反対のことを行います。連続する下位ビットは、宛先の選択されたビットにコピーされます。他の宛先ビットはクリアされます。これは、入力の任意のビットフィールドを抽出するために使用でき、以前はコストがかかっていたであろう多くのビットレベルのシャッフルを実行することさえできます。これらの命令の機能はビットレベルのギャザースキャッターSIMD命令に似ていますが、命令(他のBMI命令セットと同様)は汎用レジスターで動作します。PDEPPEXTPEXTPDEPPDEPPEXT
命令は、32ビットバージョンと64ビットバージョンで利用できます。32ビットモードで任意のソースとセレクターを使用する例は次のとおりです。
命令
セレクターマスク
ソース
行き先PEXT 0xff00fff0 0x12345678 0x00012567 PDEP 0xff00fff0 0x00012567 0x12005670
PDEPとPEXTを実装するZen3以前のAMDプロセッサは、マイクロコードで実装し、レイテンシは1サイクルではなく18サイクルです。その結果、マスクがわかっている場合は、AMDで他の命令を使用する方が速いことがよく

TBM(トレーリングビット操作)
TBMは、BMI1によって開始された命令セットを補完する命令で構成されています。それらの補完的な性質は、必ずしも直接使用する必要はないが、サポートされている場合は最適化コンパイラーによって生成できることを意味します。AMDは、Piledriver プロセッサラインにBMI1とともにTBMを導入しました。その後、AMDJaguarおよびZenベースのプロセッサはTBMをサポートしません。(少なくともCoffee Lakeを介した)IntelプロセッサはTBMをサポートし
エンコーディング 命令 説明
同等のC式
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)

CPUのサポート
インテル
Intel Nehalemプロセッサ以降(Sandy Bridge、Ivy Bridgeなど)(POPCNTをサポート)
Intel Silvermontプロセッサ(POPCNTをサポート)
Intel Haswellプロセッサ以降(Skylake、Broadwellなど)(ABM、BMI1、BMI2をサポート) AMD K10ベースのプロセッサ(ABMをサポート)
「Cat」低電力プロセッサ
ボブキャットベースのプロセッサ(ABMをサポート)
Jaguarベースのプロセッサ以降(ABMおよびBMI1をサポート)
Pumaベースのプロセッサ以降(ABMおよびBMI1をサポート)
「重機」プロセッサー
Bulldozerベースのプロセッサ(ABMをサポート)
パイルドライバーベースのプロセッサー(ABM、BMI1、TBMをサポート)
Steamrollerベースのプロセッサ(ABM、BMI1、TBMをサポート)
掘削機ベースのプロセッサ以降(ABM、BMI1、BMI2、TBMをサポート、マイクロコード化されたPEXTとPDEP)
Zenベース、Zen +ベース、およびプロセッサ(ABM、BMI1、およびBMI2がサポートされています。マイクロコード化されたPEXTおよびPDEP)
Zen 3プロセッサ以降(ABM、BMI1、BMI2をサポート、完全なハードウェア実装)
命令拡張サポートとは、プロセッサがソフトウェア互換性の目的でサポートされている命令を実行できることを意味することに注意してプロセッサはそうすることでうまく機能しないかもしれません。たとえば、ExcavatorからZen 2プロセッサは、マイクロコードを使用してPEXTおよびPDEP命令を実装するため、他の命令を使用して再現された同じ動作よりも命令の実行速度が大幅に低下します。(実際、これらのマシンでは「zp7」と呼ばれるソフトウェアメソッドの方が高速です。)最適なパフォーマンスを得るには、コンパイラ開発者は、アーキテクチャ固有のパフォーマンスプロファイルではなく、拡張機能で個々の命令を使用することをお勧めします。拡張機能の可用性について。

も参照してください
icon"
 コンピュータプログラミングポータル
Advanced Vector Extensions(AVX)
AES命令セット
CLMUL命令セット F16C FMA命令セット Intel ADX XOP命令セット
Intel BCDオペコード(高度なビット操作技術にも使用されます)

参考文献
^ 「新しい「ブルドーザー」と「まんぐり返し」の説明」 (PDF)。
^ 「インテルアドバンストベクターエクステンションプログラミングリファレンス」(PDF)。intel.com。インテル。2011年6月。
^ 「AMD64アーキテクチャプログラマーズマニュアル、第3巻:汎用およびシステムの説明」(PDF)。リビジョン3.32。AMD。2021年3月。2021年4月8日のオリジナルからアーカイブ(PDF)。
^ “”ファミリー16時間AMD Aシリーズデータシート”” (PDF) 。amd.com。AMD。2013年10月。
^ ホリングスワース、ブレント。「新しい「ブルドーザー」と「まんぐり返し」の説明」(pdf)。Advanced Micro Devices、Inc 。取得した11年12月2014。
^ Locktyukhin、Max。「第4世代Intel®Core™プロセッサー・ファミリーで新しい命令のサポートを検出する方法」。www.intel.com。インテル。取得した11年12月2014。
^ “”GCC4.8のbmiintrin.h”” 。
^ https://github.com/abseil/abseil-cpp/blob/ce4bc927755fdf0ed03d679d9c7fa041175bb3cb/absl/base/internal/bits.h#L188
^ “”AMD ExcavatorCoreは劇的なパフォーマンスの向上をもたらす可能性があります””。Xビットラボ。2013年10月18日。2013年10月23日のオリジナルからアーカイブ。
^ Yedidya Hilewitz; ルビー・B・リー。「既存および高度なビット操作用の汎用プロセッサにおけるシフターの新しい基礎」(PDF)。palms.princeton.edu。コンピューターでのIEEEトランザクション。pp。1035-1048 。
^ https://en.wikichip.org/wiki/amd/microarchitectures/zen_3#Key_changes_from_Zen_2
^ https://www.agner.org/optimize/instruction_tables.pdf
^ “”GCC4.8のtbmintrin.h”” 。
^ 「AMDファミリー14hのBIOSおよびカーネル開発者ガイド」(PDF)。
^ 「イルカ進捗レポート:2019年12月および2020年1月」。ドルフィンエミュレータ。
^ ウェグナー、ザック(2020年11月4日)。””zwegner / zp7″”。

参考文献
ウォーレンジュニア、ヘンリーS.(2013)。ハッカーの喜び(2版)。アディソンウェスリー-ピアソンエデュケーション社 ISBN 978-0-321-84268-8。

外部リンク
インテル組み込み関数ガイド”