このブログではしばらくRISC-VのBit-manipulationについて取り扱っていなかったのだが、ちょっと調べる必要があったので、現在定義されている命令を調べてみることにした。
現在の仕様によると、Frozenな命令使用は大きく以下のグループに分けられている:
- Address generation instructions (Zba)
- Basic bit-manipulation (Zbb)
- Carry-less multiplication (Zbc)
- Single-bit instructions (Zbs)
加えて、Crpytography向けに以下のグループが定義されている:
- Zbkc: Carry-less multiplication for Cryptography
- Zbkx: Crossbar permutations
- Zbkb: Bit-manipulation for Cryptography
Zba: Address generation instructions
Zba命令は、符号なしワードサイズとXLENサイズの両方のインデックスを使用して、基本タイプ(ハーフワード、ワード、ダブルワード)の配列にインデックスを付けるアドレスの生成を高速化するために使用できる。
シフト命令と加算命令で1、2、3の左シフトを行うのは、実際のコードで一般的であり、単純な加算器以上の最小限の追加ハードウェアで実装できるからである。 これにより、実装におけるクリティカル・パスが長くなるのを避けることができる。
シフト命令と加算命令の最大左シフト数は3に制限されているが、(ベースISAの)slli 命令を使用すると、より広い要素の配列にインデックスを付けるために同様のシフトを実行できる。 このサブ拡張で追加されたslli.uwは、インデックスを符号なしワードとして解釈する場合に使用できる。
Zba拡張は以下の命令で構成されている:
Zbb: Basic bit-manipulation
- 否定付き論理演算命令
- Leading/Trailing ゼロビットカウント命令
- Pop Count命令
- 整数最大値・最小値命令
- 符号拡張・ゼロ拡張命令
- ローテート命令
- OR組み合わせ命令
- バイト逆転命令