R3000
出典: フリー百科事典『ウィキペディア(Wikipedia)』
R3000は、1988年にリリースされた32ビットMIPSアーキテクチャのRISCマイクロプロセッサである。
R3000 はCPUと、メモリ管理および例外処理を担当するCP0と呼ばれる部分から構成される。またFPUはR3010という別チップであり、R3000と密に結合して使用される。基本的に従来のR2000と同じアーキテクチャで、動作周波数と内蔵キャッシュメモリ容量が強化されている。動作周波数は様々(20MHz~40MHz)だが、主に30MHz、33MHzで使用されることが多い。一次キャッシュは命令用64Kバイト、データ用64Kバイトであり、二次キャッシュは外付け可能ではあるがCPUから制御する手段はアーキテクチャ上は用意されていない。また、NECはR3000とR3010をワンチップにしたVR3600というチップをリリースしている。
ミップス社は設計のみを行い、製造はメーカーに任せていた。R3000 を製造したメーカーとしては、IDT、LSIロジック、NEC、シーメンス、東芝などがある。SGIなどのワークステーションやサーバに使用された。また、PlayStationのプロセッサとしても使用され、組み込みシステムにも多く使われた。
目次 |
[編集] アーキテクチャ
R3000 は、4つのコプロセッサをサポート可能なアーキテクチャとなっているが、実際に使っているのはふたつであり、CP0 としてメモリ管理ユニットと例外処理ユニットを内蔵し、CP1 として接続された FPU を制御する。後継アーキテクチャでは FPU の拡張命令を CP1X として従来 CP3用とされていたオペコード表に割り当てている。命令はすべて32ビットとなっていて命令フェッチとデコードを単純化している。CPUのパイプラインは5段になっていて、実行ユニットとしてALU以外に、乗除算ユニットなどを持っている。CPUの汎用レジスタは32ビット×32本で、他に乗除算の結果を格納する専用レジスタ(32ビット×2本)とプログラムカウンタがある。
CP0 は、以下のような機能を持つ。
- ユーザモード、カーネルモードの設定
- 例外発生時の原因情報を保持
- メモリ管理機能。MIPSアーキテクチャでは仮想物理アドレス変換のためのTLBを直接ソフトウェアで制御するようになっており、そのための機能を実装している。TLBは64エントリのCAM(連想メモリ)であり、各エントリが4Kバイトのページをマップする。そのうち 8エントリは固定エントリと呼ばれ、オペレーティングシステムが固定的に使用し、それ以外はランダムエントリとして無作為に入れ替えて使用する。OSのカーネルはTLBを操作する際に、TLBを使用しない空間(下記)で動作するか、固定TLBエントリのマップする空間内で動作しなければならない。
- TLB を使用しないメモリアクセスも可能になっていて、右図のようになっている。kseg1 をメモリマップドI/Oに使用するため、I/Oをその位置に配置すると、TLBを使わずにアクセスできるメモリは512Mバイト以下となる。
- TLBミスヒットが発生した場合、カーネルが処理を行う。これは他のアーキテクチャではハードウェアで実現している機能であり、ここを如何に最適化するかが性能に重要な影響を与える。OSが用意したページテーブルを仮想空間上で連続に配置しておくと高速にTLBのリフィル(置き換え)ができるよう設計されているが、そのためにはページテーブルがTLB上でマップされている必要があり、固定TLBエントリがこの用途のために使われることが多い。
- キャッシュメモリはTLBの外側にあり、物理アドレスタグになっている。ダイレクトマップ方式であるため、物理アドレスがちょうど64Kバイトの倍数分だけ離れたところにある配列のコピーなどを行うとキャッシュのスラッシングと言われる現象が発生して劇的に性能が低下する。つまり、ロード命令によってキャッシュ上に置かれたメモリ内容を直後のストア命令で置き換えてしまうため、次のロード命令でも再度メモリから読み込む必要が生じるのである。
FPU(R3010)は、以下のような特徴を持つ。
- IEEE754 浮動小数点数の規格に準拠したフォーマット。
- 32ビット×32本のレジスタ。倍精度演算では 64ビット×16本のレジスタとして使用。
- 6段のパイプライン。実行ユニットは、加減算ユニット、乗算ユニット、除算ユニットの3つ。
- CPUとは異なり、ステータス・レジスタを持っている。
[編集] 命令セットの概要
命令は三種類のフォーマットに分類される(R, I, J)。Rフォーマットは三つのレジスタとオペコードから構成される。Iフォーマットは二つのレジスタと16ビットのイミディエート値(とオペコード)から構成される。Jフォーマットは6ビットのオペコードと26ビットのイミディエート値から構成される。
算術演算(加減算)は以下のような形式である。
add $1, $2, $3 ; $1 = $2 + $3 (符号付) addu $1, $2, $3 ; $1 = $2 + $3 (符号無) sub $1, $2, $3 ; $1 = $2 - $3 (符号付) subu $1, $2, $3 ; $1 = $2 - $3 (符号無) addi $1, $2, 100 ; $1 = $2 + 100 (符号拡張されたイミディエート値)
符号無イミディエート値の加算(addiu)もある。またイミディエート値の減算はaddiで負の値を指定することで実現できる。
MIPSは、ロード・ストア型のアーキテクチャなので、メモリへのアクセスは基本的に以下のふたつの命令で実現される。
lw $1, 100($2) ; $2 + 100 で示されるアドレスのメモリワード(32ビット)を $1 レジスタにロードする。 sw $1, 100($2) ; $1 レジスタの内容(32ビット)を $2 + 100 で示されるアドレスのメモリにストアする。
分岐とジャンプ命令には、以下のようなものがある。これらは必ず次の命令を実行してからジャンプするため(ディレイスロット)、注意が必要である。
beq $1, $2, 100 ; もし ($1 == $2) ならば、PC+4+100 へ飛ぶ。 slt $1, $2, $3 ; もし ($2 < $3) ならば $1 = 1、そうでなければ $1 = 0 。(これは正確には比較命令) j 10000 ; 10000番地へ飛ぶ。 jal 10000 ; $31 = PC + 4 とした上で、10000番地へ飛ぶ。サブルーチンコールで使用する。
他に重要な命令として、以下のものがある。
lui $1, 100 ; イミディエート値 100 を $1 レジスタの上位16ビットに格納する。
MIPSでは、命令サイズが32ビットであるため、32ビットの定数やアドレスを一命令ではレジスタに格納できない。そこで、lui 命令と addiu 命令などを組み合わせて使用する。アセンブリ言語には32ビット定数をレジスタに格納するマクロ命令があり、マクロ命令のために汎用レジスタのうちのひとつをアセンブリ言語に固定的に割り当てている。
[編集] 関連項目
- MIPSアーキテクチャ
- R2000
- R4000
[編集] 外部リンク
- SPIM MIPSシミュレータ(英語) WindowsやLinux上で動作するシミュレータ。シミュレータだけでなく各種マニュアルへのリンクも豊富。
- The vmips Project(英語) もうひとつのMIPS R3000シミュレータ