andi
lyszt.netはandiおよびその他のRISC-V命令をより詳しく扱っています。
エンコーディング形式
説明
andi は定数とのビット単位 AND を実行します。and は 2 つのレジスタを取りますが、andi はレジスタと即値(命令にエンコードされた固定値)を取ります。i は即値(immediate)を意味します。AND の規則は変わりません。結果のビットは両方の入力ビットが 1 のときのみ 1 になるため、定数は一部のビットを保持し、それ以外をクリアするマスクとして機能します。マスキングとビット単位演算については and のページで説明しています。
andi の形式を以下に示します。rs1 の値と定数 imm を AND し、結果を rd に書き込みます。
andi rd, rs1, imm
どのビットを保持するか事前にわかっている場合に使用します。次の行は t0 の下位 8 ビットを保持し、上位 24 ビットをクリアして、より大きな値から 1 バイトを抽出します。0x 接頭辞は 16 進定数を示します。
andi t1, t0, 0xff
定数は 12 ビットに収まる必要があるため、広いマスクを表現できません。より大きなマスクには、li でレジスタにロードし、and を使用します。
RISC-V マニュアルによると、12 ビットの即値は演算前に 32 ビットに符号拡張されるため、負の定数は上位ビットがすべてセットされます。andi、ori、xori はレジスタ rs1 とその拡張された値に対してビット単位演算を実行し、結果を rd に格納します。
よくある 2 つの使用例を以下に示します。最初の行は最下位ビットのみを保持します。これは奇数の場合は 1、偶数の場合は 0 になります。2 番目の行は 8 で割った余りを求めます。これは、2 のべき乗による符号なしの余りが最下位ビットであるためです。
andi t1, t0, 1 andi t1, t0, 7
例
andi t1, t0, 0xff # keep only the low byte
