slt
lyszt.netはsltおよびその他のRISC-V命令をより詳しく扱っています。
エンコーディング形式
説明
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
電子
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4.2, Integer Register-Register Instructions, page 29.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4, Integer Computational Instructions, page 27.
