bgeu

bgeu

RISC-V アセンブリ 参考

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

説明

bgeu は bge の符号なし版であり、bltu の反対です。名前は branch if greater than or equal, unsigned です。rs1 が rs2 以上であるときにラベルへジャンプし、両方とも非負の数として読み取られます。比較については bge を、符号なしが何を変えるかについては bltu を参照してください。

bgeu により、このファミリには 6 つの分岐があります。等しい、より小さい、以上という 3 つの問いがあり、最後の 2 つには符号付き形式と符号なし形式があります。beq と bne は等価性を判定し、blt と bge は符号付きの値を比較し、bltu と bgeu は符号なしの値を比較します。これら 6 つと、より大きい方向および以下方向のためにオペランドを入れ替えたものを合わせれば、プログラムが必要とするあらゆる比較を網羅できます。

bgeu は負になり得ない量に対する上限のチェックに適しています。例としては、位置が末尾に達したときにループを抜ける、配列サイズに達したインデックスを拒否する、長さが容量に達したときにハンドラへ分岐する、などがあります。メモリアドレスの比較には bltu と bgeu を使います。アドレスは符号なしであり、符号付き版ではそこで誤った結果になるからです。

RISC-V のマニュアルには、符号付きの配列境界は単一の符号なし分岐でチェックできると書かれています。負のインデックスは任意の非負の境界より大きいと比較されるからです。bgeu と bltu はそのチェックの 2 つの形式です。

以下の行は、結合された境界チェックを 1 命令で実行します。

bgeu i, n, error

これは大きすぎるインデックスや負のインデックスを捕捉します。負のインデックスは巨大な符号なしの値として読み取られ、テストに失敗するからです。

例

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