sltu

sltu

RISC-V アセンブリ 参考

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 を設定し、2 つの数値を符号なしの値として比較します。名前は set less than, unsigned の略です。slt のページでは、比較結果を 1 または 0 として格納する方法について説明しています。

同じ 32 ビットは、最上位ビットが負を意味し範囲がおよそ -20 億から +20 億となる符号付き数値として読むことも、負の値がなく範囲が 0 から約 40 億となる符号なし数値として読むこともできます。slt は符号付きの値を読み取り、sltu は符号なしの値を読み取ります。すべてのビットが 1 に設定されたレジスタは、slt にとっては -1 であり、sltu にとっては可能な最大値であるため、2 つの命令は同一の入力に対して異なる結果を返すことがあります。

メモリアドレス、サイズ、カウント、位置など、負になり得ない量には sltu を使用してください。2 つのメモリアドレスを符号付きの slt で比較すると、アドレスが十分に大きくなって最上位ビットが設定されると、符号付きの読み取りではそれが負として扱われるため、誤った結果になります。

RISC-V マニュアルでは、slt と sltu をまとめて、rs1 が rs2 より小さい場合に rd に 1 を書き込み、そうでなければ 0 を書き込む符号付きおよび符号なしの比較として説明しています。非ゼロをテストする方法として、以下に示す行を挙げており、これは snez 疑似命令です。

sltu rd, x0, rs2

sltu の形式を以下に示します。

sltu rd, rs1, rs2

以下の特殊なケースでは、0 は他のすべての符号なしの値より小さいため、rs がゼロ以外であるときはいつでも rd は 1 になります。これにより、任意の数値が 1 または 0 に還元されます。

sltu rd, zero, rs

例

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