dポイントプレゼントキャンペーン実施中!

下のコードをMIPSコードへ変換する際の要点を教えて欲しいです

for( i=0; i<x; i+=1 )
y+=1;

A 回答 (4件)

ANo.3さんの回答への補足になると思うけど、要点は「遅延分岐」じゃないかな。


MIPSを含む一部のRISCアーキテクチャでは遅延分岐を採用しているので、分岐命令の次の命令は分岐に関わらず実行されます。コード生成ではこれを考慮して遅延スロットに適当な命令を入れることが必要です。
    • good
    • 0

これは、MIPS アーキテクチャを理解しているかどうかを問う問題なのでしょうね。


だから、具体的にコード展開するよりも、変換の際の要点を求められたということでしょうか。

MIPS アーキテクチャにかぎらず、RISCプロセッサは、単純な命令を(おおざっぱに言えば)同時多発的に実行することでスピードを上げるという技術ですから、それに適したコードを生成することは重要です。
その意味で、RISCプロセッサの性能はかなりの部分コンパイラの技術に依存しています。

かくいう私は、MIPS はみたこともないのですが、こんな感じかも。
普通のイメージのアセンブラだと、
for( i=0; i<x; i+=1 )
y+=1;
は、こんな感じに展開されると思います(実際のニーモニックではありません)


i = 0;

L1:
COMPARE i, x
JUMP if GE L2:

y++
i++
goto L1:

L:2

ここで、まず問題になりそうなのは、
COMPARE i, x
JUMP if GE L2:
の2行です。
この2行には依存関係があるので、パイプラインがうまく機能しません。
これを考慮して、

L1:
COMPARE i, x
y++
JUMP if GE L2:

i++
goto L1:

のようにすれば、前後の行で依存関係が無くなり、パイプラインがうまく流れるのかもしれません。
(ただし、普通は y++ が1回余計に実行されてしまうので、このままではだめです)

こんなことを考えることになるのかなとは思います。
    • good
    • 0

MIPS用のコンパイラでコンパイルしてください。

    • good
    • 0

・そのコードがどのような動作なのかをきちんと確実に理解する


・「MIPSコード」がどのようなものなのか確かめる
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!