読者です 読者をやめる 読者になる 読者になる

【パタヘネ】if-then-else文の条件分岐へのコンパイル

パタヘネ

パタヘネ第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よりも処理として時間がかかるとは言える.