R4000
64ビットモードでは、汎用レジスタが全て64ビット幅となり、アドレスに関連する情報を格納するCP0レジスタも64ビット化された。各種演算は64ビット版が用意されている。メモリ管理ユニット (MMU) は48エントリのTLBを使って仮想アドレスから物理アドレスへの変換を行う。仮想アドレス空間は64ビットとなっているが、実はフラットではない(右図参照)。実際には40ビット、すなわち1TBの仮想記憶空間しか実装していない。それ以外のビットはゼロであることを確認するだけとなっている。物理アドレスは36ビットで、物理メモリ空間は64GBまでとなっている。また、特筆すべきは特権モードとしてカーネルモードとユーザモードの中間のスーパーバイザモードが導入された点である。この図の中で xkphys は説明が必要であろう。xkphys は物理空間をTLBを使わずにマップしているが、サイズは物理空間 64GBよりもずっと大きい。これは、従来の kseg0 と kseg1 を拡張したものであり、キャッシュコヒーレンシ(後述)をどういう方式で保つかによって物理空間を多重にマップしているためである。xkphysにカーネルをおく場合、キャッシュコヒーレンシの方式(プロトコル)によってアクセスすべきアドレスが異なる。
ll/sc命令 ll命令(load linked)はロード命令として動作するが、その際にロードアドレスをCP0のレジスタ LLAddr に格納しておく。その後でロードした内容に変更を加え、sc命令(store conditional)で元のアドレスに書き込む。ただし、sc命令は以下のように動作する。
まずLLAddrに格納されているアドレスとストアしようとしているアドレスが同じかどうかチェックする。違う場合は失敗したとしてストア元のレジスタに 0 を格納して終了する。
次に該当するキャッシュラインの状態をチェックする。これによって他のプロセッサがそのキャッシュラインに該当するメモリアドレスに書き込みを行ったかどうかがわかるので、もし書き込まれていたら失敗したと判断して、ストア元のレジスタに 0 を格納して終了する。
成功すれば、メモリに書き込みを行ってストア元のレジスタに 0 以外を書き込んで終了する。
なお、LLAddr は例外が発生した場合もクリアされる。これを使うと、単純なスピンロックも、リーダー・ライターロックも実現可能である。スピンロックのコードは以下のようになる。
R4000は、MIPS III命令セットアーキテクチャ (ISA) を実装したマイクロプロセッサで、ミップス社が設計した。1991年10月1日に正式発表された。64ビットのマイクロプロセッサとしては最初期のもので、MIPS III を最初に実装した。1990年代初期、RISCマイクロプロセッサは Intel486 などのCISCマイクロプロセッサに取って代わることが期待され(1991年当時、副社長だったスキップ・ストリッター(英語版)はR4000を製造するNECが486を製造するintelとの価格競争に勝つだろうとの見方を示していた)、R4000はRISCプラットフォームの業界共通規格である Advanced Computing Environment(英語版) (ACE) で使用するマイクロプロセッサに選ばれた。ACE自体は様々な要因が重なって失敗に終わったが、R4000 はワークステーションやサーバ市場で成功を収めた。