i860

Intel社の初のRISCプロセッサがi860です。ベクトル浮動小数点演算器を内蔵し、MMXの原形ともいえるグラフィックス支援機構も組み込まれたプロセッサで、64 bitデータバスを採用した最初の製品でもあります。このアーキテクチャに適したアプリケーションを最適化されたコードで実行する限りは当時最高性能のプロセッサですが、パイプラインを意識してプログラムを組まないと性能を引き出すことはできません。

80860XR
A80860XR-33でPGAパッケージ。松尾様よりいただきました。

このi860の内部構成を簡単なブロック図にしてみました。
Schimatic of i860 internal function block
データ経路が色分けされていますが、赤で書かれたものが64 bit幅の経路です。黒は32 bitかそれ以下の部分ですが、ほとんど32 bitと考えてかまいません。
左側がバス制御と整数演算部で、中央より左が浮動小数点演算にかかわる部分ということになります。内部データバスが外部データバスに合わせて64 bitというのは自然ですが、データキャッシュと浮動小数点制御および浮動小数点レジスタブロックの間は2回路の64 bitパスで結合されているのが目につきます。つまり浮動小数点レジスタとデータキャッシュの間のやりとりは128 bit幅の配線で結ばれているのです。当時のプロセッサとしては異例のデータ幅です。また、浮動小数点演算部と浮動小数点レジスタは、ソースが2回路、演算結果のリターン側が1回路、計3回路分のデータパスが用意されていて、同時に複数のデータを演算器とレジスタ間で転送できるようになっているうえ、途中にKR, KI, Tというバッファレジスタが用意されていて、浮動小数点乗算器と浮動小数点加算器が同時に動作できるように配慮されています。演算回路の高性能化だけでなく、データ経路の広帯域化に配慮した設計となっているのがわかります。
ただし、浮動小数点演算は汎用マイクロプロセッサというよりデジタル信号処理プロセッサ的というか、マイクロプログラム制御的というか、ブロック図にある通りの経路でしか実行できません。浮動小数点乗算器や加算器の入力のそれぞれにはマルチプレクサが入れられていて、それぞれ2 - 3通りの入力の中から命令で選択できるようになっていますが、この演算回路の流れに入らない計算を行うためには、一度レジスタに戻して複数命令に分解して実行する必要があります。この演算経路をうまく利用して、各クロックごとに乗算器や加算器をすべて稼働させるようにプログラムを組むのが、プログラマの腕の見せ所となります。単純に普通のマイクロプロセッサのように1命令でひとつの演算だけを行うようなプログラムを作成すると、劇的に性能が低下してしまうプロセッサといえます。
命令キャッシュは4 KByte、データキャッシュは8 KByteの容量があり、共に1ライン32 Byteの4ウェイセットアソシアティブ方式のキャッシュです。外部メモリからキャッシュをフィルするための命令や、演算パイプラインとキャッシュを同期させるための命令も用意されています。これはキャッシュをフィルする命令が発行されてからキャッシュに正しいデータが読み込まれるまでの間にも次々と命令が処理されていくため、同期させないとまだ満たされない古いキャッシュデータを使用する可能性があるためで、アセンブリ言語レベルでプログラムする場合には、パイプライン以外にもキャッシュの状態までプログラマが意識しなくてはならないことになります。

内蔵レジスタは32 bit幅の整数レジスタがr0 - r31の32本、上のブロック図ではRISC CORE内部に収められています。この内のr0はゼロレジスタで、必ず0が読み出される定数レジスタです。r1はサブルーチンからのリターンアドレス格納用で、r2がスタックポインタ、r3がフレームポインタとして用いられます。ほかは基本的に汎用レジスタですが、推奨される使用法が定められていて、r4からr15までの12本がローカル変数用、r16からr27までの12本が引数の受け渡し用、r28からr30までの3本がテンポラリレジスタ、r31がアドレス計算用のテンポラリレジスタとされています。
浮動小数点レジスタもf0からf31まで32 bit幅のレジスタが32本ありますが、64 bit浮動小数点数を格納する場合には2本一組として偶数番目のf0, f2, f4, ..., f30が使われます。やはりf0(とf1)はゼロレジスタで、f2 - f15はローカル変数用、f16 - f27が引数用、f28 - f31がテンポラリ用途とされています。これらは、上のブロック図ではFP REGISTER FILEという部分に相当します。
さらに浮動小数点演算回路のバッファレジスタとして、64 bit幅のレジスタKR, KI, Tレジスタが用意されています。こちらはブロック図に独立した箱で書かれています。
ブロック図のGRAPHICS UNIT内部には64 bit幅のMERGEレジスタが含まれています。
このほか、psr, epsr, db, dirbase, fir, fsrの32 bit幅制御レジスタが含まれています。

グラフィックスユニットはピクセル間の演算をまとめて同時に行う機能を持ちます。i860のサポートするピクセル幅は8, 16, 32 bitのいずれかで、これを64 bit幅の浮動小数点レジスタに複数格納し、各色ごとの加算をまとめて固定小数点演算で行い、その整数部をMERGEレジスタにパックしなおすようなことが可能です。このあたりはPentium ProcessorのMMX命令と浮動小数点レジスタを流用するところまで似ています。また、外部メモリに書き込む際、psrレジスタのピクセルマスクフィールドにしたがって、64 bitレジスタにまとめて格納されているうちの一部のピクセルデータだけ書き込むことが可能となっています。

Return to IC Collection.