リネーミングを行うためには、論理レジスタ数より多くの物理レジスタを必要とする。どのくらい余裕を持たせるかは物量と性能のトレードオフであるが、32個の論理レジスタを持つRISCアーキテクチャのプロセサの場合、64~80個程度の物理レジスタを用意するのが一般的である。そして、論理レジスタに対して、それがどの物理レジスタにリネームされているかを記憶するリネーム表と、どの物理レジスタが空きであるかを管理するフリーリスト(Free List)という構造を用いる。

図6.15 レジスタリネーム機構の構造

図6.15に示すように、フリーリストは空き物理レジスタ番号を格納するFIFO(First In First Out)バッファであり、デコードする命令の結果を格納する物理レジスタ番号を供給する。そして命令の結果を格納するディスティネーション(Destination)論理レジスタ番号であるRdをインデックスとしてレジスタリネーム表をアクセスし、割り当てられた物理レジスタ番号を書き込む。これで、論理レジスタRdと物理レジスタの対応がレジスタリネーム表に記憶される。また、この時点では、この物理レジスタには結果が格納されておらず、値を読み出すことはできないので、物理レジスタファイルのエントリには、入っているデータはInvalidであることを示すTagを書き込んでおく。

なお、通常はこのように処理が進むが、フリーリストの空きレジスタを使い切ってしまうと、命令のデコードはストールし、実行中の命令が完了してレジスタが開放され、フリーリストに戻されるのを待つことになる。

図6.15では、フリーリストの先頭から順にP10、P12、P6が格納されているので、

FDIV F1←F2、F3
FADD F4←F1、F2
FSUB F1←F2、F3

の命令列の場合、最初のFDIV命令は物理レジスタP10に結果を格納し、次のFADD命令はP12レジスタ、その次のFSUB命令はP6レジスタというように、ディスティネーションレジスタには次々と異なる空き物理レジスタが割り当てられる。このようにすると、FDIVとFSUBの結果は論理的には同じF1レジスタに格納されるが、物理的には異なるレジスタに書き込まれ、FIDVの結果が上書きで消えてしまうことはなくなる。つまり、レジスタリネーミングを行うと自動的にWAWハザードが解消される。

また、FADD命令のデコード時点ではF1はP10に対応しており、FSUB命令がFDIV命令より先に完了しても問題なく、WARハザードも自動的に解消される。そして、FDIV命令とFSUB命令の間で割り込みが発生しても、FDIVの演算結果はP10に残っているので、後述するような方法でレジスタリネーム表を割り込み発生時点に戻してやれば、順次実行と全く同じ状態のプレサイス(Precise)な割り込みが実現できる。

なお、この図6.15では、図を簡単にするため、1つの命令のリネーム処理のケースを書いているが、1サイクルに複数の命令をデコードするスーパスカラプロセサでは、フリーリストやレジスタリネーム表の読み出しポート、レジスタファイルのTagの書き込みポートは並列に処理する命令数分必要となる。

そして、ソース(Source)オペランドであるRs1、Rs2レジスタについては、リネームされた物理レジスタからデータを読んでリザベーションステーションに送る必要があり、図6.16に示すような構造となる。

図6.16 リネームされたレジスタの読出し機構

命令のRs1、Rs2フィールドの値をインデックスとしてレジスタリネーム表を引いて、それぞれの物理レジスタ番号を得て、それらを使って物理レジスタファイルをアクセスする。そして、Tagと読出しデータをリザベーションステーションに送る。一般に命令のソースオペランドは2つあるので、この図のように、レジスタリネーム表と物理レジスタファイルはデュアルポートにする必要がある。

なお、この図は、前の図と同様に1命令の処理のケースであり、スーパスカラで複数の命令を並列にデコードする場合は、レジスタリネーム表と物理レジスタファイルのリードポート数は並列処理命令数の2倍必要となる。