sltiu

sltiu

RISC-V アセンブリ 参考

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

説明

sltiu は slti と sltu を組み合わせたものです。レジスタと定数を比較し、両方の値を符号なしとして扱います。名前は「set less than, immediate, unsigned」の各部分を重ねたものです。以下の形式は、rs1 が定数 imm より小さいときに rd に 1 を書き込み、両方を非負の数として読み取り、それ以外の場合は 0 を書き込みます。

sltiu rd, rs1, imm

sltu のページと同様に、符号なしとは最上位ビットが数の通常の桁として数えられることを意味し、範囲は 0 から約 40 億までになります。sltiu は、負になり得ない値に対する範囲チェック、たとえばインデックスが配列のサイズより小さいかどうかの検査を、1 命令で処理します。

以下の行は、値が 1 より小さいかどうかを問い合わせます。

sltiu rd, rs, 1

1 より小さい符号なしの値はゼロだけなので、rs がゼロのとき結果は 1、それ以外は 0 になります。これはゼロとの等価を検査するもので、seqz の省略形はこれから作られています。2 つの値の等価性もこれに従います。2 つの値を XOR すると、一致するときだけゼロになるので、その結果をゼロと検査します。

RISC-V のマニュアルによると、定数はまず 32 ビットに符号拡張され、その後符号なしの数として扱われます。したがって、負の定数は非常に大きな符号なしの値になります。マニュアルでは、定数 1 を伴う sltiu がゼロを検査する方法として示されており、これが seqz 疑似命令です。

slti と同様に、12 ビット範囲を超える定数は li でレジスタにロードされ、sltu で比較されます。

例

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