slti

slti

RISC-V 汇编 参考

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

描述

slti 将一个寄存器与一个常量进行比较,并将 1 或 0 写入目标寄存器。它是 slt(比较两个寄存器并将结果存储为一个数字,参见该页面)的立即数版本,其中第二个值以立即数形式提供。立即数是指令中编码的常量,名称中的 i 就表示这一点。

slti 的形式如下所示。当 rs1 中的值小于常量 imm 时,rd 得到 1,否则得到 0。

slti rd, rs1, imm

比较是有符号的,因此寄存器和常量都被读取为可能为负的数字。

用它来将变量与事先已知的固定阈值进行比较。检查索引是否小于 10,或者某个值是否已降到某个限制以下,只需一条 slti。下一行询问 t0 是否小于零,这会检测负值,并在值为负时将 t1 设为 1,否则设为 0。

slti t1, t0, 0

RISC-V 手册指出,当 rs1 和符号扩展后的立即数都被视为有符号数时,如果 rs1 小于该立即数,slti 就将 1 放入 rd,否则放入 0。一般有符号加法的溢出检查会使用它,如 slt 页面所示,来记录某个操作数是否为负。

常量的范围是 -2048 到 2047。要与更大的值比较,请用 li 将常量加载到寄存器中,并使用 slt。汇编器会拒绝超出范围的常量并给出错误消息。

示例

li t0, 3
slti t1, t0, 5   # t1 = 1 (3 < 5)