(57)【要約】  連続したアドレスブロックに対応する記憶場所と、少なくとも１つのベクトルレジスタの複数のデータ要素と、の間のデータ転送をトリガするために、ベクトルデータ転送命令が提供される。命令は、基底レジスタを使用して連続したブロックの開始アドレスを指定し、イミディエートオフセット値は、連続したアドレスブロックのサイズの倍数として指定する。これは、ループ制御オーバーヘッドを削減するために、ループの複数の反復を結合して展開ループの１回の反復にすることによってベクトル化されたコードの性能を改善するのに役立つループ展開に有用である。
2018530830.tif 000002
【特許請求の範囲】
【請求項１】
複数のデータ要素を含むベクトルオペランドを格納するための複数のベクトルレジスタと、
基底レジスタおよびイミディエートオフセット値を指定するベクトルデータ転送命令に応答して、少なくとも１つのベクトルレジスタの前記複数のデータ要素と、連続したアドレスブロックに対応するデータストアの記憶場所との間でデータを転送するように構成された処理回路と、を含み、
前記ベクトルデータ転送命令に応答して、前記処理回路は、前記基底レジスタに格納された基底アドレスを、前記イミディエートオフセット値と前記連続したアドレスブロックのサイズに対応する乗数との積に加算した結果に等しい値によって前記連続したアドレスブロックの開始アドレスを決定するように構成される、
装置。
【請求項２】
可変制御パラメータを格納する記憶要素を含み、前記処理回路は、前記可変制御パラメータに依存して前記連続したアドレスブロックの前記サイズを決定するように構成される、請求項１に記載の装置。
【請求項３】
前記可変制御パラメータは、１つのベクトルレジスタのサイズを識別するベクトルサイズＶＳを指定する、請求項２に記載の装置。
【請求項４】
前記処理回路は、積ＮＲ×ＮＥ×ＳＳに等しい値によって前記乗数を決定するように構成され、ここで、
ＮＲは、前記ベクトルデータ転送命令に応答してそのデータが転送されることになる前記少なくとも１つのベクトルレジスタのベクトルレジスタの数であり、
ＮＥは、前記少なくとも１つのベクトルレジスタの各々に含まれるデータ要素の数であり、
ＳＳは、単一のデータ要素に対応するアドレス単位の記憶単位サイズである、
請求項１〜３のいずれか一項に記載の装置。
【請求項５】
１つのベクトルレジスタのサイズを識別するベクトルサイズＶＳを格納する記憶要素を含み、
前記処理回路は、ＮＲ×ＶＳ／ＥＳ×ＳＳに等しい値によって前記乗数を決定するように構成され、ここで、
ＥＳは、１つのデータ要素のデータ要素サイズであり、
前記処理回路は、前記ベクトルデータ転送命令のエンコーディングに基づいて、ＥＳ、ＮＲおよびＳＳを決定するように構成される、
請求項４に記載の装置。
【請求項６】
前記イミディエートオフセット値は符号なし整数値を含む、請求項１〜５のいずれか一項に記載の装置。
【請求項７】
前記イミディエートオフセット値は符号付き整数値を含む、請求項１〜５のいずれか一項に記載の装置。
【請求項８】
前記基底レジスタはスカラレジスタを含む、請求項１〜７のいずれか一項に記載の装置。
【請求項９】
前記処理回路は、前記ベクトルデータ転送命令に応答して、前記少なくとも１つのベクトルレジスタのそれぞれのデータ要素ごとに、そのデータ要素と前記連続したアドレスブロックのそれぞれの部分に対応する記憶場所との間でデータを転送するためのデータ転送操作を行うように構成される、請求項１〜８のいずれか一項に記載の装置。
【請求項１０】
前記ベクトルデータ転送命令がベクトルロード命令であって、かつ、前記少なくとも１つのベクトルレジスタの所与のデータ要素のための前記データ転送操作について少なくとも１つの例外条件が検出されたとき、前記処理回路は、前記少なくとも１つの例外条件を処理するための少なくとも１つの応答アクションを抑制し、前記少なくとも１つのベクトルレジスタのどのデータ要素が前記所与のデータ要素であるかを識別する要素識別情報を格納するように構成される、請求項９に記載の装置。
【請求項１１】
前記ベクトルデータ転送命令がベクトルロード命令を含むとき、前記処理回路は、前記連続したアドレスブロックに対応する前記データストアの前記記憶場所から、前記少なくとも１つのベクトルレジスタの前記複数のデータ要素にデータをロードするように構成される、請求項１〜１０のいずれか一項に記載の装置。
【請求項１２】
前記ベクトルデータ転送命令がベクトルストア命令を含むとき、前記処理回路は、前記少なくとも１つのベクトルレジスタの前記複数のデータ要素から、前記連続したアドレスブロックに対応する前記データストアの前記記憶場所にデータを格納するように構成される、請求項１〜１１のいずれか一項に記載の装置。
【請求項１３】
基底レジスタおよびイミディエートオフセット値を指定するベクトルデータ転送命令を受け取るステップと、
前記ベクトルデータ転送命令に応答して、
連続したアドレスブロックの開始アドレスを決定するステップであって、前記開始アドレスは、前記基底レジスタに格納された基底アドレスを、前記イミディエートオフセット値と前記連続したアドレスブロックのサイズに対応する乗数との積に加算した結果に等しい値を有する、ステップと、
少なくとも１つのベクトルレジスタの複数のデータ要素と、前記連続したアドレスブロックに対応するデータストアの記憶場所と、の間でデータを転送するステップと、
を含む、データ処理方法。
【請求項１４】
複数のデータ要素を含むベクトルオペランドを格納するための複数の手段と、
基底レジスタおよびイミディエートオフセット値を指定するベクトルデータ転送命令に応答して、ベクトルオペランドを格納するための少なくとも１つの手段の複数のデータ要素と、連続したアドレスブロックに対応するデータストアの記憶場所と、の間でデータを転送するための手段と、を含み、
前記ベクトルデータ転送命令に応答して、前記転送するための手段は、前記基底レジスタに格納された基底アドレスを、前記イミディエートオフセット値と前記連続したアドレスブロックのサイズに対応する乗数との積に加算した結果に等しい値によって前記連続したアドレスブロックの開始アドレスを決定するように構成される、
装置。
【請求項１５】
請求項１〜１２のいずれか一項に記載の装置に対応する仮想マシン実行環境を提供するようにコンピュータを制御するためのコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本技法は、データ処理の分野に関する。より詳細には、それは、少なくとも１つのベクトルレジスタの複数のデータ要素とデータストアの記憶場所との間でデータを転送するためのベクトルデータ転送命令に関する。
【背景技術】
【０００２】
データ処理装置の中には、ベクトルの各データ要素に対して所与の処理操作を行って結果ベクトルの対応するデータ要素を生成するベクトル処理をサポートすることができるものがある。これにより、多くの異なるデータ値を単一命令で処理することが可能になり、所与の数のデータ値を処理するのに必要なプログラム命令の数が削減される。ベクトル処理を、ＳＩＭＤ（単一命令複数データ）処理と呼ぶこともできる。ベクトルデータ転送命令（例えば、ベクトルロード命令やベクトルストア命令）を使用して、少なくとも１つのベクトルレジスタのそれぞれの要素とデータストア内の対応する記憶場所との間でデータを転送することができる。
【発明の概要】
【課題を解決するための手段】
【０００３】
少なくともいくつかの例は、
複数のデータ要素を含むベクトルオペランドを格納するための複数のベクトルレジスタと、
基底レジスタおよびイミディエートオフセット値を指定するベクトルデータ転送命令に応答して、少なくとも１つのベクトルレジスタの複数のデータ要素と、連続したアドレスブロックに対応するデータストアの記憶場所との間でデータを転送するように構成された処理回路と、を含み、
ベクトルデータ転送命令に応答して、処理回路は、基底レジスタに格納された基底アドレスを、イミディエートオフセット値と前記連続したアドレスブロックのサイズに対応する乗数との積に加算した結果に等しい値によって前記連続したアドレスブロックの開始アドレスを決定するように構成される、
装置を提供する。
【０００４】
少なくともいくつかの例は、
基底レジスタおよびイミディエートオフセット値を指定するベクトルデータ転送命令を受け取るステップと、
ベクトルデータ転送命令に応答して、
連続したアドレスブロックの開始アドレスを決定するステップであって、開始アドレスは、基底レジスタに格納された基底アドレスを、イミディエートオフセット値と前記連続したアドレスブロックのサイズに対応する乗数との積に加算した結果に等しい値を有する、ステップと、
少なくとも１つのベクトルレジスタの複数のデータ要素と、連続したアドレスブロックに対応するデータストアの記憶場所と、の間でデータを転送するステップと、
を含む、データ処理方法を提供する。
【０００５】
少なくともいくつかの例は、
複数のデータ要素を含むベクトルオペランドを格納するための複数の手段と、
基底レジスタおよびイミディエートオフセット値を指定するベクトルデータ転送命令に応答して、ベクトルオペランドを格納するための少なくとも１つの手段の複数のデータ要素と、連続したアドレスブロックに対応するデータストアの記憶場所と、の間でデータを転送するための手段と、を含み、
ベクトルデータ転送命令に応答して、転送するための手段は、基底レジスタに格納された基底アドレスを、イミディエートオフセット値と前記連続したアドレスブロックのサイズに対応する乗数との積に加算した結果に等しい値によって前記連続したアドレスブロックの開始アドレスを決定するように構成される、
装置を提供する。
【０００６】
また、少なくともいくつかの例は、上述の装置に対応する仮想マシン実行環境を提供するようにコンピュータを制御するためのコンピュータプログラムも提供する。コンピュータプログラムは、非一時的記憶媒体であってよいコンピュータ可読記憶媒体に記憶されていてよい。
【０００７】
少なくともいくつかの例は、ソースプログラムに基づいて、処理回路による処理のための命令を生成するコンピュータ実装方法であって、
複数の反復を含むソースループをソースプログラム内で検出するステップであって、ソースループの各反復は、少なくとも１つのベクトルレジスタの複数のデータ要素と、ベクトルデータ転送命令によって識別された開始アドレスおよび所与のブロックサイズを有する連続したアドレスブロックに対応するデータストア内の記憶場所との間でデータを転送するためのベクトルデータ転送命令を含み、ソースループの所与の反復のための連続したアドレスブロックは後続の反復のための連続したアドレスブロックと連続している、検出するステップと、
ソースループを検出したことに応答して、ソースループよりも少ない反復を含む展開ループのための命令を生成するステップであって、展開ループの各反復は、ソースループの少なくとも２回の反復に対応し、
ソースループの前記少なくとも２回の反復のうちの選択された反復のベクトルデータ転送命令によって指定された開始アドレスを格納するための基底レジスタを指定する参照ベクトルデータ転送命令と、
前記基底レジスタ、および、所与のブロックサイズの倍数として、基底レジスタに格納された開始アドレスと、ソースループの前記少なくとも２回の反復のうちの残りの反復のベクトルデータ転送命令によって識別された開始アドレスとの差を指定するイミディエートオフセット値を指定する、少なくとも１つのさらなるベクトルデータアクセス命令と、
を含む、生成するステップと、
を含む方法、を提供する。
【０００８】
また、少なくともいくつかの例は、上述の命令を生成するための方法を行うように構成されたデータ処理装置も提供する。
【０００９】
上述の命令を生成する方法を行うようにコンピュータを制御するための命令を含むコンピュータプログラムを提供することができる。本コンピュータプログラムは、非一時的記憶媒体であってよいコンピュータ可読記憶媒体に記憶されていてよい。
【００１０】
本技法のさらなる態様、特徴および利点は、添付の図面と併せて読まれるべき以下の例の説明から明らかになるであろう。
【図面の簡単な説明】
【００１１】
【図１】ベクトルデータ転送命令をサポートするデータ処理装置の一例を概略的に示す。
【図２】少なくとも１つのベクトルレジスタの複数のデータ要素と、連続したアドレスブロックに対応するデータストアの記憶場所との間でデータ転送を行う例を示す。
【図３】所与のサイズのデータ要素を異なるサイズのアドレスブロックにマップする３つの例を示す。
【図４】基底レジスタを使用してアクセスされるべきアドレスブロックの開始アドレスと、アドレスブロックのサイズの倍数として指定されたイミディエートオフセット値とを識別するベクトルデータ転送命令の例を示す。
【図５】ベクトルデータ転送命令を処理する方法を示す。
【図６】ベクトルデータ転送命令を使用して処理回路が処理すべき命令を生成するための方法を示す。
【図７】第１のタイプのベクトルロード命令の例外条件の処理を示す。
【図８】第１のタイプのベクトルロード命令の例外条件の処理を示す。
【図９】第２のタイプのベクトルロード命令の例外条件の処理を示す。
【図１０】第１および第２のタイプのベクトルロード命令を区別する例を示す。
【図１１】第１および第２のタイプのベクトルロード命令を区別する例を示す。
【図１２】どのデータ要素が命令シーケンスの例外条件をトリガしたか識別する累積フォールト情報を記録するためのフォールトレジスタの使用を示す。
【図１３】フォールトが検出されたベクトルロード命令を実行しようと繰り返される試みを制御するためにフォールト情報を使用することについての、２つの異なる技法を示す。
【図１４】ベクトルロード命令の例外条件を処理する方法を示す。
【図１５】第１および第２のタイプのロード命令を使用して処理回路が処理するための命令を生成する方法を示す。
【図１６】仮想マシンの実装形態を示す。
【発明を実施するための形態】
【００１２】
次にいくつかの具体例を説明する。本発明はこれら特定の例に限定されないことが理解されよう。
【００１３】
図１は、記載の実施形態の技法が用いられ得るシステムのブロック図である。図１に示す例では、システムはパイプラインプロセッサの形を取る。命令が、フェッチ回路１０によって命令キャッシュ１５（通常は、レベル２キャッシュ５０のような１つまたは複数のさらなるレベルのキャッシュを介してメモリ５５に結合されている）からフェッチされ、そこから命令は、命令によって要求される演算を行うようパイプラインプロセッサ内の下流実行リソースを制御するための適切な制御信号を生成するために各命令をデコードするデコード回路２０に渡される。デコードされた命令を形成する制御信号は、パイプラインプロセッサ内の１つまたは複数の実行パイプライン３０、３５、４０、８０に発行するための発行段回路２５に渡される。実行パイプライン３０、３５、４０、８０は、集合的に、処理回路を形成するものとみなすことができる。
【００１４】
発行段回路２５は、演算が必要とするデータ値を格納できるレジスタ６０にアクセスすることができる。特に、ベクトル演算のためのソースオペランドをベクトルレジスタ６５内に格納し、スカラ演算のためのソースオペランドをスカラレジスタ７５に格納することができる。加えて、１つまたは複数の述語（マスク）を、ある特定のベクトル演算を行う場合に処理されるベクトルオペランドのデータ要素の制御情報として使用するために、述語レジスタ７０に格納することができる。また、スカラレジスタの１つまたは複数を使用して、ある特定のベクトル演算の実行中に使用するためのそのような制御情報を導出するのに使用されるデータ値を格納することもできる（例えばベクトル・ロード／ストア命令は、後述するようにスカラレジスタを基底レジスタとして指定することができる）。
【００１５】
またレジスタ１６は、処理パイプラインの動作を制御するための構成情報や、処理中に発生する条件または命令の結果の特性を指示するステータス情報など、様々な制御情報を提供するためのいくつかの制御レジスタ７６も含むこともできる。例えば、制御レジスタ７６は、ファースト・フォールティング・レジスタ（ＦＦＲ）７８およびベクトル・サイズ・レジスタ（ＶＳ）７９を含むことができ、これらについては以下でより詳細に説明する。
【００１６】
ソースオペランドおよび任意の関連付けられた制御情報は、経路４７を介して発行段回路２５に送ることができ、よってそれらを、デコードされた各命令を実施するために行われるべき（１つまたは複数の）演算を識別する制御信号と共に適切な実行ユニットにディスパッチすることができる。図１に示す様々な実行ユニット３０、３５、４０、８０は、ベクトルオペランドを操作するためのベクトル処理ユニットであるものと仮定されているが、装置によってサポートされる任意のスカラ演算を処理する必要に応じて別々の実行ユニット（図示せず）を設けることもできる。
【００１７】
様々なベクトル演算を考慮すると、例えば算術演算は、必要なソースオペランドに対して算術演算または論理演算が行われることを可能にするために、算術論理ユニット（ＡＬＵ）３０に、それらのソースオペランド（および述語などの任意の制御情報）と共に送られ、結果値は通常、ベクトル・レジスタ・バンク６５の指定されたレジスタに格納するため、デスティネーションオペランドとして出力される。
【００１８】
ＡＬＵ３０に加えて、デコードされた浮動小数点命令に応答して浮動小数点演算を行うために浮動小数点ユニット（ＦＰＵ）３５を設けることができ、ベクトルオペランドに対してある特定の置換演算を行うためにベクトル置換ユニット８０を設けることができる。加えて、ロード／ストアユニット（ＬＳＵ）４０を使用して、メモリ５５から（データキャッシュ４５および、レベル２キャッシュ５０のような任意の介在するさらなるレベルのキャッシュを介して）レジスタセット６０内の指定されたレジスタにデータ値をロードするためにロード操作が行われ、それらのレジスタからメモリ５５に再度データ値を格納するためにストア操作が行われる。図１に示されていない他のタイプの実行ユニットも設けることができることが理解されるであろう。
【００１９】
図１に示すシステムは、命令シーケンスがプログラム順に実行されるインオーダ処理システムであってもよく、あるいは、性能を高めることを目的として様々な命令を実行する順序を再順序付けすることを可能にするアウトオブオーダシステムであってもよい。当業者には理解されるように、アウトオブオーダシステムでは、追加の構造（図１には明示されていない）、例えば、命令によって指定されたアーキテクチャレジスタをレジスタバンク４５内の物理レジスタプールからの物理レジスタにマップして（物理レジスタプールは通常、アーキテクチャレジスタの数より大きい）、ある特定の危険を除去することを可能にし、アウトオブオーダ処理のより多くの使用を円滑化するレジスタリネーミング回路を設けることができる。加えて、通常は、アウトオブオーダの実行を追跡し、様々な命令の実行結果に順番にコミットできるように、リオーダバッファを設けることができる。
【００２０】
記載の実施形態では、図１の回路は、ベクトルレジスタ６５に格納されたベクトルオペランドに対してベクトル演算を実行するように構成されており、ベクトルオペランドは複数のデータ要素を含む。そのようなベクトルオペランドに対して行われるある特定のベクトル演算（算術演算など）では、必要な演算をベクトルオペランド内の様々なデータ要素に対して並列に（または反復して）適用することができる。述語情報（マスクとしても知られる）は、ベクトル内のどのデータ要素が特定のベクトル演算のためのアクティブデータ要素であり、したがって演算が適用されるべきデータ要素であるかを識別するのに使用することができる。
【００２１】
ベクトル処理は、処理されるべき大きいデータ配列があり、配列の各メンバに同じ演算セットを適用する必要がある場合に特に有用となり得る。純粋にスカラの手法では、命令シーケンスは、データキャッシュ４５またはメモリ５５から配列の各要素をロードし、その要素を処理し、次いでその結果をメモリに再度格納し、そのシーケンスを配列の要素ごとに繰り返す必要があるであろう。対照的に、ベクトル処理では、単一の命令は、配列の複数の要素を１つまたは複数のベクトルレジスタ６５のいくつかのデータ要素にロードすることができ、次いで、ベクトルレジスタ内のそれらの要素の各々を共通の命令セットによって処理してから、その結果をデータストアに再度格納することができる。これにより、単一の命令シーケンス（好ましくは、少なくともいくつかの要素が並列に処理されることを可能にする）に応答して複数の要素を処理することができ、フェッチし、発行し、実行される命令の数を減らすことによって性能が改善される。
【００２２】
したがって、図２に示すように、ベクトル処理システムは、連続したアドレスブロック１００に対応するデータストア内の記憶場所と少なくとも１つのベクトルレジスタ６５の複数のデータ要素との間でデータを転送するためのベクトル・ロードまたはストア命令（本明細書では集合的にベクトルデータ転送命令と呼ぶ）をサポートすることができる。ロード命令では、少なくとも１つのベクトルレジスタ６５の各アクティブ要素１０２に、連続したアドレスブロック１００の対応する部分１０４から読み出されたデータがロードされる。ストア命令では、所与のアクティブデータ要素１０２からのデータが、連続したブロック１００の対応する部分１０４に対応する記憶場所に格納される。
【００２３】
所与のベクトルデータ転送命令に応答してアクセスされるアドレスブロック１００は、一定のサイズＳＢを有する。ブロックサイズＳＢ＝ＮＲ×ＮＥ×ＳＳであり、式中、
・ＮＲは命令がターゲットとするレジスタの数であり、
・ＮＥは各レジスタ内のデータ要素の数であり、
・ＳＳは、レジスタ６５の単一のデータ要素１０２に対応するアドレスブロックの下位部分（sub-portion）１０４のうちの１つによって表されるアドレス単位のサイズである。
パラメータＮＲ、ＮＥ、ＳＳの各々は、以下のいずれかとすることができる。
・所与のプロセッサのために配線された固定値（例えば、プロセッサの中には単一のベクトルレジスタをターゲットとするロード／ストア命令をサポートするだけのものもある）、
・制御レジスタ７６のうちの１つにおいて（明示的に、もしくは別の変数への依存関係によって暗黙的に）指定された変数値、または
・ベクトルデータ転送命令のエンコーディングにおいて（明示的に、もしくは別の変数への依存関係によって暗黙的に）指定された変数値。例えば、演算コードまたは命令エンコーディングの別のフィールドのどちらかで、ＮＲ、ＮＥおよび／またはＳＳにどの値が使用されるべきかを識別することができる。
したがって、異なる命令セットアーキテクチャは、これらのパラメータを表す異なる方法を選択することができる。
【００２４】
例えば、図１に示すように、１つのベクトルレジスタ６５内の総ビット数に対応するベクトルサイズＶＳを識別するためにベクトル・サイズ・レジスタ７９を設けることができ、命令エンコーディングで、現在の演算に使用されるべきデータ要素サイズＥＳ（すなわち、１つのデータ要素内のビット数またはバイト数）を識別することができる。可変制御レジスタ内のベクトルサイズＶＳを識別することは、異なるベクトルサイズを使用して実施され得る広範なプラットフォームにわたって同じコードを実行させることができるのに有用である。レジスタごとのデータ要素の数ＮＥは、処理回路がＮＥ＝ＶＳ／ＥＳを定めることができるので、データ要素サイズＥＳの指定を通じて命令によって暗黙的に識別され得る。この場合、連続したアドレスブロックサイズＳＢを、ＳＢ＝ＮＲ×ＶＳ／ＥＳ×ＳＳと表すこともできる。
【００２５】
ＳＢ、ＶＳ、ＥＳおよびＳＳは、所与の長さのある単位で、例えば、ビット数またはバイト数や、ビット数またはバイト数の倍数の数や、何らかの他のデータ単位として表すことができることに留意されたい。以下の例のようにＳＢがバイト単位で表される場合には、ＳＳもバイト単位で表される必要があるが、ＶＳとＥＳは、それらが同じである限り、他の単位（例えば、ビットや、バイト）とすることができる。一般に、ＳＢとＳＳは同じ単位であるべきであり、ＶＳとＥＳは同じ単位であるべきであるが、ＳＢおよびＳＳはＶＳおよびＥＳと異なる単位とすることもできる。
【００２６】
他方、レジスタの数ＮＲは、命令エンコーディングから決定することができる。例えば、これが単一レジスタ、二重レジスタ、または三重レジスタのロード／ストアであるかどうかを演算コードで指定してもよく、また、命令がレジスタの数ＮＲを指定するフィールドを含んでいてもよい。
【００２７】
また、記憶単位サイズＳＳも、命令エンコーディングから識別することができる（この場合もやはり、異なる演算コードが異なる記憶単位サイズＳＳにマップすることもでき、エンコーディング内にＳＳを識別するフィールドがあってもよい）。図３に、記憶単位サイズＳＳがデータ要素サイズＥＳと異なり得る理由の例を示す。図３の部分Ａ）に示すように、いくつかの命令は、データストアからの対応するデータの量で所与のデータ要素サイズ（例えば、ＥＳ＝３２ビット＝４バイト）のデータ要素を満たすことができ、よってＳＳ＝ＥＳ＝３２ビット＝４バイトである。しかし、図３の部分Ｂ）および部分Ｃ）に示すように、プロセッサの中には、データストアからのより小さいデータの量をより大きいデータ要素との間で転送させることができるものもある。例えば、図３の部分Ｂ）および部分Ｃ）には、記憶単位サイズＳＳがそれぞれ２バイトおよび１バイトである例が示されている。そのようなベクトルロードでは、サイズＳＳのメモリ単位からのデータは、サイズＥＳの１つのデータ要素を満たすために符号拡張またはゼロ拡張される。同様に、ストア命令では、データストアへのデータ格納時にデータ要素からの４バイト値を切り捨てて２バイトまたは１バイトにすることができる。
【００２８】
他方、他のシステムは、メモリへのロードまたは格納時のデータの拡張または切り捨てをサポートしない場合があり、その場合、ＳＳはデータ要素サイズＥＳに等しい固定値とすることもでき、この場合ＳＢは単にＮＲ×ＶＳに等しく、命令または制御レジスタにおいてＳＳを指定する必要はなくなる。
【００２９】
ブロックサイズＳＢはＮＲ×ＮＥ×ＳＳに等しいが、必ずしもこれらのパラメータの乗算によって決定する必要はないことに留意されたい。上記のように、これらのパラメータのうちの１つまたは複数を固定することができ、または、別の関連したパラメータに基づいて決定することもでき、よって等価の結果を生成する他の方法もあり得る。また、要素の数ＮＥ、記憶単位サイズＳＳおよび、ベクトルサイズＶＳやデータ要素サイズＥＳなどの他の関連パラメータが一般に２の累乗である場合には、値を掛け合わせるのではなく、シフト演算を使用して等価の結果を生成することもできる。
【００３０】
このタイプの連続ベクトル・ロード／ストア命令を使用して、データストアからデータブロックＳＢを繰り返しロードし、一連のベクトルデータ処理命令（例えば、ベクトル加算、ベクトル乗算など）を使用して何らかの方法で処理し、次いで、結果ベクトルをメモリに再度格納してから、ブロック１００の開始アドレスを、後続の反復のため、ブロックサイズＳＢに対応する量だけ増分するプログラムループを形成することができる。したがって、多くの場合ベクトル化されたコードは、以下に示す形式のループを含むことができる。
loop: ld1d z0.d, p0/z, [x0] //アドレス[x0]のブロックからのデータでベクトルを
//ロードする
//...ロードされたベクトルを用いたデータ処理命令...
st1d z6.d, p0/z, [x0] //アドレス[x0]のデータストアに結果を再格納する
incb x0, SB           //ポインタx0をブロックサイズSBだけ増分する
cmp x0, x1            //ループを継続するか決定する
blo loop              //x0＜x1ならば継続する
【００３１】
この単純な例は反復ごとに１回のベクトルロードしか示していないが、実際には、後続のデータ処理でベクトルを組み合わせることができるように各反復で複数の異なるベクトルがロードされる場合があることに留意されたい。
【００３２】
しかし、このようなループを設けると、ループの前後のプログラムフローを制御するための命令を実行する際の性能コストを負う。ロード／ストア命令および実際のデータ処理命令に加えて、ループが何回実行されたかを表すポインタまたはループカウンタ（例えば、上記の［ｘ０］）を増分／減分するための命令や、ループをいつ終了すべきか決定するためにポインタまたはカウンタを限界値と比較する命令や、終了条件がまだ満足されていないときにループの開始に分岐して戻るための条件分岐命令など、ループを管理するためのいくつかの追加の命令も必要になるはずである。これらの命令はループの各反復で実行されなければならず、特に実際のデータ処理のためのベクトル命令の数と比較してループ制御命令の数が多い場合に、このために性能が低下する。
【００３３】
ループ制御のコストを削減するために、ループ展開を行って、ソースコード内の所与のプログラムループを、より少ない反復回数を有する展開ループ（unrolled loop）で置き換えることが可能である。展開ループの各反復は、元のソースループの複数の反復の処理を事実上実行するためにより多くの命令を有し得る。例えば、展開ループの各反復が、メモリ内の４つの異なるデータブロックに対応するデータを処理するためのロード命令、データ処理命令およびストア命令の４つのシーケンスを含む場合、ループ制御オーバーヘッドを３／４だけ削減することができる。そのような展開ループの例を以下に示す。
loop: ld1d z0.d, p0/z, [x0]     //ロードの反復＃０
ld1d z1.d, p0/z, [x0, x1] //ロードの反復＃１（x1はSBを格納）
ld1d z2.d, p0/z, [x0, x2] //ロードの反復＃２（x2は2*SBを格納）
ld1d z3.d, p0/z, [x0, x3] //ロードの反復＃３（x3は3*SBを格納）
//ロードされた各ベクトルz0、z1、z2、z3を用いた４組のデータ処理命令
st1d z6.d, p0/z, [x0]     //ストアの反復＃０
st1d z7.d, p0/z, [x0, x1] //ストアの反復＃１
st1d z8.d, p0/z, [x0, x2] //ストアの反復＃２
st1d z9.d, p0/z, [x0, x3] //ストアの反復＃３
incb x0, 4*SB         //ポインタx0を4*SBだけ増分する
cmp x0, x5            //ループを継続するか決定する
blo loop              //x0＜x5ならば継続する
【００３４】
ループの個々の反復はより長いが、制御命令（例えば、ｉｎｃｂ、ｃｍｐ、ｂｇｅ）を実行する頻度を少なくすることにより、全体の性能を改善することができる。ループ展開は、ループ制御オーバーヘッドを削減するだけでなく、プロセッサリソースのより適切な利用を可能にするソフトウェアパイプライン化やモジュロスケジューリングなどの他の最適化技法を可能にすることによって性能を改善することもできる。元のソースループでは、そのときにはただ１つの命令だけしか出会わず、そのような改善は利用できないはずであるが、例えば、展開ループの１回の反復内の別個のベクトル命令のうちの２つ以上を、（例えば、より大きなベクトルサイズを使用することによって）少なくとも部分的に並列に処理することができる可能性がある。場合によっては、ループ展開はソフトウェアで、例えば、ソースコードをコンパイルしてプロセッサハードウェアによって実行される実行可能コードにするコンパイラによって行われてもよい。しかし、ループ展開をハードウェアで、例えば、ループを検出してそれらを展開ループで置き換えることができるパイプラインの初期段によって行うことも可能である。
【００３５】
しかし、レジスタ値のみを使用して転送の開始アドレスを指定する連続ベクトルデータ転送命令は、いくつかの理由でループ展開をうまくサポートしない。連続ベクトルデータ転送命令は、基底アドレスを指定するスカラ基底レジスタと、基底レジスタに付加されるインデックス値を指定するスカラ・インデックス・レジスタとを使用して開始アドレス＃Ａを形成してアクセスされるアドレスブロック１００の開始アドレス＃Ａを指定することができる。しかし、この手法には、それが、展開ループ内のそれぞれのベクトルデータ転送命令によって使用されるすべてのインデックスレジスタを初期設定するためにループが行われる前に追加のオーバーヘッドを必要とし、また、各インデックスレジスタを増分するための追加の命令もループ内で必要となり得るから、ループ展開での不都合がある。また、追加のインデックスレジスタを使用すると、ループの各反復でより多数のレジスタを参照することが必要になるため、スカラ・レジスタ・ファイルにかかる圧力も増す。ループの１回の反復内で必要とされるすべての値を収容するのに十分なスカラレジスタがない場合には、いくつかのレジスタからのデータをメモリまたはキャッシュに格納する（例えばスタックにプッシュする）ことが必要になる可能性があり、このようにスタック上でレジスタがあふれ、一杯になることは、性能が損なわれる可能性があり望ましくない。
【００３６】
代わりに、図４に示すように、基底レジスタ１２０およびイミディエートオフセット値１２２を使用して、連続したアドレスブロック１００の開始アドレス＃Ａを識別するベクトルデータ転送命令が提供される。イミディエート値は、レジスタへの参照ではなく、命令のエンコーディングで直接指定される値である。基底レジスタ１２０およびイミディエートオフセット１２２に加えて、命令エンコーディングは、行われる演算のタイプを識別する演算コード１２４、１つまたは複数のターゲットレジスタ１２６の指示、およびベクトル演算を制御するための述語値を格納する述語レジスタ１２８の指示も含むことができる。
【００３７】
基底レジスタ１２０およびイミディエートオフセット１２２を使用してターゲットアドレスを指定する連続ベクトルデータ転送命令が有用となることは意外に思われるかもしれない。インデックスレジスタではなく、イミディエート値を使用してオフセットを指定すると、展開ループ内のインデックスレジスタを初期化し増分するコストと、より多くのレジスタを使用することと関連付けられるレジスタ圧の増加が回避される一方で、実際には、ベクトルプロセッサのベクトルサイズが非常に長く（例えば２５６バイト）なり、命令ごとのブロックサイズＳＢが比較的大きくなる可能性がある。元のループの４反復または８反復が展開されて展開ループの１反復になる場合、ループの最後のデータ転送に必要なオフセットは大きくなる可能性があり、命令エンコーディング内のイミディエートオフセットにおいてこれを表すために相当なビット数が必要となり得る。実際には、多くのベクトル命令セットアーキテクチャでは、命令エンコーディングのほとんどのビットが演算コード、ターゲットレジスタ、述語値、基底レジスタ、および所与の命令が必要とし得る任意の他のパラメータを指定するためにすでに必要であるため、利用可能なエンコーディング空間が限られており、よって、大きなイミディエートオフセットのための十分な余地が単にない可能性がある。また、命令エンコーディング内のビット数を増やすと、これにより、処理パイプライン内で命令を転送するためのバスのサイズが増加し、所与のプログラムを格納するのに必要なメモリ空間の量が増加して、電力消費および回路面積の観点からみて高くつきすぎることになり得るため、これもやはり選択肢になりえない。イミディエートオフセット値の使用に伴う別の問題は、上述したように、異なるハードウェア実装形態では異なるベクトルサイズを使用する場合があり、またはベクトルサイズは１つの実装形態内で可変である可能性もあり、よって、コンパイラ（またはループ展開を行う他のソフトウェアもしくはハードウェア）が、所与の命令にどんなオフセットを指定すべきか知ることが不可能となり得るから、展開ループ内の連続したデータ転送命令の開始アドレス間の差が、展開ループが生成されているときには分からないということである。これらの理由で、基底レジスタおよび単純なイミディエート・バイト・オフセットを使用して所与の命令の開始アドレスを指定することは実行可能な選択肢にはならないようである。
【００３８】
しかし、図４に示すベクトルデータ転送命令では、イミディエートオフセットは、絶対値としてではなく、ロードされる連続したアドレスブロックのブロックサイズＳＢの倍数として指定される。ロード／ストアユニット４０は、スカラ基底レジスタＸｂに格納された基底アドレスをイミディエートオフセット値ｉｍｍとブロックサイズＳＢとの積に加算した結果に等しい値を有する開始アドレス＃Ａを生成するアドレス生成ユニットを含むことができる。ブロックサイズＳＢは、図２について上述したように、ＮＲ×ＮＥ×ＳＥに等しいものとして決定することができる。イミディエート値ｉｍｍとブロックサイズＳＢとの積は、異なる方法で決定することもできる。いくつかの実装形態ではイミディエート値ｉｍｍとブロックサイズＳＢとを実際に掛け合わせることができるが、ブロックサイズＳＢが２の累乗である場合には、別の選択肢は、ｌｏｇ２（ＳＢ）に対応するビット数だけイミディエート値ｉｍｍを左シフトすることである。次いでその積を基底アドレスに加算して開始アドレス＃Ａを生成することができる。
【００３９】
図５に、連続ベクトルデータ転送命令を処理する方法を示す。ステップ１３０で、命令が基底レジスタおよびイミディエートオフセットを指定する連続ベクトルデータ転送命令であるかどうかが判定される。そうでない場合には、命令は別の方法で処理される。命令が基底レジスタおよびイミディエートオフセットを指定する連続ベクトルデータ転送命令である場合には、ステップ１３２でロード／ストアユニット４０は、基底アドレス＃ｂａｓｅを積ｉｍｍ×ＳＢに加算した結果に等しい値を有する開始アドレス＃Ａを計算する。開始アドレス＃Ａは、＃ｂａｓｅ＋ｉｍｍ×ＳＢに等しい結果を与える任意の方法で決定することができるが、実際にこの方法で計算する必要はない（例えば、乗算は、上述のように代わりにシフトを使用して実施することもできる）ことに留意されたい。ステップ１３４で、ロード／ストアユニットは一連のデータ転送をトリガし、各データ要素は、アドレス＃Ａで開始する連続したアドレスブロック１００のそれぞれの部分に対応し、データ転送は、所与のデータ要素とアドレスブロック１００の対応する部分１０４との間で、そのデータ要素が述語レジスタ１２８内の述語によってアクティブデータ要素として指示されているときに行われる。例えば、ターゲットレジスタの最下位要素をアドレス＃Ａのところのデータにマップすることができ、次の要素をアドレス＃Ａ＋ＳＳのところのデータにマップすることができ、以下同様であり、１つまたは複数のターゲットレジスタ６５のｎ番目の要素はアドレス＃Ａ＋ｎ×ＳＳ（０≦ｎ＜ＮＲ×ＮＥ）に対応する。
【００４０】
この手法は、イミディエートオフセットをブロックサイズＳＢの倍数として指定することにより、プログラムコードの書き込み時またはコードのコンパイル時にベクトルサイズＶＳを知っている必要がないため、上述の問題に対処できる。これにより、同じ命令を、異なるベクトルサイズを有する広範な異なるハードウェア実装形態に実行させることが可能になる。また、イミディエートオフセットを指定する連続ベクトル・ロード／ストア命令は、実際には、ループ展開にのみ有用であり、展開して展開ループの１反復にすることができる元のソースループの反復回数をレジスタ圧が制限する傾向があるため、実際には、イミディエートオフセット１２２を非常に小さくすることができる。例えば、多くのシステムでは、元のループの８を超える反復を１反復の展開ループの１反復に展開することはまれであり、よって値０〜７の範囲内の正の値を表す３ビットの符号なしイミディエート値で十分となり得る。これは、たとえ命令セットアーキテクチャが限られたエンコーディング空間を有していても、非常に小さいイミディエートオフセット１２２が命令セットエンコーディング内に依然として収まり得ることを意味する。
【００４１】
図４には、命令の所与のビットパターンを使用した命令のエンコーディングが示されているが、アセンブラ構文では、命令は以下のように表すことができ、
LD1H  Zd.S, Pg/Z, [Xb, #1]
LD2H {Zd1.H, Zd2.H}, Pg/Z, [Xb, #2]
LD3H {Zd1.H, Zd2.H, Zd3.H}, Pg/Z, [Xb, #3]
上記の例のすべてにおいて、イミディエートは４ビットのバイナリ値０ｂ０００１としてエンコードされるが、構文にはメモリからロードされているレジスタの数の倍数として表されている。ニモニックＬＤ１Ｈ、ＬＤ２Ｈ、ＬＤ３Ｈは、ロードされているレジスタの数（すなわち、それぞれＮＲ＝１、２、および３）を指す。あるいは、アセンブラ構文では、上記の３つのケースすべてについてイミディエート値を＃１と定義することもできる。
【００４２】
ループ展開のための命令のこの形式を使用する例を以下に示す。
//ベクトル長の複数ロードを用いた、展開された×４ベクトルループ
//x0 = 現在のループ反復のためのアレイポインタ
//p0-p3 = 展開された反復＃０から＃３のための述語
//z0-z3 = 展開された反復＃０から＃３のためのロード結果
loop: ld1d z0.d, p0/z, [x0, #0] //ロードの反復＃０
ld1d z1.d, p1/z, [x0, #1] //ロードの反復＃１
ld1d z2.d, p2/z, [x0, #2] //ロードの反復＃２
ld1d z3.d, p3/z, [x0, #3] //ロードの反復＃３
... //ロードされたベクトルを用いたデータ処理
incb x0, all, mul #4 //基底 += 4×SBバイト
b    loop
【００４３】
この例では、展開ループの最初のベクトルロード命令は０のイミディエートオフセットを有し、連続したさらなるロードは１、２、３などのイミディエートオフセットを指定して、各ロードが、それぞれ、ブロックサイズＳＢの単位のその数だけずらしたアドレスブロックからデータをロードすることを指示する。
【００４４】
しかし、実際には、展開ループの最初のロードが０オフセットを指定することは必須ではない。ソフトウェアパイプライン化技法では、ループの開始点または終了点以外のループの位置でループポインタを増分することが望まれる場合があり、よってこの場合には、基底レジスタの基準点を、展開ループの中間ロード命令のうちの１つのアドレスとすることができる。これにより、負のオフセットを指定できることが有用となり得る。したがって、イミディエートオフセット値１２２を、所与のビット数を有する２の補数形式でエンコードできる符号付き整数値として指定することができる。例えば、４ビットで−８〜＋７の範囲内の２の補数値をエンコードすることができる。例えば、ループの増分が最初の２回のロードの後、最後の２回のロードの前に行われる場合、オフセットは次のように定義することができる。
loop: ld1d z0.d, p0/z, [x0, #0]  //ロードの反復＃０
ld1d z1.d, p1/z, [x0, #1]  //ロードの反復＃１
incb x0, all, mul #4  //基底+= 4×SBバイト
ld1d z2.d, p2/z, [x0, #-2]  //ロードの反復＃２
ld1d z3.d, p3/z, [x0, #-1]  //ロードの反復＃３
... //ロードされたベクトルを用いたデータ処理
b    loop
【００４５】
図６に、ループ展開を行う方法を示す。この方法は、所与のソースプログラムに応答して処理回路が処理するための命令を生成する任意のソフトウェアまたはハードウェアによって行うことができる。例えば、この方法は、ソースプログラムを取得し、実行されるコンパイルコードを生成するコンパイラが行うこともでき、またはこの方法は、命令を実際に実行する同じ処理パイプライン内の回路で実行中に行うこともできる。一般に、ループ展開を行うハードウェアまたはソフトウェアを、ループアンローラ（loop unroller）と呼ぶ。
【００４６】
ステップ１４０で、ソースプログラムの命令が受け取られる。ステップ１４２で、ソースプログラムが何回かの反復を有し、各反復ｉは、サイズＳＢの連続したアドレスブロックをターゲットとし、開始アドレスＡ［ｉ］を有するベクトルデータ転送命令を含むソースループを含むかどうかが検出される。ソースプログラムがそのようなループを含まない場合には、本方法は終了し、ソースプログラムは別の方法で処理される。しかし、ソースプログラムがそのようなソースループを含む場合には、ステップ１４４で、ループアンローラは、ソースループより少ない反復回数を有する展開ループのための命令を生成し、ここで、展開ループの各反復はソースループのＮ回の反復に対応し、基底レジスタとゼロオフセットとを使用して開始アドレスを指定する少なくとも１つの参照ベクトルデータ転送命令と、基底レジスタとブロックサイズＳＢの倍数として指定されたイミディエート値とを使用して開始アドレスを指定する少なくとも１つの別のベクトル・ロードまたはストア命令とを含む。また展開ループの各反復は、Ｎ×ＳＢに対応する量だけ基底レジスタを増分するための増分命令を含むこともできる。基底レジスタがループ内で増分されるタイミングに応じて、参照命令は、ループのその他のベクトルデータ転送命令よりも早いか、遅いか、またはその途中とすることができる。参照ベクトルデータ転送のゼロオフセットは、上述したのと同じ方法でイミディエートオフセットを使用して、または後述するようにレジスタ参照を使用して指定することができる。
【００４７】
ステップ１４６で、生成された命令は処理回路により処理するために出力される。例えば、命令は、処理回路による処理のためにメモリ５５に格納することができるコンパイルされたプログラムとして出力することができる。あるいは、展開がパイプライン内で実行中に行われている場合には、出力命令は処理のために後続段に送られる。
【００４８】
イミディエート・オフセット・フィールド１２２の特定のサイズは、使用されている特定の命令セットアーキテクチャに依存し得る。実際には、ベクトルレジスタ６０、スカラレジスタ７５または述語レジスタ７０の数により、展開して展開ループの１反復にすることができるソースループの反復回数に事実上の制限が設けられる可能性があり、そのため、この制限を超える値を収容するイミディエート・オフセット・フィールド１２２を設けることは有用ではない可能性がある。例えば、ソースループの各反復が最大Ｒ個のスカラレジスタを使用することが予期され、アーキテクチャがＭ個のスカラレジスタを定義している場合、実際には、展開して１反復にすることができるソースループの最大反復回数はＭ／Ｒになるはずであり、よってイミディエート・オフセット・フィールド１２２のサイズは、表現できる最大値がＭ／Ｒ−１になるように選択することができる。負のオフセットと正のオフセットの両方を定義できるように符号付きの値を収容するために追加ビットを割り振ることもできる。例えば、多くの場合Ｒは２または４であり、よってＭ／２−１またはＭ／４−１のオフセット値をエンコードするのに十分なビット空間を設ければ十分である。例えば、Ｍ＝３２の場合には、８回を超える反復を展開することはまれであり、よって、３ビットの符号なしオフセットフィールドまたは４ビットの符号付きフィールドで、イミディエートオフセットを有するベクトルデータ転送命令が使用される可能性の高いほとんどの実際の状況に十分に対処することができる。他方、述語レジスタ７０がスカラレジスタよりも少ない場合には、実際に展開して展開ループの１反復にすることができるループの反復回数に対する制限要因になるのは述語レジスタの数であるかもしれない。したがって、一般に展開の量を制限するいくつかの制約条件が存在する可能性があり、イミディエート・オフセット・フィールド１２２のサイズは、所与の実装形態に発生する制約条件に基づいて選択することができる。
【００４９】
要約すると、基底レジスタおよびイミディエートオフセット値を使用して連続したアドレスブロックの開始アドレスを識別するベクトルデータ転送命令は、意外にも、比較的長いベクトルまたは可変ベクトル長を有するシステムにおいてさえも有用である。イミディエートオフセット値は、ハードウェアによって使用されるベクトル長に応じて可変的に選択され得る連続したアドレスブロックのサイズの倍数として定義されるので、事前に絶対的なブロックサイズを知っている必要はなく、よって、異なるベクトル長を使用する異なるプラットフォームにわたって、または可変ベクトル長をサポートするプラットフォーム上で同じコードを実行することができる。ループ展開では、展開された反復の回数が比較的少なくなると予期されるので、イミディエートオフセット値は命令エンコーディングにおいて大きなフィールドを必要とせず、よって、利用可能なエンコーディング空間が限られている命令セットアーキテクチャにおいてさえも使用することができる。
【００５０】
ベクトルデータ転送命令のこの形式は、固定サイズの連続したアドレスブロックを使用する装置で使用することもできるが、可変サイズのアドレスブロックを提供する装置において特に有用である。この装置は、基底アドレスまでのオフセットを形成するためにイミディエートオフセット値に適用される乗数を決定する目的で命令を実行するときに読み取られ得る、可変制御パラメータを格納するための記憶要素を有していてよい。例えば、可変制御パラメータは、１つのベクトルレジスタのサイズを識別するベクトルサイズとすることができる。
【００５１】
アクセスされる連続したブロックの開始アドレスは、イミディエートオフセット値と連続したアドレスブロックのサイズに対応する乗数との積に基底アドレスを加算することと同等の様々な方法で決定することができるが、この方法で実際に決定する必要はない。乗数は、積ＮＲ×ＮＥ×ＳＳと等しい値を有していてよく、ここで、ＮＲは、ベクトルデータ転送命令に応答してデータが転送されるベクトルレジスタの数であり、ＮＥは、各ベクトルレジスタが含むデータ要素の数であり、ＳＳは、１つのデータ要素に対応するアドレス単位の記憶ユニットのサイズである。ＮＲ、ＮＥ、ＳＳは各々、固定することもでき、命令エンコーディングにおいて定義することもでき、制御レジスタに格納された可変パラメータに依存して定義することもできる。
【００５２】
１つの有用な手法では、ベクトルサイズＶＳ（１つのベクトルレジスタのサイズ）が制御レジスタで定義され、命令エンコーディングが（明示的に、または演算コードによって暗黙的に）ＮＲ、ＳＳおよびＥＳ（１つのデータ要素のサイズ）を識別し、乗数がＮＲ×ＶＳ／ＥＳ×ＳＳに等しくなるよう決定される。ＶＳは特定のハードウェア実装形態に依存するが、ＮＲ、ＳＳ、ＥＳはすべて、実行する必要のある演算に応じてプログラマ／コンパイラによって事前に知られている可能性が高い。したがって、ＶＳを制御レジスタで、その他のパラメータＮＲ、ＳＳ、ＥＳを命令エンコーディングを使用して定義することにより、異なるベクトルサイズを使用する広範なハードウェア実装形態にわたって同じコードを実行することが可能になる。
【００５３】
イミディエートオフセットに掛け合わせる乗数を決定するために実際に乗算を行う必要はない。多くの場合、ＮＥ、ＳＥ、ＥＳ、ＶＬの可能な値は２の累乗に対応し、よって、あるビット数だけ左シフトすれば乗算と等しくなり得る。
【００５４】
イミディエートオフセット値は符号なし整数値とすることができ、これにより負のオフセットが不要である場合により小さなイミディエートフィールドが可能になる。あるいは、イミディエートオフセット値は、負のオフセットの使用を可能にするために符号付き整数値とすることもでき、これが有用なのは、負のオフセットを可能にすればループの異なるポイントで基底アドレスを更新するより多くの柔軟性が得られ、例えば、ソフトウェアパイプライン化技法を使用した性能の改善に役立ち得るからである。
【００５５】
ベクトルデータ転送命令によって参照される基底レジスタは、（ロード／ストアされるターゲットベクトルの要素ごとに異なるアドレスを識別するベクトルレジスタを指定することができるスキャッタギャザータイプのロード／ストア命令とは対照的に）スカラレジスタとすることができる。
【００５６】
場合によっては、ベクトルデータ転送命令がベクトルロード命令である場合、ベクトルの所与のデータ要素のために行われたロード操作で例外条件が検出されたときに、例外条件を処理するための応答アクションを抑制することができ、代わりに、どのデータ要素が例外条件をトリガした所与のデータ要素であるか識別する要素識別情報を格納することができる。この手法は、要素を実際に処理すべきであるかどうか決定する関連条件が解決される前にいくつかの要素が処理されるループスペキュレーション（loop speculation）を可能にするのに有用であり、性能を改善するのに役立つ。これについては以下でより詳細に説明する。
【００５７】
イミディエートオフセット値を指定するベクトルデータ転送命令は、ロード命令またはストア命令のいずれかであるかもしれない。
【００５８】
ベクトル化されたコードの処理に伴う別の問題は、アドレス変換フォールトやメモリ許可フォールトなどの例外条件の処理である。多くの場合、ベクトル化されたコードによって処理されるデータの配列はブロックサイズＳＢの正確な倍数を含まず、よって、ループの最終反復には有効なデータを処理するいくらかの要素しかない場合がある。いくつかのベクトル化されたループでは、ループの各反復は、ロードされたデータ要素のうちの１つが、配列の終わりに達したことを指示する停止条件を満たすかどうかチェックするための少なくとも１つの命令を有することができ、この条件が満たされる場合には、ループを終了することができる。各要素を別々にロードし、次の要素をロードする前に停止条件についてテストする必要がある場合には、ベクトル化の性能上の利点が失われるため、通常ベクトルロード命令は、データブロックをロードしてから、ロードされたデータの任意の要素が停止条件を満たすかどうかテストする。したがって、いくつかの要素は、それらの要素が処理される必要のある有効な要素であるかどうかが実際に分かる前にロードされ得る。この技法では、少なくとも１つの要素が、その要素を処理すべきかどうか決定するための関連条件が解決される前に処理され、ループスペキュレーションと呼ばれることがある。
【００５９】
しかし、ループの所与の反復が、処理される配列の終わりを超える範囲のデータをロードする場合には、配列の終わりを越えたアドレスについてはページテーブルでアドレス変換データが定義されておらず、アドレス変換フォールトを引き起こす可能性があり、または実行中のプロセスが配列の終わりを越えたアドレスにアクセスする許可を持たず、メモリ許可フォールトを引き起こす可能性があるから、これによりフォールトが発生する場合がある。したがって、ループスペキュレーションが使用される場合には、アドレス変換フォールトやメモリ許可フォールトなどの例外条件の可能性がより高くなり得る。
【００６０】
所与のデータ要素に例外条件が発生したが、配列の終わりにまだ達していない場合は、これは有効な例外条件であり、フォールトに対処するための例外処理ルーチンを実行するなど、対応する応答アクションを取る必要が生じ得る。例えば、例外処理ルーチンは、オペレーティングシステムをトリガして、必要なアドレスのアドレス変換マッピングを定義するようページテーブルを更新することができる。しかし、必要な配列の終わりを越えたアドレスからロードされた要素では、例外条件が発生した場合、そのアドレスはいずれにせよアクセスされるべきではなかったはずであり、そのアドレスでのロードは、配列の終わりを越えて進んだ、所与のベクトル長ＶＬまたはブロックサイズＳＢでコードをベクトル化したことのアーチファクトとしてトリガされたにすぎないから、応答アクションをトリガすることは望ましくないであろう。したがって、ループスペキュレーションが行われる場合、すべての例外条件に対して応答アクションをトリガすることは望ましくない場合がある。
【００６１】
図７および図８に、これに対処するための第１のタイプのベクトルロード命令の動作を示す。第１のタイプの命令は、ロードされているベクトルの最初のアクティブ要素で例外条件が検出された場合には応答アクションをトリガするが、他の要素で例外条件が発生した場合には応答アクションをトリガしないため、ファーストフォールティング（ＦＦ）ロード命令とも呼ばれる。この例では、要素は、最下位要素から最上位要素へと進む所定の順序で考察され、よって最初のアクティブ要素は、述語値Ｐｇによりアクティブとして指示される最下位要素である。例えば、図７では、要素０は０の述語ビットを有し、要素１〜３は１の述語ビットを有し、よって最初のアクティブ要素は要素１である。
【００６２】
図７では、最初のアクティブ要素（要素１）のために行われたロード操作で例外条件が発生し、よって例外処理ルーチンを実行するなどの応答アクションがトリガされる。一般に、最初のアクティブ要素は、停止条件が満たされることにつながり得る、もっと前のアクティブ要素がないため非投機的にロードされ、よって、フォールトが発生した場合には、これは有効なフォールトであり、これに対処するための応答アクションがトリガされる。
【００６３】
他方、図８に示すように、ファーストフォールティング・ベクトル・ロード命令では、最初のアクティブ要素以外の要素（例えば、この例では要素２）で例外条件が発生した場合、応答アクションは抑制される。代わりに、処理回路は、どの要素がフォールトを引き起こしたか識別するようファースト・フォールティング・レジスタ（ＦＦＲ）７８を更新する。（最初のアクティブ要素以外の）後続のデータ要素のうちの複数でフォールトが発生した場合には、これらの要素の最初のものの位置がＦＦＲ７８において識別されることができ、または後述するように、ＦＦＲはフォールトが発生した最初の要素および任意の後続の要素を識別することができる。
【００６４】
この手法は、最初のアクティブ要素以外の要素で例外条件が発生した場合に応答アクションがすぐにはトリガされないことを意味するため、一般にループスペキュレーションに有用である。ＦＦＲ７８を更新した後、いくつかの命令が、フォールトが発生した要素よりも前の要素について停止条件が満たされるかどうかを次いでチェックし、もしそうである場合、例外条件が発生した原因が単に、処理されるデータの終わりをベクトルループが越えていたことだから、例外条件を処理せずにループを終了することができる。他方、停止条件がまだ満たされていない場合、ＦＦＲ７８を使用してどの要素が例外条件をトリガしたか識別することができ、これを使用して、フォールトが発生した要素を最初のアクティブ要素とするループ化された命令シーケンスの繰り返しをトリガして、例外条件が再度発生した場合、フォールト要素が最初のアクティブ要素になるため今度は応答アクションをトリガできるようにすることができる。したがって、ファーストフォールティングの手法は、（フォールトを発生させる各要素を最初のアクティブ要素として扱うことができるように命令シーケンスを数回繰り返す必要があるために）有効な例外条件が処理されるのを遅延させる可能性があるが、ループの反復ごとにより多くの要素が処理される（ループ制御オーバーヘッドが少なくなる）ことを許可することによって達成される性能利得は、通常、このオーバーヘッドを補って余りあり、これが可能なのは、たとえ停止条件が解決される前にループの反復ごとに大きなデータブロックがロードされたとしても、ファーストフォールティング機構により、後で不要であることが判明する投機的に処理された要素によって偽の応答アクションがトリガされることが防止されるからである。
【００６５】
図８に示すように、ＦＦＲ７８は、ロードされるベクトルの要素の１つに各々が対応するいくつかのビットを含む要素マスクとして定義することができる。フォールト要素および任意の後続の要素に対応するビットは、第１の値（この例では０）を有し、フォールト要素よりも前の任意の要素のビットは第２の値（この例では１）を有する。ＦＦＲ７８をこの方法で定義することは、フォールト要素が後続の試みでの最初のフォールト要素になるように、命令シーケンスを実行しようとする後続の試みのために新しい述語またはアドレスを決定できるようにする（下記の図１３を参照）のに有用である。したがって、ＦＦＲ７８は、フォールトをトリガしなかった要素のためにすでに行われた演算を不必要に繰り返すことなく、フォールトの解決後にデータ要素の処理を再開できるようにさせるのに有用である。
【００６６】
したがって、この形式のファーストフォールティング命令は、ベクトル化されたコードが、ベクトル化のアーチファクトとして導入された例外条件を処理するためのオペレーティングシステムまたは他のソフトウェアへの不要なトラップを防止するのに有用である。しかし、ループ展開を行う場合、命令のファーストフォールティング形式は、展開ループの最初の命令以外の命令には機能しない。展開ループの最初のロードの最初のアクティブ要素は（停止条件が満たされることにつながり得る、もっと前のアクティブ要素がないため）非投機的である可能性が高いが、後続のロードでは、最初のアクティブ要素は投機的にロードされた要素でもある可能性がある。通常、展開ループの停止条件は、一旦、展開ループ内のすべてのロードが完了すると解決され、よって、展開ループのまさに最初のロードによってロードされた最初のアクティブ要素以外の任意の要素は投機的要素である可能性があり、よって、展開ループ内のあらゆるロードの最初のアクティブ要素に対して応答アクションをトリガすることは望ましくないであろう。
【００６７】
図９に示すように、非フォールティング（ＮＦ）・ベクトル・ロード命令と呼ばれる第２のタイプのベクトルロード命令を提供することができる。非フォールティング・ベクトル・ロード／ストア命令が実行された場合には、たとえ最初のアクティブ要素で例外条件が発生したとしても、応答アクションは依然として抑制され、フォールトが発生した要素を識別するために図８と同様の方法でＦＦＲ７８が更新される。したがって、非フォールティングタイプのロード命令では、どの要素がフォールトをトリガしたかにかかわらず、応答アクションはトリガされず、ファースト・フォールティング・レジスタ７８はフォールトを引き起こした要素を識別するように更新される。以下の例に示すように、これにより、ループ展開が、展開ループにおけるまさに最初のロードにファーストフォールティング形式の命令（例えばｌｄｆｆ１ｄ）を使用し、展開ループ内の後続のロードに非フォールティング形式の命令（例えばｌｄｎｆ１ｄ）を使用することが可能になる。
//非フォールトロード発明を用いた展開された×３ベクトルループ
//x0 = 現在のループ反復のためのアレイポインタ
//p0-p2 = 展開された反復＃０から＃２のための述語
//z0-z2 = 展開された反復＃０から＃２のためのロード結果
loop: setffr                      //FFR = すべて真
ldff1d z0.d, p0/z, [x0, #0] //ファースト・フォールト・ロードの反復＃０
rdffr p4.b                  //１番目のロードについてFFRを読み込む
ldnf1d z1.d, p1/z, [x0, #1] //非フォールト・ロードの反復＃１
rdffr p5.b                  //２番目のロードについてFFRを読み込む
ldnf1d z2.d, p2/z, [x0, #2] //非フォールト・ロードの反復＃１
rdffr p6.b                  //３番目のロードについてFFRを読み込む
brkn p5.b, p0/z, p4.b, p5.b //＃０におけるフォールトを＃１に伝播
brkn p6.b, p1/z, p5.b, p6.b //＃１におけるフォールトを＃２に伝播
... //p4、p5、p6に基づいた演算
incb x0, all, mul #3 //基底 += 3×SBバイト
b loop
【００６８】
命令の２つのタイプは、命令エンコーディング内で任意の方法で区別することができる。これらの命令に２つの全く異なる演算コードを提供すること、または命令がファーストフォールティングであるかそれとも非フォールティングであるかを指定する命令エンコーディング内のフラグを有する共通の演算コードを提供することが可能である。しかし、このためには、命令セットアーキテクチャ内に別の種類の演算が含まれないようにし得る追加の演算コードがこれらの命令に割り振られることを要求して、またはエンコーディングの追加のビットがフラグを表すことを要求して、命令セットアーキテクチャ内の追加のエンコーディング空間が必要になるであろう。
【００６９】
したがって、第１および第２のタイプの命令をエンコードするより効率的な方法は、命令が第１のタイプの命令かそれとも第２のタイプの命令かを知らせるようにアドレスオフセットが命令内で表される方法を使用することとすることができる。上述したように、ブロックサイズＳＢの倍数を表すイミディエートオフセット１２２を指定する命令形式が提供されてもよく、これは、第２のタイプの命令が使用される可能性が高い状況でもあるループ展開に主に有用である。したがって、アドレスオフセットが定義される方法は、命令がファーストフォールティングかそれとも非フォールティングかを決定することもできる。
【００７０】
図１０に、２つのタイプの命令を区別する第１の例を示す。この例では、イミディエートオフセット値がゼロの場合には、命令は第１の（ファーストフォールティング）タイプであり、イミディエートオフセット値が非ゼロの場合には、命令は第２の（非フォールティング）タイプである。多くの場合、ループ展開を行うとき、展開ループのまさに最初のロードはゼロのオフセットを有し、後続のロードは非ゼロオフセットを有することになり、よってイミディエートオフセットがゼロであるかどうかを使用してフォールティング挙動のタイプを識別することができる。これにより、２つの命令形式が、エンコーディング内にいかなる追加のビット空間も必要とせずに、異なる例外処理挙動をトリガすることが可能になる。
【００７１】
図１１に、命令を区別する第２の例を示す。イミディエートオフセットを指定する図４に示すタイプのベクトルロード命令に加えて、命令セットアーキテクチャは、インデックスレジスタを使用してオフセットを指定する、対応するベクトル・ロード／ストア命令も含むことができる。この場合、ベクトル・ロード／ストア命令がインデックスレジスタを使用してオフセットを指定するときには、これをファーストフォールティングタイプの命令として扱うことができ、オフセットがイミディエート値によって指定されるときには、これを非フォールティングタイプのロード命令として扱うことができる。イミディエートオフセット値の使用と非フォールティングタイプのロード命令の両方は主にループ展開に使用される可能性が高いため、非フォールティングタイプの命令を使用するほとんどのインスタンスはイミディエートオフセット値も指定し、よって、デフォルトでイミディエート指定ロード命令を非フォールティングとすることによって、非フォールティング挙動を識別するために命令エンコーディング内で他のビット空間を使い果たす必要が回避される。
【００７２】
図１１に示す手法が使用される場合、展開ループのまさに最初のロードは、インデックスレジスタを使用してそのオフセットを指定させることができ、そのためファーストフォールティング挙動をトリガする。場合によっては、最初のロードのインデックスを格納するために汎用レジスタを割り振ることができ、これには展開ループの反復ごとに１つ追加のスカラレジスタが必要になるが、後続のロードはイミディエート値を使用してオフセットを指定することができるため、あらゆるロードが別個のインデックスレジスタを有する場合よりもかかるレジスタ圧は依然として低い。いずれにしても、多くの場合、展開ループの最初のロードはゼロオフセットを使用し、一部のアーキテクチャでは、（任意の値に設定できる汎用レジスタに加えて）デフォルトでゼロであると仮定される所定のレジスタが定義される。ゼロを格納するハードワイヤードレジスタをハードウェアで設けることもでき、または、所定のレジスタが実際のレジスタに対応せず、処理回路が、レジスタバンクにアクセスする必要なしに、単に、その所定のレジスタのレジスタ指定子をゼロの入力値にマップするだけでもよい。したがって、展開ループの最初のロードで所定のレジスタを参照することにより、最初のロードがインデックスレジスタを使用してオフセットを指定するときでも、汎用スカラレジスタを使い果たす必要はない。
【００７３】
したがって、上記の展開ループの例は、図１１に示す手法に基づいて、ファーストフォールティング命令ｌｄｆｆ１ｄが所定のレジスタｘｚｒを参照することによってそのオフセットを識別し、それが、イミディエート値＃１、＃２などを参照する非フォールティング命令ｌｄｎｆ１ｄとは対照的に、インデックスレジスタを使用してそのオフセットを識別することから、デフォルトでファーストフォールティングとして扱われるように変更することができる。
//非フォールトロード発明を用いた展開された×３ベクトルループ
//x0 = 現在のループ反復のためのアレイポインタ
//p0-p2 = 展開された反復＃０から＃２のための述語
//z0-z2 = 展開された反復＃０から＃２のためのロード結果
loop: setffr                       //FFR = すべて真
ldff1d z0.d, p0/z, [x0, xzr] //ファースト・フォールト・ロードの反復＃０
rdffr p4.b                   //１番目のロードについてFFRを読み込む
ldnf1d z1.d, p1/z, [x0, #1]  //非フォールト・ロードの反復＃１
rdffr p5.b                   //２番目のロードについてFFRを読み込む
ldnf1d z2.d, p2/z, [x0, #2]  //非フォールト・ロードの反復＃１
rdffr p6.b                   //３番目のロードについてFFRを読み込む
brkn p5.b, p0/z, p4.b, p5.b  //＃０におけるフォールトを＃１に伝播
brkn p6.b, p1/z, p5.b, p6.b  //＃１におけるフォールトを＃２に伝播
... //p4、p5、p6に基づいた演算
incb x0, all, mul #3 //基底 += 3×SBバイト
b loop
【００７４】
図１２に、ＦＦＲ７８を使用して、所与のデータ要素セットに作用し、そのシーケンスの各命令が前の命令からの結果を使用する命令シーケンスから発生する例外条件を追跡する例を概略的に示す。これらの命令のうちのいずれかのための所与の要素がフォールトをトリガする場合には、その要素および任意の後続の要素の処理をシーケンスの後続の命令において続行することは望ましくない可能性がある。したがって、ファースト・フォールティング・レジスタを累積的に定義して、シーケンスの開始前にすべてのビットが１に設定され、次いで、任意の命令が（ファーストフォールティング命令のための最初のアクティブ要素以外の）所与の要素に対してフォールトをトリガした場合には、所与の要素および任意の後続の要素に対応するビットがファースト・フォールティング・レジスタ７８においてクリアされ、そのシーケンスの残りの命令についてクリアされたままになるようにすることができる。ＡＮＤ演算を使用してファースト・フォールティング・レジスタ７８を述語値Ｐｇと組み合わせることにより、フォールトが発生した要素がそれ以上処理されるのを防止するために、修正された述語Ｐｇ’を任意の後続の命令について生成することができる。後続の命令（例えば、図１２の命令１）が次いで前の要素について別のフォールトを発生した場合には、ＦＦＲ７８の少なくとも１つのさらなるビットをクリアして０にすることができ、次の命令はさらに少ない要素を処理することになる。
【００７５】
あるいは、図１３に示すように前のマスクＰｇとＦＦＲとの論理積を取るのではなく、代わりに、命令（例えば、上記の例に示すｒｄｆｆｒ命令）が単に、ＦＦＲを読み取り、その結果を、シーケンスの後続の命令によって述語レジスタとして使用される対応するレジスタｐ４／ｐ５／ｐ６に格納することもできる。
【００７６】
上記の例のｂｒｋｎ命令は、
BRKN Pdm.B, Pg, Pn.B, Pdm.B
の形式のものであり、これらは、以下の操作を行うように処理回路を制御する。
Ｐｇの最後の（すなわち、左端の、最上位の）真／アクティブ／非ゼロのビットに対応するＰｎの述語ビットも真／アクティブ／非ゼロである場合には、Ｐｄｍは変更されず、
Ｐｇの最後の（すなわち、左端の、最上位の）真／アクティブ／非ゼロのビットに対応するＰｎの述語ビットが偽／非アクティブ／ゼロである場合には、Ｐｄｍはクリアされてすべて偽／不活性／ゼロになる。
【００７７】
言い換えると、
Pdm = LastActive(Pg, Pn) ? Pdm : 0;
（// LastActive()はＰｇの最も左のセットビットを見つけ、Ｐｎの同じビットが真であるかどうかを返す）。
【００７８】
言い換えると、ｂｒｋｎ命令は、最初のロードで失敗を検出した場合、すなわち、ＦＦＲの最後のアクティブ要素がそのロードの後に偽である場合には、その失敗は、すべてゼロに設定することによって二番目のロードのＦＦＲ結果に伝播され、以下同様である。ｂｒｋｎ命令は、展開ループの次の部分反復に「中断」条件を伝播する。
【００７９】
シーケンスの終わりに達すると、首尾よく完了した要素は有効な結果として扱われ、ループは、ＦＦＲ７８を検査し、停止条件を解決して、フォールト要素に対して生成されたフォールトが、ループスペキュレーションが原因で生成された偽のフォールトである（よってそれらのフォールトは処理される必要がなく、ループは終了できる）か、またはシーケンスを繰り返すことによって処理される必要がある有効なフォールトであるかを判定するいくつかの命令を含むことができる。図１３に示すように、ＦＦＲ７８を使用して、シーケンスを実行しようと繰り返すための新しい述語（マスク）または新しいアドレスを決定することができる。図１３の左側には、フォールトが発生した最初の要素（ＦＦＲ７８において「０」ビットを有する最初の要素）が今度は最初のアクティブ要素（更新されたマスクにおいて「１」ビットを有する最初の要素）になる新しい述語の生成が示されている。あるいは、図１３の右側に示すように、ＦＦＲ７８を使用して、後続の試行の基底アドレスがフォールト要素によってロードされたアドレスに今度は対応するようにロード命令の基底アドレスを更新することも可能である。いずれにしても、シーケンスが繰り返されると、フォールトが発生した要素が今度は最初のアクティブ要素になり、よってそのフォールトがその要素で再度発生した場合、ループシーケンスの開始におけるファーストフォールティングタイプの命令が応答アクションをトリガすることになる。
【００８０】
図１４に、例外条件に直面し得るベクトルロード命令またはベクトルストア命令を処理する方法を示す。ステップ２００で、プロセッサは、現在の命令がベクトルロード命令であるかどうか判定し、そうでない場合には、命令は何らかの他の方法で処理される。ベクトルロード命令に出くわした場合には、ステップ２０２で、ベクトルの複数のデータ要素のためにロード操作が行われる。各要素のアドレスは、基底レジスタおよびオフセットを使用して、または基底レジスタおよびインデックスレジスタを使用して計算された開始アドレスに基づいて計算することができる。ステップ２０４で、ベクトルの任意の所与のデータ要素について例外条件が検出されたかどうかが判定される。そうでない場合には、方法はステップ２００に戻って次の命令を処理し、ロード操作は首尾よく実行される。
【００８１】
しかし、例外条件が検出された場合には、ステップ２０６で、フォールトをトリガした所与のデータ要素がベクトルの最初のアクティブデータ要素であるかどうかが判定される。複数の要素がフォールトをトリガした場合には、これらの要素のうちの最初の要素が最初のアクティブ要素であるかどうかが判定される。フォールトが発生した所与のデータ要素が最初のアクティブデータ要素である場合には、ステップ２０８で、現在のベクトルロード命令がファーストフォールティングタイプのものであるかそれとも非フォールティングタイプのものであるかが判定される。ベクトルロード命令がファーストフォールティングタイプの命令であった場合には、ステップ２１０で、例外処理ルーチンを実行する、フォールトが発生したことを指示する何らかの情報を記録するなど、応答アクションがトリガされる。他方、命令が非フォールティング形式の命令である場合には、ステップ２１２で、応答アクションは抑制され（すなわち、行われず）、ステップ２１４で、ファースト・フォールティング・レジスタ７８が、フォールトが発生した所与のデータ要素を識別するように更新される。ステップ２０６で、所与のデータ要素が最初のアクティブ要素でない場合には、方法はステップ２０６から直接にステップ２１２に進む（応答アクションは抑制され、ＦＦＲ７８は、命令がファーストフォールティングであるか非フォールティングであるかにかかわらず更新される）。
【００８２】
図１４に示す技術は、上述のタイプの連続したロードだけでなく、ベクトルロード命令のあらゆるタイプに使用できる。したがって、異なるフォールティング挙動を有する第１および第２のタイプのロード命令を、ターゲットベクトルの要素ごとにいくつかの離散アドレスを定義するアドレスベクトルを指定し、ロードで各離散アドレスからのデータをターゲットベクトルに集めるギャザーロード命令のために定義することもできる。
【００８３】
図１５に、ソフトウェア（例えば、コンパイラ）で実施されてもよく、ハードウェア（例えば、生成された命令を実行する同じパイプライン内の回路）によって実施されてもよいループアンローラによって行うことができる、処理回路が処理するための命令を生成する方法を示す。ステップ２５０で、ソースプログラムの命令が受け取られる。ステップ２５２で、ループアンローラは、ソースプログラムが、各反復がファーストフォールティング・ベクトル・ロード命令を含むソースループを含むかどうか判定し、そのようなループがない場合には、方法は終了し、命令が何らかの他の方法で生成される。しかし、ソースプログラムがソースループを含む場合には、ステップ２５４でループアンローラは、ソースループより少ない反復回数を有する展開ループのための命令を生成する。展開ループの各反復は、ファーストフォールティング・ベクトル・ロード命令および少なくとも１つの非フォールティング・ベクトル・ロード命令を含む。ステップ２５６で、ループアンローラは次いで、ソースループが展開ループで置き換えられた、処理回路が処理するための命令を出力する。
【００８４】
いくつかのループ展開方法では、図６と図１５の技法を組み合わせて、図１５に示す第１／第２のタイプの命令と、少なくとも第２のタイプの命令がイミディエート値を使用してオフセットを指定するオプションとの両方を使用することができることが理解されるであろう。他のループ展開方法では、図６および図１５に示す技術のうちの１つだけまたは他のものを使用することもできる。
【００８５】
図１６に、使用可能な仮想マシンの実装形態を示す。前述の実施形態は、関連した技法をサポートする特定の処理ハードウェアを動作させるための装置および方法として本発明を実施するが、ハードウェアデバイスのいわゆる仮想マシン実装形態を提供することも可能である。これらの仮想マシン実装形態は、仮想マシンプログラム５１０をサポートするホスト・オペレーティング・システム５２０を動作させるホストプロセッサ５３０上で動作する。通常、妥当な速度で実行される仮想マシン実装形態を提供するには大規模で高性能なプロセッサが必要であるが、互換性や再利用のために別のプロセッサにネイティブなコードを実行したいという要望がある場合など、いくつかの状況ではそのような手法が正当化され得る。仮想マシンプログラム５１０はアプリケーションプログラム５００に、仮想マシンプログラム５１０によってモデル化されているデバイスである実際のハードウェアによって提供されるはずのアプリケーション・プログラム・インターフェースと同じアプリケーション・プログラム・インターフェースを提供する。よって、上述したメモリアクセスの制御を含むプログラム命令は、仮想マシンハードウェアとのインタラクションをモデル化する仮想マシンプログラム５１０を使用して、アプリケーションプログラム５００内から実行することができる。
【００８６】
要約すると、第１および第２のタイプのベクトルロード命令を命令セットアーキテクチャにおいて定義することができる。第１のタイプの命令については、所定の順序におけるターゲット・ベクトル・レジスタの最初のアクティブデータ要素のために行われたロード操作について例外条件が検出されると応答アクションがトリガされるが、例外条件が、最初のアクティブ要素以外のアクティブデータ要素のために行われたロード操作で発生した場合には応答アクションは抑制され、その場合には、例外条件が検出されたアクティブデータ要素を識別する要素識別情報が格納される。第２のタイプの命令については、応答アクションは抑制され、ターゲット・ベクトル・レジスタの任意のアクティブ要素のために行われたロード操作で例外条件が検出された場合に格納された要素識別情報。
【００８７】
この手法は、ベクトル化されたコードの性能を改善するための２つの技法、すなわち、ループ展開（１つのループの複数反復を結合して展開ループの１回反復にする）と、ループスペキュレーション（少なくとも１つのアクティブデータ要素のためのロード操作を、そのロード動作が実際に行われるべきかどうか判定するための関連条件が解決される前に行うことができる）とを併用することを可能にするため、性能を改善するのに役立つ。対照的に、命令の以前の形式では、ループ展開とループスペキュレーションの両方を使用することは困難であったろう。第１のタイプに加えて第２のタイプのベクトルロード命令を提供することによって、展開ループにおいて、展開ループの最初のロード命令以外の命令によって処理される要素が、ループ停止条件が解決される前に投機的に処理される場合に、第２のタイプの命令を使用してそれらの要素によって偽の例外処理応答アクションがトリガされるのを防止することができる。
【００８８】
一般に、ベクトルロード命令は、どの要素がアクティブか非アクティブかを指示するマスク（または述語）を有し得る。第１または第２のタイプの命令の実行に続いて、少なくとも１つのさらなる命令を実行して、要素識別情報に基づいて、第１のタイプのベクトルロード命令を実行する後続の試行のための新しいマスクおよび新しいアドレスのうちの少なくとも１つを生成することができる。新しいマスクが生成される場合には、例外条件をトリガした所与のデータ要素が今度は最初のアクティブ要素であるように生成することができるが、新しいアドレスが生成される場合には、新しいアドレスは、例外条件をトリガした所与のデータ要素によって前にロード／格納されたアドレスに対応するよう設定することができる。そして、フォールト要素が今度は最初のアクティブ要素であるため、新しいマスクまたはアドレスを使用して第１のタイプのベクトルロード命令が繰り返されると、フォールトが引き続き発生した場合には、応答アクションをトリガして例外条件を解決することができる。
【００８９】
要素識別情報は、様々な方法で設定することができる。例えば、要素識別情報は、単に例外条件を引き起こした所与のデータ要素の識別子とすることもできる。
【００９０】
しかし、有用な手法は、データが転送されている少なくとも１つのベクトルレジスタの各要素に対応するいくつかの指示によって要素識別マスクを設定することである。例外条件が検出された要素および所定の順序における任意の後続の要素に対応する指示を第１の値（例えば０）に設定し、（存在する場合）その順序における前の要素に対応する指示を第２の値（例えば１）に設定することができる。要素識別マスクをこの方法で定義すれば、要素識別マスクを、どの要素がアクティブかを決定する述語（マスク）と組み合わせることがより簡単になるため、有用である。
【００９１】
一般に、どの要素が最初のアクティブ要素とみなされるかは、要素の任意の順序に従って決定することができる。例えば、所定の順序は、ベクトルの最下位要素から最上位要素までに及ぶ場合もあり、その逆もあり得る。しかし、実際には多くの場合、ベクトルは最下位要素に配置された最も小さいアドレスからのデータと、最上位要素に配置された最も大きいアドレスからのデータが格納される傾向があり、ほとんどのプログラマ／コンパイラは、最も小さいアドレスから最も大きいアドレスまでを反復するループを書く傾向がある。したがって、所定の順序が最下位要素から最上位要素までに及ぶ場合、これは多くの場合、ベクトル化されたコードが書かれる方法に最もよくマップすることになる。したがって、いくつかの例では、最初のアクティブ要素を、レジスタの最下位アクティブデータ要素とすることができる。
【００９２】
上述した第１および第２のタイプのベクトルロード命令は、連続ベクトルロード（ロード／ストアされる各データ要素に対応するアドレスが連続している場合）と不連続（スキャッタ／ギャザー）形式のベクトルロード（各データ要素のアドレスは不連続であり、アドレスベクトルによって指定される）の両方に使用することができる。
【００９３】
しかし、連続したタイプのベクトルロードには、少なくとも第２のタイプのベクトルロード命令が、基底レジスタおよびロードされる連続したアドレスブロックのサイズの倍数として表現されたイミディエートオフセット値を使用してロードされる連続したアドレスブロックの開始アドレスを指定することが有用となり得る。第１のタイプのベクトルロード命令もこの方法で定義することができ、そうである場合、それらは、それらの演算コードによって、またはイミディエートオフセット値が第１のタイプにはゼロであり、もしくは第２のタイプには非ゼロであるかによって区別することができる。
【００９４】
他の例では、第２のタイプのベクトルロード命令はそのオフセットをイミディエート値として指定できるが、第１のタイプは、アクセスされる連続したアドレスブロックの開始アドレスを形成するために基底アドレスに加算されるオフセット値を格納したオフセット（インデックス）レジスタを指定することができる。したがって、命令のアドレッシングモードを使用して、フォールティング挙動のタイプを区別することができる。この手法は、デフォルトで０の値に対応する所定のゼロレジスタ指定子を提供するシステムにおいては、これにより第１のタイプの命令は、ゼロオフセットを格納するための汎用レジスタを浪費する必要なしに、インデックスレジスタ参照でゼロオフセットを定義することが可能になるから、特に有用である。
【００９５】
データ要素について検出される例外条件は、ある種の異常な結果または何らかのエラーを知らせる任意の条件であってもよい。しかし、第１／第２の形式の命令は、例外条件がアドレス変換フォールトまたはメモリ許可フォールトを含む場合に特に有用であり得る。応答アクションは様々とすることができ、例外処理ルーチンの実行をトリガすること、および／または例外条件が発生したことを指示するステータス情報を設定することが含まれ得る。
【００９６】
以下の条項においてさらなる例示的な構成を定義する。
（１）装置であって、
ベクトルロード命令に応答して、データストアから少なくとも１つのベクトルレジスタの複数の要素にデータをロードするためのロード操作を行う処理回路、
を含み、
第１のタイプのベクトルロード命令に応答して、所定の順序における前記少なくとも１つのベクトルレジスタの最初のアクティブデータ要素のために行われたロード操作について例外条件が検出された場合、処理回路は応答アクションを行うように構成され、前記所定の順序における前記最初のアクティブデータ要素以外のアクティブデータ要素のために行われたロード操作について例外条件が検出された場合、処理回路は、前記応答アクションを抑制し、例外条件が検出されたアクティブデータ要素を識別する要素識別情報を格納するように構成され、
第２のタイプのベクトルロード命令に応答して、前記少なくとも１つのベクトルレジスタの任意のアクティブデータ要素のためのロード操作について前記例外条件が検出された場合、処理回路は、前記応答アクションを抑制し、例外条件が検出されたアクティブデータ要素を識別する要素識別情報を格納するように構成される、
装置。
【００９７】
（２）第１のタイプまたは第２のタイプのベクトルロード命令に応答して、ロード操作が少なくとも１つのアクティブデータ要素のために行われるべきかどうかを判定するための関連条件が解決される前に、処理回路が、前記少なくとも１つのベクトルレジスタの少なくとも１つのアクティブデータ要素のためにロード操作を行うように構成される、条項（１）の装置。
【００９８】
（３）ベクトルロード命令が、前記少なくとも１つのベクトルレジスタのうちのどのデータ要素がアクティブデータ要素であるか指示するマスクを識別する、任意の先行する条項の装置。
【００９９】
（４）処理回路が、少なくとも１つのさらなる命令に応答して、要素識別情報に基づいて、第１のタイプのベクトルロード命令を実行する後続の試行のために、新しいマスクおよび新しいアドレスのうちの少なくとも１つを生成する、条項（３）の装置。
【０１００】
（５）要素識別情報が、各々が少なくとも１つのベクトルレジスタのデータ要素のうちの１つに対応する複数の指示を含む要素識別マスクを含み、例外条件が検出されたアクティブデータ要素および所定の順序における任意の後続のアクティブデータ要素に対応する指示は第１の値を有し、例外条件が検出された前記アクティブデータ要素よりも所定の順序において前の任意のデータ要素に対応する指示は第２の値を有する、任意の先行する条項の装置。
【０１０１】
（６）所定の順序における最初のアクティブデータ要素は、少なくとも１つのベクトルレジスタの最下位のアクティブデータ要素を含む、任意の先行する条項の装置。
【０１０２】
（７）ベクトルロード命令は連続したアドレスブロックを識別し、少なくとも１つのベクトルレジスタのそれぞれのデータ要素について、ロード操作は、連続したアドレスブロックのそれぞれの部分に対応するデータストア内の記憶場所からそのデータ要素にデータをロードすることを含む、任意の先行する条項の装置。
【０１０３】
（８）第２のタイプのベクトルデータ転送命令は、基底レジスタおよびイミディエートオフセット値を指定し、
第２のタイプのベクトルロード命令に応答して、処理回路は、基底レジスタに格納された基底アドレスを、イミディエートオフセット値と前記連続したアドレスブロックのサイズに対応する乗数との積に加算した結果に等しい値によって連続したアドレスブロックの開始アドレスを決定するように構成される、
条項（７）の装置。
【０１０４】
（９）第１のタイプのベクトルロード命令は、基底レジスタおよびオフセットレジスタを指定し、
第１のタイプのベクトルロード命令に応答して、処理回路は、基底レジスタに格納された基底アドレスを、オフセットレジスタに格納された値に基づいて決定されたオフセット値に加算した結果に等しい値によって連続したアドレスブロックの開始アドレスを決定するように構成される、
条項（７）および（８）のいずれかの装置。
【０１０５】
（１０）第１のタイプのベクトルロード命令が所定のレジスタをオフセットレジスタとして指定した場合、処理回路はオフセット値をゼロとして決定するように構成される、条項（９）の装置。
【０１０６】
（１１）第１のタイプのベクトルデータ命令と第２のタイプのベクトルデータ命令はどちらも、基底レジスタおよびイミディエートオフセット値を指定し、
第１のタイプまたは第２のタイプのベクトルロード命令に応答して、処理回路は、基底レジスタに格納された基底アドレスを、イミディエートオフセット値と前記連続したアドレスブロックのサイズに対応する乗数との積に加算した結果に等しい値によって連続したアドレスブロックの開始アドレスを決定するように構成され、
第１のタイプのベクトルロード命令については、イミディエートオフセット値はゼロであり、
第２のタイプのベクトルロード命令については、イミディエートオフセット値は非ゼロである、
条項（７）および（８）のいずれかの装置。
【０１０７】
（１２）例外条件は、アドレス変換フォールトまたはメモリ許可フォールトを含む、任意の先行する条項の装置。
【０１０８】
（１３）応答アクションは、例外処理ルーチンの実行をトリガすることを含む、任意の先行する条項の装置。
【０１０９】
（１４）データ処理方法であって、
ベクトルロード命令に応答して、データストアから、少なくとも１つのベクトルレジスタの複数の要素にデータをロードするためのロード操作を行うステップと、
ベクトルロード命令が第１のタイプのものであり、かつ、所定の順序における前記少なくとも１つのベクトルレジスタの最初のアクティブデータ要素のために行われたロード操作について例外条件が検出された場合、応答アクションを行うステップと、
ベクトルロード命令が第１のタイプのものであり、かつ、前記所定の順序における前記最初のアクティブデータ要素以外のアクティブデータ要素のために行われたロード操作について例外条件が検出された場合、前記応答アクションを抑制し、例外条件が検出されたアクティブデータ要素を識別する要素識別情報を格納するステップと、
ベクトルロード命令が第２のタイプのものであり、かつ、前記少なくとも１つのベクトルレジスタの任意のアクティブデータ要素のためのロード操作について例外条件が検出された場合、前記応答アクションを抑制し、例外条件が検出されたアクティブデータ要素を識別する要素識別情報を格納するステップと、
を含むデータ処理方法。
【０１１０】
（１５）装置であって、
ベクトルロード命令に応答して、データストアから、少なくとも１つのベクトルレジスタの複数の要素にデータをロードするためのロード操作を行うための手段を含み、
第１のタイプのベクトルロード命令に応答して、所定の順序における前記少なくとも１つのベクトルレジスタの最初のアクティブデータ要素のために行われたロード操作について例外条件が検出された場合、行うための手段は応答アクションを行うように構成され、前記所定の順序における前記最初のアクティブデータ要素以外のアクティブデータ要素のために行われたロード操作について例外条件が検出された場合、行うための手段は、前記応答アクションを抑制し、例外条件が検出されたアクティブデータ要素を識別する要素識別情報を格納するように構成され、
第２のタイプのベクトルロード命令に応答して、前記少なくとも１つのベクトルレジスタの任意のアクティブデータ要素のためのロード操作について前記例外条件が検出された場合、行うための手段は、前記応答アクションを抑制し、例外条件が検出されたアクティブデータ要素を識別する要素識別情報を格納するように構成される
装置。
【０１１１】
（１６）条項（１）〜（１３）のいずれかの装置に対応する仮想マシン実行環境を提供するようコンピュータを制御するためのコンピュータプログラム。
【０１１２】
（１７）ソースプログラムに基づいて、処理回路による処理のための命令を生成するコンピュータ実装方法であって、
各反復が、処理回路をトリガしてデータストアから少なくとも１つのベクトルレジスタの複数のデータ要素にデータをロードするロード操作を行わせるための第１のタイプのベクトルロード命令を含む、複数の反復を含むソースループを、ソースプログラム内で検出するステップであって、第１のタイプのベクトルロード命令は、所定の順序における前記少なくとも１つのベクトルレジスタの最初のアクティブデータ要素のために行われたロード操作について処理回路によって例外条件が検出された場合、処理回路は応答アクションを行うべきであり、前記所定の順序における前記最初のアクティブデータ要素以外のアクティブデータ要素のために行われたロード操作について例外条件が検出された場合、処理回路は前記応答アクションを抑制し、例外条件が検出されたアクティブデータ要素を識別する要素識別情報を格納すべきである、と指示するエンコーディングを有する、検出するステップと、
ソースループを検出したことに応答して、ソースループよりも少ない反復を含む展開ループのための命令を生成するステップであって、展開ループの各反復は、ソースループの少なくとも２回の反復に対応し、
前記第１のタイプのベクトルロード命令と、
前記少なくとも１つのベクトルレジスタの任意のアクティブデータ要素のために行われたロード操作について例外条件が検出された場合、処理回路は前記応答アクションを抑制し、例外条件が検出されたアクティブデータ要素を識別する要素識別情報を格納すべきである、と指示するエンコーディングを有する第２のタイプの少なくとも１つのベクトルロード命令と、
を含む、生成するステップと、
を含む方法。
【０１１３】
（１８）条項（１７）の方法を行うように構成されたデータ処理装置。
【０１１４】
（１９）前記方法に従って生成された命令を実行するように構成された前記処理回路を含む、条項（１８）のデータ処理装置。
【０１１５】
（２０）条項（１７）の方法を行うようコンピュータを制御するための命令を含むコンピュータプログラム。
【０１１６】
（２１）条項（２０）のコンピュータプログラムを格納する記憶媒体。
【０１１７】
（２２）ソースプログラムに基づいて、処理回路による処理のための命令を生成するコンピュータ実装方法であって、
複数の反復を含むソースループをソースプログラム内で検出するステップであって、ソースループの各反復は、少なくとも１つのベクトルレジスタの複数のデータ要素と、ベクトルデータ転送命令によって識別された開始アドレスおよび所与のブロックサイズを有する連続したアドレスブロックに対応するデータストア内の記憶場所との間でデータを転送するためのベクトルデータ転送命令を含み、ソースループの所与の反復のための連続したアドレスブロックは後続の反復のための連続したアドレスブロックと連続している、検出するステップと、
ソースループを検出したことに応答して、ソースループよりも少ない反復を含む展開ループのための命令を生成するステップであって、展開ループの各反復は、ソースループの少なくとも２回の反復に対応し、
ソースループの前記少なくとも２回の反復のうちの選択された反復のベクトルデータ転送命令によって指定された開始アドレスを格納するための基底レジスタを指定する参照ベクトルデータ転送命令と、
前記基底レジスタ、および、所与のブロックサイズの倍数として、基底レジスタに格納された開始アドレスと、ソースループの前記少なくとも２回の反復のうちの残りの反復のベクトルデータ転送命令によって識別された開始アドレスとの差を指定するイミディエートオフセット値を指定する、少なくとも１つのさらなるベクトルデータアクセス命令と、
を含む、生成するステップと、
を含む方法。
【０１１８】
（２３）条項（２２）の方法を行うように構成されたデータ処理装置。
【０１１９】
（２４）前記方法に従って生成された命令を実行するように構成された前記処理回路を含む、条項（２３）のデータ処理装置。
【０１２０】
（２５）条項（２２）の方法を行うようコンピュータを制御するための命令を含むコンピュータプログラム。
【０１２１】
（２６）条項（２５）のコンピュータプログラムを格納する記憶媒体。
【０１２２】
本出願において、「〜するように構成された」という表現は、装置の要素が定義された動作を実行することができる構成を有することを意味するために使用されている。この文脈において、「構成」は、ハードウェアまたはソフトウェアの相互接続の配置または方法を意味する。例えば、定義された動作を提供する専用のハードウェアを装置が有していてもよく、プロセッサまたは他の処理装置が機能を果たすようにプログラムされてもよい。「〜するように構成された」は、定義された動作を提供するために装置要素をいずれかの方法で変更する必要があることを意味しない。
【０１２３】
以上、添付図面を参照して本発明の例示的な実施形態を本明細書で詳細に説明したが、本発明はこれらの厳密な実施形態だけに限定されず、添付の特許請求の範囲によって定義される本発明の範囲および精神から逸脱することなく、様々な変更および修正が当業者によって実施され得ることを理解されたい。
【図１】
2018530830.tif 000003
【図２】
2018530830.tif 000004
【図３】
2018530830.tif 000005
【図４】
2018530830.tif 000006
【図５】
2018530830.tif 000007
【図６】
2018530830.tif 000008
【図７】
2018530830.tif 000009
【図８】
2018530830.tif 000010
【図９】
2018530830.tif 000011
【図１０】
2018530830.tif 000012
【図１１】
2018530830.tif 000013
【図１２】
2018530830.tif 000014
【図１３】
2018530830.tif 000015
【図１４】
2018530830.tif 000016
【図１５】
2018530830.tif 000017
【図１６】
2018530830.tif 000018
【国際調査報告】
2018530830.tif 000019
2018530830.tif 000020
2018530830.tif 000021