SuperFXのアーキテクチャの特徴
いわゆるSuperFXチップは、スーパーファミコンにおいてStar Foxや他のゲームで3Dポリゴンの描画や他の仕事に用いられたチップで、当時('92〜'94)としては非常に広範に普及したRISCチップとなった(搭載ゲームがよく売れたため)。
Wikipediaによると( http://en.wikipedia.org/wiki/Super_FX )これをベースにARCのRISCコアが作られたことになっているが、どの程度特徴を受け継いでいるのかについては何とも言えない。ARC自身は普通のDSPやRISCプロセサを提供しているように見える。
RISC的特徴
- Delay slotを持つ
- 16bit x 16個のレジスタ
- 除算ステップ命令を持つ
MSP430のような、いわゆる組み込みのRISC風プロセサによく見られるように、PCや他の機能レジスタも通常のレジスタにマップされている。例えばPCはR15となる。
DSP的特徴
- 512byteのローカル命令ストレージ
- 16x16 = 32bit乗算命令
- スタックが無い
- よってCALL/RETも無い
ローカル命令ストレージは要するにキャッシュで、メモリ空間のうち16byteアラインされた512byteをキャッシュとして利用できる。このキャッシュへのfillを待つための命令もある。
キャッシュはdirect-mapで、1ライン16byte。よってベースレジスタの他は1bitのTAGビットのみを持ち、ラインが有効かどうかだけを示す。選択的なinvalidateは無い。
キャッシュ内の命令を実行する限りは、1命令1サイクルが最小の実行時間となる。そうでない場合は最低でも3サイクル掛かる。
16bitの乗算命令を持つが、乗算器は8x8=16bitなので、16x16=32bitには3サイクル以上かかる。8x8=16bitの乗算は(命令がキャッシュ中に有れば)1サイクルで行える。
通常のプロセサに無い特徴として、SuperFX固有のスタック命令やスタックのためのABIを持たない。サブルーチンへのリターンアドレスなどは自分で管理する必要がある。SuperFXは非同期の割り込みを処理するための仕組みを持たない(本体のCPUからは単にstart/stopだけできる)。
いわゆるサブルーチンコールを支援する命令として、LINK命令がある。LINK命令は、PC+N(4bit即値)をR11レジスタに格納する命令となっている。Nを加算するのは、ジャンプ命令とディレイスロットの命令を飛ばすため(Super FXは可変長命令であることに注意)。同様の機構は例えばMIPSのJAL(Jump and Link)に見られる。MIPSのJAL命令は$31レジスタにPC+4を格納する。MIPSの命令長は32bit固定なので、リターンアドレスは後続の命令に依らない。
PCが通常のレジスタとしてマップされているので、ジャンプやRETの代わりにMOVE命令を使う。
CISC的特徴
- レジスタの多くは固定された用途を持つ
- 6502風の0,1オペランドコードと2オペランドコードの混在
- FROM命令やTO命令として、レジスタを指定するための命令が別に存在する
- 長い演算にはいくらかのサイクルを消費する
- オペコードをフラグによって拡張している
- LOOP命令を持つ
先のLINK命令のように、ディスティネーションが固定された命令が多い。一部のRISCのように、乗算命令のディスティネーションも固定されていたりする。
これはDSP的と言えるかも知れないが、ADD/ADCで命令コードは同一であり、ステータスフラグ(2bitのALTフラグ)によって動作が変更される。
- http://code.google.com/p/snes9x-gtk/source/browse/trunk/fxdbg.cpp - ALT0〜4の4つのテーブルで、NOPのように動作が変更されていないものもある。
SuperFXのループ命令はx86のLOOPに似ている。特定のレジスタを1減算し、その結果によって分岐を行う。これもコード密度を高めるためのデザインと考えられる。
固有の特徴
- カートリッジ内のROM/RAMに対して動作する
- store back命令を持つ
- 画面に点を打つための専用命令が有る(PLOT/COLOR)
カートリッジ内ROMは1つしか無いので、本体のCPU(これもカートリッジ内ROMのコードを実行する)とSuperFXを同時に実行するためには、SuperFX側のコードをローカル命令ストレージに収める必要がある。
CPUとSuperFXが同時に実行出来ないのは地味に問題になる。本体CPUの割り込みベクタは通常ROMにマッピングされているので、SuperFXの動作中にNMIが発生すると困ったことになる。SuperFXは割り込みベクタに対するアクセスは特別扱いしてRAMのアドレスにルーティングすることでこの問題を回避している。
"直前にロードしたアドレスにストア"する命令がある。これはコード密度を上げ、かつ、アドレスのラッチを減らすためと考えている。
PLOT命令は、座標(R1,R2)にCOLOR命令でセットした色をプロットする。このような命令があるのは、当時の家庭用ゲーム機にはいわゆるビットマップを直接表現したVRAMが存在せず、フルスクリーンのグラフィックスをレンダリングするようには出来ていなかったため。
SuperFXには8byteの専用キャッシュがあり、複数のpixelの描画を一旦キャッシュしてちょうど良い単位で書き出すようになっている。スーパーファミコンでは1ピクセルあたり2〜4bit程度なので、1度の描画でRAMのデータを更新するわけにはいかない。