sltu

sltu

RISC-V 汇编 参考

lyszt.net 更详细地介绍了 sltu 和其他 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

描述

sltu 像 slt 一样将目标寄存器设置为 1 或 0,并且它将两个数作为无符号值进行比较。这个名字代表 set less than, unsigned。slt 页面介绍了如何将比较结果存储为 1 或 0。

同样的 32 位既可以作为有符号数读取,此时最高位表示负数,范围大约为 -20 亿到 +20 亿;也可以作为无符号数读取,此时没有负数,范围为 0 到约 40 亿。slt 读取有符号值,而 sltu 读取无符号值。一个所有位都设置为 1 的寄存器,对 slt 来说是 -1,对 sltu 来说是可能的最大值,因此这两条指令在相同输入上可能给出不同结果。

对于不可能为负的量,例如内存地址、大小、计数和位置,请使用 sltu。用有符号的 slt 比较两个内存地址时,一旦地址大到足以设置其最高位,就会得到错误结果,因为有符号读取会将其视为负数。

RISC-V 手册将 slt 和 sltu 一起描述为有符号和无符号比较:如果 rs1 小于 rs2,则向 rd 写入 1,否则写入 0。它给出下面这一行作为测试非零的方法,这就是 snez 伪指令。

sltu rd, x0, rs2

sltu 的形式如下所示。

sltu rd, rs1, rs2

在下面的特殊情况下,只要 rs 不为零,rd 就会变为 1,因为 0 小于其他所有无符号值。这会将任意数字归约为 1 或 0。

sltu rd, zero, rs

示例

li t0, -1
li t1, 1
sltu t2, t0, t1   # t2 = 0 (t0 read as unsigned is huge)