bltu

bltu

RISC-V アセンブリ 参考

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

説明

bltu は blt と同じ分岐を行いますが、両方のレジスタを符号なしとして読み取ります。名前は branch if less than, unsigned を表します。rs1 が rs2 より小さいときに分岐が成立し、両方の値は 0 から約 40 億までの非負の数として読み取られます。blt のページでは分岐そのものについて説明しています。このページでは、符号なしの読み取りに専用の命令がある理由を説明します。

同じ 32 ビットでも、最上位ビットを符号として読むか値の一部として読むかによって、表す数が異なります。blt はビットを符号付きとして読み取り、bltu は符号なしとして読み取り、この 2 つの読み取りは一致しません。すべてのビットが 1 に設定されたレジスタは、blt にとっては -1 という非常に小さな値であり、bltu にとっては可能な最大の値です。誤った命令を選ぶと、エラーメッセージも出ずに誤った結果が生じます。

bltu は、メモリアドレス、サイズ、カウント、位置など、負になり得ないものすべてに適しています。符号付きの blt でアドレスを比較すると、アドレスが大きくなって最上位ビットが立つと失敗します。符号付きの読み取りでは負と見なされるからです。

RISC-V のマニュアルにも同じ範囲チェックについての記述があります。符号付きの配列の境界は、単一の bltu でチェックできます。負のインデックスは、非負の境界よりも大きいと比較されるからです。

単一の bltu で、インデックスが範囲内にあること、つまり 0 以上でサイズ n 未満であることをチェックできます。

bltu i, n, ok

i が負の場合、その符号なしの読み取りは非常に大きな数となりテストに失敗するため、1 回の符号なし比較で大きすぎる場合と負の場合の両方を捉えられます。

例

li t0, 1
li t1, -1
bltu t0, t1, done   # t1 read as unsigned is huge, so jump to 'done'