slt

slt

RISC-V アセンブリ 参考

lyszt.netはsltおよびその他の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

説明

slt は 2 つの数値を比較し、結果を 1 または 0 として格納します。名前は set less than の略です。以下の形式は rs1 が rs2 より小さいかどうかをテストします。テストが成功すると、この命令は宛先レジスタ rd に 1 を書き込みます。失敗すると 0 を書き込みます。

slt rd, rs1, rs2

比較は 2 通りの方法で使用できます。分岐命令はそれに基づいてジャンプします。あるいは、はい/いいえの答えを数値として格納し、真には 1、偽には 0 として後で使用することもできます。slt はその格納を行います。アセンブリでは真と偽を格納された 1 または 0 で表し、その値は他の数値と同様に加算、マスク、結合できます。

この比較は値を符号付きとして扱うため、負の値になることがあり、-1 は 0 より小さいと見なされます。関連命令 sltu は値を符号なしとして扱い、大きな値や負に見える値に対して結果が変わります。

RISC-V マニュアルでは、slt と sltu を、rs1 が rs2 より小さい場合に rd に 1 を、そうでない場合に 0 を書き込む符号付きおよび符号なしの比較として説明しています。また、一般的な符号付き加算のオーバーフローチェックにも slt を使用しています。加算の後、以下の 2 行目は第 2 オペランドが負かどうかを記録し、3 行目は和が第 1 オペランドより小さいかどうかを記録し、最後の行は 2 つの答えが異なる場合にジャンプします。

add t0, t1, t2
slti t3, t2, 0
slt t4, t0, t1
bne t3, t4, overflow

その理由は、和が一方のオペランドより小さくなるのは、もう一方のオペランドが負の場合だけだからです。

set greater than 命令は存在しません。a が b より大きいかどうかをテストするには、オペランドを入れ替えて b が a より小さいかどうかを尋ねます。例では 3 と 9 を比較します。3 は 9 より小さいので、t2 は 1 に設定されます。

例

li t0, 3
li t1, 9
slt t2, t0, t1   # t2 = 1