1

私は 1 年前にコンピューター編成コースを受講しましたが、現在は「コンピューター アーキテクチャー」としてフォローアップしています。ジョン ヘネシーの著書「コンピューター アーキテクチャーへの定量的アプローチ」の第 3 版を使用しています。MIPS ISA を受けました。まだ助けが必要ですが、このコード行をさらに詳しく説明していただけますか

ソースコード:

for(i=1000; i>0; i--)
    x[i] = x[i] + s;

アセンブリ コード:

   Loop:      L.D         F0, 0(R1)          ; F0 = array element
              ADD.D       F4, F0, F2        ; add scalar
              S.D         F4, 0(R1)          ; store result
              DADDUI      R1, R1,# -8      ; decrement address pointer
              BNE         R1, R2, Loop    ; branch if R1 != R2

これは ILP を悪用するためのループ展開の例として示されていますが、私にはいくつか疑問があります。配列が Mem[0+R1] から始まり、 Mem[R+8] (テキストに示されているように) まで逆行することがわかります。これには何らかの理由がありますか、それともランダムにこの場所を取りましたか?

また、符号付きの数値 (-8) を追加するときに DADDUI (unsigned) を使用するのはなぜですか?

残りのトピックに沿ってフォローできるように、これの詳細な概要を教えてください。ありがとう

4

1 に答える 1

4

メモリ アクセスは、アドレスに対して、ソース コードのループで指定された順序で実行されます。

このdaddiu命令は、このようなアドレス演算を実行するのに十分です。「負」の値は、2 の補数で減算を実行します。アドレスは負でも正でもありません。それらは単なるビットパターンです。MIPS と手順の詳細については、ISA リファレンスを参照してください。

16 ビットの符号付き即値が GPR rs の 64 ビット値に加算され、64 ビットの算術結果が GPR rt に格納されます。どのような状況でも整数オーバーフロー例外は発生しません。

…</p>

命令名の「符号なし」という用語は誤称です。この演算は、オーバーフロー時にトラップされない 64 ビットのモジュロ演算です。アドレス演算などの符号なし演算や、C 言語演算などのオーバーフローを無視する整数演算環境に適しています。

この例は最適化または展開されていません。ソースを直訳しただけです。

于 2015-03-29T08:36:00.550 に答える