図6.25 先行するストアとのアドレス一致チェック

このためには、図6.25に示したような構造を用いる。ロードキュー、ストアキューの各エントリには命令の発行順を示すタイムスタンプ(Time)を付け、時刻順に上から下方向にロード、ストア要求を格納する。このタイムスタンプはプログラムにおけるロードとストアの前後関係を判定する目的であり、正確な時刻である必要なく一連の番号で良い。

なお、一連番号の時刻を格納するビット数が制限されるので、時刻値は、例えば1023などの最大値で折り返して、次はゼロにしなければならない。このため、時刻の比較は単純な大小比較で行うことはできない。そのため、まず、キューに入っているもっとも古い時刻値と比較対象の時刻値の比較を行い、比較対象の時刻値の方が小さい場合は折返しが入っているので、最大値+1(この例では1024)を加えた値として大小比較を行う必要がある。

そして、ロードキューから実行すべきエントリが選択されると、そのエントリのTimeとストアキューの各エントリのTimeとの大小比較を行う。ロードの時刻の方が新しい場合には処理対象、そうでない場合はロードより後のストアであるので、処理対象にしない。

そして、処理対象のエントリは、ストアアドレスが求まっていない(InValid、 IV=1)の場合は、ロードと一致するアドレスになる可能性もあるので、Wired ORでアドレス未定ラインに"1"を出力する。また、図の下側に書かれた時刻が新しいエントリのアドレスが一致した場合は、それより上側のエントリがフォワードラインにストアデータを出力することを抑制し、ロード命令に一番近いストア命令のデータを出力するようになっている。このようにアドレス一致信号が"1"の場合は、フォワードラインから得られるストアデータをロードの結果としてロード先のPRdレジスタに送ればよい。

そして、アドレス一致信号もアドレス未定信号も"0"の場合は、先行するストアのデータに依存しないロード命令であるので、1次キャッシュのアクセスを開始する。

一方、アドレス未定信号が"1"の場合は、先行するストアと実行しようとしているロードのアドレスが一致する可能性があるので、そのロード命令の実行は控える。