(57)【要約】  いくつかの実施例によれば、ｎ個のエントリを有するハードウェア・スタックにプッシュされる新しい値を決定することが判断される。スタック中の各エントリは、データ部および関連するカウンタを含む。新しい値がスタック・ポインタの現在のトップに関連するエントリのデータ部と等しい場合、そのエントリに関連するカウンタが増分される。新しい値がスタック・ポインタの現在のトップに関連するデータ部と等しくない場合、その新しい値は、次のエントリのデータ部に格納され、スタック・ポインタの現在のトップは前進する。
2008524721.tif 000002
【特許請求の範囲】
【請求項１】
ｎ個のエントリを有するハードウェア・スタックにプッシュされる新しい値を決定する段階であって、ｎは１より大きい整数であり、各エントリはデータ部および関連するカウンタを含む、段階と、
前記新しい値がスタック・ポインタの現在のトップに関連する前記エントリの前記データ部と等しい場合、そのエントリに関連する前記カウンタを増分する段階と、
前記新しい値がスタック・ポインタの前記現在のトップに関連する前記データ部に等しくない場合、前記新しい値を次のエントリのデータ部に格納し、スタック・ポインタの前記現在のトップを増分する段階と、
を含むことを特徴とする方法。
【請求項２】
前記新しい値がスタック・ポインタの前記現在のトップに関連する前記データ部と等しい場合、前記カウンタは、１だけ増分されることを特徴とする請求項１記載の方法。
【請求項３】
前記新しい値がスタック・ポインタの前記現在のトップに関連する前記データ部に等しくない場合、スタック・ポインタの前記現在のトップは、１だけ増分されることを特徴とする請求項１記載の方法。
【請求項４】
前記新しい値は、１組のｎ個の可能値から選択されることを特徴とする請求項１記載の方法。
【請求項５】
前記データ部は、ｎビット幅であることを特徴とする請求項４記載の方法。
【請求項６】
前記新しい値は、スタック・ポインタの前記現在のトップに関連する前記データ部に格納された前記値以外の前記ハードウェアにプッシュされた先の値と等しくすることができないことを特徴とする請求項５記載の方法。
【請求項７】
前記ハードウェア・スタックにプッシュされた値中のビットは、（ｉ）前記ハードウェア・スタックにプッシュされた直近の値と比較すると０から１へ変化できるが、１から０へ変化できない、あるいは、（ｉｉ）前記ハードウェア・スタックにプッシュされた直近の値と比較すると１から０へ変化できるが、０から１へ変化できないことを特徴とする請求項６記載の方法。
【請求項８】
前記ハードウェア・スタックにプッシュされる第２の値を決定する段階と、
第２の値は、スタック・ポインタの前記現在のトップに関連する前記エントリの前記データ部と等しいことを決定する段階と、
スタック・ポインタの前記現在のトップに関連するその前記カウンタは、最大値に等しいことを決定する段階と、
前記第２の値を次のエントリのデータ部に格納し、前記次のエントリに関連するカウンタを増分するかあるいは初期化し、スタック・ポインタの前記現在のトップを増分する段階と、
をさらに含むことを特徴とする請求項１記載の方法。
【請求項９】
前記ハードウェア・スタックから値を取り出すことを決定する段階と、
スタック・ポインタの前記現在のトップに関連する前記データ部に格納された前記値を引き出す段階と、
スタック・ポインタの前記現在のトップに関連する前記カウンタを減分する段階と、
をさらに含むことを特徴とする請求項１記載の方法。
【請求項１０】
スタック・ポインタの前記現在のトップに関連する前記カウンタが最小値と等しいことを決定する段階と、
スタック・ポインタの前記現在のトップを減分する段階と、
をさらに含むことを特徴とする請求項９記載の方法。
【請求項１１】
前記ハードウェア・スタックは、ｎチャネル単一命令の多重データ実行エンジンのループ・スタックと関連していることを特徴とする請求項１記載の方法。
【請求項１２】
前記新しい値は、多重データ・オペランドに基づくループ命令の評価に関連していることを特徴とする請求項１１記載の方法。
【請求項１３】
前記ハードウェア・スタックは、ｎチャネル単一命令の多重データ実行エンジンの条件付きスタックに関連していることを特徴とする請求項１記載の方法。
【請求項１４】
前記新しい値は、多重データ・オペランドに基づく条件付き命令の評価に関連していることを特徴とする請求項１３記載の方法。
【請求項１５】
ｎ個のデータ・レジスタを有する後入れ先出しハードウェア・スタックであって、ｎは１より大きい整数である、後入れ先出しハードウェア・スタックと、
ｎ個のカウンタ・レジスタであって、各カウンタ・レジスタは、前記データ・レジスタの１つに関連する、ｎ個のカウンタ・レジスタと、
スタック・ポインタ・レジスタのトップと、
を含むことを特徴とする装置。
【請求項１６】
前記ハードウェア・スタックは、ｎチャネル単一命令の多重データ実行エンジンと関連していることを特徴とする請求項１５記載の装置。
【請求項１７】
ｎビットのループ・マスク・ベクトルをさらに含み、前記ループ・マスク・ベクトルは、前記実行エンジンの多重チャネルのためにループ命令に関連するループ情報を格納する、
ことを特徴とする請求項１６記載の装置。
【請求項１８】
ｎビットの条件付きマスク・ベクトルをさらに含み、前記条件付きマスク・ベクトルは、（ｉ）ＩＦ命令条件、および、（ｉｉ）前記実行エンジンの多重チャネルに関連するデータ、の評価の結果を格納する、
ことを特徴とする請求項１６記載の装置。
【請求項１９】
命令をその上に格納した格納媒体を含む物品であって、マシンによって前記命令は、
ｎ個のエントリを有するハードウェア・スタックにプッシュされる値を決定する段階であって、ｎは１より大きい整数であり、各エントリは、ｎビットのデータ部、および、関連するカウンタを含む、段階と、
前記値がスタック・ポインタに関連する前記エントリの前記データ部と同じである場合、前記エントリに関連する前記カウンタを１だけ増分する段階と、
前記値が前記スタック・ポインタに関連する前記データ部と同じでない場合、次のエントリのデータ部に前記値を格納し、前記スタック・ポインタを１だけ増分する段階と、
を実行することを特徴とする物品。
【請求項２０】
前記命令は、
前記ハードウェア・スタックから値を取り出すことを決定する段階と、
前記スタック・ポインタに関連する前記データ部に格納された前記値を取り出す段階と、
前記スタック・ポインタに関連する前記カウンタを１だけ減分する段階と、
をさらに実行することを特徴とする請求項１９記載の物品。
【請求項２１】
前記命令は、
前記スタック・ポインタに関連する前記カウンタが０であることを決定する段階と、
前記スタック・ポインタを１だけ減分する段階と、
をさらに実行することを特徴とする請求項１９記載の物品。
【請求項２２】
ｎチャネル単一命令の多重データ実行エンジンであって、ｎは１より大きい整数である、多重データ実行エンジンと、
後入れ先出しハードウェア・スタックであって、
ｎ個のデータ・レジスタ、
ｎ個のカウンタ・レジスタであって、各カウンタ・レジスタは、前記データ・レジスタの１つに関連する、ｎ個のカウンタ・レジスタ、および、
スタック・ポインタ・レジスタのトップ、からなる後入れ先出しハードウェア・スタックと、
グラフィック・メモリ・ユニットと、
を含むことを特徴とするシステム。
【請求項２３】
ｎビットのループ・マスク・ベクトルをさらに含み、前記ループ・マスク・ベクトルは、前記実行エンジンの多重チャネルのためにループ命令に関連するループ情報を格納することである、
ことを特徴とする請求項２２記載のシステム。
【請求項２４】
ｎビットの条件付きマスク・ベクトルをさらに含み、前記条件付きマスク・ベクトルは、（ｉ）ＩＦ命令条件、および（、ｉｉ）前記実行エンジンの多重チャネルに関連するデータ、の評価の結果を格納する、
ことを特徴とする請求項２２記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＤＡＴＡ部および関連するカウンタを備えるエントリを有するハードウェア・スタックに関する。
【背景技術】
【０００２】
情報は、「スタック」と呼ばれる格納エリアまたはデータ・バッファに加えられ、あるいはそこから取り出すことができる。後入れ先出し（ＬＩＦＯ）スタックの場合、各値がそのスタックに加えられた（「プッシュされた」）順に基づいて取り出され（「ポップされ」）、最新のプッシュされた値は次にポップされる値となる。このタイプのスタックは、より新しい値がより古い値を押し下げる値のリストと考えることができ、その値はそのリストのトップから取り出される。
【０００３】
ランダム・アクセス・メモリ（ＲＡＭ）ユニットおよび／またはハードウェア・レジスタに各値を格納することにより、このようなスタックを実行することができる。しかしながら、スタックに多くの値を格納する必要があるとき、必要とされるＲＡＭの量および／またはハードウェア・レジスタの数は、非実用的となることがある。
【発明の開示】
【０００４】
図１はハードウェア・スタック１００のブロック図である。特に、スタック１００は、データ・エントリをサポートすることができるデータ格納領域１１０を含む（例えば、ｅまで、個別の値がスタック１００に一度に格納することができる）。スタック１００は、またそのスタックにプッシュする直近の値を格納しているエントリを示すスタック・ポインタのトップ（ＴＯＳ）１５０を含む。
【０００５】
図１に示されたスタック１００では、ＴＯＳポインタ１５０は、エントリ２に格納された値「１１１０」が直近に加えられたことを示す。データがスタック１００から取り出される場合、値「１１１０」が出力され、ＴＯＳポインタは１へ減じられる（減分する）であろう。図１に示されるスタック１００に、新しい値が加えられる場合、新しい値がエントリ３に格納され、ＴＯＳポインタ１５０は３へ増やされる（増分する）であろう。
【０００６】
データ格納領域１１０は、例えば、ＲＡＭユニットおよび／またはハードウェア・レジスタを使用して、実行される。しかしながら、スタック１００に多くの値を格納する必要があるとき、ＲＡＭの量および／またはハードウェア・レジスタの数は、非実用的になるであろう。
【０００７】
図２は、いくつかの実施例によるハードウェア・スタック２００のブロック図である。この場合、スタック２００は、ｎ個のエントリ（ｎは１より大きい整数）を備えるＬＩＦＯバッファである。スタック２００中の各エントリは、データ部２１０および関連するカウンタ２２０を含む。カウンタ２２０は、データ部２１０の値がそのスタックに何回繰り返しプッシュされたかを示す。スタック２００は、さらにＴＯＳポインタ２５０を含む。データ部２１０、カウンタ２２０および／またはＴＯＳポインタ２５０のいずれかは、例えばＲＡＭユニット中で、またはハードウェア・レジスタで実行される。いくつかの実施例によるスタック２００の動作は、図３〜図１０に関して説明されるであろう。
【０００８】
図３は、データを、いくつかの実施例によるハードウェア・スタックにプッシュする方法のフローチャートである。図３の方法は、例えば図２に示されたスタック２００に関して使用することができる。ここに説明されたフローチャートは、必ずしも固定された動作順を意味するものではなく、本実施例は、実行可能なあらゆる順で行なうことができる。ここに説明された方法のいずれもがハードウェア、ソフトウェア（マイクロコードを含む）、ファームウェア、またはこれらの試みの任意の組合せによって達成できることに注意すること。例えば、格納媒体はその上に命令を格納し、実行されると、マシンはここに説明された実施例の能力を発揮する結果となる。
【０００９】
３０２で、スタック２００にプッシュされる新しい値が決定される。その新しい値は、ＴＯＳポインタ２５０によって参照されるエントリのデータ部２１０に現在格納されている値に等しい場合、そのエントリに関連するカウンタ２２０は、３０６で増分される。
【００１０】
スタック２００にプッシュされる新しい値が、ＴＯＳポインタ２５０によって参照されるエントリのデータ部２１０に現在格納されている値と等しくない場合、新しい値は、３０８でスタックの次のエントリに格納される。さらに、ＴＯＳポインタ２５０は、３１０で増分される。
【００１１】
次のエントリに関連するカウンタ２２０は、３１２で増やされてもよい（これは、すべてのカウンタ２２０が初期化プロセス中に０に設定されたと仮定する）。別のアプローチとして、カウンタ２２０は、３１２で単に１に設定されてもよい。このアプローチは、もっぱら記述を明瞭にするためにここに説明されたいくつかの実施例に含められる。この時点でカウンタ２２０を増分させる（あるいは、それを１に設定する）ことによって、カウンタ２２０に格納された数は、データ部２１０中の関連する値が繰り返された回数に等しくなるであろう。３１２で行なわれた動作なしに（すべてのカウンタが初期化プロセス中に０に設定されたと仮定して）、カウンタ２２０に格納された数は、データ部２１０中の関連する値が繰り返された回数を１マイナスした値と等しくなるであろう。
【００１２】
カウンタ２２０が関連する値が繰り返された回数を示すとき、最初のカウンタがゼロに等しいスタック２００は、そのスタック２００が空であることを意味する。カウンタ２００が関連する値が繰り返された回数を１マイナスした値に等しい場合、空のスタックは、例えば、「空スタック」レジスタ・ビットによって信号が送られてもよい。別の実施例に従えば、そのスタックが空であることを示すために最初のカウンタ２２０に「−１」を格納してもよい。
【００１３】
さて、図４を参照すると、最初の２つのエントリ中に値を有するスタック２００を示す。特に、（エントリ０のカウンタ２２０によって示されるように）「１１１０」が続けて３回スタック２００にプッシュされ、次に、「１０１０」がスタック２００に一度プッシュされる。たとえ４回のプッシュがスタック２００になされても、２つのエントリだけが使用されることに注意（すなわち、「１１１０」が３回および「１０１０」が１回）。さらに、新しい値（「１０１０」）がスタック２００にプッシュされようとしている。この新しい値は、スタックのトップであるエントリ（エントリ１）に現在格納されている値に等しいので、図５に示されるように、そのエントリに関連するカウンタ２２０は、１から２に増やされる。この場合、新しい値はスタック２００にプッシュされた最後の値の「繰り返し」である。
【００１４】
図５では、別の新しい値（「００１０」）がスタック２００にプッシュされるところである。この新しい値は、スタックのトップであるエントリ（エントリ１）に現在格納されている値と等しくないので、その値は次のエントリ（エントリ２）に格納され、次のエントリに関連するカウンタ２２０は、０から１へ増やされるとともに、図６に示されるように、ＴＯＳポインタ２５０は１から２に増加する。
【００１５】
図７は、いくつかの実施例によるハードウェア・スタック２００からデータを取り出す（ポップする）方法のフローチャートである。７０２で、ＴＯＳポインタ２５０によって参照されるデータ部２１０に格納された値がポップされる。その後、そのエントリに関連するカウンタ２２０は、７０４で減少する。７０６でそのカウンタ２１０が０に等しくない場合、ＴＯＳポインタ２５０の現在値は７０８で維持される。そのカウンタ２１０が０に等しい場合、ＴＯＳポインタ２５０が減じられる。例えば、カウンタ２２０に格納された数がデータ部２１０中の関連する値が繰り返された回数に等しいとき、このアプローチは適切なことがある。カウンタ２２０に格納された数がその関連する値が繰り返された回数マイナス１に等しいとき、ＴＯＳポインタ２５０は、カウンタ２２０を減らすことによってアンダーフローを生じさせる場合に、減じられる。
【００１６】
例えば、図８を参照して、最初の３つのエントリに値を現在格納しているスタック２００を示す。特に、（エントリ０のカウンタ２２０によって示されるように）「１１１１」がスタック２００に続けて二回プッシュされ、「１０１０」がスタック２００に続けて二回プッシュされ、次に、「００１０」がスタック２００に一度プッシュされる。さらに、スタック２００から値がポップされようとしている。
【００１７】
ポップを実行するために、ＴＯＳポインタ２５０によって参照されるエントリのデータ部２１０に格納された値が出力される（「００１０」）。さらに、そのエントリに関連するカウンタ２２０は、１から０に減じられる。カウンタ２２０が今０であるので、図９に示されるように、ＴＯＳポインタ２５０は２から１に減じられる。この場合、このポップに関連するエントリは「空」になる。
【００１８】
図９では、別のポップが実行されるところである。それを行なうために、ＴＯＳポインタ２５０によって参照されるエントリのデータ部２１０に格納された値が出力される（「１０１０」）。さらに、そのエントリに関連するカウンタ２２０は、２から１に減じられる。カウンタ２２０は０でないので、ＴＯＳポインタ２５０は、図１０に示されるように、変更されない。この場合、このポップに関連するエントリはまだ空ではない。
【００１９】
このようなスタック２００は、例えば、スタックに格納される値が頻繁に繰り返されると予測される場合、有用なことがある。例えば、１０００個の値を格納し、その値の９０％が最後に格納された値の繰り返しであるスタックを必要とする実行を考慮する（１０００個の値または「オーバフロー」の後のあらゆる値は別の構造で格納されてもよい）。従来のアプローチは、１０００個のハードウェアを必要とする一方で、ここに説明されたいくつかの実施例は２００個だけを用いて実行することができる（１００個のデータ部と１００個のカウンタ）。
【００２０】
このようなスタック２００は、例えば、スタック２００に格納することができる一組の可能な値が制限される場合、さらに有用となる。例えば、いくつかの実施例によるハードウェア・スタック１１００のブロック図である図１１を検討する。この場合、スタック１１００は、ｎ個のエントリ（ｎは１より大きい整数）を有する。スタック１１００中の各エントリは、ｎ’−ビット幅のデータ部１１１０（ｎ’はｎと等しくてもよく、異なる値であってもよいことに注目）、および、データ部１１１０の値が連続して何回スタックにプッシュされたかを示す関連するｍ−ビット幅のカウンタ１１２０を含む。スタック１１００は、さらにＴＯＳポインタ１１５０を含む。
【００２１】
さらに、（ｉ）スタック１１００にプッシュされる一組の可能な値がｎ個に制限されていること、および（ｉｉ）スタック１１００にプッシュされる新しい値は、最後の格納された値以外にスタック１１００にプッシュされた先の値と等しくないこと、を仮定する。例えば、スタック１１００にプッシュすることが可能であった一組の値が｛００００，０００１，００１０，０１００，１０００｝であった場合、その後次のシーケンス：
０１００，１０００，１０００，１０００，００１０
の後において、
００００または００１０だけがスタック１１００にプッシュすることが許可されるであろう（つまり、０１００と１０００は既にスタックに格納されるので）。００１０は、スタック１１００にプッシュされた最後の値と等しいので、許されることに注意すること。このような状況で、ＴＯＳポインタ１１５０は、ｎ−１より大きい値に達しないであろう。すなわち、スタック１１００は、新しい値が格納することができるエントリを使い果たさないであろう。
【００２２】
各カウンタ１１２０は、ｍビットの値を格納することに制限されていることに注意すること。例えば、４ビット・カウンタは、関連するデータ部１１１０が８回（図３の要素３１２に関して説明された動作が実行されるなら７回）繰り返されたことを単に記録することができるだけである。
【００２３】
図１２は、いくつかの実施例に従って、ハードウェア・スタック１１００にデータをプッシュする方法のフローチャートである。１２０２で、スタック１１００にプッシュされる新しい値が決定される。新しい値が、ＴＯＳポインタ１１５０によって参照されるエントリのデータ部１１１０に現在格納されている値と等しくない場合、その新しい値は、１２０６でスタックの次のエントリに格納される。さらに、１２０８でＴＯＳポインタ１１５０は増分される。この場合、図３の要素３１２に対応する動作が実行されていないことに注意すること。結果として、カウンタ１１２０に格納された数は、関連する値が繰り返された回数より１小さいであろう。
【００２４】
新しい値がＴＯＳポインタ１１５０によって参照されるエントリのデータ部１１１０に現在格納されている値と等しい場合、１２１２でそのエントリに関連するカウンタ１１２０が最大値であるかどうかが判断される（つまり、４ビット・カウンタの場合「１１１１」）。そうでない場合、カウンタ１１２０は、１２１４で単に増加される。カウンタ１１２０が最大値にある場合、要素１２０６，１２０８に関して説明された動作が実行される。
【００２５】
例えば、各エントリが１０ビットのデータ部１３１０および４ビットのカウンタを含む１０個のエントリを含むスタック１３００である図１３を検討する。スタック１３００は、さらにＴＯＳポインタ１３５０を含む。この場合、値「１１１００００１１１１」が連続して４回、続いて「１０１００００１１１」が連続して８回スタック１３００にプッシュされる。さらに、別の「１０１００００１１１」がスタック１３００にプッシュされるところである。
【００２６】
ＴＯＳでのカウンタ１３２０の値が最大値にあるので、「１０１００００１１１」は次のエントリで繰り返され、図１４に示されるように、ＴＯＳポインタ１３５０が増やされる。すなわち、新しい値は、あたかもスタック１３００にプッシュされた最終の値とは異なっているかのように扱われる。このように、スタック１３００は、カウンタ１３２０のサイズによってサポートされることを越えて繰り返されるシーケンスを扱うことができる。しかしながら、２個（またはより多くの）エントリが単一の値によって使用されているので、スタック１３００は、たとえ（ｉ）スタック１３００にプッシュすることができる一組の可能な値がｎに制限されていても、また（ｉｉ）新しい値が最後にプッシュされた値以外にスタック１３００にプッシュされた先の値に等しくなくても、エントリを使い果たすことが可能であることに注意すること。
【００２７】
ここに説明されるようなハードウェア・スタックが有用であるいくつかの環境が実施例によって説明される。これらの実施例は、他のタイプの環境においても使用できることに注意すること。
【００２８】
ここに説明されたいくつかの実施例は、「処理システム」に関連する。ここに使用されるように、フレーズ「処理システム」は、データを処理するあらゆる装置に関する。処理システムは、例えば、図形データおよび／または他のタイプの媒体情報を処理するグラフィック・エンジンに関係していてもよい。処理システムの他の例は、中央処理装置（ＣＰＵ）およびデジタル信号プロセサ（ＤＳＰ）を含む。
【００２９】
処理システムの性能を改善するために、命令は、単一の命令期間中に多重データ・オペランドに対して同時に実行することができる。このような命令は単一命令多重データ（ＳＩＭＤ）命令）と呼ばれる。例えば、８チャネルのＳＩＭＤ実行エンジンは、８個の３２ビットのデータ・オペランドに対して命令を同時に実行することができ、各オペランドは、（例えば、変換および／または三次元の幾何学的図形の描画を加速するための）ＳＩＭＤ実行エンジンの単一の演算チャネルにマップされる。
【００３０】
図１５は、ＳＩＭＤ実行エンジン１５１０を含む処理システム１５００の１つのタイプを示す。この場合、実行エンジン１５１０は、４個の要素データのベクトル（例えば、ＳＩＭＤ実行エンジン１５１０を対応するチャネル０〜３上で処理するために各々がビットを有し、レイアウトされたベクトル・コンポーネントＸ，Ｙ，Ｚ，Ｗ）と共に命令（例えば、命令メモリ・ユニットから）を受け取る。その後、エンジン１５１０は、ベクトル中のすべてのコンポーネントに対して命令を同時に実行する。このようなアプローチは、「水平」、「チャネル・パラレル」または「アレイ構造」の実行と呼ばれる。ここに説明されたいくつかの実施例は、４チャネルのＳＩＭＤ実行エンジン１５１０に関係しているが、ＳＩＭＤ実行エンジンは１より大きい任意の数のチャネルを有することができることに注意すること（例えば、実施例は３２のチャネル実行エンジンに関係する）。
【００３１】
図１６は、ＳＩＭＤ実行エンジン１６１０を含む別タイプの処理システム１６００を図示する。この場合、実行エンジン１６１０は、４つのデータ・オペランドと共に命令を受け取るが、各オペランドは異なるベクトルと関連する（つまり、ベクトル０からベクトル３の４つのＸコンポーネント）。その後、エンジン１６１０は、単一の命令期間中にすべてのオペランドに対して命令を同時に実行する。このようなアプローチは、「水平」、「チャネル・シリーズ」または「アレイ構造」の実行と呼ばれる。
【００３２】
いくつかの実施例によれば、ＳＩＭＤ命令は、１組の関連する命令が、例えば特定の回数あるいは特定の条件が満たされるまで、実行されるべきであることを示す「ループ」命令であってもよい。例えば、次の命令を検討する：
ＤＯ{
命令のシーケンス
}ＷＨＩＬＥ<条件>
ここで、命令のシーケンスは、「条件が真」である限り実行されるであろう。しかしながら、このような命令がＳＩＭＤ風に実行される場合、異なるチャネルは、異なる結果の<条件>テストを導くかもしれない。例えば、Ｖａｒｌが０でない限り、命令のシーケンスを実行すべきであるように命令のシーケンスを定義してもよい（また、命令のシーケンスがＶａｒｌを適切に操作してもよい）。この場合、Ｖａｒｌは１つのチャネルに対しては０であり、他のチャネルに対しては非０となってもよい。
【００３３】
図１７は、いくつかの実施例に従って４チャネルのＳＩＭＤ実行エンジン１７００を図示する。エンジン１７００は、４ビットのループ・マスク・レジスタ１７３０を含み、その各ビットは関連する演算チャネルに対応する。ループ・マスク・レジスタ１７３０は、例えば、エンジン１７００中のハードウェア・レジスタからなる。エンジン１７００は、さらに４ビットの広ループ・スタック１７１０を含む。ここに説明されたあらゆる実施例に従って、ループ・スタック１７１０は４つのエントリ深度があり、各エントリは、関連するループ・カウンタ１７２０を有する。ループ・スタック１７１０は、さらにループ・スタック・カウンタ・レジスタ１７４０、および、ループ・スタック・ポインタのトップ１７５０を含む。
【００３４】
ループ・スタック１７１０は、例えば、一連のハードウェア・レジスタ、メモリ位置、および／または、ハードウェア・レジスタとメモリ位置の組合せを含む。図１７に図示されたエンジン１７００、ループ・マスク・レジスタ１７３０、および、ループ・スタック１７１０は、４つのチャネル幅であるが、その実施は別の数のチャネル幅であってもよく（例えば、ｘチャネル幅）、そして各演算チャネルはｙビット・オペランドを処理することができることに注目すること。いくつかの実施例によれば、演算チャネル、マスク・チャネル、および、ループ・スタック・チャネルの間に１対１の関係がある。
【００３５】
エンジン１７００は、（例えば、４つの演算チャネルに関連して）４つの異なるチャネルのデータのための命令を受けて同時に実行することができる。いくつかのケースでは、４未満のチャネルが必要なことがあることに注意すること（例えば、４未満の有効なオペランドがあるとき）。結果として、ループ・マスク・レジスタ１７３０は、どのチャネルが有効なオペランドを有しているのか、および  どれをすべきでないのかを示す初期化ベクトルで初期化される（例えば、オペランドｉ０からｉ１７は対応するチャネルが現在イネーブルにされていることを示す「１」を有する）。その後、ループ・マスク・ベクトル１７３０が不必要な処理を回避するために使用されてもよい（例えば、命令は、「１」に設定されているループ・マスク・レジスタ１７３０中のオペランドに対してのみ実行されてもよい）。別の実施例によれば、ループ・マスク・レジスタ１７３０は、すべてに対して単に初期化されてもよい（例えば、チャネルがすべて常にイネーブルであると仮定される）。いくつかのケースでは、ループ・マスク・レジスタ１７３０中の情報は、他のレジスタ中の情報と結合されてもよく（例えば、ブールＡＮＤ演算による）、そしてその結果は、実行マスク・レジスタ全体に格納されてもよい（それはその後の不必要または不適当な処理を回避するために使用されてもよい）。
【００３６】
図１８〜図２０は、いくつかの実施例に従ってネスト（入れ子に）されたＤＯ命令を実行するエンジン１７００を図示する。図１８に示されるように、エンジン１７００がループ命令（例えば、ＤＯ命令）を受け取る場合、ループ・マスク・レジスタ１７３０中のデータは、ループ・スタック１７１０のトップにコピーされ、そのエントリに関連するループ・スタック・カウンタ１７２０の値は増やされて、ＴＯＳポインタ１７５０が更新される。さらに、ループ情報は、ループ・マスク・レジスタ１７３０に格納される。そのループ情報は、例えば、最初にＤＯ命令に遭遇したとき、４つのチャネルのどれがアクティブ中だったかをまず示す（例えば、オペランドｄ０からｄ３は「１」で関連するチャネルがアクティブ中であることを示す）。
【００３７】
その後、ＤＯループに関連する一組の命令は、ループ・マスク・レジスタ１７３０に従って、各チャネルのために実行される。例えば、もしループ・マスク・レジスタ１７３０が「１１１０」である場合、ループ中の命令は、最下位オペランド以外（つまり、そのチャネルは現在イネーブルではないので）の３つの最上位オペランドに関連するデータに対して実行されるであろう。
【００３８】
ＤＯ命令に関連するＷＨＩＬＥ文に遭遇する場合、条件がアクティブなチャネルに対して評価され、その結果はループ・マスク・レジスタ１７３０へ格納される（例えば、ブールＡＮＤ演算による）。例えば、ＷＨＩＬＥ文に遭遇する前に、ループ・マスク・レジスタ１７３０が「１１１０」だった場合、その条件は、３つの最上位オペランドに関連するデータに対して評価される。その後、その結果は、ループ・マスク・レジスタ１７３０に格納される。ループ・マスク・レジスタ１７３０中のビットの少なくとも１つが、依然として「１」である場合、一組のループ命令は、「１」のループ・マスク・レジスタ値を有するすべてのチャネルのために再び実行される。例として、ＷＨＩＬＥ文と連携した条件が「１１０ｘ」（ここでｘは、そのチャネルがイネーブルではないので、評価されなかった）の結果になった場合、「１１００」がループ・マスク・レジスタ１７３０に格納される。その後、そのループに連携した命令が再実行される場合、エンジン１７００は、その２つの最上位オペランドに関連するデータに対してのみ行なうであろう。この場合、不必要かつ／または不適当な処理は、ループのために回避することができる。その更新がアクティブなチャネルだけに制限されている場合、ブールＡＮＤ演算は必要でないことに注意すること。
【００３９】
ＳＩＭＤエンジンは、ネストされたループ命令を扱うことができる（例えば、第２のループ・ブロックが、第１のループ・ブロックの内部に「ネスト」されている場合）。例えば、次の一組の命令を検討する。
【００４０】
ＤＯ{
第１の一組の命令
ＤＯ{
第２の一組の命令
}ＷＨＩＬＥ<第２の条件>
第３の一組の命令
}ＷＨＩＬＥ<第１の条件>
この場合、第１の条件が真である間、第１および第３の一組の命令は適切なチャネルのために実行される一方、第１および第２の条件の両方が真である間、第２の一組の命令のみが実行される。
【００４１】
図１９は、いくつかの実施例に従って、ネストされた別のループ命令（例えば、第２のＤＯ文）の実行を図示する。この場合、ループ・マスク・レジスタ１７３０（ｄ１０からｄ１３）中の現在の情報は、スタック１７１０の「トップ」にプッシュされる。その結果、スタック１７１０のトップにもともとあった情報（つまり、初期化ベクトルｉ０からｉ３）は、１つのエントリだけ押し下げられる。エンジン１７００は、さらに、第２のループ情報をループ・マスク・レジスタ１７３０（ｄ２０からｄ２３）へ格納する。
【００４２】
スタック１７１０に情報がプッシュされるので、ここに説明されたあらゆる実施例に従って、ループ・スタック・カウンタ１７２０、および、ＴＯＳポインタ１７５０は更新されることに注意すること。図１９に示された実施例において、ｄ１０からｄ１３の値は、ｉ０からｉ３と等しくない結果、第２のエントリが使用された（そして、ＴＯＳポインタ１７５０は、第２のエントリがスタックのトップであることを反映する）。さらに、ネストされたループに遭遇するので、スタック１７１０にプッシュされる後続の値中のビットは同じに留まってもよく、あるいは「１」から「０」に変化してもよいが、「０」から「１」に変化することはできないことに注目すること。したがって、（ｉ）スタック１７１０にプッシュできる一組の可能な値は４個に制限され、また、（ｉｉ）新しい値は、スタック１７１０にプッシュされた先の値と等しくなく、最後のプッシュされた値以外となろう。結果として、ＴＯＳポインタ１７５０は、５番目のエントリを指す必要はないであろう。すなわち、スタック１７１０は、新しい値を格納するエントリを使い果たすことはないであろう（カウンタ１７２０の１つがオーバフローするかもしれないが）。
【００４３】
また、ループを遭遇する度に、重要な反復回数が生成されることに注意すること。結果として、本実施例は、非実用的な量のハードウェア・レジスタまたはＲＡＭを使用せずに、多数の値を格納することをサポートする。
【００４４】
その後、第２のループ命令に関連するループ・ブロックは、ループ・マスク・レジスタ１７３０中の情報によって示されるように、実行される（例えば、第２のブロックが実行されるごとに、ループ・マスク・レジスタ１７３０は、第２のループのＷＨＩＬＥ命令に関連する条件に基づいて更新される）。図２０に示されるように、第２のループのＷＨＩＬＥ命令がループ・マスク・レジスタ１７３０のすべてのビットを「０」にするとき、ループ・スタック１７１０のトップにあるデータ（つまり、ｄ１０からｄ１３）は、ループ・マスク・レジスタ１７３０へ戻され、カウンタ１７２０およびＴＯＳポインタ１７５０は、適切に、更新される。その後、ループ・マスク・レジスタ１７３０に従って、さらなる命令が実行される。第１のループ・ブロックが完了すると（図２０には示されていない）、初期化ベクトルはループ・マスク・レジスタ１７３０へ返送され、さらなる命令がイネーブルにされたチャネルに関連するデータのために実行される。
【００４５】
いくつかの実施例によれば、ＳＩＭＤとして、エンジンは「条件付き」命令を実行することができる。例えば、次の一組の命令を検討する。
【００４６】
ＩＦ<条件>
第１の一組の命令
ＥＬＳＥ
第２の一組の命令
ＥＮＤ  ＩＦ
ここで、「条件」が真であるとき、第１の一組の命令が実行され、「条件」が偽であるとき、第２の一組の命令が実行される。しかしながら、このような命令がデータの多重チャネルに対して同時に実行される場合、異なるチャネルは、異なる結果を導出するかもしれない。すなわち、第１の一組の命令は、いくつかのチャネルに対して実行する必要がある一方、第２の一組の命令は、他のチャネルに対して実行する必要がある。
【００４７】
図２１は、いくつかの実施例に従って、４チャネルのＳＩＭＤ実行エンジン２１００を図示する。エンジン２１００は、４ビットの条件付きマスク・レジスタ２１３０を含み、各ビットは対応する演算チャネルに関連する。条件付きマスク・レジスタ２１３０は、例えば、エンジン２１００中のハードウェア・レジスタを含む。エンジン２１００は、さらに４ビット幅、４つのエントリ深度の条件付きスタック２１１０、条件付きスタック・カウンタ・レジスタ２１２０、および、ＴＯＳポインタ２１５０を含む。条件付きスタック２１１０は、例えば、一連のハードウェア・レジスタ、メモリ位置、および／または、ハードウェア・レジスタとメモリ位置の組合せを含んでもよい（例えば、１０のエントリ深度スタックの場合、スタック２１１０の最初の４つのエントリは、ハードウェアである一方、残りの６つのエントリは、メモリに格納されてもよい）。図２１に示されたエンジン２１００、条件付きマスク・レジスタ２１３０、および、条件付きスタック２１１０は、４つのチャネルに関連しているが、実装では他の数のチャネルに関連していてもよく（例えば、ｘチャネル実行エンジン）、各演算チャネルは、ｙビット・オペランドを処理することができることに注目すること。
【００４８】
従前のように、条件付きマスク・ベクトル２１３０は、どのチャネルが有効なオペランドを有しているのか、および  どれをすべきでないのかを示す初期化ベクトルで初期化される（例えば、オペランドｉ０からｉ３は対応するチャネルが現在イネーブルにされていることを示す「１」を有する）。その後、条件付きマスク・ベクトル２１３０が不必要な処理を回避するために使用されてもよい（例えば、命令は、「１」に設定されている条件付きマスク・レジスタ２１３０のオペランドに対してのみ実行してもよい）。
【００４９】
図２２に示されるように、エンジン２１００が条件付き命令（例えば「ＩＦ」文）を受け取るとき、条件付きマスク・レジスタ２１３０中のデータは、条件付きスタック２１１０のトップにコピーされる。ここに説明されるように、条件付きスタック・カウンタ２１２０および条件付きスタック・ポインタ２１５０のトップも更新される（例えば、第１のエントリのカウンタ２１２０は、１に設定される）。さらに、命令は、条件付きマスク・レジスタ中の情報に従って、４つのオペランドのそれぞれに対して実行される。その後、その結果は、条件付きマスク・レジスタ２１３０に格納され、ＩＦ文に関連するステートメントに対して不必要、および／または、不適当な処理を回避するために使用することができる。実施例によれば、条件がＩＦ文に関連する条件が「１１０ｘ」の結果となる場合（ここで、ｘは、チャネルがイネーブルでないので、評価されなかった）、「１１００」が条件付きマスク・レジスタ２１３０に格納される。その後、ＩＦ文に関連する他の命令が実行される場合、エンジン２１００は、２つのＭＳＢ（２つのＬＳＢに関連するデータではない）に関連するデータに対してのみ行なうであろう。
【００５０】
いくつかの実施例によれば、１つの条件付き命令が、他の条件付き命令に関連する一組の命令の内部でネストされることがある。例えば、次の一組の命令を検討する。
【００５１】
ＩＦ<第１の条件>
第１の一組の命令
ＩＦ<第２の条件>
第２の一組の命令
ＥＮＤ  ＩＦ
第３の一組の命令
ＥＮＤ  ＩＦ  
この場合、「第１の条件」が真であるとき、第１および第３の一組の命令が実行され、「第１の条件」および「第２の条件」の両方が真であるとき、第３の一組の命令のみが実行される。
【００５２】
図２３は、いくつかの実施例に従って、ネストされた別の条件付き命令（例えば、第２のＩＦ文）の実行を図示する。この場合、条件付きマスク・レジスタ２１３０中の現在の情報は、スタック２１１０のトップにプッシュされる。その結果、スタック２１１０のトップにもともとあった情報（例えば、初期化ベクトル）は、１つのエントリだけ押し下げられる。しかしながら、図２３に示された実施例において、ｒ１２からｒ１３の値は、ｉ０からｉ３と完全に等しく、その結果、第１のスタック・エントリが再利用され、関連するカウンタ２１２０は、１から２へ増やされる（そして、ＴＯＳポインタ１７５０は、第１のエントリが依然スタックのトップであることを反映する）。
【００５３】
その後、データの多重チャネルは、（ｉ）条件付きマスク・レジスタ２１３０の現在の情報（つまり、ｒ１０からｒ１３）、および、第２の条件付き命令（つまり、「条件２」）に関連する条件に従って、同時に評価される。その後、この評価の結果は、条件付きマスク・レジスタ（つまり、ｒ２０からｒ２３）に格納され、条件付きマスク・レジスタ２１３０中の情報によって示される多重データ・オペランドに対する第２の条件付き命令に関連するさらなる命令を実行するためにエンジン２１００によって使用される。
【００５４】
情報がスタック２１１０にプッシュされると、条件付きスタック・カウンタ２１２０およびＴＯＳポインタ２１５０は、ここに説明されたあらゆる実施例に従って、更新される。さらに、ネストされたループに遭遇するので、スタック２１１０にプッシュされる後続の値中のビットは同じに留まってもよく、あるいは「１」から「０」に変化してもよいが、「０」から「１」に変化することはできないことに注目すること。したがって、（ｉ）スタック２１１０にプッシュできる一組の可能な値は４に制限され、また、（ｉｉ）新しい値は、スタック１７１０にプッシュされた先の値と等しくなく、最後のプッシュされた値以外となろう。結果として、ＴＯＳポインタ２１５０は、５番目のエントリを指す必要はないであろう。すなわち、スタック２１１０は、新しい値を格納するエントリを使い果たすことはないであろう（カウンタ２１２０の１つがオーバフローするかもしれないが）。
【００５５】
エンジン２１００が第２の条件付き命令に関連する命令の終了（例えばおよび「ＥＮＤ  ＩＦ」文）を受領したことの指示を受け取ると、図２４に示されるように、条件付きスタック２１１０のトップにあるデータ（つまり、ｒ１０からｒ１３）は、条件付きマスク・レジスタ２１３０に戻される。その後、さらなる命令が条件付きマスク・レジスタ２１１０に従って実行される。別のＥＮＤ  ＩＦ文に遭遇すると（図２４に図示せず）、初期化ベクトルは条件付きマスク・レジスタ２１３０へ返送され、さらなる命令はイネーブルにされたチャネルに関連するデータに対して実行される。
【００５６】
図２５は、いくつかの実施例によるシステム２５００のブロック図である。システム２５００は、例えば、デジタル・テレビ信号を記録および／または表示するために適合したメディア・プロセッサに関連する。システム２５００は、ここに説明されたあらゆる実施例に従って、ｎ個のオペランドのＳＩＭＤ実行エンジン２５２０を有するグラフィック・エンジン２５１０を含む。例えば、ＳＩＭＤ実行エンジン２５２０は、ここに説明されたあらゆる実施例に従って、ｎ個のデータ・レジスタ、ｎ個のカウンタ・レジスタ（各カウンタ・レジスタは、データ・レジスタのうちの１つに関連する）、および、スタック・ポインタのトップを具備する。システム２５００は、さらに、ＳＩＭＤ命令を格納するための命令メモリ・ユニット２５３０、および、グラフィック・データ（例えば、三次元画像に関連するベクトル）を格納するためのグラフィック・メモリ・ユニット２５４０を具備する。命令メモリ・ユニット２５３０およびグラフィック・メモリ・ユニット２５４０は、例えば、ランダム・アクセス・メモリ（ＲＡＭ）ユニットからなる。
【００５７】
以下、様々な追加の実施例を示す。これらは、全ての実行可能な実施例の定義を構成するものではなく、また、当業者は、他の多くの実施例が可能であることを理解するであろう。さらに、以下の実施例は明瞭にするために簡潔に説明されるが、当業者はあらゆる変更方法を理解しており、必要ならば、これらの他の実施例およびアプリケーションを提供するために上記説明を参照する。
【００５８】
さらに、異なる実施例が説明されたが、実施例のあらゆる組合せも実現し得る（例えば、ＳＩＭＤエンジンは、ループおよび条件付き命令をサポートすることができる）ことに注意すること。さらに、本例は、他の実施例に従って、イネーブルでないチャネルを示すために「０」を使用したが、これに代り、チャネルが現在イネーブルでないことを示すため「１」を用いてもよい。同様に、カウンタおよび／またはポインタは、特定の実行に依存して、増分してもよいし減少してもよいことを理解すべきであろう。
【００５９】
いくつかの実施例によれば、多重値がスタックにプッシュされる。例えば、次のアルゴリズムを検討する。
【００６０】
void push(int data, int count){
if(data==TOS->data_bit_field){
if(count+TOS->count<=MAX_COUNT){
TOS->count+=count;
}else{
count=MAX_COUNT-TOS->count;
TOS->count=MAX_COUNT;
TOS++;
TOS->data=data;
TOS->count=count;
}
}else{
TOS++;
TOS->data=data;
TOS->count=count;
}
}
この場合、プッシュされるデータ値は、ＴＯＳポインタによって示されるエントリのデータ部の中に保持されたものと比較される。ＴＯＳデータおよびプッシュされるデータがビットごとに同一の場合、ＴＯＳであると指定されたエントリのカウント値は、プッシュされるデータのコピー数だけ増やされる。２つのデータ値がビットごとに異なる場合、新しいＴＯＳスタック・エントリがＴＯＳポインタを増やすことによりまず選択される。その後、プッシュされるデータは、新しいＴＯＳエントリに格納され、関連するカウンタはプッシュされるデータのコピー数に設定される。
【００６１】
同様に、１つの動作を使用して、多くの値がスタックから取り出される。
【００６２】
int pop(count){
int retValue=TOS->data_bit_field;
int residual=count;
while(residual>0){
if(resudual>=TOS->count){
residual-=TOS->count;
TOS->count=0;
TOS--;
}else{
TOS->count-=residual;
}
}
return retValue;
}
この場合、呼出し人は、１つの動作で行ないたいポップ数を指定する。ＴＯＳポインタによって示されるエントリのデータ値が呼出し人に戻される。ＴＯＳエントリの関連するカウント・フィールドは、呼出し人によって指定されたポップ数だけ減じられる。いくつかのケースでは、ポップ・カウントは、現在のＴＯＳカウント・フィールドに保持されたカウントを超過することがある。この場合、そのカウントは、消費されるまで、連続するスタック・エントリに亘って適用される。
【００６３】
ここに説明された幾つかの実施例は、単に提示の目的である。当業者は、この説明から、請求項によって制限される修正及び変更のみで実施できることを認識するであろう。
【図面の簡単な説明】
【００６４】
【図１】ハードウェア・スタックのブロック図である。
【図２】いくつかの実施例に従うハードウェア・スタックのブロック図である。
【図３】いくつかの実施例に従うデータをハードウェア・スタックにプッシュする方法のフローチャートである。
【図４】いくつかの実施例に従ってハードウェア・スタックにプッシュされるデータを図示する。
【図５】いくつかの実施例に従ってハードウェア・スタックにプッシュされるデータを図示する。
【図６】いくつかの実施例に従ってハードウェア・スタックにプッシュされるデータを図示する。
【図７】いくつかの実施例に従ってハードウェア・スタックからのデータをポップする方法のフローチャートである。
【図８】いくつかの実施例に従ってハードウェア・スタックから取り出されるデータを図示する。
【図９】いくつかの実施例に従ってハードウェア・スタックから取り出されるデータを図示する。
【図１０】いくつかの実施例に従ってハードウェア・スタックから取り出されるデータを図示する。
【図１１】いくつかの実施例に従ってハードウェア・スタックのブロック図である。
【図１２】いくつかの実施例に従ってデータをハードウェア・スタックにプッシュする方法のフローチャートである。
【図１３】いくつかの実施例に従ってハードウェア・スタックにプッシュされるデータを図示する。
【図１４】いくつかの実施例に従ってハードウェア・スタックにプッシュされるデータを図示する。
【図１５】処理システムを図示する。
【図１６】処理システムを図示する。
【図１７】いくつかの実施例に従って入れ子のループ命令を実行するＳＩＭＤ実行エンジンを図示する。
【図１８】いくつかの実施例に従って入れ子のループ命令を実行するＳＩＭＤ実行エンジンを図示する。
【図１９】いくつかの実施例に従って入れ子のループ命令を実行するＳＩＭＤ実行エンジンを図示する。
【図２０】いくつかの実施例に従って入れ子の条件付き命令を実行するＳＩＭＤ実行エンジンを図示する。
【図２１】いくつかの実施例に従って入れ子の条件付き命令を実行するＳＩＭＤ実行エンジンを図示する。
【図２２】いくつかの実施例に従って入れ子の条件付き命令を実行するＳＩＭＤ実行エンジンを図示する。
【図２３】いくつかの実施例に従って入れ子の条件付き命令を実行するＳＩＭＤ実行エンジンを図示する。
【図２４】いくつかの実施例に従って入れ子の条件付き命令を実行するＳＩＭＤ実行エンジンを図示する。
【図２５】いくつかの実施例に従うシステムのブロック図である。
【図１】
2008524721.tif 000003
【図２】
2008524721.tif 000004
【図３】
2008524721.tif 000005
【図４】
2008524721.tif 000006
【図５】
2008524721.tif 000007
【図６】
2008524721.tif 000008
【図７】
2008524721.tif 000009
【図８】
2008524721.tif 000010
【図９】
2008524721.tif 000011
【図１０】
2008524721.tif 000012
【図１１】
2008524721.tif 000013
【図１２】
2008524721.tif 000014
【図１３】
2008524721.tif 000015
【図１４】
2008524721.tif 000016
【図１５】
2008524721.tif 000017
【図１６】
2008524721.tif 000018
【図１７】
2008524721.tif 000019
【図１８】
2008524721.tif 000020
【図１９】
2008524721.tif 000021
【図２０】
2008524721.tif 000022
【図２１】
2008524721.tif 000023
【図２２】
2008524721.tif 000024
【図２３】
2008524721.tif 000025
【図２４】
2008524721.tif 000026
【図２５】
2008524721.tif 000027
【国際調査報告】
2008524721.tif 000028
2008524721.tif 000029
2008524721.tif 000030