xori

xori

RISC-V アセンブリ 参考

lyszt.netはxoriおよびその他の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

説明

xori は定数とのビット単位 XOR を実行します。andi と ori とともに、即値論理命令を完成させます。i は即値 (immediate) を意味します。つまり命令にエンコードされた固定値であり、2 つ目のレジスタは不要です。XOR は 2 つのビットが異なるとき、そのビット位置で 1 を返します (xor ページを参照)。定数マスクが与えられたとき、マスクの 1 は対応するビットを反転させ、0 はそのビットを変更しません。

xori の構文を以下に示します。rs1 の値と定数 imm を XOR し、結果を rd に書き込みます。

xori rd, rs1, imm

andi は選択したビットをクリアし、ori はそれらをセットし、xori はそれらを反転させます。2 回反転すると元の値に戻ります。

xori は not 命令も提供します。値のすべてのビットを反転させることは、すべて 1 のマスクとの XOR を意味し、not は以下の行の省略形です。なぜならビットで -1 はすべて 1 だからです。RISC-V にはすべてのビットを反転させる専用命令はありません。

xori rd, rs, -1

RISC-V マニュアルには、12 ビットの即値は演算の前に 32 ビットに符号拡張されると記載されているため、定数 -1 はすべて 1 のマスクになります。マニュアルは定数 -1 を伴う xori をレジスタのビット単位論理反転として挙げており、これが not 疑似命令です。

よくある小さな用途は、0 または 1 として保持される yes または no の値をトグルすることです。次の行は、実行されるたびにそれを反対の状態に切り替えます。

xori t0, t0, 1

定数は 12 ビットに制限されています。より広いパターンには、マスクをレジスタにロードして xor を使用してください。

例

li t0, 0
xori t1, t0, -1   # t1 = -1 (every bit flipped)