x86 ビット操作命令セット

ビット操作命令セットBMIセット)は、 IntelおよびAMDマイクロプロセッサ向けのx86命令セットアーキテクチャの拡張です。これらの命令セットの目的は、ビット操作の速度を向上させることです。これらのセットに含まれるすべての命令は非SIMDであり、汎用レジスタのみを操作します。

Intelが公開した命令セットには、BMI(現在はBMI1と呼ばれる)とBMI2の2つがあります。これらはどちらもHaswellマイクロアーキテクチャで導入され、BMI1はAMDのABM命令セットが提供する機能に対応し、BMI2はそれらを拡張したものです。AMDは他に、ABM(Advanced Bit Manipulation 、 IntelがSSE4.2およびBMI1の一部として実装したSSE4aのサブセット)とTBM(Trailing Bit Manipulation 、 PiledriverベースのプロセッサでBMI1の拡張として導入されたが、Zenベースのプロセッサでは再び廃止された)の2つの命令セットを公開しました。[ 1 ]

ABM(高度なビット操作)

AMDは、現在IntelのBMI1を構成する命令をABM( Advanced Bit Manipulation )命令セットの一部として初めて導入し、その後Intelの新しいBMI2命令のサポートも追加しました。AMDは現在、これらの機能の利用可能性をIntelのBMI1およびBMI2 CPUフラグを通じて宣伝し、プログラマーにこれらの機能を適切にターゲットとするよう指示しています。[ 2 ]

インテルはPOPCNTSSE4.2 の一部とLZCNTBMI1 の一部であると考えているが、インテルと AMD はどちらもこれらの 2 つの命令の存在を個別に宣伝しています。同じ名前のPOPCNT別のCPUIDフラグがあり、インテルと AMD は AMD のABMフラグを使用してサポートを示しますLZCNT( LZCNTBMI1 と BMI2 を組み合わせることで拡張 ABM 命令セットが完成するため)。[ 2 ] [ 3 ]

エンコーディング 命令 説明[ 4 ]
F3 0F B8 /rPOPCNT人口数
F3 0F BD /rLZCNT先頭のゼロの数

LZCNTはビットスキャンリバース(BSR)命令に関連していますが、ZF(結果がゼロの場合)フラグとCF(ソースがゼロの場合)フラグを設定するのではなく、ZF(結果がゼロの場合)フラグとCF(ソースがゼロの場合)フラグを設定します。また、ソースオペランドがゼロの場合、定義された結果(ソースオペランドのサイズ(ビット単位))を生成します。引数がゼロ以外の場合、LZCNTと のBSR合計は引数のビット幅から1を引いた値になります(例えば、32ビット引数が の場合 0x000f0000、LZCNTは12、BSRは19となります)。

のエンコードはLZCNT、ABMがサポートされていない場合は代わりに命令が実行されるというものであるBSR[ 4 ]:227

BMI1(ビット操作命令セット1)

以下の命令はBMICPUIDのビットによって有効化される命令です。Intelは公式にはLZCNTBMIの一部としていますが、 CPUID機能フラグLZCNTを使用してサポートを宣伝していますABM[ 3 ] BMI1はAMDのJaguar[ 5 ] Piledriver [ 6 ]以降のプロセッサ、およびIntelのHaswell [ 7 ]以降のプロセッサで利用可能です。

エンコーディング 命令 説明[ 3 ]同等のC式[ 8 ] [ 9 ] [ 10 ]
VEX.LZ.0F38 F2 /rANDN論理的ではない ~x & y
VEX.LZ.0F38 F7 /rBEXTRビットフィールド抽出(レジスタ付き) (src >> start) & ((1 << len) - 1)
VEX.LZ.0F38 F3 /3BLSI最下位セット分離ビットを抽出する x & -x
VEX.LZ.0F38 F3 /2BLSMSKマスクを最下位セットビットまで取得する x ^ (x - 1)
VEX.LZ.0F38 F3 /1BLSR最下位セットビットをリセット x & (x - 1)
F3 0F BC /rTZCNT末尾のゼロビットの数を数える
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(結果がゼロの場合)フラグとCF(ソースがゼロの場合)フラグを設定するのではなく、ZF(結果がゼロの場合)フラグとCF(ソースがゼロの場合)フラグを設定します。引数がゼロ以外の場合、TZCNTとの結果はBSF等しくなります。

と同様にLZCNT、 のエンコードでTZCNTは、BMI1がサポートされていない場合はBSF代わりに 命令が実行される。[ 4 ] : 352

BMI2(ビット操作命令セット2)

IntelはHaswellプロセッサシリーズにおいて、BMI1とBMI2の両方を導入しました。BMI2を搭載せずBMI1のみをサポートするプロセッサを製造しているのはAMDのみです。BMI2はAMDのExcavatorアーキテクチャ以降でサポートされています。[ 11 ]

エンコーディング 命令 説明
VEX.LZ.0F38 F5 /rBZHI指定されたビット位置 [src & (1 << inx)-1] から始まる上位ビットをゼロにします。
VEX.LZ.F2.0F38 F6 /rMULXフラグや任意の宛先レジスタに影響を与えない符号なし乗算
VEX.LZ.F2.0F38 F5 /rPDEP並列ビットデポジット
VEX.LZ.F3.0F38 F5 /rPEXT並列ビット抽出
VEX.LZ.F2.0F3A F0 /r ibRORXフラグに影響を与えずに論理的に右に回転する
VEX.LZ.F3.0F38 F7 /rSARXフラグに影響を与えずに算術演算を右にシフトする
VEX.LZ.F2.0F38 F7 /rSHRXフラグに影響を与えずに論理的に右にシフトする
VEX.LZ.66.0F38 F7 /rSHLXフラグに影響を与えずに論理左シフト

並列ビットの堆積と抽出

命令PDEPPEXT命令は、新しい汎用ビットレベル圧縮および展開命令です。これらは2つの入力を取ります。1つはソース、もう1つはセレクタです。セレクタは、パックまたはアンパックするビットを選択するビットマップです。 は、 PEXTソースから選択されたビットを宛先の連続する下位ビットにコピーします。宛先の上位ビットはクリアされます。 は、 PDEP選択されたビットに対してその逆の処理を行います。連続する下位ビットは宛先の選択されたビットにコピーされます。その他の宛先ビットはクリアされます。これは、入力の任意のビットフィールドを抽出したり、以前はコストがかかったビットレベルのシャッフルを大量に実行したりするために使用できます。これらの命令の動作は、ビットレベルのギャザースキャッタSIMD命令に似ていますが、命令PDEPPEXT命令は(他のBMI命令セットと同様に)汎用レジスタに対して動作します。[ 12 ]

命令は32ビット版と64ビット版で利用可能です。32ビットモードで任意のソースとセレクタを使用する例を以下に示します。

命令セレクタマスクソース行き先
PEXT0xff00fff00x123456780x00012567
PDEP0xff00fff00x000125670x12005670

Zen 3以前のAMDプロセッサ[ 13 ]はPDEPとPEXTをマイクロコードで実装しており、レイテンシは(Zen 3の)3サイクル[15]ではなく18サイクル[14]となっているその結果これらプロセッサでは他の命令を使用する方が高速になることが多い。[ 16 ]

TBM(末尾ビット操作)

TBMはBMI1によって開始された命令セットを補完する命令で構成されています。補完的な性質を持つため、必ずしも直接使用する必要はなく、サポートされている場合は最適化コンパイラによって生成できます。AMDは、Piledriver [ 6 ]シリーズのプロセッサでBMI1とともにTBMを導入しました。その後のAMD JaguarおよびZenベースのプロセッサはTBMをサポートしていません。[ 5 ] Intelプロセッサは(少なくともAlder Lakeまでは)TBMをサポートしていません。

エンコーディング 命令 説明[ 4 ]同等のC式[ 17 ] [ 9 ]
XOP.LZ.0A 10 /r idBEXTRビットフィールド抽出(即値付き) (src >> start) & ((1 << len) - 1)
XOP.LZ.09 01 /1BLCFILL一番下のクリアビットから埋める x & (x + 1)
XOP.LZ.09 02 /6BLCI最も低いクリアビットを分離する x | ~(x + 1)
XOP.LZ.09 01 /5BLCIC最低クリアビットを分離し、補数化する ~x & (x + 1)
XOP.LZ.09 02 /1BLCMSK最も低いクリアビットからマスク x ^ (x + 1)
XOP.LZ.09 01 /3BLCS最下位のクリアビットを設定する x | (x + 1)
XOP.LZ.09 01 /2BLSFILL最下位の設定ビットから埋める x | (x - 1)
XOP.LZ.09 01 /6BLSIC最下位のセットビットを分離し、補数をとる ~x | (x - 1)
XOP.LZ.09 01 /7T1MSKC末尾の1からの逆マスク ~x | (x + 1)
XOP.LZ.09 01 /4TZMSK末尾のゼロをマスクする ~x & (x - 1)

対応CPU

命令拡張のサポートとは、プロセッサがソフトウェア互換性のためにサポートされている命令を実行できることを意味することに注意してください。プロセッサは、その場合、良好なパフォーマンスを発揮しない可能性があります。例えば、ExcavatorからZen 2プロセッサまでは、PEXT命令とPDEP命令をマイクロコードで実装しているため、他の命令で同じ動作を再現した場合よりも、これらの命令の実行速度が大幅に遅くなります。[ 20 ](実際には、「zp7」と呼ばれるソフトウェア手法は、これらのマシンではより高速です。)[ 21 ]最適なパフォーマンスを得るためには、コンパイラ開発者は、拡張機能の可用性ではなく、アーキテクチャ固有のパフォーマンスプロファイルに基づいて、拡張機能内の個々の命令を使用するように選択することが推奨されます。

参照

参考文献

  1. ^ a b「新しい「ブルドーザー」と「パイルドライバー」の指示」(PDF)2014年1月3日閲覧。
  2. ^ a b「AMD64アーキテクチャプログラマーズマニュアル第3巻:汎用命令とシステム命令」(PDF) 。 2022年7月20日閲覧
  3. ^ a b c「Intel Advanced Vector Extensions Programming Reference」(PDF) . intel.com . Intel . 2011年6月. 2014年1月3日閲覧
  4. ^ a b c d「AMD64アーキテクチャプログラマーズマニュアル、第3巻:汎用命令とシステム命令」(PDF)。リビジョン3.32。AMD 2021年3月。2021年4月8日時点のオリジナルよりアーカイブ(PDF) 。 2021年4月8日閲覧
  5. ^ a b c d「ファミリー 16h AMD Aシリーズ データシート」(PDF) . amd.com . AMD . 2013年10月. 2014年1月2日閲覧
  6. ^ a b Hollingsworth, Brent. 「新しい「ブルドーザー」と「パイルドライバー」の説明書」(PDF)。Advanced Micro Devices, Inc. 2014年7月26日時点のオリジナル(PDF)からアーカイブ。 2014年12月11日閲覧
  7. ^ a b Locktyukhin, Max. 「第4世代Intel® Core™プロセッサー・ファミリーにおける新しい命令のサポートを検出する方法」 www.intel.com . Intel . 2014年12月11日閲覧
  8. ^ 「GCC 4.8のbmiintrin.h」 。 2017年2月23日時点のオリジナルよりアーカイブ2014年3月17日閲覧。
  9. ^ a b「sandpile.org -- x86アーキテクチャ -- ビット」 。 2014年3月17日閲覧
  10. ^ 「Abseil - C++共通ライブラリ」 . GitHub . 2021年11月4日.
  11. ^ a b「AMD Excavator Core、劇的なパフォーマンス向上をもたらす可能性」 X-bit labs. 2013年10月18日. 2013年10月23日時点のオリジナルよりアーカイブ2013年11月24日閲覧。
  12. ^ Yedidya Hilewitz、Ruby B. Lee (2009年8月). 「既存および高度なビット操作のための汎用プロセッサにおけるシフタの新たな基盤」(PDF) . palms.princeton.edu . IEEE Transactions on Computers. pp.  1035– 1048.オリジナル(PDF)から2013年6月17日にアーカイブ。 2014年2月10日閲覧
  13. ^ 「Zen 3 - マイクロアーキテクチャ - AMD - WikiChip」
  14. ^ 「命令表」(PDF) . 2023年9月9日閲覧
  15. ^ 「AMDファミリー19hプロセッサ向けソフトウェア最適化ガイド」 AMD Developer Central 2022年7月22日閲覧
  16. ^ 「Saving Private Ryzen: PEXT/PDEP 32/64b replacement functions for #AMD CPUs (BR/#Zen/Zen+/#Zen2) based on @zwegner's zp7」 . Twitter . 2022年2月21日閲覧
  17. ^ “tbmintrin.h from GCC 4.8” . 2017年2月23日時点のオリジナルよりアーカイブ2014年3月17日閲覧。
  18. ^ 「AMDファミリー14h向けBIOSおよびカーネル開発者ガイド」(PDF) 2014年1月3日閲覧。
  19. ^ 「AMD Zen 3 Ryzen Deep Dive Review: 5950X、5900X、5800X、5600Xをテスト」 。 2020年11月5日時点のオリジナルよりアーカイブ。 2021年12月26日閲覧
  20. ^ 「Dolphin Progress Report: December 2019 and January 2020」 . Dolphin Emulator . 2020年2月7日. 2020年2月7閲覧
  21. ^ウェグナー、ザック (2020 年 11 月 4 日)。「ツウェグナー/zp7」GitHub

さらに読む