EPICはそれらの問題点に対して以下のような機能で対処する。
- 各命令には識別フラグがあり、次の命令がそれ以前の命令の処理結果に依存しているかどうかを示す。識別フラグによって命令幅を変更できるVLIWと言える。これにより、将来複数の命令を同時に実行する拡張を実現することができる。コンパイラが同時実行可能命令を十分には見つけられない場合、NOP命令で命令幅を埋める代わりに識別フラグに依存マークをつけ、命令キャッシュなどを有効利用できる。依存しているかどうかはコンパイラが決定するので、ハードウェアが依存関係をチェックするのは簡単になる。識別フラグに依存マークがない限りは実行ユニットの分だけ命令を発行し、依存マークを見つけたらレイテンシを確保して以前の命令の処理結果を待つ。
例
識別フラグが「-」なら以前の命令に依存しない、「+」なら依存するとする。
+命令A +命令B -命令C -命令D +命令E -命令F
という命令列があったとき、2命令同時実行可能なハードウェアなら
+命令A
+命令B -命令C
-命令D
+命令E -命令F
の様に4クロックで実行できる。将来3命令同時実行可能なようにハードウェアを拡張した場合、
+命令A
+命令B -命令C -命令D
+命令E -命令F
命令セットの互換性を崩さず先の命令列をそのまま、しかも以前のハードウェアより速い3クロックで実行できる。
実際のIA-64の実装では、命令ごとに1ビットの識別フラグ領域を確保するのではなく、一定数の命令を束にした単位(バンドルと呼ぶ)ごとに数ビットのフラグ領域を確保している。バンドル幅を埋めるのにNOPを使う点を除けば、命令ごとの識別フラグと同様の効果を得られる。
- データプリフェッチのためのspeculative(投機的)ロード命令が用意されている。これにより実際のロードの際の一次キャッシュヒット率を向上させることができる。
- チェックロード命令によりロードがそれ以前のストアに依存していないことを確認し、投機的ロードを助ける。
EPICアーキテクチャにはILPを高めるための様々なコンセプトが詰め込まれている。
- "predicated execution"(プレディケーション;断定された実行)により分岐を減らし投機的実行を増加させる。この機能では分岐条件はプレディケーションレジスタの内容に変換される。プレディケーションレジスタを使って、実際には選択されなかった方の処理結果をなかったことにする。
- 遅延例外(汎用レジスタにあるNot-A-Thingビットを使う)により例外についても投機的実行が可能である。
- レジスタ・リネーミングの必要性をなくするために命令セットアーキテクチャレベルの大きなレジスタファイルとレジスタローテーション機能を持つ。
- 二方向以上の分岐命令(訳注:例えば「等しい」「小さい」「大きい」の三方向の分岐)