sltiu

sltiu

RISC-V 汇编 参考

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

描述

sltiu 结合了 slti 和 sltu。它将寄存器与常量进行比较,并把两个值都视为无符号数。这个名字堆叠了各个部分:set less than、immediate、unsigned。下面的形式在 rs1 小于常量 imm 时把 1 写入 rd,两个值都按非负数读取,否则写入 0。

sltiu rd, rs1, imm

与 sltu 页面一样,无符号意味着最高位被当作数字的普通数位,因此范围从 0 到约 40 亿。sltiu 用一条指令处理那些不可能为负的值的范围检查,例如测试某个索引是否小于数组的大小。

下面这行询问该值是否小于 1。

sltiu rd, rs, 1

0 是唯一小于 1 的无符号值,所以当 rs 为 0 时结果为 1,否则为 0。这测试是否等于零,而 seqz 简写就是由它构建的。两个值之间的相等性也由此得出。将两个值进行 XOR,只有当它们匹配时结果才为零,然后测试结果是否为零。

RISC-V 手册说,常量首先被符号扩展为 32 位,然后被当作无符号数处理。因此负常量会变成一个非常大的无符号值。手册给出了带常量 1 的 sltiu 作为测试零的方法,也就是 seqz 伪指令。

与 slti 一样,超出 12 位范围的常量会用 li 加载到寄存器中,并用 sltu 进行比较。

示例

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