スーパスカラプロセサのリネーミング処理

以上の説明から分かるように、スーパスカラプロセサでは、並列にデコードする命令グループの最初の命令から順に、結果を格納する物理レジスタ番号を割り当てる必要がある。しかし、最大4命令を並列にデコードするマイクロアーキでも、条件分岐命令などが出てくると次に実行する命令が分からず途切れてしまい、常に4命令を並列デコードできるとは限らない。

また、演算結果を格納しない命令もあるので、常にフリーリストから4つの空き物理レジスタを取ってくるわけではない。このため、4命令並列デコードの場合、図6.17のように第1から第4命令のどれがディスティネーションレジスタを必要とするかによりマルチプレクサを制御して物理レジスタ番号の取り出しと次サイクルのためのシフト量を制御する回路が必要となる。

図6.17 4命令デコード用のフリーリスト

4命令の内の第1命令が空き物理レジスタを必要とする場合は、必ず、フリーリストの先頭のFL1からレジスタ番号が供給される。そして、第2命令に対しては、第1命令が結果を格納する命令の場合はFL2、そうでない場合はフリーリストの先頭であるFL1から物理レジスタを受け取るように、命令のデコート結果により、マルチプレクサMXAを制御する。また、第3命令に対しては、第1、第2命令が両方とも結果を格納する命令の場合はFL3、どちらか一方が結果を格納する場合はFL2、どちらも結果を格納しない場合はFL1を選択するようにMXBを制御する。

そして、第4命令に対しても同様に、MXCを制御する。このような構造を採れば、1サイクルに、フリーリストを4回シフトすることなく4つの命令に対して並列に空き物理レジスタ番号を供給することができる。

そして、MX1~6は、4命令全体でいくつの物理レジスタが使われたかにより、1~4ポジションの左シフトを選択する。なお、空き物理レジスタが1個も消費されなかった場合は、FLレジスタの書き込みをディスエーブルして以前の値をそのまま保持する。

レジスタリネーム表についても、1番目の命令のRDレジスタをリネームしてレジスタリネーム表を書き換え、2番目の命令のリネームを行うというやり方では、1サイクルで複数の命令のリネームは出来ない。このため、次に示す図6.18のような構造を用いる。

図6.18 4命令並列のソースレジスタ用リネーム構造

遅延時間を考えると、レジスタリネーム表の読み出しと更新は1サイクルに1回しかできないので、同時にデコードする4命令間のデータ依存関係は並列にチェックし、1番目の命令のRdレジスタが2番目以降の命令のRsS1、Rs2となっている場合は、2番目以降の命令では、図6.16に示したマルチポートのレジスタリネーム表の出力ではなく、リネームされた物理レジスタ番号をタグとしてリザベーションステーションに送る必要がある。

このため、図6.18に示すように、一番目の命令(Inst1と表記)のRdと2番目以降の命令のRs1、Rs2との比較回路(○に+で表記)を設け、一致した場合にはレジスタリネーム表からのタグ(物理レジスタ番号)ではなく、1番目の命令のリネームされた物理レジスタ番号(PRdと表記)を出力する。3番目の命令は、1、2番目の命令のRdをRs1、Rs2として使っているかどうかをチェックする必要があり、図6.18の2段目の比較回路がこのチェックを行っている。

そして、一番目と二番目の命令のどちらのRdとも一致していない場合は、レジスタリネーム表からのタグをリザベーションステーションに送り、どちらかと一致している場合には、一致した命令のPRdをタグとしてリザベーションステーションに送る。そして、4番目の命令は1~3番目の命令のRdとの一致をチェックする必要がある。

この構造では、レジスタリネーム表は依存関係がないものとして、サイクルの前半にリードし、サイクルの後半に図6.18の構造で生成した4命令分のリネーム関係を書き込めばよいので、1サイクルで4命令のリネームを行うことができる。しかし、その代償は回路量で、図6.18のように、必要な比較回路の数は並列デコードを行う命令の数の2乗に比例して増加する。