パタヘネ第5版p89の例題(if-then-else文の条件分岐へのコンパイル)の理解ができなかった.
本の例題は,下記のコードをコンパイルした結果のMIPSコードを示せというもの.
if(i==j){ f = g + h; else{ f = g - h; }
条件分岐を行い,それにしたがって,特定の処理を行うというもので,
単純に考えると2つのレジスタの値が等しい時に分岐するbeq命令を使いたくなる.
しかし,一般的には条件を逆にチェックしたほうがコードの効率がよくなるという.
この場合は,2つのレジスタの値が等しくないときに分岐するbne命令を使用することになる.
とりあえずアセンブリコードを書いてみる
beq命令を使うバージョン
beq $s3, $s4, Else # i=jならElseにジャンプ sub $s0, $s1, $s2 # f=g-h (i=jならスキップ) j Exit # Exitへジャンプ Else: add, $s0, $s1, $s2 # f=g+h (i≠jならスキップ) Exit:
bne命令を使うバージョン
bne $s3, $s4, Else # i≠jならElseにジャンプ add $s0, $s1, $s2 # f=g+h (i≠jならスキップ) j Exit # Exitへジャンプ Else: sub $s0, $s1, $s2 # f=g-h (i=jならスキップ) Exit:
アセンブリコード長としては同じなので,効率の違いが出るとしたら,
beqとbneのチェック速度だろうか.
たしかに定性的に考えるとビットパターンがすべて合っているか確認しなければならないbeqは,
bneよりも処理として時間がかかるとは言える.