xori
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):一个编码在指令中的固定值,因此不需要第二个寄存器。当两个位不同时,XOR 在该位位置产生 1(参见 xor 页面)。给定一个常量掩码,掩码中的 1 会翻转对应的位,而 0 则保持该位不变。
xori 的语法如下所示。它将 rs1 中的值与常量 imm 进行 XOR,并将结果写入 rd。
xori rd, rs1, imm
andi 清除选定的位,ori 设置它们,而 xori 反转它们。反转两次会返回原始值。
xori 还提供了 not 指令。翻转一个值的所有位意味着与全 1 掩码进行 XOR,而 not 是下面这行的简写,因为 -1 的位表示是全 1。RISC-V 没有专门反转每一位的指令。
xori rd, rs, -1
RISC-V 手册指出,12 位立即数在操作前会符号扩展为 32 位,因此常量 -1 会变成全 1 掩码。它将带有常量 -1 的 xori 列为寄存器的按位逻辑反转,这就是 not 伪指令。
一个常见的小用途是切换以 0 或 1 保存的是/否值。下面这行在每次运行时将其切换到另一种状态。
xori t0, t0, 1
常量限制为 12 位。对于更宽的模式,请将掩码加载到寄存器中并使用 xor。
示例
li t0, 0 xori t1, t0, -1 # t1 = -1 (every bit flipped)
