質問

私は次のMIPSコードを持っています、そして、私はコードの数を減らすことができるようにコードを書き直す/並べ替えたいと思っています nop 正確性を維持しながら適切なパイプラインの実行に必要な指示。データパスは失速したり前方にしたりしないと想定されています。問題は2つのヒントを与えます。ブランチとジャンプが遅れており、遅延スロットが埋められる必要があることを思い出させ、必要に応じてメモリアクセス手順(LW、SW)のオフセット値を追いかけることを示唆しています。

LOOP:  lw           $1, 100 ($2)
       addi         $1, $1, 1
       sw           $1, 500 ($2)
       addiu        $2, $2, 4
       bne          $2, $10, LOOP

このコードが1つの配列の内容を増加させ、別のアレイに保存することは私にとって非常に明白です。したがって、ループを完了する前にインデックスを計算する必要があるため、このコードを再配置する方法を正確に見ているわけではありません。

私の推測は、移動することです LW (私が理解している限り)ブランチの指示後の指示遅延スロットの指示は常に実行されます。繰り返しになりますが、私はこの主題をよく理解していません。説明に感謝します。私は一般的にパイプラインを理解していますが、分岐がそれほど遅れていません。ありがとう

役に立ちましたか?

解決

ブランチの遅延スロットを埋める1つの方法は、次のことです。

addiu  $2, $2, 4  # We'll now iterate over [$2+4, $10] instead of [$2, $10[
LOOP:  lw           $1, 96 ($2)
       addi         $1, $1, 1
       sw           $1, 496 ($2)
       bne          $2, $10, LOOP
       addiu        $2, $2, 4  # Use the delay slot to increase $2

他のヒント

2番目のヒントに関しては:

4番目の指示を2番目にします。最初のものがまだ実行されている間に、それは(P/H用語を使用する場合、第1命令のIDの後)でパイプ化できます。次に、500ではなく(古い)3番目の指示496でオフセットを作成します。

最初のヒントに関しては、私は正確な遅延ブランチがどのように実行されるかについてあまり慣れていません(SPIMに実装されていないので、気にしませんでした)。 「遅延」という名前が示すように、古い最後の指示はおそらく2番目になることができますが、どのように、そしてその理由を伝えることができませんでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top