(57)【要約】【課題】　制御投機ロード命令の実行中に、待ち時間の長い演算を遅延させるかなどを判定する。【解決手段】　待ち時間の長い演算が制御投機ロード命令の実行中に必要になる場合、この命令に対応するエントリを求めて投機ロード加速遅延テーブルを探索する。エントリがあるときには、待ち時間の長い演算を遅延させる。この命令に対応するエントリがテーブルに見つからない場合には、待ち時間の長い演算が即座に開始される。非投機命令（ｃｈｋ．ｓを含む）が投機ロードの結果を使用する場合、テーブルを探索し、命令の結果がプログラムによって最近使用されたことを示すために、対応するエントリを投機ロード加速遅延テーブルから除去する。【選択図】図３
2004062908.tif 000002
【特許請求の範囲】
【請求項１】
　制御投機ロード命令の実行中に発生する遅延演算の処理について、実行時に得られる情報を使用して、待ち時間の長い演算を遅延させるか否かを実行時に判定する方法であって、
　投機ロード加速遅延テーブル（６０２、６０４）を提供することと、
　特定の制御投機ロード命令の実行中に待ち時間の長い動作を検出する必要がある場合、前記投機ロード加速遅延テーブルにアクセスし（７０２）、前記制御投機ロード命令の最近の実行履歴に基づいて、前記待ち時間の長い演算例外を遅延するか否かを判定する（７０３）ことと
　を含む方法。
【請求項２】
　前記投機ロード加速遅延テーブル（６０２、６０４）に、実行中に待ち時間の長い演算を検出する必要がある前記特定の制御投機ロード命令に対応するエントリがある場合、前記待ち時間の長い演算を遅延させること（３１２）と、
　制御投機ロード命令が実行される場合、前記制御投機ロード命令のエントリを前記投機ロード加速遅延テーブルに配置すること（７０６）と、
　待ち時間の長い演算が遅延された投機ロード命令のターゲットであったレジスタのコンテンツを使用する命令を実行する場合、前記投機ロード加速遅延テーブルから対応する制御投機ロード命令についてのエントリをいずれも消去すること（８０２）と
　をさらに含む請求項１記載の方法。
【請求項３】
　前記投機ロード加速遅延テーブル（６０４）は、各汎用レジスタ毎にエントリを含み、該エントリは、前記投機ロード加速遅延テーブルへのインデックスとしてレジスタを使用することによりアクセスすることができ、
　前記投機ロード加速遅延テーブルのエントリは、特定のレジスタについてのエントリが存在しないことを示す識別値を含み、
　前記投機ロード加速遅延テーブルのエントリは、例外が制御投機ロード命令の処理中に発生したときの命令ポインタレジスタのコンテンツを含む
　請求項１記載の方法。
【請求項４】
　前記投機ロード加速遅延テーブル（６０２）は、命令ポインタレジスタのコンテンツのすべてまたは一部から生成される一意のハッシュ値のエントリを含み、
　該エントリは、前記ハッシュ値を前記投機ロード加速遅延テーブルへのインデックスとして使用することによってアクセスすることができ、
　前記投機ロード加速遅延テーブルは、最近実行された投機ロード命令の結果が使用されたか否かを示す単一ビットを各エントリに含む
　請求項１記載の方法。
【請求項５】
　待ち時間の長い演算が、投機ロード命令の実行中に遅延される場合、前記投機ロード命令の前記ターゲットレジスタに関連する遅延演算属性をセットすること（３１２）と、
　遅延演算属性を有するレジスタを使用する非投機命令が実行される場合、前記投機ロード加速遅延テーブル（６０２、６０４）から対応する制御投機ロード命令についてのエントリをいずれも消去すること（８０２）とをさらに含み、
　前記投機ロード加速遅延テーブルは、以下：
　　待ち時間の長い演算の結果に最近アクセスした回数のカウント、
　　待ち時間の長い演算の結果に最近アクセスしなかった回数のカウント、
　　待ち時間の長い演算の結果アクセスにおける相関に関する情報、
　　クラス単位またはタイプ単位で待ち時間の長い演算の実行後に結果にアクセスする場合があるかどうかを予測するために使用することができるタイプおよびクラス情報、
のうちの１つまたは複数を含む追加情報を含むことができる
　請求項１記載の方法。
【請求項６】
　投機ロード加速遅延テーブル（６０２、６０４）と、
　投機ロード命令実行ロジックと
　を備え、
　前記投機ロード命令実行ロジックは、特定の制御投機ロード命令の実行中に待ち時間の長い演算を検出する必要がある場合（３０８）、前記投機ロード加速遅延テーブルにアクセスし（７０２）、前記制御投機ロード命令の最近の実行履歴に基づいて、前記待ち時間の長い演算例外を遅延させるか否かを判定する（７０３）
　コンピュータプロセッサ。
【請求項７】
　前記投機ロード命令実行ロジックは、
　前記投機ロード加速遅延テーブル（６０２、６０４）に、特定の制御投機ロード命令に対応するエントリがある場合、前記特定の制御投機ロード命令の実行中に待ち時間の長い演算を遅延させること（３１２）と、
　前記制御投機ロード命令が実行される場合、前記投機ロード加速遅延テーブルに制御投機ロード命令についてのエントリを配置すること（７０６）と、
　前記対応する制御投機ロード命令の結果が別の非投機命令によって使用される場合、前記投機ロード加速遅延テーブルから対応する制御投機ロード命令についてのエントリを消去すること（８０２）と
　を行う請求項６記載のコンピュータプロセッサ。
【請求項８】
　前記投機ロード加速遅延テーブル（６０４）は、各汎用レジスタ毎にエントリを含み、該エントリは、前記投機ロード加速遅延テーブルへのインデックスとしてレジスタを使用することによりアクセスすることができ、前記投機ロード加速遅延テーブルのエントリは、特定のレジスタについてのエントリが存在しないことを示す識別値を含むとともに、例外が制御投機ロード命令の処理中に発生したときの命令ポインタレジスタのコンテンツを含む
　請求項６記載のコンピュータプロセッサ。
【請求項９】
　前記投機ロード加速遅延テーブル（６０２）は、命令ポインタレジスタのコンテンツのすべてまたは一部から生成される一意のハッシュ値のエントリを含み、
　前記エントリは、前記ハッシュ値を前記投機ロード加速遅延テーブルへのインデックスとして使用することによってアクセスすることができ、
　前記投機ロード加速遅延テーブルは、最近実行された投機ロード命令の結果が使用されたか否かを示す単一ビットを各エントリに含む
　請求項６記載のコンピュータプロセッサ。
【請求項１０】
　前記プロセッサは、待ち時間の長い演算が、投機ロード命令の実行中に遅延される（３０８）場合、前記投機ロード命令の前記ターゲットレジスタに関連する遅延演算属性をセット（３１２）し、
　遅延演算属性を有するとフラグ付けられたレジスタを使用する非投機命令が実行される場合、前記投機ロード加速遅延テーブル（６０２、６０４）から対応する制御投機ロード命令についてのエントリをいずれも消去（８０２）し、
　待ち時間の長い演算は、例外処理、キャッシュミス処理、ページテーブルアクセス、ならびにメモリから値をフェッチし、その値をレジスタにロードするために必要なプロセッササイクルの他にプロセッササイクルを必要とする他の演算を含み、
　前記投機ロード加速遅延テーブルは、以下：
　　待ち時間の長い演算の結果に最近アクセスした回数のカウント、
　　待ち時間の長い演算の結果に最近アクセスしなかった回数のカウント、
　　待ち時間の長い演算の結果アクセスにおける相関に関する情報、
　　クラス単位またはタイプ単位で待ち時間の長い演算の実行後に結果にアクセスする場合があるかどうかを予測するために使用することができるタイプおよびクラス情報、
のうちの１つまたは複数を含む追加情報を含むことができる
　請求項６記載のコンピュータプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
　本発明は、最近のコンピュータプロセッサアーキテクチャによってサポートされるロード命令の静的制御投機に関し、特に、特定の例外条件と、制御投機ロード命令の実行中に発生するかまたは必要になる他の待ち時間の長い演算と、の即時遅延をトリガするために、ルーチン実行中に動的例外処理情報を使用する方法およびシステムに関する。
【背景技術】
【０００２】
　本発明は、Ｉｎｔｅｌ（商標）ＩＡ−６４プロセッサアーキテクチャ等最近のプロセッサアーキテクチャによってサポートされるロード命令の静的制御投機に関する。
　ロード命令の制御投機により、最適化を目的として、対応する元の最適化されていないコードにおいてロード命令が実行されるか否かを制御する、フロー制御ポイント、条件付分岐命令、または述語計算の上方にロード命令が配置換えされる。
　最適化されていないコードではロード命令によって占められる条件付分岐命令に相対して同じ位置にチェック命令が配置される。
【０００３】
　プロセッサは、チェック命令または他の非投機命令がロード命令の結果を使用するまで、配置換えされた制御投機ロード命令の実行中に発生する特定の例外を遅延させる。
　現在、ロード命令の制御投機の例外遅延戦略は、ロード命令実行中に発生する特定タイプの例外を遅延させるべきか否かをより正確に示唆しうる実行時情報の恩恵を受けることなく、コンパイラおよびオペレーティングシステムにより統計的に判定される。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
　最近のプロセッサの設計者および製造業者、ならびに最近のプロセッサをベースとするコンパイラ開発者およびコンピュータシステムユーザは、投機ロードの実行中に発生するどの例外および他の待ち時間の長い演算を遅延させるべきかを実行時に判定することができる方法およびシステムの必要性を認識している。
【課題を解決するための手段】
【０００５】
　本方法および本システムは、投機ロード加速遅延テーブルに格納される最近の履歴に依拠する。
　待ち時間の長い演算（たとえば、主記憶装置に対するＴＬＢミスまたはキャッシュミス）が制御投機ロード命令の実行中に必要になる場合、制御投機ロード命令に対応するエントリを求めて投機ロード加速遅延テーブルを探索する。
　エントリが見つかる場合には、投機ロード加速遅延テーブルが、制御投機ロード命令を最近実行した結果がプログラムによって使用されなかったことを示すため、待ち時間の長い演算を遅延させる。
　対照的に、制御投機ロード命令に対応するエントリが投機ロード加速遅延テーブルに見つからない場合には、考えられる例外処理も含め、待ち時間の長い演算が即座に開始される。
　非投機命令（ｃｈｋ．ｓを含む）が投機ロードの結果を使用する場合、投機ロード加速遅延テーブルを探索し、制御投機ロード命令の結果がプログラムによって最近使用されたことを示すために、対応するエントリを投機ロード加速遅延テーブルから除去する。
　本発明の別の実施形態では、投機ロード例外が遅延される場合にのみ投機ロード加速遅延テーブルにエントリが追加され、投機ロードが成功するか、または非投機命令が遅延された例外トークンを使用する場合に、テーブルからエントリが除去される。
【発明の効果】
【０００６】
　本発明によれば、制御投機ロード命令の実行中に、発生する例外、または必要になる別の待ち時間の長い演算を遅延させるか否かを、その制御投機ロード命令の最近の実行履歴に基づいて、実行時に判定することができる。
【発明を実施するための最良の形態】
【０００７】
　本発明の一実施形態は、最近のプロセッサが、制御投機ロード命令の実行中に、発生するかまたは必要になる例外または他の待ち時間の長い演算を遅延させるか否かを実行時に判定する手段を提供する。
　現在、遅延判定は、ある時点での遅延の望ましさ、または別の時点での即時例外処理もしくは他の待ち時間の長い演算実行の望ましさを示しうる実行時の情報の恩恵を受けることなく、コンパイラによって静的に行われている。
　投機オーバヘッドを回避し、よりよく遅延方針を最適化するために、実行時状態に基づいて例外または他の待ち時間の長い演算を遅延させるか否かを判定する手段が必要である。
【０００８】
　ロード命令の制御投機および制御投機への現在のアーキテクチャサポートの上記欠点は、単純なプログラミング例を使用して最もよく示される。
　２クラスの非常に短いＣ＋＋様の擬似コード実施態様を、２つのクラスのうちの一方の関数メンバから抽出されるｆｏｒループの短い擬似アセンブリ言語版と併せて以下に示す。
　Ｃ＋＋様擬似コードは、メンバ関数の一部の擬似アセンブリ言語版の特定の態様を詳細に考察するためのコンテキストを提供する。
【０００９】
　Ｃ＋＋様擬似コードは、クラス「ｃａｎｄｉｄａｔｅ」およびクラス「ｅｌｅｃｔｉｏｎ」を実施する。
　クラス「ｃａｎｄｉｄａｔｅ」のインスタンスは、選出に参加している候補を表し、クラス「ｅｌｅｃｔｉｏｎ」のインスタンスは、候補への投票が行われて当選者が決定される選出を表す。
　この単純なＣ＋＋様擬似コードは、クラス「ｅｌｅｃｔｉｏｎ」の関数メンバ「ｗｉｎｎｅｒ」の一部の擬似アセンブリ言語版を考察するための例示的なコンテキストとしてのみ提供されるため、実際の使用を意図するプログラムに含められる誤り検査および機能性は省略する。
　まず、Ｃ＋＋様擬似コードは、ｉｎｃｌｕｄｅディレクティブ宣言および３つの定数宣言で始まる。
【００１０】
【表１】
2004062908.tif 000003
【００１１】
　１行目のｉｎｃｌｕｄｅステートメントは、各種ストリング関数を指定するヘッダファイルを含む。定数「ＭＡＸ＿ＮＡＭＥ」、「ＭＡＸ＿ＢＩＯ」、および「ＭＡＸ＿ＣＡＮＤＩＤＡＴＥＳ」は、選出における候補の名前、経歴、候補数をそれぞれ含むデータアレイメンバのサイズを制限するために使用される。
【００１２】
【表２】
2004062908.tif 000004
【００１３】
　クラス「ｃａｎｄｉｄａｔｅ」のインスタンスは、上記の４〜７行目で宣言される以下のデータメンバを含む：
　（１）「ｎａｍｅ」−候補の名前を含むキャラクタアレイ、
　（２）「ｃａｎｄｉｄａｔｅＮｏ」−識別子として候補に割り当てられる番号、
　（３）「ｂｉｏ」−候補の経歴を含む大きなキャラクタアレイ、および
　（４）「ｎｕｍＶｏｔｅｓ」−候補が集めた得票数。
【００１４】
　クラス「ｃａｎｄｉｄａｔｅ」は、上記の９〜１９行目において宣言される以下のメンバ関数を含む：
　（１）「ｉｎ」−引き数「ｃ」として与えられる文字列がデータメンバ「ｎａｍｅ」に格納されている候補の名前内に含まれるか否かを判定するメンバ関数、
　（２）「ｇｅｔＮａｍｅ」および「ｓｅｔＮａｍｅ」−データアレイメンバ「ｎａｍｅ」に対して候補の名前を格納する関数メンバおよび候補の経験を検索する関数メンバ、
　（３）「ｇｅｔＮｏ」および「ｓｅｔＮｏ」−データメンバ「ｃａｎｄｉｄａｔｅＮｏ」に対して候補に割り当てられた番号を格納する関数メンバおよび候補に割り当てられた番号を検索する関数メンバ、
　（４）「ｇｅｔＢｉｏ」および「ｓｅｔＢｉｏ」−データアレイメンバ「ｂｉｏ」に対して候補の経歴を格納する関数メンバおよび候補の経験を検索する関数メンバ、
　（５）「ｇｅｔＶｏｔｅｓ」および「ｉｎｃＶｏｔｅｓ」−データメンバ「ｎｕｍＶｏｔｅｓ」から得票数を検索する関数メンバおよびデータメンバ「ｎｕｍＶｏｔｅｓ」に含まれる値を１だけ増分する関数メンバ、ならびに
　（６）クラス「ｃａｎｄｉｄａｔｅ」のコンストラクタおよびデコンストラクタ。
【００１５】
　次に、クラス「ｅｌｅｃｔｉｏｎ」の宣言を提供する。
【００１６】
【表３】
2004062908.tif 000005
【００１７】
　クラス「ｅｌｅｃｔｉｏｎ」のインスタンスは、上記の４〜５行目に宣言される以下の２つのデータメンバを含む：（１）「ｃａｎｄｉｄａｔｅｓ」−クラス「ｃａｎｄｉｄａｔｅ」のいくつかのインスタンスを含むデータアレイメンバ、および（２）「ｎｕｍ」−データアレイメンバ「ｃａｎｄｉｄａｔｅｓ」中のクラス「ｃａｎｄｉｄａｔｅｓ」のインスタンス数を含む整数。
　クラス「ｅｌｅｃｔｉｏｎ」は、上記の７〜１３行目に宣言される以下の関数メンバを含む：（１）「ａｄｄＣａｎｄｉｄａｔｅ」−候補を選出に追加する関数メンバ、（２）「ｇｅｔＣａｎｄｉｄａｔｅ」−与えられる引き数「ｃＮｏ」の値に等しい識別番号が割り当てられたクラス「ｃａｎｄｉｄａｔｅ」のインスタンスにポインタを戻す関数メンバ、（３）「ｖｏｔｅ」−名前が引き数「ｃ」として与えられるストリングを含む候補に投票する関数メンバ、（４）「ｗｉｎｎｄｅｒ」−選出の当選者を選ぶ関数メンバ、ならびに（５）クラス「ｅｌｅｃｔｉｏｎ」のコンストラクタおよびデコンストラクタ。
【００１８】
　クラス「ｃａｎｄｉｄａｔｅ」の関数メンバの実施態様の大半は、クラスｄｅｃｌａｒａｔｉｏｎにおいて指定されるインライン関数である。
　１つの例外は、以下に提供する、クラス「ｃａｎｄｉｄａｔｅ」のコンストラクタである。
【００１９】
【表４】
2004062908.tif 000006
【００２０】
　クラス「ｅｌｅｃｔｉｏｎ」の関数メンバ「ａｄｄＣａｎｄｉｄａｔｅ」の実施態様を以下に提供する。
【００２１】
【表５】
2004062908.tif 000007
【００２２】
　関数メンバ「ａｄｄＣａｎｄｉｄａｔｅ」は、単に、与えられる名前および経歴を引き数「ｃ」および「ｂ」として、データアレイ「ｃａｎｄｉｄａｔｅｓ」に格納されるクラス「ｃａｎｄｉｄａｔｅｓ」のインスタンスにセットし、新しい候補の追加を反映するようにデータメンバ「ｎｕｍ」を増分する。
【００２３】
　クラス「ｅｌｅｃｔｉｏｎ」の関数メンバ「ｖｏｔｅ」の実施態様を以下に提供する。　　
【００２４】
【表６】
2004062908.tif 000008
【００２５】
　関数メンバ「ｖｏｔｅ」は、４〜７行目のｆｏｒループ中のデータアレイメンバ「ｃａｎｄｉｄａｔｅｓ」中のクラス「ｃａｎｄｉｄａｔｅ」のすべてのインスタンスを通して反復し、名前が引き数「ｃ」として提供されるサブストリングを含む候補のデータメンバ「ｎｕｍＶｏｔｅｓ」を増分する。
【００２６】
　クラス「ｅｌｅｃｔｉｏｎ」の関数メンバ「ｗｉｎｎｅｒ」の実施態様を以下に提供する。
【００２７】
【表７】
2004062908.tif 000009
【００２８】
　関数メンバ「ｗｉｎｎｅｒ」は、クラス「ｃａｎｄｉｄａｔｅ」のすべてのインスタンスおよび５〜１２行目のｆｏｒループ中のデータアレイメンバ「ｃａｎｄｉｄａｔｅｓ」を通して反復し、最大数の投票を含むクラス「ｃａｎｄｉｄａｔｅ」のインスタンスを求めて探索する。
　現在考慮しているクラス「ｃａｎｄｉｄａｔｅ」のインスタンスが、７行目の関数メンバ「ｗｉｎｎｅｒ」によって決定されるように、ローカル変数「ｍａｘＶｏｔｅｓ」に格納されている値よりも多くの得票数を有する場合、現在考慮中の候補「ｃａｎｄｉｄａｔｅｓ［ｉ］」は、５〜１２行目のｆｏｒループにおいて今まで考慮されていた最大数の投票を有する候補であり、９〜１０行目のステートメントが実行される。
【００２９】
　ローカル変数「ｒｅｓ」は、現在考慮中の候補に割り当てられた番号にセットされ、ローカル変数「ｍａｘＶｏｔｅｓ」は、現在考慮中の候補「ｃａｎｄｉｄａｔｅｓ［ｉ］」が選出中に取得した得票数にセットされる。５〜１２行目のｆｏｒループの完了後、１３行目で選出の当選者の名前が戻される。
【００３０】
　最後に、クラス「ｅｌｅｃｔｉｏｎ」のコンストラクタを提供する。
【００３１】
【表８】
2004062908.tif 000010
【００３２】
　以下の考察では、上述したクラス「ｅｌｅｃｔｉｏｎ」の関数メンバ「ｗｉｎｎｅｒ」からの例示的なｆｏｒループに焦点をあてる。
【００３３】
【表９】
2004062908.tif 000011
【００３４】
　このｆｏｒループの考えられる擬似アセンブリ言語版を以下に提供する。
【００３５】
【表１０】
2004062908.tif 000012
【００３６】
　上記擬似アセンブリ言語コードの冒頭にあるコメント行には、レジスタ「ｒ１」〜「ｒ９」の定義が、上述した対応するＣ＋＋様擬似コードのデータメンバおよびローカル変数に関して提供される。
　したがって、レジスタ「ｒ１」のコンテンツは、クラス「ｅｌｅｃｔｉｏｎ」の関連するインスタンスが開始するメモリアドレスを含み、レジスタ「ｒ２」および「ｒ３」のコンテンツは、クラス「ｅｌｅｃｔｉｏｎ」のインスタンス内のデータメンバ「ｎｕｍ」および「ｃａｎｄｉｄａｔｅｓ」のオフセットである。
【００３７】
　レジスタ「ｒ４」のコンテンツは、クラス「ｃａｎｄｉｄａｔｅ」のインスタンスの、バイト単位でのサイズを含む。
　レジスタ「ｒ５」および「ｒ６」のコンテンツは、クラス「ｃａｎｄｉｄａｔｅ」のインスタンス内のデータメンバ「ｃａｎｄｉｄａｔｅＮｏ」および「ｎｕｍＶｏｔｅｓ」それぞれのオフセットを含む。
　レジスタ「ｒ７」および「ｒ９」は、それぞれローカル変数「ｍａｘＶｏｔｅｓ」、「ｉ」、および「ｒｅｓ」を表す。
【００３８】
　１行目において、レジスタ「ｒ８」のコンテンツが０にセットされ、上記例示的なｆｏｒループの５行目のｆｏｒループ変数「ｉ」のＣ＋＋様擬似コード初期化を実施する。
　次に、２〜３行目において、レジスタ「ｒ１」に含まれるメモリアドレスから開始するクラス「ｅｌｅｃｔｉｏｎ」のインスタンスのデータメンバ「ｎｕｍ」のメモリアドレスが計算され、レジスタ「ｒ１０」に格納され、それからデータメンバ「ｎｕｍ」の値が、３行目のロード命令を介してメモリからフェッチされレジスタ「ｒ１１」に格納される。
【００３９】
　４行目において、アレイ「ｃａｎｄｉｄａｔｅｓ」の最初の要素のアドレスが計算され、レジスタ「ｒ１２」に格納される。
　５行目において、比較命令が、レジスタ「ｒ８」に格納されている値をレジスタ「ｒ１１」に格納されている値と比較し、上記の５行目における例示的なｆｏｒループのテスト部分を実施する。
【００４０】
　比較ステートメントは、プレディケートレジスタ「ｐ０」および「ｐ１」をそれぞれテスト式のブール値およびテスト式のブール値の補数にセットする。
　プレディケートレジスタ「ｐ１」のコンテンツによって判定されるように、ｉがｎｕｍ以上である場合、アセンブリコードの６行目の分岐は、上記アセンブリコードの４行目で開始するループの実行の終了に進む。
【００４１】
　その他の場合、７〜８行目において、クラス「ｃａｎｄｉｄａｔｅ」の現在考慮中のインスタンス「ｃａｎｄｉｄａｔｅｓ［ｉ］」のデータメンバ「ｎｕｍＶｏｔｅｓ」のメモリアドレスが計算され、クラス「ｃａｎｄｉｄａｔｅ」の現在考慮中のインスタンスのデータメンバ「ｎｕｍＶｏｔｅｓ」に格納されている値がメモリからフェッチされ、レジスタ「ｒ１４」に格納される。
　９行目の比較命令が、クラス「ｃａｎｄｉｄａｔｅｓ」の現在考慮中のインスタンスの得票数をローカル変数「ｍａｘＶｏｔｅｓ」と比較し、プレディケートレジスタ「ｐ２」および「ｐ３」をセットする。
【００４２】
　プレディケートレジスタ「ｐ３」に格納されるように、現在考慮中の候補の得票数がローカル変数「ｍａｘＶｏｔｅｓ」のコンテンツよりも多い場合、１０行目の条件分岐は、４行目で変数「ｉ」を増分し、レジスタ「ｒ１２」を次の候補を指すようにセットした後、ループの実行を継続するように進む。
　その他の場合、ローカル変数「ｒｅｓ」は、１１行目および１２行目において、現在考慮中の候補に割り当てられた番号を指すようにセットされる。
　ここで、レジスタ「ｒ９」はローカル変数「ｒｅｓ」に対応し、ローカル変数「ｍａｘＶｏｔｅｓ」は、１３行目において、現在考慮中の候補の得票数にセットされる。
【００４３】
　上記擬似アセンブリ言語の１２行目のロード命令の抽出を考える。
　ロード命令では一般に、１６行目の移動命令等のレジスタ間命令よりも多くの数のプロセッササイクルおよび高い程度の実行待ち時間がプロセッサバスを通してのキャッシュアクセスに関わる必要がある。
　最適化コンパイラは、ロード命令をレジスタ間命令と並行して実行でき、ロード命令がアクセスする値が必要になる前に完了することができるように、実行シーケンスにおいて上方にロード命令を移そうとする。
　たとえば、１１行目および１２行目は、以下のように最適化コンパイラにより８行目の後直接上方に移すことができる。
【００４４】
【表１１】
2004062908.tif 000013
【００４５】
　上記第２版のアセンブリコードでは、ロードが、レジスタ「ｒ９」に格納されている、ロード命令の結果が必要になる前に開始される。
　以下に「ＩＡ−６４プロセッサ」と呼ばれるＩｎｔｅｌ（登録商標）ＩＡ−６４プロセッサアーキテクチャに準拠するプロセッサ等最近のプロセッサは、命令をパイプライン化するため、またこれら最近のプロセッサは、ノンブロッキングキャッシュを使用しているため、ロード命令は後続命令と並行して実行される。
　本ケースでは、ロード命令の結果は、後続するループの終了および関数メンバ「ｗｉｎｎｅｒ」から戻るためにのみ必要である。
【００４６】
　しかし、ロード命令の実行中に例外が発生する場合、実行時システムは、ロード命令の結果が実際に使用されるまで、例外を遅延させる必要がある。
　そうではなく、ロード命令が、制御条件分岐により最適化されていないコードで実行されていない場合、ロード命令を上方に移すことによってアセンブリコードが最適化されていない場合には発生しない例外が、配置換えされたロード命令の実行中に発生する。
【００４７】
　最適化されていないプログラムが正しく実行されて完了する場合でも、最適化プログラムは条件のエラーによって失敗する可能性がある。
　たとえば、データメンバ「ｃａｎｄｉｄａｔｅＮｏ」のメモリアドレスにおける１１行目の条件付分岐命令、および計算されたメモリアドレスのコンテンツをフェッチする１２行目のロード命令のすぐ上方にある１０行目の第１版のアセンブリコードにおける条件付分岐命令を考える。
【００４８】
　多くの場合、現在考慮中の候補が、ｍａｘＶｏｔｅｓの値よりも多い得票数を持たない場合、１０行目の条件分岐のすぐ下方にある命令は実行されない。
　対照的に、当初は１２行目にあったロード命令が当初１０行目にあった条件分岐の上方に配置換えされた第２版のアセンブリコードを考えてみる。
【００４９】
　最適化アセンブリコードでは、ロード命令は、現在考慮されている候補がｍａｘＶａｌに格納されている値よりも多い得票数を有する場合のみではなく、ループの各反復中に実行される。
　最適化されていないコードにおいて、ロード命令が実行されていないループ反復において、ロード命令の例外中に例外が発生する場合、最適化アセンブリコードは、最適化されていないアセンブリコードが失敗していない場合に失敗する可能性がある。
【００５０】
　上記問題は、ロード命令の制御投機を提供することにより、Ｉｎｔｅｌ　ＩＡ−６４プロセッサファミリ等最近のプロセッサにおいて解消される。以下の擬似アセンブリ言語コードは、当初は１２行目にあったが上方の１０行目に配置換えされたロード命令の制御投機版を含む。
【００５１】
【表１２】
2004062908.tif 000014
【００５２】
　当初は１１行目および１２行目にあった２つの命令が、上方の９行目および１０行目に配置換えされることに留意する。
　したがって、データメンバ「ｃａｎｄｉｄａｔｅＮｏ」のアドレスを計算するａｄｄ命令、およびｃａｎｄｉｄａｔｅＮｏの値をメモリからレジスタ「ｒ９」にロードする後続のｌｏａｄ命令は、ここでは、当初は１０行目にあったがここでは１２行目にある、最適化されていない擬似アセンブリ言語抽出において２つの命令が実行されるか否かを制御する条件分岐命令の上方に移っている。
【００５３】
　２つの命令を上方に移すことにより、待ち時間の長いロード命令を、後続する比較命令および分岐命令と並行して実行することができるため、結果が必要なときに、その値はメモリから首尾良くすでにフェッチされていることになる。
　ここでは、新しい命令「ｃｈｋ．ｓ」が、ここでは１２行目の条件付き分岐命令に関して配置換えされた２つの命令が当初占めていたところと同じ場所の１４行目をここでは占め、上方に移されたロード命令はここでは「ｌｄ８．ｓ」命令になっている。
【００５４】
　接尾辞「．ｓ」は、ロード命令の結果を含むレジスタが、非投機命令において続けて使用されるかまたはｃｈｋ．ｓ命令への引数として指定されるまで、ロード命令の実行中に発生する特定の例外をプロセッサが遅延させる制御投機ロードを示す。
　１４行目のｃｈｋ．ｓ命令は、前に実行された１０行目のロード命令が、例外なく首尾良く完了したかどうかをチェックして調べる。
【００５５】
　例外が発生しなかった場合、プロセッサは、ｃｈｋ．ｓ命令に続く次の命令を実行することによって継続する。
　しかし、１０行目のロード命令の前の実行中に例外が発生した場合、分岐は１８行目のラベル「ＲＥＣＶＲ」とラベルづけられた命令にとられる。
　ラベル「ＲＥＣＶＲ」はリカバリブロックをラベル付けし、リカバリブロックでは、ラベル「ＣＯＮＴＩＮ」でラベル付けられる、１５行目の増分命令であるステートメントに分岐して戻る前にロード命令が再発行される。
【００５６】
　したがって、１０行目のロード命令が例外なしで実行される場合、最適化コードと最適化されていないコードの実行の唯一の相違は、後続する命令と並列に実行し、最終的に命令実行待ち時間を減らすために、ロード命令がループ中でより初期に開始されることである。
　しかし、ロード命令の実行が例外を発生する場合、ｃｈｋ．ｓ命令の位置によって決まる、最適化されていないロード命令が実行される命令ストリームでの時点まで、その例外は遅延される。
【００５７】
　この時点において、分岐がリカバリブロックにとられ、ロードが再実行される。
　ロードの実行がリカバリブロック内で継続する場合、コードは、初期ロード実行が例外を発生しなかったかのように実行するが、ロードが再び失敗する場合、例外が即座に発生し、適宜処理される。
【００５８】
　制御投機は、各種レジスタおよびレジスタフィールドをレジスタセット内に追加することにより、ならびにプロセッサに含められる制御投機ロジックにより、ＩＡ−６４プロセッサにおいて可能になった。
　図１は、ＩＡ−６４プロセッサの中の汎用６４ビット整数レジスタの一部を示す。
　図１では、６４ビット汎用整数レジスタ「ｒ０」、「ｒ１」、・・・が、レジスタ名でラベル付けられたレジスタ列１０１に示される。
【００５９】
　レジスタ「ｒ０」１０２等の各汎用６４ビット整数レジスタには、特別な１ビット属性が関連付けられている。
　これら特別な１ビット属性は、汎用レジスタ１０１と整列した図１の１ビットレジスタ列１０３に示される。
【００６０】
　したがって、たとえば、第１の特別な１ビット属性１０４が汎用レジスタ「ｒ０」１０２に関連付けられる。
　特別な１ビットレジスタは「ＮＡＴ」ビットと呼ばれ、これは「ｎｏｔ−ａ−ｔｈｉｎｇ」ビットを略したものである。
【００６１】
　ＮＡＴビットは、１ビットレジスタのセットとして実施しても、または汎用レジスタ内の予約値または余分なビットを使用して実施してもよい。
　汎用レジスタに関連付けられるＮＡＴビットは、投機ロード命令を介してレジスタをロードする間に例外が遅延された後では値「１」を有し、その他の場合には値「０」を有する。
　ＮＡＴビットは、値「１」を有するＮＡＴビットのレジスタのコンテンツ、またはそのコンテンツから導出される値がレジスタに格納される場合、別のレジスタにも伝搬しうる。
【００６２】
　制御投機は、各種システムレジスタ内のフィールドを介して構成することが可能である。
　図２は、ＩＡ−６４プロセッサ内の制御投機の構成に関わるシステムレジスタを示す。
　ＩＡ−６４プロセッサは、仮想メモリアドレスについての仮想メモリ／物理メモリ変換を格納する２つの変換キャッシュを使用する。
【００６３】
　第１の変換キャッシュ２０２は、命令変換ルックアサイドバッファ（「ＩＴＬＢ」）であり、命令の仮想メモリアドレスについての仮想メモリ／物理メモリ変換を格納する。
　データ変換ルックアサイドバッファ（「ＤＴＬＢ」）２０４は、メモリ内のデータの仮想メモリアドレスについての仮想メモリ／物理メモリ変換を格納する。
　ＩＴＬＢエントリ２０３等のＩＴＬＢエントリでは、「ＩＴＬＢ．ｅｄ」と呼ばれるビットフィールド２０５が、投機実行された命令のリカバリコードがあるか否かを示す。
【００６４】
　フィールド「ＩＴＬＢ．ｅｄ」が値「１」を有する場合、投機ロード命令の実行中に発生する遅延例外のリカバリコードがコードに挿入されている。
　同様に、仮想メモリデータアドレスの変換を表すＤＴＬＢエントリ２０６等のＤＴＬＢエントリは、対応する仮想マッピングページの投機的特徴、キャッシャビリティ（cacheability）特徴、およびライトポリシー特徴を示すフィールド「ＤＴＬＢ．ｍａ」２０７を含む。
　プロセッサはフィールド「ＤＴＬＢ．ｍａ」を使用して、例外を遅延すべきか否かを判定することができる。
【００６５】
　たとえば、アクセスに副作用が伴う可能性があり、また失敗した演算を再試行すべきではない仮想メモリをＩ／Ｏ装置にマッピングすることができる。
　プロセッサ状態レジスタ（「ＰＳＲ」）２１０は、プロセッサが制御投機ロード命令の実行中に発生する特定の例外を遅延するか否かを制御する３ビットフィールドを含む。
　ビットフィールド「ＰＳＲｉｃ」が値０を有する場合、制御投機ロード実行中に発生するすべての例外が遅延される。
　これは、例外の即時処理が不都合なオペレーティングシステムルーチンにとって有益な処理モードである。
【００６６】
　ビットフィールド「ＰＳＲ．ｉｔ」は、６４ビット命令アドレスが仮想アドレスであるか、それとも物理アドレスであるかを示す。
　このビットフィールドが値「０」を有する場合、プロセッサは投機ロード命令からの例外を即時遅延しない。
　最後に、ビットフィールド「ＰＳＲ．ｅｄ」が値「０」を有する場合、再開した制御投機ロードに対して例外遅延が強制される。
【００６７】
　オペレーティングシステムは、制御投機中に遅延可能な例外のタイプをある程度制御することができる。
　ＰＳＲ．ｉｃ、ＰＳＲ．ｉｔ、およびＩＴＬＢ．ｅｄの値が、ロード命令の実行中にすべて１に等しい場合、発生する特定の例外タイプの例外を遅延するか否かは、特定の例外タイプに対応するＤＣＲレジスタ２１４内のビット範囲２１２内のビットがセットされるか否かによって決まる。
　したがって、オペレーティングシステムは、特定タイプの例外を遅延に指定し、他のタイプの例外を遅延しない代わりに即時処理するように指定することができる。
【００６８】
　上記各種ビットフィールドにおける値に応答してのＩＡ−６４の厳密な振る舞いの詳細は、本発明の背景を提供するために必要な考察の範囲を超えている。
　こういった詳細は、Ｉｎｔｅｌ発行のＩｎｔｅｌ　ＩＡ−６４アーキテクチャソフトウェアデベロッパーズマニュアル第１〜４巻から得ることができる。
　しかし、汎用レジスタに関連付けられるＮＡＴビット、ならびに浮動小数点レジスタに関連する同様の符号化は、投機ロード実行中の例外の発生にフラグを立て、投機ロード命令の実行に関するプロセッサの振る舞いは、特定のシステムレジスタを介して構成可能であり、投機ロード命令の実行中に発生しうる特定の例外は、遅延するかまたは即座に発生させるようにＤＣＲレジスタを介して構成しうることに留意することが重要である。
【００６９】
　また、ＮＡＴビットは、セットされたＮＡＴビットに関連付けられたレジスタのコンテンツが移された、またはセットされたＮＡＴビットに関連付けられたレジスタに格納される値から導出される結果が格納されるレジスタに伝播することにも留意されたい。
　ＮＡＴビットの伝播は、遅延された投機ロードから生じる無効なレジスタコンテンツが、無効なレジスタコンテンツを別のレジスタに転送する結果として使用されないように確実にする。
【００７０】
　図３は、制御投機整数ロード命令の処理を表すフロー制御図である。
　ステップ３０２において、プロセッサがロード演算を開始する。
　ステップ３０４において、プロセッサは、例外条件がロード演算処理中に発生したか否かを判定する。
【００７１】
　例外条件が発生していない場合、制御投機ロード処理は終了し、首尾良く完了する。
　その他の場合、ステップ３０６において、プロセッサは発生しうる１つまたは複数の例外の中から最高優先度例外を特定し、状態レジスタをチェックして、その例外を遅延すべきか否かを判定する。
　ステップ３０８において判定されるように、例外がシステムレジスタ内に格納されている現構成下では遅延不可能である場合、障害が即座に発生する。
【００７２】
　その他の場合、ステップ３１０において、プロセッサは、考慮すべき例外がまだあるかどうかを判定する。
　まだある場合、制御はステップ３０６に戻って流れる。
　その他の場合、ステップ３１２において、ロード命令のターゲットレジスタに関連付けられたＮＡＴビットが値「１」にセットされ、ロード命令の実行は、例外条件の遅延で終了する。
【００７３】
　図４は、制御投機整数ロード命令に続くｃｈｋ．ｓ命令実行のフロー制御図である。
　ステップ４０２において、プロセッサが、ｃｈｋ．ｓ命令において指定されるレジスタに関連付けられたＮＡＴビットをチェックして、ＮＡＴビットがセットされているか否かを判定する。
　ＮＡＴビットのセットは、指定レジスタに向けられたロード命令の実行前の例外発生を示す。
【００７４】
　ステップ４０４において検出されるように、ＮＡＴビットがセットされる場合、プロセッサは、ステップ４０６において、ｃｈｋ．ｓ命令において指定されるリカバリコードに分岐する。
　その他の場合、ｃｈｋ．ｓ命令の実行が完了する。
【００７５】
　一般に、コンパイラが、制御投機命令「ｌｄ．ｓ」および「ｃｈｋ．ｓ」を使用して、条件付分岐命令および他の条件付ステートメントに関してロード命令をいつ配置換えすべきで、いつ配置換えすべきではないかの推測を試みる。
　特定の場合では、静的解析またはプロファイル情報を用いて、コンパイラは、適度な確実性をもってロード命令配置換えによりプロセッササイクルを節約し、より効率の高い最適化されたコードを生成することを判定することができる。
【００７６】
　他の場合では、コンパイラにより事前には知ることができない実行時値にコードの実行時の振る舞いが依存するため、タスクが不可能なことがある。
　上記Ｃ＋＋様擬似コードルーチンは、この第２の問題のある場合の例を提供する。
【００７７】
　クラス「ｅｌｅｃｔｉｏｎ」のインスタンスのデータアレイメンバ「ｃａｎｄｉｄａｔｅｓ」中のクラス「ｃａｎｄｉｄａｔｅ」の各インスタンスに格納されているデータのレイアウトを考える。
　図５は、メモリにおけるクラス「ｃａｎｄｉｄａｔｅ」のインスタンスのデータ構成要素のレイアウトを示す。
【００７８】
　図５では、コンピュータシステムの仮想メモリの一部を、一連の仮想メモリページ５０１〜５０７として示す。
　本例では、仮想メモリページのサイズは４０９６バイトであるものと仮定する。
　次に、クラス「ｃａｎｄｉｄａｔｅ」のインスタンスを考える。
【００７９】
　クラス「ｃａｎｄｉｄａｔｅ」のインスタンスは、４つのデータメンバを含む。
　クラス「ｃａｎｄｉｄａｔｅ」のインスタンスによって占められるメモリ領域は、図５において、仮想メモリの一部の仮想ページ構造上に重複して示される。
　クラス「ｃａｎｄｉｄａｔｅ」のインスタンスによって占められるメモリの第１の部分は、データメンバ「ｎａｍｅ」５１０を格納する。
【００８０】
　クラス「ｃａｎｄｉｄａｔｅ」のインスタンスによって占められるメモリの第２の部分は、６４ビット整数データメンバ「ｃａｎｄｉｄａｔｅＮｏ」５１２を格納する。
　クラス「ｃａｎｄｉｄａｔｅ」のインスタンスによって占められるメモリの第３の部分は、大きなキャラクタアレイデータメンバ「ｂｉｏ」５１４を格納する。
【００８１】
　最後に、６４ビット整数はデータメンバ「ｎｕｍＶｏｔｅｓ」５１６を含む。
　図５から見て取ることができるように、データアレイメンバ「ｂｉｏ」のサイズにより、データメンバ「ｃａｎｄｉｄａｔｅＮｏ」５１２によって占められる仮想メモリは、データメンバ「ｎｕｍＶｏｔｅｓ」５１６によって占められる仮想メモリの部分とは別の仮想メモリページに存在する。
【００８２】
　ここでも、上記の最適化された擬似アセンブリ言語コードの抽出を考える。
　１１行目のｌｏａｄ命令は、クラス「ｃａｎｄｉｄａｔｅｓ」のインスタンスについてデータメンバ「ｎｕｍＶｏｔｅｓ」を含むメモリの部分にアクセスする一方で、配置換えされた１３行目のｌｏａｄ命令はデータメンバ「ｃａｎｄｉｄａｔｅＮｏ」を格納するメモリにアクセスする。
【００８３】
　図５に見られるように、これら２つのメモリアクセスは、異なる仮想メモリページへのものである。
　ＤＴＬＢは固定されており、プロセッサ実施態様に依存して比較的小さなサイズである。
　仮想メモリデータアドレスの変換がＤＴＬＢにない場合、ＴＬＢミス例外が発生し、仮想ハッシュページテーブル（「ＶＨＰＴ」）中の変換を探索するプロセッサ機構が呼び出される。
【００８４】
　このため、ＴＬＢミス例外は、処理サイクル、ならびに並列処理の潜在的な割り込みの双方において相当なプロセッサオーバヘッドを生じさせる。
　変換がＶＨＰＴから見つけることができない場合には、より低速の大容量記憶装置から対応するページを物理メモリにロードするために、非常に高価なオペレーティングシステムページ不在ハンドラが呼び出される。
【００８５】
　２つの異なるシナリオを考える。
　以下では「シナリオ１」と呼ぶ第１のシナリオでは、選出の最終的な当選者が、データアレイメンバ「ｃａｎｄｉｄａｔｅｓ」に格納されるクラス「ｃａｎｄｉｄａｔｅ」の最初のインスタンス「ｃａｎｄｉｄａｔｅｓ［０］」である。
　この場合、例示的なｆｏｒループの最初の反復中、３行目の条件付きステートメントが真と評価され、５行目および６行目が実行される。
【００８６】
　最適化されたアセンブリコードの場合、プレディケートレジスタ「ｐ３」は値「０」を含み、１５行目の条件付分岐命令は、実行を１８行目に転送しない。
　代わりに、ループの最初の反復中に、介在する１６行目および１７行目が実行される。
　しかしその後、３行目の例示的なｆｏｒループの条件付きステートメントは、プリディケートレジスタ「ｐ３」に値「１」を常に配置する最適化アセンブリコードの１４行目の比較命令に対応して常に偽に評価される。
【００８７】
　したがって、シナリオ１では、１３行目の配置換え後のロード命令はループの各反復において実行されるが、最適化されていないコードでは、ロード命令は、ループの最初の反復中に一度だけ実行される。
　１３行目のロード命令は、１１行目のロードがアクセスする仮想メモリページとは異なる仮想メモリページにアクセスするため、またループが、最近アクセスされていなかったかもしれないクラス「ｃａｎｄｉｄａｔｅ」のインスタンスの潜在的に長いアレイを横断中であるため、１３行目のロード命令の各実行がＴＬＢミス例外を引き起こす可能性が高い。
【００８８】
　したがって、最適化されていないコードでは発生しない多数のＴＬＢミス例外が発生する。
　最適化されていないコードにおいて当初は１５行目にあったロード命令を、最適化されたコードの１３行目に配置換えすることによって、ループの最初の反復中に得られるわずかな利点は、９９の潜在的な後続する不必要なＴＬＢミス例外の欠点にまったく及ばない。
【００８９】
　この欠点を回避する一方法は、適切なＤＣＲレジスタビットをＴＬＢミス例外を遅延させるようにセットすることである。
　この場合、リカバリブロックにおいて回復する必要のあるのは、ループの最初の反復中に発生する単一のＴＬＢミス例外のみである。
　ループのすべての後続反復について、１６行目のｃｈｋ．ｓ命令は実行されず、後続するＴＬＢミス処理は発生しない。
【００９０】
　しかし、「シナリオ２」と以下に呼ぶ第２のシナリオを考える。
　シナリオ２では、クラス「ｃａｎｄｉｄａｔｅｓ」の１００個のエンティティがデータアレイメンバ「ｃａｎｄｉｄａｔｅｓ」に存在し、クラス「ｃａｎｄｉｄａｔｅ」の各インスタンスは、データアレイ「ｃａｎｄｉｄａｔｅｓ」内にインスタンスのインデックスに等しい得票数を有する。
【００９１】
　シナリオ２では、データアレイメンバ「ｃａｎｄｉｄａｔｅｓ」中のクラス「ｃａｎｄｉｄａｔｅ」の最後のインスタンス「ｃａｎｄｉｄａｔｅｓ［９９］」が、最終的に当選者と決定される。
　シナリオ２では、例示的なｆｏｒループの３行目の条件付きステートメントは、例示的なｆｏｒループの反復中に考慮されるクラス「ｃａｎｄｉｄａｔｅ」の各インスタンスについて真と評価され、５行目および６行目のステートメントが例示的なｆｏｒループの各反復中に実行される。
【００９２】
　最適化されたアセンブリコードでは、シナリオ２の下では、１４行目の比較命令の実行後にプレディケートレジスタ「ｐ３」は常に値「０」を有する。
　したがって、１６行目のｃｈｋ．ｓ命令はループの各反復について実行される。
　シナリオ２では、シナリオ１において特定された問題を解消するために、ＴＬＢミス命令は遅延するように構成される。
【００９３】
　しかしここでは、ＴＬＢミス例外の遅延により、１６行目のｃｈｋ．ｓ命令の各実行はリカバリコードへの分岐、そして並列処理の割り込みおよび追加処理オーバヘッドを伴うロード命令の再実行につながる。
　シナリオ２の下では、ＴＬＢミス事象が発生すると即座に処理でき、ＴＬＢミス例外の処理後のロード命令の並列実行を実現することができるように、ＴＬＢミス例外を遅延させないほうがよい。
　または、単純に、最初からロード命令を配置換えしないほうがよい。
【００９４】
　上記２つのシナリオ下でのアセンブリコード抽出によって示される問題は、ＴＬＢミス例外を遅延するか否かを判定するために、動的な実行時に利用可能な情報が必要なことである。
　シナリオ１では遅延が好ましいが、シナリオ２では遅延は好ましくなく、シナリオ１と２との間の相違は、実行時にメモリに格納されるデータに関係する。
【００９５】
　一般に、コンパイラはメモリのコンテンツを予測することができない。
　たとえば、メモリのコンテンツは、ユーザ入力から取得し、様々な任意の大容量記憶装置からロードすることができ、また他の場合にはプログラム実行中に決定することができる。
【００９６】
　不都合なことに、最近のプロセッサアーキテクチャは、ルーチンのランタイム実行中に制御投機振る舞いデータを動的に集める手段をサポートしない。
　現在のプロセッサアーキテクチャは、プロセッサが、投機ロード命令実行の最近の履歴に基づいて、投機ロード命令の実行中に発生する特定タイプの例外を遅延するか否かを実行時に判定することができる機構を提供しない。
【００９７】
　本発明の一実施形態は、特別なハードウェア実施テーブルを使用して、制御投機ロード命令の遅延例外の回復についての動的情報を保持する。
　本発明は、代替の実施形態では、例外のみならず、任意の待ち時間の長い演算の即時遅延に適用できることに留意されたい。
【００９８】
　図６および図７は、投機ロード加速遅延テーブル（「ＳｐＬＡＤＴ」）の代替の実施形態を示す。
　図６に示す第１の実施形態では、ＳｐＬＡＤＴ６０２は、ＩＡ−６４プロセッサ等最近のプロセッサ内に組み込まれるビットアレイ、またはレジスタである。
　命令ポインタレジスタ（「ＩＰ」）の現在値、またはあるビット数の命令ポインタを、ハードウェアハッシュ関数において使用して、ＳｐＬＡＤＴを実施するビットアレイまたはレジスタへのインデックスを生成する。
【００９９】
　ＳｐＬＡＤＴエントリが値「１」を有する場合、ＩＰの現在のコンテンツに対応する、おそらく命令アドレスにおける最近の投機ロードの結果は、使用されなかった。
　一方、値「０」は、最近の投機ロードの結果が使用されたことを示す。
　この第１のＳｐＬＡＤＴ実施形態では、エイリアシングが発生しうる。
【０１００】
　言い換えれば、２つの異なる投機ロード命令が同じＳｐＬＡＤＴエントリにハッシングされてしまうことがある。
　これが発生すると、例外処理演算または他の待ち時間の長い演算の実行を遅延するか否かについて最適ではない選択が行われうる。
　エイリアシングの確率は一般に小さく、最適ではない場合であってもロード命令は正しく実行される。
【０１０１】
　図７に示す第２の実施形態では、ＳｐＬＡＤＴ６０４は、ＩＡ−６４等の最近のプロセッサ内に組み込まれる小さなハードウェアテーブルである。
　多くの異なる代替のＳｐＬＡＤＴフォーマットが可能である。
　ＳｐＬＡＤＴの一形態では、ＳｐＬＡＤＴは汎用レジスタ番号によってインデックス付けられ、ＳｐＬＡＤＴエントリは、インデックスの付いたレジスタをターゲットとした制御投機ロード命令の実行時のＩＰのコンテンツを格納する。
【０１０２】
　ＳｐＬＡＤＴの他の形態では、ＳｐＬＡＤＴエントリは、レジスタによってインデックス付けられた単一ビットフラグ、対応するロード命令がアクセスするデータのメモリアドレス、またはメモリアドレスおよびＩＰコンテンツを含むことができる。
　すべての場合において、ＳｐＬＡＤＴは、最近実行された制御投機ロード命令に対応するエントリを格納するように意図される。
　以下に述べるＳｐＬＡＤＴの一形態では、ＳｐＬＡＤＴエントリは、対応する制御投機命令が、リカバリブロックへのｃｈｋ．ｓ仲介分岐を介して回復されなかった１つまたは複数の例外を最近の実行中に生成したこと、および制御投機ロード命令のターゲットレジスタが、非投機命令によって後に使用されなかったことを示す。
【０１０３】
　たとえば、図６に示すＳｐＬＡＤＴフォーマットでは、汎用レジスタ「ｒ１」に対応する最初のエントリ６０４における０ではない値の存在は、レジスタ「ｒ１」に向けられたエントリ６０４のコンテンツによって示される仮想メモリアドレスを有する制御投機ロード命令が、後に回復されなかった例外を発生させたことを示す。
　この場合、値「０」は、対応するレジスタにエントリが存在しないことを示す識別値である。
【０１０４】
　エントリがエイリアシングされ、したがって正しく解釈されないことも考えられる。
　エイリアシングが頻繁ではない場合、エイリアシングを無視することに弊害はほとんどないであろう。
　一般に、即時遅延は、所与の時点においてロード命令を最適化することができるが、即時遅延の失敗、または即時処理がより高い効率を提供する状況での遅延は、コードが誤って実行されることにはならず、コードの実行効率を下げるだけである。
【０１０５】
　図８は、投機ロード加速遅延テーブルと併せて使用するようになっている変更後制御投機ロード機構のフロー制御図である。
　図８に示すステップの多くは、上記図３に示すものと同一であるため、簡略化のために再び説明はしない。
　同一ステップは、図３に使用するものと同じ符号を使用して特定する。
【０１０６】
　代わりに、以下では相違を指摘する。
　プロセッサが、制御投機ロード実行中に発生した例外を遅延させることができないと判定するステップ３０８に続き、ステップ７０２において、プロセッサはＳｐＬＡＤＴをチェックして、ＳｐＬＡＤＴが、現在実行中の制御投機ロード命令に対応するエントリを含むかどうかを調べる。
【０１０７】
　かかるエントリは、図６に示すＳｐＬＡＤＴの一形態では、ＩＰのすべてまたは一部のコンテンツをハッシングすることにより、図７に示すＳｐＬＡＤＴの第２の形態では、現在の制御投機ロード命令が、ＳｐＬＡＤＴへのインデックスとして指示されてＳｐＬＡＤＴエントリを見つけるレジスタを使用し、ＩＰの現在のコンテンツをＳｐＬＡＤＴエントリのコンテンツと比較することによって、特定される。
　プロセッサにより、ステップ７０３において判定されるように、現在実行中の制御投機ロード命令に対応するエントリがＳｐＬＡＤＴ中に見つかる場合、例外は、ステップ３１２に流れる制御によって遅延される。
【０１０８】
　その他の場合、対応するＳｐＬＡＤＴエントリが見つからない場合、例外が発生する。
　ステップ３１２および７０３に続き、新しいステップ７０４および７０６が実行され、ＳｐＬＡＤＴが更新される。
　更新は、ＳｐＬＡＤＴのタイプおよび実行履歴が格納されている精度に応じて、新しいエントリの挿入、エントリの除去、またはエントリの変更を含むことができる。
【０１０９】
　上記実施態様は例外処理に関連するが、本発明の代替の実施形態は、投機ロード演算の完了に必要でありうる他の待ち時間の長い演算の即時遅延を対象としうることに留意されたい。
　たとえば、主記憶装置へのキャッシュミス、ページテーブルアクセス、および他のタイプの演算が必要になる可能性があり、ＳｐＬＡＤＴのコンテンツに応じて遅延されるか、または遅延されない。
【０１１０】
　かかる待ち時間の長い演算の必要性は、図８のステップ３０２において検出することができ、ステップ３０２後に、ＳｐＬＡＤＴにアクセスして演算を遅延するか否かを判定する。
　ステップ３０４に続き、特定の実施態様では、首尾良く完了する前にエントリをＳｐＬＡＤＴに配置してもよく、他の実施態様では、ステップ７０４中にエントリをＳｐＬＡＤＴに配置してもよいことにも留意されたい。
　言い換えれば、首尾良い完了および遅延例外完了の双方に、または遅延例外完了のみに、ＳｐＬＡＤＴエントリをセットすることが望ましい場合がある。
【０１１１】
　図９は、投機ロード加速遅延テーブルを使用するようになっている、制御投機整数ロード命令後のｃｈｋ．ｓ命令の実行のフロー制御図である。
　図８と同様に、図９中のステップの大半は、図４に示し、図４に関連付けてすでに述べたステップと同一であるため、簡略化のために再び説明はしない。
　ｃｈｋ．ｓの変更版における新しいステップ８０２が、ステップ４０４の後に挿入される。
【０１１２】
　ステップ８０２では、指定レジスタに関連付けられたＮＡＴビットがセットされていることをプロセッサが判定する。
　この場合、リカバリコードに分岐する前に、ｃｈｋ．ｓ命令は、指定された制御投機ロード命令に対応する、ＳｐＬＡＤＴ中のエントリを消去する。
　他の非投機命令についても実行機構を同様に変更し、そうして、遅延例外を示すためにセットされた関連するＮＡＴビットを使用してアクセスするレジスタの対応するＳｐＬＡＤＴエントリを消去することが望ましい場合がある。
【０１１３】
　また、ＮＡＴビットと同様に、対応するレジスタが、たとえば、値をレジスタに格納するレジスタ間命令を実行することによって有効な値で上書きされる場合、ＳｐＬＡＤＴエントリを消去または変更することが望ましいことがある。
　最後に、ＳｐＬＡＤＴエントリは、そうしない場合に非関連の制御投機ロード命令に関連するものとして推測される可能性があるため、コンテキストスイッチ時にさらに取り除いてもよい。
　しかし、現実においてその確率は比較的低い。
【０１１４】
　したがって、ＩＡ−６４プロセッサは、本発明の一実施形態により、ＳｐＬＡＤＴに格納される制御投機ロード命令実行の最近の履歴に基づいて、制御投機ロード命令の実行中に発生する、普通なら遅延不可能な例外を遅延するように変更される。
　再びシナリオ１を考え、ＴＬＢミス例外が即座に処理されるように構成され、ＳｐＬＡＤＴベースの実行時遅延が可能なものと仮定する。
【０１１５】
　ループの最初および２番目の反復では、ＴＬＢミス例外が発生し、対応するエントリがＳｐＬＡＤＴに見つからないことから即座に処理される。
　しかし、その後、後続するループ反復では、対応するＳｐＬＡＤＴエントリが見つかり、後続するＴＬＢミス例外は遅延される。
　シナリオ２の下では、１５行目の制御投機ロード命令に対応するＳｐＬＡＤＴエントリは、ループのいずれの反復中でも見つからない。
　これは、ロード命令の各実行により、次に即座に処理されるＴＬＢミス例外が発生するためである。
【０１１６】
　本発明を特定の実施形態に関して説明したが、本発明のこの実施形態に制限する意図はない。
　本発明の精神内の変更が、当業者には自明であろう。
　たとえば、反対の意味で即時遅延を実行することも可能である。
　対応するＳｐＬＡＤＴエントリが見つからない場合に遅延するように構成される例外は、構成に関わらず即座に発生させることができる。
【０１１７】
　ＳｐＬＡＤＴエントリの存在の意味も同様に反転させることができ、ＳｐＬＡＤＴエントリは、対応する制御投機ロード命令について例外が最近処理されなかったことを示し、ＳｐＬＡＤＴエントリの不在は、対応する制御投機ロード命令について例外が最近処理されたことを示す。
　このような場合、特定の制御投機ロード命令の最初に実行時に、ＳｐＬＡＤＴ中のエントリを入力、または消去する必要がありうる。
【０１１８】
　上述したように、ＳｐＬＡＤＴは、エントリをより精密に特定の投機命令と相関付けられるようにする追加情報または異なるタイプの情報を含むことができる。
　たとえば、アクセスされたデータのメモリアドレスをＳｐＬＡＤＴエントリに含めることができる。
　さらに、遅延決定を追加履歴に基づいて行うことができるように、例外が処理された回数のカウント、および例外が続けて処理されなかった回数のカウント、および制御投機ロード命令を実行した最新の一連の結果を含むより多くの情報を含むことができる。
【０１１９】
　別の例として、待ち時間の長い演算の間の相関を検出し、ＳｐＬＡＤＴに格納することができる。
　これにより、即時遅延の予測をかかる相関に基づいて行うことができる。
　たとえば、２番目の演算の結果にアクセスするとき、最初の演算の結果に常にアクセスする場合、２番目の演算の結果に最近アクセスした場合、最初の演算の実行中に発生する例外は、即時遅延ではない。
【０１２０】
　ＳｐＬＡＤＴは多くの異なるタイプのフォーマットを有することができ、制御投機ロード命令およびｃｈｋ．ｓ実行機構の多くの異なる変更を用いて、本発明の多くの異なる実施形態の１つを実施することができる。
　例外タイプ遅延決定を行うために、たとえば、異なるクラスの例外タイプ毎に別個のエントリを入力することによって追加情報をＳｐＬＡＤＴに含めて、特定タイプの例外を、特定の制御投機ロード命令についての他のタイプの例外を遅延することなく即時遅延することができる。
　ロード命令以外の命令に関連する待ち時間の長い演算の即時遅延もまた、本発明の技法を用いて行うことができる。
【０１２１】
　上記説明では、説明目的として、本発明の完全な理解を提供するために特定の名称を使用した。
　しかし、特定の詳細は本発明を実施するために必要ないことが当業者には明らかであろう。
　本発明の特定の実施形態の上記説明は、例示および説明を目的として提示されるものである。
【０１２２】
　網羅的である、すなわち開示される厳密な形態に本発明を限定する意図はない。
　明らかに、上記教示を鑑みて多くの変更形態および変形形態が可能である。
　実施形態は、当業者が意図する特定の使用に合うように各種変更を行って本発明および各種実施形態を最もよく利用できるように、本発明の原理およびその実際の応用を最もよく説明するために図示し説明された。
　本発明の範囲は、併記の特許請求項およびその等価物によって定義されるものである。
【産業上の利用可能性】
【０１２３】
　本発明は、コンピュータにおける命令実行制御のために利用可能である。
【図面の簡単な説明】
【０１２４】
【図１】ＩＡ−６４プロセッサの汎用６４ビット整数レジスタの一部を示す図である。
【図２】ＩＡ−６４プロセッサ内の制御投機の構成に関わるシステムレジスタを示す図である。
【図３】制御投機ロード命令の処理を表すフロー制御図である。
【図４】投機ロード命令後のｃｈｋ．ｓ命令の実行についてのフロー制御図である。
【図５】メモリ中のクラス「ｃａｎｄｉｄａｔｅ」のインスタンスのデータ構成要素のレイアウトを示す図である。
【図６】投機ロード加速遅延テーブル（「ＳｐＬＡＤＴ」）の代替の実施形態を示す第１の図である。
【図７】投機ロード加速遅延テーブル（「ＳｐＬＡＤＴ」）の代替の実施形態を示す第２の図である。
【図８】投機ロード加速遅延テーブルと併せて使用するようになっている変更後制御投機ロード機構のフロー制御図である。
【図９】投機ロード加速遅延テーブルを使用するようになっている、制御投機ロード命令後のｃｈｋ．ｓ命令実行のフロー制御図である。
【符号の説明】
【０１２５】
１０１・・・レジスタ列、
１０２・・・レジスタ「ｒ０」、
１０３・・・１ビットレジスタ列
１０４・・・１ビット属性、
２０２・・・第１の変換キャッシュ、
２０４・・・データ変換ルックアサイドバッファ（「ＤＴＬＢ」）、
２１０・・・プロセッサ状態レジスタ（「ＰＳＲ」）、
２１２・・・ビット範囲、
２１４・・・ＤＣＲレジスタ、
５１０・・・データメンバ「ｎａｍｅ」、
５０１〜５０７・・・仮想メモリページ、
５１２・・・整数データメンバ「ｃａｎｄｉｄａｔｅＮｏ」、
５１４・・・キャラクタアレイデータメンバ「ｂｉｏ」、
５１６・・・データメンバ「ｎｕｍＶｏｔｅｓ」、
６０２・・・ＳｐＬＡＤＴ、
６０４・・・エントリ、
【図１】
2004062908.tif 000015
【図２】
2004062908.tif 000016
【図３】
2004062908.tif 000017
【図４】
2004062908.tif 000018
【図５】
2004062908.tif 000019
【図６】
2004062908.tif 000020
【図７】
2004062908.tif 000021
【図８】
2004062908.tif 000022
【図９】
2004062908.tif 000023