sltu
lyszt.netはsltuおよびその他のRISC-V命令をより詳しく扱っています。
エンコーディング形式
説明
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)
