削除された内容 追加された内容
→‎レジスタ・ウィンドウ: MIPSはバークレーではなくスタンフォード
Melan (会話 | 投稿記録)
編集の要約なし
6行目:
== 特長 ==
=== レジスタ・ウィンドウ ===
29kは、バークレーRISC([[:en:Berkeley RISC]])の影響下にある[[サン・マイクロシステムズ]]の[[SPARC]]や[[Intel i960]]と同様、[[レジスタ・ウィンドウ]]を採用している<!--ref>[[MIPSアーキテクチャ]]は例外、MIPSはコンパイラ技術の向上で多数のレジスタが性能に貢献すると考えていた。</ref--><!-- ← まちがい。MIPSはバークレーではなくスタンフォードなのでここに出てくるのはおかしい -->。これは[[関数 (プログラミング)|プロシージャコール]]を劇的に高速化する技法である。基本的なアイデアは大きな[[レジスタ (コンピュータ)|レジスタ]]セットを[[コールスタック]]のように使うものである。
 
元のバークレーの設計もSPARCもi960もレジスタウィンドウのサイズは固定であり性能上の問題を引き起こしていた。たとえば、SPARCではローカル変数をひとつも使用しないルーチンに対しても8本のレジスタが固定的に割り当てられ、ウィンドウオーバーフローの機会を増やし性能悪化の原因となっている。この知見を生かし、Am29000ではウィンドウサイズを可変にすることで効率を向上させた。例えば、2本のレジスタをウィンドウとして、ひとつをローカル変数として使い、もうひとつをリターンアドレス格納に使う。それ以外にも、レジスタ・ウィンドウ用の128本とは別の64本のグローバルレジスタを持っていて常にアクセスできる。SPARCでは全体で8面程度<ref>SPARCのレジスタ・ウィンドウの深さは実装に依存する</ref>のレジスタ・ウィンドウを持ち、グローバル用に8本のレジスタを使っている。このようなレジスタ構造を、充分に高度なコンパイラを使うことで性能を向上させた。これに対し、Am29000はレジスタ・ウィンドウ・スタックをメモリにまで拡張している。プロシージャコールでレジスタセットを使い切っていると自動的にメモリ上のスタックにレジスタを退避する。逆にプロシージャからのリターンでレジスタセットを使い切るとスタックから復帰する。このように、29kのレジスタはコールスタックのキャッシュのように機能した。<ref>[[トランスピュータ]]の実装などにもスタックトップキャッシュは観られるが、これらはレジスタとしてのアクセス性は提供しておらずフレームレジスタを通じスタックを常に意識する必要がある</ref>