sltu
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)
