bge

bge

RISC-V アセンブリ 参考

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

説明

bge は blt と対になり、その条件を反転させます。この文字は branch if greater than or equal(以上なら分岐)を表します。rs1 が rs2 以上の場合、以下の命令はラベル位置へジャンプします。そうでなければ、実行は次の命令へ続きます。

bge rs1, rs2, label

任意の 2 つの値について、blt と bge のうちちょうど一方が分岐するため、この 2 つで全ての場合をカバーします。比較については blt で、分岐全般については beq で説明しています。

bge は一般に、ループの先頭で終了判定として現れます。以下の行は、カウンタ t1 が上限 t2 に達した時点でループを抜けます。

bge t1, t2, done

続いてループ本体があり、その末尾の無条件ジャンプで先頭に戻ります。本体の前に判定を行うことで、0 回の繰り返しにも対応できます。条件がすでに成り立つ本体は決して実行されないからです。

「または等しい」の部分が境界での動作を決めます。bge は 2 つの値が等しいときに分岐し、ループにおける off-by-one エラーは通常この境界に起因します。0 から n まで数えるループは、カウンタが n に達したときに終了します。

RISC-V マニュアルによれば、bge と bgeu は rs1 が rs2 以上の場合に分岐し、それぞれ符号付き値と符号なし値を比較します。分岐オフセットは 2 バイトの倍数で測られる 12 ビット値です。

blt と同様、比較は符号付きなので負の値も許されます。bgeu は符号なし形式で、アドレスやサイズに用いられます。よくある用途は、以下の行のように値が非負であることを確認することです。

bge t0, zero, ok

例

bge t1, t2, done   # leave the loop once i >= n