and
lyszt.netはandおよびその他のRISC-V命令をより詳しく扱っています。
エンコーディング形式
R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode
説明
and はビット単位命令です。レジスタは32ビットを保持し、それは32個の独立した0と1が一列に並んだものです。ビット単位命令は、その演算を32個の位置すべてに独立して適用し、位置間でキャリーは伝わりません。
単一のビットでは、AND は両方の入力ビットが1のときだけ1を返し、それ以外は0を返します。以下の形式はその規則を32個の位置すべてに適用し、rs1 と rs2 を比較して結果を rd に書き込みます。
and rd, rs1, rs2
AND はマスキングに使われ、一部のビットを保持し、他のビットをクリアします。マスクが1の位置では、元のビットがそのまま残ります。マスクが0の位置では、結果は0になります。値とマスク 00001111 の AND を取ると、下位4ビットが保持され、残りはクリアされます。マスキングは、複数のフィールドをまとめて格納した値から1つのフィールドを取り出します。
RISC-V のマニュアルでは、and、or、xor がレジスタ間演算として挙げられています。いずれもソースレジスタ rs1 と rs2 を読み、結果を宛先レジスタ rd に書き込み、ビット単位の論理演算を行います。
例では、0b1100(0b 接頭辞は2進数を示します)と 0b1010 の AND を取ります。両方の入力は最左位置にのみ1を持つので、結果は 0b1000 となり、t2 に入ります。
例
li t0, 0b1100 li t1, 0b1010 and t2, t0, t1 # t2 = 0b1000
