bne
lyszt.netはbneおよびその他の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
説明
bne は branch if not equal(等しくない場合に分岐)を意味し、beq の対になる命令です。2 つのレジスタを比較し、それらが異なる場合にラベル位置へジャンプします。一致する場合は、次の命令で実行が続きます。形式は以下のとおりです。分岐、ラベル、条件によるジャンプについては beq のページで説明しています。
bne rs1, rs2, label
beq と bne は合わせて、等しい/等しくないのあらゆる判定を扱います。アセンブリでは、条件を反転した形で表すことがよくあります。2 つの値が等しいときだけコードのブロックを実行するには、bne でそのブロックを飛び越えます。値が異なればコードはブロックをスキップし、一致すればブロックに入ります。
bne はまた、条件が成り立つ間ループを続けるのにも使われます。値が目標に達するまで実行されるループは、先頭へジャンプし戻す bne で終わります。テキストの読み取りはこのパターンに従い、現在の文字が終端を示すゼロバイトでない間ループが続きます。
RISC-V のマニュアルには、beq と bne はレジスタ rs1 と rs2 が等しいか等しくないときに分岐すると書かれています。オフセットは 2 バイトの倍数で数えられる 12 ビット値なので、分岐はどちらの方向にも約 4 KiB に届きます。ここで 1 KiB は 1024 バイトです。
bnez はゼロとの比較、つまり値がゼロでないかどうかを問うための省略形です。bne の比較は beq と同様に単なるビットの等価性なので、符号付きか符号なしかは関係ありません。
例
li t0, 1 li t1, 2 bne t0, t1, done # t0 != t1, so jump to 'done'
