ビット操作命令
| マシンコード |
|---|
| 一般的な概念 |
| 説明書 |
ビット操作命令は、ソフトウェアで例が示されているように、操作に複数の命令を必要とするのではなく、ハードウェアでビット操作操作を実行する命令です。[ 1 ] ARM、WDC 65C02、TX-2、Power ISAなど、いくつかの主要なアーキテクチャと歴史的なアーキテクチャには、ビット操作命令があります。[ 2 ]
ビット操作は通常、サブセットに分割されます。これは、対象アプリケーションに正当な理由がない場合、個々の命令をハードウェアに実装するとコストが高くなる可能性があるためです。逆に、正当な理由がある場合、その命令を除外するとパフォーマンスが低下する可能性があります。費用対効果分析の実施は複雑な作業です。ビット操作に関する最も包括的な取り組みの一つは、クレア・ウルフが率いる共同研究であり、提案されたRISC-V命令ごとに、その正当性、ユースケース、Cコード、証明、Verilogを提供しました。[ 3 ] [ 4 ]
具体的な実例としては、WDC 65C02、8051、Atmel PICなどの低価格組み込みコントローラを用いたGPIOのビットバンギングが挙げられます。これらのCPUのクロック速度は低く、ビットセット/クリア/テスト操作が利用できない場合、これらの低価格CPUはターゲットアプリケーションに必要な速度に達しません。
ハードウェアビット操作
以下のすべてのアーキテクチャには、ビット操作がハードウェアで提供される命令のサブセットとグループがあります。リストから、DSPと組み込みマイクロコントローラには少なくともテスト/セット/クリアビット命令が含まれていることがわかりますが、先行ゼロカウント、ポップカウント、ガロア体演算、2進化10進数、ビット行列乗算と転置、バイト置換、ビット反転を含むビット置換、特殊な暗号化命令など、より包括的な命令も多数あります。
IntelとAMD(x86)
- x86 命令コア セットには次のものが含まれます。
BSRビットスキャンリバース - 入力内の最高セットビットのビットインデックスを返します。実質的には先頭のゼロを逆順にカウントします。0 の場合は定義されません。BSFビット スキャン フォワード - 入力内の最も低いセット ビットのビット インデックスを返します。実質的には末尾のゼロをカウントしますが、0 については定義されません。
- SSE4およびBMI命令セット拡張には、次の命令が含まれています。
- 先頭のゼロを数える -
lzcnt - 末尾のゼロを数える -
tzcnt - 人口数 -
popcnt - ビット抽出/ビットデポジット -
pext/pdep - ビット テスト -
ptestand はvptest、2 つの入力を与えられ、それらの間のAND演算とANDN演算の両方を実行し、それぞれ AND と ANDN の結果が 0 かどうかに基づいて ZF EFLAGS ビットと CF EFLAGS ビットを設定します。これを使用して、マスクされたすべてのビットが 0 であるか、マスクされたすべてのビットが設定されているかどうか、またはその両方であるかをテストできます。
- 先頭のゼロを数える -
- AVX -512三値拡張には、ビット単位の三値論理命令、が含まれています
vpternlog。また、競合検出命令も注目に値します。VPCONFLICTD - AVX/ AVX-512 GFNIサブセットには、ビット行列アフィン変換とその逆変換も含まれています。これは実質的に、ガロア体GF(2^8)
GF2P8AFFINEQBにおける8x8ビット行列の乗算です。 [ 5 ] - AVX-512 BITALG では、既存のビット操作命令の AVX-512 バージョンのほかに、
VPSHUFBITQMB2 番目のソースのインデックスを使用して 1 つのソースからビットを選択するビット レベルのシャッフル命令も追加されました。 - AVX/AVX512 GNFI拡張に関するIntel GNFIテクノロジーガイドには、並列バイト単位のセット/クリア/反転ビット操作、5ビット符号拡張など、多数の用途がリストされており、その可能性ははるかに大きいと指摘されています。[ 6 ]
- Intel BCDオペコード
パワーISA
Power ISAには、IBMメインフレームやz/Architectureとの歴史と関係により、幅広いビット操作命令があります。 [ 7 ]
- 先頭のゼロと末尾のゼロをカウントし、同じもののマスクバージョンをカウントします。[ 8 ]ポップカウント[ 8 ]パリティ[ 9 ]とSWARスタイルの命令が混在していますが、それぞれが完全に揃っているわけではありません。SWAR
popcntbはバイトレベルの8x8ビットですが、4x16ビットはありませんpopcnthが、2x32ビットpopcntwと64ビットのスカラーがありますpopcntd。同様に、prtywSWARはハーフワード4x16ビットですが、prtyb - マスク付きビット抽出
pextdおよびビット配置pdepdは、オフセットと長さを用いるより一般的な手法ではなく、マスクに従ってビットをその場で配置する。[ 10 ]マスク付きビットを左へ、マスクなしビットを右へ移動する珍しい遠心分離命令であり、どちらの場合も相対的な順序は維持される。ほとんどのISAは、抽出する連続ビット数と長さを表すオペランドを持つ。cfugedこれらを1つの汎用ビットマスクにまとめる。[ 10 ] - 8x8ビット転置
vgbbd[ 11 ]は、64ビットの量を8x8の2次元行列として扱い、行列転置演算を実行します。したがって、各バイトのビット0は最初のバイトになり、各バイトのビット1は2番目のバイトになり、以下同様に続きます。 - 奇妙ですが非常に便利なインデックス命令(
bpermd)[ 12 ]は、2番目の64ビットレジスタの各バイトを最初の64ビットレジスタのビットインデックスとして扱うことで、64ビットソースから最大8つの個別のビットを選択することを可能にします。 - 三値8ビットビット単位の三値論理命令
xxeval[ 13 ] AVX-512に類似 - パックBCDを加速するための戦略的指示[ 14 ]
- Power v3.1 では、ハーフワード、ワード、および 64 ビット レジスタ全体内でのバイトの順序の入れ替えを含む、追加のビット操作命令もいくつか導入されました。
クレイスーパーコンピュータ
クレイは1990年に最大64x64ビットのオペランドに対応できるBMM(ビット行列乗算)の特許を取得しました。[ 15 ]現在最も近いのはAVX512の8x8 GF(2)アフィン変換命令です。
IBM System/360 から z/Architecture へ
IBM システム/360
IBM System/360には、ビット単位の論理積、排他的論理和、論理和を求めるRR命令、RX命令、およびSI命令(RS算術および論理シフト命令[ a ] )、マスク下のSIテスト命令[ b ]、およびアトミックRXテストおよびセット命令が搭載されています。これらの命令とその拡張機能は、z/Architectureを通じて引き続き利用可能です。
IBM システム/370
S/370 のライフサイクルの終わり頃、IBM は、以前は RPQ であった文字の逆移動を標準命令にしました。
IBM S/370、S/370-XA、ESA/370、およびESA/390のベクトル操作
IBM 3090は、System/370-XAおよびEnterprise Systems Architecture/370命令セットにオプションのベクトル機能[ 16 ]を導入しました。整数および浮動小数点ベクトルの算術演算と複数の整数および浮動小数点値に対する論理演算に加えて、ベクトルビット操作演算、先行ゼロのカウント、およびポピュレーションカウントが導入されました。[ 17 ]vczvmvcovm
ESA/390
ESA/390のライフサイクルの終盤に、IBMはESA/390にいくつかのz/Architecture命令を導入しました。これには、単一論理左回転命令、反転ロード命令、反転ストア命令などが含まれます。
z/Architecture スカラー
z/Architecture は、その前身のビット操作命令をすべて継承し、一部の 64 ビット (グランデ) およびロング (20 ビット) 変位バージョンを追加しました。
- 一般命令拡張機能[ 18 ]は、
- 上位語機能[ 21 ]は
- インターロックアクセス施設1 [ 23 ]は
- その他の命令拡張機能1 [ 27 ]は、
- 選択したビットを回転してから挿入する(RISBGN)[ 28 ]
- その他の命令拡張機能3は以下を追加します
- 補語付き(NCRK、NCGRK)
- 右から左へ移動
- NAND (NNRK、NNGRK)
- 排他的論理和 (NXRK、NXGRK)
- NOR(ノルウェー語、ノルウェー語)
- または補語付き(OCRK、OCGRK)
- 選択 (SELR、SELGR)
- セレクトハイ(セルフHR)
- その他の命令拡張機能4 [ 29 ]は、
z/Architecture ベクトル演算
z/Architectureは以前のベクトル機能をサポートしていません。[ 32 ]ただし、z/Architecture Principles of Operationの第11版以降では、[ 33 ]以下の命令をサポートしています。
- ベクトルの先頭ゼロ数
vclz、末尾ゼロ数vctz[ 34 ] [ 35 ]、ベクトルの集団数vpopct[ 36 ] - マスク下のベクトルテスト
vtm[ 37 ] - 1つのレジスタのすべての要素をマスクとしての2番目のベクトルと比較することに基づいて条件コードを設定します。マスクされた比較がすべてゼロの場合、すべて1の場合、または両方の混合の場合。 - ベクトルGF(2)の乗算と乗算累算、
vgfm[ 38 ]はキャリーレス乗算として知られる。 - 包括的な パックBCD。[ 39 ]
- メモリベースのテストアンドセットと様々なマスクテストのセット/クリアビット操作は、単一ビットを条件コードに移動またはコピーします。[ 40 ]
12月 PDP-10
DEC PDP-6とPDP-10は、 2オペランドハードウェアルックアップテーブル(LUT2)ブール関数[ 41 ]の完全なスイートをカバーする論理演算を備えていました(AVX512とPower ISAが備えている3オペランド関数ではなく)。
PDP-10の後期モデルには、パックBCDとバイナリを変換する命令が搭載されました。[ 42 ]
また、メモリオペランドにバイトポインタを使用する珍しい(可変ビット長)バイトロードおよびストア命令も存在する。現代の用語では、これらはビットフィールドの挿入および抽出と呼ばれる。ワードアドレスに加えて、ロード元またはストア先のバイトのビット長(S)とビットオフセット(P)を指定する。これらの命令は0~36のバイトサイズを指定できるが、バイトがワード境界をまたぐことはできない。[ 43 ]後期モデルの文字列操作、[ 44 ] BCD/バイナリ変換、[ 45 ]および文字列編集[ 46 ]命令はバイトポインタを使用し、同様の制限がある。
GE-600シリーズ
GE -600シリーズとその後継機種にはグレイコードからバイナリへの変換機能がありましたが、この命令がなければグレイコードからの変換には複数のステップが必要になります。バイナリからグレイコードへの変換は単純でありx^(x>>1)、専用の命令を用意する必要はありません。グレイコードは実用上、重要な用途があります。
アーム
- ARM11には、ビット単位のANDテスト(ビットマスクテスト)とXORテスト、OR補数を含む標準的なビット単位の論理演算、バイトハーフワードとビット反転、条件付きバイト選択/マージ機能が搭載されています。シフトと回転はOperand2で利用可能です。[ 47 ]
- ARM Cortex-Aにはビットフィールドの設定、クリア、抽出、反転機能がある。[ 48 ]
- ARM A64にはSWARスタイルのハーフワードバイトスワッピング、ビットフィールドの挿入と抽出、ビット反転機能がある。[ 49 ]
RISC-V
RISC-Vの標準拡張では、シフトと算術シフトを含むスカラービット演算はサポートされていますが、回転演算はサポートされていません。これらの不足は、追加の拡張機能によって補われています。
- RISC-V Zb*拡張には、多数のビット操作命令が含まれています。[ 50 ] 4つのグループは便利なカテゴリに分類されており(整数サブセットには、min/max、回転、ポップカウントなど)、それらの追加とそれがもたらす改善については、十分に調査された正当性があります。[ 51 ]
- RISC-Vベクター拡張(RVV)には、ハードウェアレベルのビット操作に相当する命令が含まれていますが、通常はスカラーレジスタに対して行われますが、ベクターマスクに対して行われます。例えば、ベクターマスクのポップカウント命令が利用可能です。[ 52 ] RVVには、要素ごとのビット演算命令もあります。[ 53 ]
組み込みマイクロコントローラ
インテル
- 8086にはビット演算機能
TESTも備わっている[ 54 ] - 8051に
SETBは、CLRセット、クリア、ビット反転命令がありCPL、その命令のかなりの割合がビット操作です。[ 55 ]また、RISC-V Zb*にあるOr補数とAnd補数も含まれています。[ 56 ]
ザイログ Z80
- Zilog Z80命令セット
BITには、、、命令RESが含まれていますSET。これらの命令は、HL、IX、またはIYで指定されたレジスタまたはメモリ内の個々のビットをテスト、リセット、またはセットします。[ 57 ]
MOS 6502
- WDC 65C02では、個々のビットに対するビット操作(テストとセット (TSB) とテストとリセット (TRB))が追加されました。
- ロックウェルはR65C00シリーズに同様の拡張機能(RMB、SMB、BBR、BBS)を追加しました[ 58 ]
マイクロチップPIC
- Microchip Technology のPIC 製品には、ビット単位の操作や、ビットの設定、クリア、テストも含まれており、説明書に記載されています。
その他
- TMS320C6000シリーズなどのテキサスインスツルメンツ社のDSPには、ビット(またはビットフィールド)の設定、クリア、反転、テスト、抽出、挿入命令があります。[ 59 ]
- 1958年のTX -2には、 「ビットスキップ」述語機能のほか、ビットの設定、クリア、反転、並べ替え、シフトなどのビット単位の操作機能がありました。[ 60 ] [ 61 ]
- SuperHは、AND補数やOR補数を含む包括的なメモリベースのビット操作を備えていますが、標準的なレジスタベースのテスト/セット/クリア命令や、ビットN(0~7の範囲)を置き換えて置き換えたビットをテストレジスタにコピーするという珍しい命令も備えています。[ 62 ]
- Signetics 8X300は、1976 年に導入されたマイクロプロセッサです。 このプロセッサは通常 8 ビットのデータ バイトを操作しますが、マスク ユニットと回転ユニットにより 1 ビットまたは複数ビットの操作が可能になり、可変データ長プロセッサになります。
- 1970年のDEC PDP -11アーキテクチャは、
BITBISBICワードとバイトの両方でビットテスト、セット、クリアをサポートしていますBITBBISBBICB。非常によく似たWD16は、これらの命令のワード形式とのみをサポートしていますBISB。WD16はさらに、およびTSTBSETBCLRB(COMB補数)命令により、より高速なバイトアドレス指定フラグをサポートしています。PDP-11にはSETB命令がありません。 - Motorola 68000は、メモリまたはデータレジスタのビットテストと操作をサポートしています。ビット番号は、即値またはデータレジスタ内の値のいずれかです。命令は、
BSET(1に設定)、BCLR(0にクリア)、BCHG(反転)、BTST(変更なし)です。これらの命令はすべて、まずデスティネーションビットをテストし、デスティネーションビットが0の場合はCCR Zビットをセットします。
注記
参照
- 最初のセットを見つける – 機械語に対する関連するビット演算のファミリー
- ビット演算 – コンピュータサイエンスのトピック
- Popcount – 文字列内の非ゼロ記号の数
- 先頭のゼロを数える – 機械語に対する関連するビット演算のグループ
- マスク(コンピューティング) – ビット演算に使用されるデータ
- 2進化10進数 – 数字をデジタル的に符号化するシステム
- CLMUL命令セット – x86命令セットの拡張
- ビット単位の3値論理命令 – ビット単位の3値論理(3値ブール関数)
- GFNI命令セット – Intelによる命令セット拡張
参考文献
- z/Architecture Principles of Operation (PDF) (初版). IBM . 2000年12月. SA22-7832-00 . 2025年8月8日閲覧.
- z/Architecture Principles of Operation (PDF) (第11版). IBM . 2015年3月. SA22-7832-10 . 2025年8月8日閲覧.
- z/Architecture Principles of Operation (PDF) (第15版). IBM . 2025年4月. SA22-7832-14 . 2025年7月3日閲覧。
- Power ISA™ バージョン3.1 (PDF) (v3.1版). IBM . 2020年5月1日. SA22-7832-14 . 2025年8月7日閲覧。
- IBM System/370 ベクトル演算(PDF) (第3版). IBM Corporation. 1986年8月. SA22-7125-2 . 2018年9月20日閲覧.
- DECsystem-10 - DECSYSTEM--20 - プロセッサリファレンスマニュアル(PDF) . Digital Equipment Corporation . AA-H391A-TK, AD-4391A-T1 . 2025年8月8日取得– bitsavers.org経由。
- ^ 「ビットいじりハック」。
- ^ 「高度なビット操作命令:アーキテクチャ、実装、およびアプリケーション」。ProQuest 。
- ^ 「 GitHub - riscv/Riscv-bitmanip v0.93」。GitHub 。
- ^ Claire Wolf編 (2021年1月20日). 「RISC-V Bitmanip拡張ドキュメント バージョン0.94-draft」(PDF) .
- ^ 「GF2P8AFFINEQB — ガロア体アフィン変換」。
- ^ 「Galois Field New Instructions (GFNI) テクノロジー ガイド」。networkbuilders.intel.com 。
- ^ power3.1、IBM Power ISA v3.1。
- ^ a b power3.1、p. 104、Power ISA Book I Chapter 3.3.13 Fixed-Point。
- ^ power3.1、p. 103、Power ISA Book I Chapter 3.3.13 Fixed-Point。
- ^ a b power3.1、p. 106、Power ISA Book I Chapter 3.3.13 Fixed-Point。
- ^ power3.1、p. 445、Power ISA Book I Chapter 6.12.1 Vector Facility。
- ^ power3.1、p. 105、Power ISA Book I Chapter 3.3.13 Fixed-Point。
- ^ power3.1、p. 967、Power ISA Book I Chapter 7. Vector-Scalar Extension Facility。
- ^ power3.1、p. 117、Power ISA Book I Chapter 3.3.15 Fixed-Point。
- ^ 「ベクトルビット行列乗算機能ユニット」。
- ^ ibm370、IBM System/370 ベクトル操作。
- ^ ibm370、3-7~3-8ページ。
- ^ z15、1-16ページ。
- ^ z15、p.7-426。
- ^ a b c z15、p.7-427。
- ^ z15、1-17ページ。
- ^ a b z15、pp. 7-430 – 、7–431。
- ^ z15、1-18ページ。
- ^ z15、pp. 7-306 – 、7–307。
- ^ z15、7-307ページ。
- ^ z15、pp. 7-307 – 、7–308。
- ^ z15、1-25ページ。
- ^ z15、pp.7-428– 、7–430。
- ^ z15、1-26ページ。
- ^ z15、7-35ページ~32ページ、7~36ページ。
- ^ z15、7-36ページ。
- ^ z1、p.1-1。
- ^ z11、p. xxviii。
- ^ z15、pp.22-11–22-12。
- ^ z15、7-289–7-290頁。
- ^ z15、pp.22–26、7–424。
- ^ z15、22-37ページ。
- ^ z15、22-16ページ。
- ^ z15、pp.8-1–8-14。
- ^ z15、7-458~7-459頁。
- ^ pdp10、p. 2-38、2.4 ブール関数。
- ^ pdp10、pp.2–99。
- ^ pdp10、pp. 2-85–2-89、バイト操作。
- ^ pdp10、pp. 2-91–2-99、2.12 文字列操作。
- ^ pdp10、pp. 2-98–2-103、2.13 小数点変換。
- ^ pdp10、pp. 2-104–2-112、2.14 文字列編集。
- ^ 「ARM命令セットクイックリファレンスカード」(PDF) 2003年10月。
- ^ 「ドキュメント – Arm 開発者」。
- ^ 「ドキュメント – Arm 開発者」。
- ^ 「Riscv-bitmanip/Bitmanip/ Index.adoc at main · riscv/Riscv-bitmanip」。GitHub 。
- ^「Riscv-bitmanip/Bitmanip/Overview.adoc at main · riscv/Riscv-bitmanip」。GitHub 。
- ^ "マスターの Riscv-v-spec/V-spec.adoc · riscvarchive/Riscv-v-spec" . GitHub。
- ^ "マスターの Riscv-v-spec/V-spec.adoc · riscvarchive/Riscv-v-spec" . GitHub。
- ^ 「8086のビット操作命令|論理命令」 2018年8月11日。
- ^ 「8051 説明書」(PDF)。
- ^ 「8051のビット操作のためのブール(ビット単位)命令」。2020年4月29日。
- ^ Z80ファミリーCPUユーザーマニュアル(PDF) . Zilog . 2016. UM008011-0816. 2023年12月26日時点のオリジナルよりアーカイブ(PDF) . 2024年1月5日閲覧。
- ^ 「Rockwell R6500/11、R6500/12、R6500/15 ワンチップマイクロコンピュータ」 1987年6月7日。 2023年9月3日時点のオリジナルよりアーカイブ。 2020年4月30日閲覧。
- ^ 「TMS320C6000プログラマーズガイド」(PDF) . Texas Instruments . 2011年7月.
- ^ 「TX-2 ドキュメント」。
- ^ 「第3章 オペレーションコード」(PDF) . TX-2 ユーザーズハンドブック.
- ^ 「ルネサスSH命令セットの概要」。
さらに読む
- Hilewitz, Yedidya (2008).高度なビット操作命令:アーキテクチャ、実装、およびアプリケーション(PDF) (博士論文).プリンストン大学.
- Hilewitz, Yedidya; Lee, Ruby B. (2006年11月).高度ビット操作命令セットアーキテクチャ. 技術レポート CE-L2006-004 . プリンストン大学電気工学部.
- Koppelmann, Bastian; Adelt, Peer; Mueller, Wolfgang; Scheytt, Christoph (2019). RISC-V ビット操作命令拡張. 2019 第29回国際電力・タイミングモデリング・最適化・シミュレーションシンポジウム (PATMOS). IEEE. pp. 41– 48. doi : 10.1109/PATMOS.2019.8862170 . ISBN 978-1-7281-2103-1。