bnez
疑似lyszt.netはbnezおよびその他のRISC-V命令をより詳しく扱っています。
説明
bnez は、レジスタがゼロ以外の値を持つときに分岐します。この名前は branch if not equal to zero を意味します。以下の形式は、rs が非ゼロのときにラベルへジャンプします。
bnez rs, label
アセンブラはこの疑似命令を以下の命令に展開します。これは常にゼロを保持するレジスタと比較します。
bne rs, zero, label
ゼロ判定については beqz を、分岐全般については beq を参照してください。
beqz は終了を守るためによく使われ、bnez はループを動かし続けるためによく使われます。読み取るべき文字が残っている間、ループは走査を続けます。カウンタが尽きていない間、それは進み続けます。よくある短いループの終わりは、レジスタをデクリメントし、値が非ゼロの間ループします。1 を引き、その後 bnez で先頭へジャンプして戻ります。
bnez は以前に計算された真または偽の値にも作用します。slt のような設定命令はレジスタに 1 または 0 を残し、続く bnez はその結果に基づいて分岐します。はいかいいえの値を保持するレジスタは bnez でテストできます。
RISC-V のマニュアルは、その分岐が 1 つのレジスタをゼロと比較するのではなく 2 つのレジスタを比較する理由を 1 つ挙げています。ゼロとの比較には自明でない回路遅延が必要なので、算術的な大小比較とほぼ同じコストがかかります。したがって bnez は zero を伴う bne を使う疑似命令です。
もう 1 つのよくある用途は結果を確認することです。関数が成功に対して 0 を、失敗に対して非ゼロを返すとき、呼び出し側は呼び出しの後に以下の行を続けて、何か問題が起きたときはいつでもエラー処理へジャンプします。これは戻りコードを確認するアセンブリ形式です。
bnez a0, error
展開先
bne rs, zero, label
アセンブラはこの疑似命令を、上記に示された実際の命令または複数の命令に置き換えます。
例
li t0, 5 bnez t0, done # t0 != 0, so jump to 'done'
