2016-04-29 4 views
0

私は命令を減らすことによってMIPSコードを最適化しようとしています。今のところ、私はwhileループを持っています:MIPSアセンブリを最適化する

funct: add $v0, $zero, 0 
     add $t0, $zero, 0 
Loop: slt $t1, $t0, $a0 
     beq $t1, $zero, Exit 
     add $v0, $v0, $t0 
     addi $t0, $t0, 1 
     j Loop 
Exit: jr $ra 

これは、同等の意味で、単純なwhileループに変換されています。しかし、私はプログラムの実行を減らすためにこれをdo-whileループに変換する方法を混乱させています。

答えて

2

これは宿題の問題のように見えるので、私はあなたに答えをスプーンを与えずに正しい方向に向けるようにします。

条件付きジャンプを「完了しましたか?」と尋ねるのではなく、条件を「続けるべきか」と逆にすると、あなたができることを考えてください。

0

ループを0回実行する必要がある場合は、条件分岐をの外側に入れてください。ループをチェックしてそのケースを確認してください。

また、最初の反復をループ外に設定する(または実際に行う)方法もあります。もう一つのトリックは、最初の命令に落ちるのではなく、ループの途中にジャンプすることです。この技術の名前があるかどうかはわかりません。ループ内の命令シーケンスを回転させるだけではなく、ループ内の命令シーケンスを回転させるのではなく、コードサイズを増加させるより複雑なものとしてsoftware pipeliningを定義しています。

ループ条件を最下部に置く再構成は簡単です:チェックを逆転させ、ブランチを終了させるのではなく、適切なときにループのフォールスルーが発生するようにします。


実際に実行される命令の数を減らしたい場合は、数式を実行してループを削除します。 $t0 = 0 .. $a-1、それを$v0に追加します。したがって、ループはちょうど和です(0 .. $ a-1)。 sum(0..n)の閉じた形式の式はn * (n+1)/2です。

ループを変換するときは、ループをスキップすることができます(保持する場合).0は加算的な識別情報です。