AMD Am29000

AMD Am29000（Am29000、Am29kあるいは29kとも）は、AMDの32ビットRISCマイクロプロセッサ製品、またそれから派生した製品群。以下本稿では製品群全体、または製品としてのAm29000につきAm29kという。
この製品群は、1980年代から1990年代にかけて、Postscriptインタプリタと組み合わせて多くのメーカーのレーザープリンターに搭載されるなどRISCチップ市場で最も人気を誇った。しかし、1995年、AMDはAm29kの開発チームをx86互換チップ開発に異動させ、Am29kシリーズは終焉を迎えた。Am29kの様々なアイデアや回路がAMD K5の開発に使われた。組込応用市場用にはAm80186から派生した186ファミリを投入した。
特長.
レジスタ・ウィンドウ.
Am29kは、 の影響下にあるサン・マイクロシステムズのSPARCやIntel i960と同様、レジスタ・ウィンドウを採用している。これはプロシージャコールを劇的に高速化する技法である。基本的なアイデアは大きなレジスタセットをコールスタックのように使うものである。
元のバークレーの設計もSPARCもi960もレジスタウィンドウのサイズは固定であり性能上の問題を引き起こしていた。たとえば、SPARCではローカル変数をひとつも使用しないルーチンに対しても8本のローカルレジスタと8本の引数引渡しのレジスタが割り当てられウインドウを1面消費する。プロシージャコールが深くなるに伴い使用するウインドウ数が嵩んでウィンドウオーバーフローを引き起こし、性能悪化の原因となっている。この知見を生かし、29kではウィンドウサイズを可変にすることで効率を向上させた。レジスタ・ウィンドウ用に備えられた128本のレジスタにつき、ひとつのプロシージャでは例えば、2本のレジスタをウィンドウとして、ひとつをローカル変数として使い、もうひとつをリターンアドレス格納に使って4本のレジスタのみを消費する。レジスタ・ウインドウとは別に64本のグローバルレジスタも持っており、いずれのプロシージャからも常にアクセスできる。SPARCでは全体で8面程度のレジスタ・ウィンドウを持ち、グローバル用に8本のレジスタを使っている。充分に高度なコンパイラを使うことで、このようなレジスタ構造に適したコードを生成し性能を向上させた。これに対し、Am29kはレジスタ・ウィンドウ・スタックをメモリにまで拡張している。プロシージャコールでレジスタセットを使い切ると自動的にメモリ上のスタックにレジスタを退避する。逆にプロシージャからのリターンでレジスタセットを使い切るとスタックから復帰する。このように、Am29kのレジスタはコールスタックのキャッシュのように機能した。
ステータスの格納.
他の典型的なCPUでは条件分岐などの判断に供するステータスレジスタを持つが、Am29kはこれを持たず、多数の汎用レジスタのいずれでも条件判断に供することができ、その内容で分岐の可否を判断できる。
遅延実行とブランチターゲットキャッシュ.
Am29kも多くの初期のRISCと同じく遅延実行方式を採用した。また、ブランチターゲットキャッシュ（BTC）とよばれる512バイトのを持ち、これは過去に分岐先となったアドレスのインスタンスをキャッシュすることにより、分岐の際の性能を向上させた。ファミリの中でも、Am29005ではBTCは実装されず、Am29050では1024バイトに増量されていた。
ハーバード・アーキテクチャ.
Am29kは、命令バスとデータバスを分離したハーバードアーキテクチャを採用した。これは、有限のメモリ帯域を命令フェッチとデータアクセスで分離することで、資源の競合/レイテンシーの悪化を回避しスループットを向上する効果がある。同時に、自己書き換えコードが正しく機能しないなどの問題もあるが、Am29kの主要な応用である組込用途に於いては、自己書き換えコードは不可欠なテクニックではなく問題として顕在化されることは殆どなかった。
その後.
Am29050の後継プロセッサは、スーパースカラ、アウト・オブ・オーダー実行、レジスタ・リネーミングなど、その後のマイクロプロセッサで設計・実装される機能が計画されていた。これは最終的に製品にはならなかったが、x86互換プロセッサであるK5に受け継がれ、FPUはそのまま使われ、x86の命令をマイクロコードにより29000ファミリに似た命令に内部的に変換され実行された。
参考.
ロードマップでわかる！当世プロセッサー事情 ― 第122回『CPU黒歴史　対Pentiumのために放棄されたAm29000』