しかし、図6.25に示した構成では、アドレスが一致したエントリのうちの最新のものを選ぶために、それのエントリより下側のすべてのエントリでのアドレス一致のORを必要とし、ストアキューのエントリ数を大きくすることは難しい。より多数のエントリを持つ場合は、浮動小数点加算器の結果のノーマライズのところで示したリーディングゼロデテクタと同様な回路を用いるプライオリティエンコーダでアドレス一致したエントリの中の一番新しいエントリ番号を求め、そのエントリのストアデータをフォワードするようにすれば、ある程度、エントリ数の大きな構造を作ることができる。

また、ここでは、ストアキューは時刻の古いものから順に格納されていると考えているが、これを実現するためには、実行の終了したエントリを削除して空きを詰めていく必要があり、リネーム処理のフリーリストの空きを詰めるのと同じような回路が必要となる。あるいはアウトオブオーダ実行を管理するコミットリングのようにエントリ自体は物理的には移動させず、先頭と末尾のポインタを使ってストアキューを管理する方法も考えられるが、最新のエントリの位置が動くのでプライオリティエンコーダの構造が難しくなる。

メモリへのストアから短い時間で、そのデータをメモリからロードすること自体がそれほど頻繁に発生する事態ではなく、その同じメモリアドレスへのストアがロードの直前に2回以上あるというのはさらに稀である。ということで、ストアキューでは複数のエントリがアドレス一致した場合はストアデータのフォワードを諦め、1エントリがアドレス一致した場合だけストアデータをフォワードすることにすれば、時刻のプライオリティを考慮する必要が無くなり、回路を簡単に出来る。

この構成では、複数のエントリがアドレス一致したかどうかを検出する必要があるが、これは図6.26のような回路で実現できる。TRUE側はエントリ番号を2進表示し"1"のビットに対応する線にWired ORで接続し、FALSE側は2進表示の"0"のビットに対応する線にWired ORで接続する。このような構造にすると、どのエントリもアドレスが一致しない場合は、TRUE側、FALSE側ともに全部の線が"0"になる。

そして、1つのエントリだけがアドレス一致した場合は、TRUE側とFALSE側の対応するビットの各線は否定の関係となるが、複数のエントリでアドレスが一致した場合(マルチヒット)はこの否定関係が崩れるので検出が可能である。そして、マルチヒットの場合は、ロード要求の実行開始を控え、先行するロード要求が処理を終わって、シングルヒットになった時点でストアデータのフォワードが行われる。プライオリティエンコーダを用いてマルチヒットの場合でも最新のストアデータをフォワードする構成に比べると、マルチヒットの場合はデータフォワードのタイミングが遅れるが、回路はかなり簡単になるので、物量と性能のトレードオフとなる。

図6.26 マルチヒット検出回路

なお、ここでは、ロードとストアのデータサイズが同じとして簡単化して説明したが、実際には、バイト、ハーフワード(16bit)、ワード(32bit)、ダブルワード(64bit)のメモリアクセス単位があり、ロードとストアのサイズが異なる場合は、サイズの違いを考慮してアドレスの一致比較を行う必要がある。また、先行するストアがバイトで、実行しようとする後続のロードがワードであるような場合は、ストアキューからはロードの全データが得られないので、フォワーディングは上手く行かず、ストアの完了後にロードを行う必要がある。

また、ここでは、ロードキューとストアキューは別個のキューとして説明したが、ロードとストアの共有のロードストアキューを使う方法もある。この方が、先行するストア命令を判定するのは容易であるが、ロード命令を格納するエントリにもアドレス比較器が必要であり、また、ストアデータを格納するフィールドも必要となるなど、ハードウェア的には物量が大きくなる。