そこで、私の教科書 (Computer Organization and Design) を引用して、質問をします。
if-then-else を条件分岐にコンパイルする
次のコード セグメントでは、f、g、j、i、および j は変数です。f から j までの 5 つの変数が $s0 から $s4 までの 5 つのレジスターに対応する場合、この C の if ステートメントのコンパイル済み MIPS コードは何ですか?
もし (i == j) f = g + h; そうでなければ f = g - h;
図 2.9 は、MIPS コードが何をすべきかのフローチャートです。最初の式は等しいかどうかを比較するため、レジスタが等しい場合は分岐が必要なように思われます (beq)。一般に、if の後続の then 部分 (ラベル Else は以下で定義されています) を実行するコードを分岐する反対の条件をテストすると、コードはより効率的になります。 (bne):
bne $s3, $s4, Else # i ≠ j の場合は Else へ
しばらく検索しましたが、bne が beq よりも効率的である理由がわかりませんでした。(ただし、bne ステートメントのすぐ下に条件成立時に実行されるステートメントがあるため、コードが理解しやすくなるため、bne が推奨される場合があることがわかりました。)
したがって、一般的にはより効率的でない場合でも、この特定の演習ではより効率的である可能性があります. 考えてみたところ、ジャンプ命令には時間がかかるので、必要なジャンプの量を最小限に抑えたいと考えました。つまり、条件が成立すると予想される場合は bne を使用し、条件が成立しないと予想される場合は beq を使用する必要があります。
$s3 が $s4 に等しいかどうかをテストすると、これらのレジスタの内容に関する情報がまったくない場合、それらが等しい可能性が高いと仮定するのは合理的ではありません。それどころか、それらが等しくない可能性が高いため、bne の代わりに beq を使用する必要があります。
つまり、要約すると、教科書には bne が beq よりも効率的であると書かれています。それが一般的なのか、この例だけなのかは明確ではありませんが、どちらの場合も理由はわかりません。