(57)【特許請求の範囲】
【請求項１】
多重ループ処理機能と命令の条件実行のためのプレディケート機能とを有するプロセッサによるプログラムの実行を制御するプログラム実行制御装置であって、
前記プログラムは、ループ処理における繰り返しを制御するための分岐命令を含み、
前記分岐命令は、さらに、ループ処理の１回後の繰り返し時に当該分岐命令を実行するか否かを示す実行可否条件を生成し、当該実行可否条件を、当該分岐命令を条件実行させるためのループ毎に対応した識別子に示されるプレディケートフラグに反映させる命令であり、
前記プログラム実行制御装置は、
前記分岐命令の実行サイクルよりも前に、前記プレディケートフラグに反映された前記実行可否条件をもとに、当該分岐命令以降の命令実行のためにプロセッサの状態を先行的に変更するプロセッサ状態変更手段を備える
ことを特徴とするプログラム実行制御装置。
【請求項２】
前記プロセッサ状態変更手段は、前記プレディケートフラグが分岐命令が実行されないことを示している場合には、当該分岐命令の実行サイクルよりも前に、前記分岐命令以降の命令を前記プロセッサにフェッチさせる
ことを特徴とする請求項１に記載のプログラム実行制御装置。
【請求項３】
前記プロセッサ状態変更手段は、前記プレディケートフラグが分岐命令が実行されることを示している場合には、前記プログラムを記憶しているメモリへの電力供給またはクロック供給を停止させ、前記プレディケートフラグが分岐命令が実行されないことを示している場合には、当該分岐命令の実行サイクルよりも前に、前記メモリへの電力供給またはクロック供給を再開させる
ことを特徴とする請求項１に記載のプログラム実行制御装置。
【請求項４】
前記プロセッサ状態変更手段は、前記プレディケートフラグが示す実行可否条件に応じて、前記プロセッサによる命令発行に関する制約条件を変更する
ことを特徴とする請求項１に記載のプログラム実行制御装置。
【請求項５】
前記プロセッサ状態変更手段は、前記プレディケートフラグに基づいて、ループ処理における繰り返し処理の最終周を予測し、最終周の繰り返し処理を実行した後は、再び該当分岐命令を実行するまでは、このループに対する予測処理を行なわない
ことを特徴とする請求項１に記載のプログラム実行制御装置。
【請求項６】
前記分岐命令は、当該分岐命令の条件実行のための識別子をオペランドにより指定し、
前記プロセッサ状態変更手段は、前記オペランドにより指定された識別子で示されたプレディケートフラグの一致を利用して、ループ処理における繰り返しの最終周を予測する
ことを特徴とする請求項５に記載のプログラム実行制御装置。
【請求項７】
前記分岐命令は、当該分岐命令の条件実行のための識別子をオペランドにより指定し、
前記プロセッサ状態変更手段は、前記オペランドにより指定された識別子で示された分岐ターゲットレジスタの一致を利用して、ループ処理における繰り返しの最終周を予測する
ことを特徴とする請求項５に記載のプログラム実行制御装置。
【請求項８】
前記プロセッサ状態変更手段は、前記プレディケートフラグに基づいて、ループ処理における繰り返し処理の最終周を予測した後に、当該プレディケートフラグに対応する分岐命令以外の分岐命令が発生した場合に、前記最終周の予測を終了する
ことを特徴とする請求項５に記載のプログラム実行制御装置。
【請求項９】
前記プロセッサ状態変更手段は、前記プレディケートフラグに基づいて、ループ処理における繰り返し処理の最終周を確定する際に、当該予測の誤りが所定の回数以上発生した場合には、前記最終周の予測を終了する
ことを特徴とする請求項５に記載のプログラム実行制御装置。
【請求項１０】
前記分岐命令は、当該分岐命令の条件実行のためのプレディケートをオペランドにより指定し、
前記プロセッサ状態変更手段は、プレディケートフラグ毎に、前記プロセッサの状態の先行的変更処理を行なう
ことを特徴とする請求項１に記載のプログラム実行制御装置。
【請求項１１】
前記プロセッサ状態変更手段は、
前記分岐命令は、当該分岐命令実行時の分岐先のアドレスを保持する分岐ターゲットレジスタの識別子をオペランドで指定し、
前記プロセッサ状態変更手段は、分岐ターゲットレジスタごとに、前記プロセッサの状態の先行的変更処理を行なう
ことを特徴とする請求項１に記載のプログラム実行制御装置。
【請求項１２】
さらに、前記ループ処理における繰り返しを制御するための分岐命令に付随するプレディケートフラグ識別子ごとに、次回のループが最終周であることを示すループ最終周フラグを有するテーブルを備える
ことを特徴とする請求項１に記載のプログラム実行制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、単一または複数のマイクロプロセッサで実行されるプログラムを制御するプログラム実行制御装置に関する。
【背景技術】
【０００２】
近年、デジタルテレビ、ビデオレコーダおよび携帯電話等のデジタル機器において、音声処理、オーディオ処理、動画処理および符号処理などのデジタル処理や、ＧＵＩ操作処理を実行することや、ＪＡＶＡ（登録商標）対応等の様々な要求が増加している。これらの要求を実現するために、マイクロプロセッサ（マイクロコンピュータやマイクロコントローラやデジタル・シグナル・プロセッサ（ＤＳＰ）を含む）などの情報処理装置が一般に利用されているが、アプリケーションの要求の増大に応じて処理能力を向上させるために、プロセッサの動作周波数の向上、マルチスレッド化およびマルチコア化等が行われている。これに伴い、プロセッサのパイプラインステージ段数、回路規模および消費電力は増加の一途を辿っている。
【０００３】
一般にパイプライン段数が増加すると、分岐命令実行時において新たな命令をフェッチするまでのペナルティサイクルが発生し性能低下の一因となる。アプリケーションプログラムの実行効率向上のために、特に処理の集中するループ部においてこの性能劣化を抑制する必要がある。性能劣化を抑制する目的で、ループ命令用の分岐命令では常に分岐成立（ｔａｋｅｎ）するものであると静的に予測するとともに（静的分岐予測）、ループの先頭命令をループ用命令バッファに格納し、ループ末端から先頭への分岐時に発生するペナルティサイクルを抑制する方法が知られている（例えば、特許文献１参照。）。
【０００４】
図２２は、プロセッサで実行されるプログラムの一例を示す図であり、図２２（ａ）は、Ｃ言語で記述されたプログラムであり、図２２（ｂ）は、図２２（ａ）に示されるプログラムに対応するアセンブリプログラムである。
【０００５】
例えば、図２２（ｂ）に示すプログラム例において、ループ末端の分岐命令（ＢＲＺ命令）における分岐成立時（この場合ループ先頭であるＬ＿ＨＥＡＤラベル位置への分岐時）および分岐不成立時（ＢＲＺ命令より後続のＳＴ命令への実行遷移時）のそれぞれにおいて、ペナルティサイクルが発生し得る。
【０００６】
また、上述の静的分岐予測や、分岐履歴表（ＢＨＴ）を使用した動的分岐予測においてすら回避できない、ループ最終周における分岐不成立（ｎｏｔ−ｔａｋｅｎ）によるペナルティサイクルを抑制するために、ループカウンタを用いてループ最終回を高い精度で予測し、最終周におけるループ終了時の分岐ペナルティを抑制する方法が知られている（例えば、特許文献２参照。）。
【０００７】
一方、増加する消費電力の抑制に関しては、やはりループ部分に着目し、ループ実行中には使用されない資源を停止させ電力削減を行う方法が知られている（例えば、特許文献３参照。）。
【０００８】
例えば、ループ対象箇所の命令を格納するループ用命令バッファを有するプロセッサでは、ループ実行中は、ループ用命令バッファに格納された命令を繰り返し実行するため、命令メモリからの命令フェッチが不要である。このため、キャッシュシステムを含めた命令メモリシステムを停止させることができ、省電力化を図ることができる。
【０００９】
また、パイプラインステージの増加にともなうペナルティサイクルの増加に起因する性能劣化を抑制するために、マルチスレッド指向のプロセッサが有効になりつつある（例えば、特許文献４参照。）。
【特許文献１】特許第２９８７３１１号公報
【特許文献２】特許第３５７０８５５号公報
【特許文献３】特許第１９５９８７１号公報
【特許文献４】特許第３７１６４１４号公報
【発明の開示】
【発明が解決しようとする課題】
【００１０】
しかしながら、分岐命令の種類に応じて常に予測方向を固定（例えばループ用分岐命令では常に分岐成立とする等）にする静的分岐予測や、過去の分岐成立頻度を元に次回の判定を予測する分岐履歴表などに基づく動的予測においても、ループ終了時の分岐では必ず予測ミスが発生し、分岐ペナルティを生じてしまう。
【００１１】
特に、近年のプロセッサのパイプラインステージ増加に伴うペナルティサイクル増加により、分岐予測ミスによる性能劣化の影響が大きくなっている。
【００１２】
また、アプリケーションの特性として、例えば動画コーデック規格の動向に見られるように、総処理量は増加するにも係らず、一度に処理する領域が小型化する傾向にある。例えば、従来の動画コーデック規格では、１６画素角のデータが処理対象であったのに対し、新たな規格では４画素角のデータに対する処理が登場している。これは１つのループにおける処理サイクル数が減少する事を意味する。
【００１３】
さらに、プロセッサが実行可能な命令の並列度が向上する傾向にあることも、１つのループにおける処理サイクル数を減少させる事に拍車をかけている。
【００１４】
このように、アプリケーションの特性やプロセッサの並列実行可能数の向上により、１つのループにおける処理サイクル数が減少するのに対し、分岐ペナルティは増加する傾向にある。
【００１５】
例えば、ループ内の１周の命令実行サイクルが８サイクルで、ループ周回数が４回の場合、１つのループにおける処理サイクル数は３２サイクルである。これに対し、例えば分岐ペナルティが４サイクルであれば、１つのループ実行のたびに、約１割強の実行性能劣化が生ずることとなる。
【００１６】
このようなループ処理における実行性能劣化を回避するために、例として示した特許文献２に代表される、ループカウンタを用いて最終周を予測する方法は、比較的高頻度に最終回を予測できるという意味で価値がある。しかしながら、適用対象、ソフトウェア生産性およびハードウェア実装資源投資において課題がある。
【００１７】
ループカウンタ方式において最終周予測が適用可能なループは、ループカウンタの増減値が、１またはハードウェアで予め固定されたステップ数でなければならない。現在のループカウンタ値をもとに、次回が最終周、すなわち減算カウンタ方式においては次回にカウンタ値が０以下となることを知るためには、上記制限が必須となる。
【００１８】
したがって、ループの種類によっては、ループカウンタを用いて最終周を予測する方法が適用できない。例えば、図２３（ａ）に示すようにループ変数の増減値が１でない場合や、図２３（ｂ）に示すようにループ変数の増減値が所定のステップ数でない場合や、図２３（ｃ）に示すようにループ回数が予め決まらないｗｈｉｌｅループのような場合や、図２３（ｄ）に示すように、ループ内からループ外への飛び出しが存在し得る場合には、最終周予測制御を適用する事ができない。
【００１９】
過去のＤＳＰ応用分野のように小規模なソフトウェアでは、ループのそれぞれを増分１のｆｏｒループにアルゴリズム変更することも可能であった。しかし、現在のように大規模化したソフトウェア応用分野では、ソフトウェア生産性の観点からそのような個別のアルゴリズムチューニングが現実的ではなくなっている。また、本質的にアルゴリズム変更が不可能なケースも存在する。
【００２０】
また、ループカウンタによる予測方式は、単一スレッドのプログラム実行環境で、かつ最も深いｆｏｒループのみを適用対象とする場合には実装回路規模を少なく実現できるが、多重ループやマルチスレッドを対象とする場合には回路投資の増加が避けられない。
【００２１】
例えば、３重のｆｏｒループをループカウンタ方式で実現する場合、それぞれ３つのループごとのループカウンタ値を保持および管理する記録装置がハードウェア的に必要となる。物理的なカウンタ用レジスタをただ１つ用意し、ループの深さに応じてスタックメモリなどにループカウンタ値を退避させ、スタックメモリからループカウンタにループカウンタ値を復帰させる事も可能であるが、その処理を挿入するために処理サイクルを要し、プログラムの実行性能が劣化する。
【００２２】
この資源の増加はマルチスレッド型プロセッサでは特に顕著となる。これは、ループカウンタ用のスタックメモリを、プロセッサで同時に実行可能なスレッドの数だけ実装する必要があるためである。
【００２３】
またスタックメモリを利用するハードウェア構成以外に、特許文献２に示されるように、アドレス（プログラムカウンタ値）に対応づけられたテーブルを利用するハードウェア構成もあるが、この場合にもアドレス情報を含めて、必要回路規模が大きくなる。
【００２４】
このように、ループカウンタを用いた最終周予測制御は、過去の伝統的なＤＳＰ分野においては有効であったが、現在のように大規模ソフトウェア開発を前提とした高性能プロセッサにおいては、その適用対象、ソフトウェア生産性およびハードウェア投資の観点から有効では無くなっている。
【００２５】
本発明は上述の課題を解決するためになされたものであり、少ない回路投資により、プロセッサで実行される様々な構造のループを制御適用対象とすることができ、ソフトウェア生産性を高めながら、性能向上および省電力化を実現できるプログラム実行制御装置を提供することを目的とする。
【課題を解決するための手段】
【００２６】
上記目的を達成するために、本発明に係るプログラム実行制御装置は、多重ループ処理機能と命令の条件実行のためのプレディケート機能とを有するプロセッサによるプログラムの実行を制御するプログラム実行制御装置であって、前記プログラムは、ループ処理における繰り返しを制御するための分岐命令を含み、前記分岐命令は、さらに、ループ処理の１回後の繰り返し時に当該分岐命令を実行するか否かを示す実行可否条件を生成し、当該実行可否条件を、当該分岐命令を条件実行させるためのループ毎に対応した識別子に示されるプレディケートフラグに反映させる命令であり、前記プログラム実行制御装置は、前記分岐命令の実行サイクルよりも前に、前記プレディケートフラグに反映された前記実行可否条件をもとに、当該分岐命令以降の命令実行のためにプロセッサの状態を先行的に変更するプロセッサ状態変更手段を備えることを特徴とする。
【００２７】
この構成によると、プレディケートフラグにより、ループ処理が最終周か否かを判断することができる。このため、最終周の実行が終了するまでの間に、プロセッサの状態を先行的に変更することができる。例えば分岐方向や電力制御状態や命令発行条件を的確に変更可能であるため、分岐ペナルティサイクルに伴う性能劣化の抑制や、電力制御による省電力化や、命令発行数の動的制御によりシステム全体性能の向上を図ることができる。
【００２８】
また、このような制御はプレディケートフラグに基づいて行なうことができるため、少ない回路投資において、様々な構造のループを制御適用対象とすることができ、ソフトウェア生産性を高めながら、性能向上や省電力化を実現できる。
【００２９】
なお、本発明は、このような特徴的な手段を備えるプログラム実行制御装置として実現することができるだけでなく、プログラム実行制御装置に含まれる特徴的な手段をステップとするプログラム制御方法として実現したり、プログラム制御方法に含まれる特徴的なステップをコンピュータに実行させるプログラムとして実現したりすることもできる。そして、そのようなプログラムは、ＣＤ−ＲＯＭ（Compact Disc-Read Only Memory）等の記録媒体やインターネット等の通信ネットワークを介して流通させることができるのは言うまでもない。
【発明の効果】
【００３０】
以上のように本発明によれば、ループ終了後のプロセッサ状態の変更として、例えば分岐方向や電力制御状態や命令発行条件を的確に変更可能であるため、分岐ペナルティサイクルに伴う性能劣化の抑制や、電力制御による省電力化や、命令発行数の動的制御によりシステム全体性能の向上を図ることができる。
【００３１】
特に、少ない回路投資において、様々な構造のループを制御適用対象とすることができ、ソフトウェア生産性を高めながら、性能向上や省電力化を実現できる。
【発明を実施するための最良の形態】
【００３２】
以下、本発明の実施の形態を図面を参照して詳しく説明する。なお、図面において同一または相当する部分には同一の参照符号を付してその説明は繰り返さない。
【００３３】
（第１の実施形態）
図１は、本発明の第１の実施形態に係るプロセッサの構成を示すブロック図である。
【００３４】
プロセッサは、プログラムを実行する装置であり、命令フェッチ装置３１と、命令メモリ３２と、命令デコード装置３３と、命令実行装置３４と、レジスタファイル３５と、データメモリ３６と、プレディケートフラグ制御装置３７と、ループ分岐予測装置３８とを含む。
【００３５】
命令メモリ３２は、プログラムを構成する複数の命令を記憶するメモリである。
命令フェッチ装置３１は、命令メモリ３２に記憶されている命令をフェッチする処理部である。命令フェッチ装置３１は、命令が記憶されている命令メモリ３２のアドレスである命令フェッチアドレスを、命令メモリ３２に対して送出する。命令メモリ３２は、受け取った命令フェッチアドレスに記憶されている命令を、命令フェッチ装置３１に対して出力する。命令フェッチ装置３１は、受け取った命令を場合に応じて並べ替え、命令デコード装置３３に供給する。
【００３６】
命令デコード装置３３は、供給された命令を解読し命令の内容に応じて、プロセッサ内の各ブロックへ、命令の動作を指示するための制御信号を送出する処理部である。
【００３７】
レジスタファイル３５は、各種データを記憶する複数の汎用レジスタおよび複数の専用レジスタから構成される。
【００３８】
データメモリ３６は、各種データを記憶するメモリである。
命令実行装置３４は、算術論理演算器（ＡＬＵ）および積和演算器（ＭＡＣ）等の演算器ならびに各命令の動作を実現する専用回路から構成される処理部である。命令実行装置３４は、命令デコード装置３３から入力される命令に応じた制御信号の指示に基づき、レジスタファイル３５やデータメモリ３６との間で演算用データの入力を行い、これに対して演算を施し、命令に応じて演算結果をレジスタファイル３５やデータメモリ３６に出力する。
【００３９】
プレディケートフラグ制御装置３７は、命令実行装置３４による命令の条件付き実行のための条件フラグである複数のプレディケートフラグを有する。各々のプレディケートフラグは１ビットで構成され、条件が真であるか偽であるかを表す。プレディケートフラグには、例えば、命令実行装置３４において、比較命令を実行した結果の真偽の結果が書き込まれる。
【００４０】
図２に、プレディケートフラグを用いたアセンブリプログラムの例を示す。図２におけるＣＭＰＥＱ命令は、レジスタＲ０およびＲ１に記憶されている値が等しいか否かを判定し、等しい場合（真）には、指定したプレディケートフラグＣ０に１を書き込み、等しくない場合（偽）には、プレディケートフラグＣ０に０を書き込むものとする。図２の例では、３ステップ目のＭＯＶ命令は、プレディケートフラグＣ０の内容が１（真）である場合にのみ実行される。この様にプレディケート機能を使用することで、Ｃ言語におけるｉｆ文などの条件実行を表現することができる。なおここで示したプレディケート機能自体は、近年の命令並列度の高いプロセッサにおいては、一般的なものである。
【００４１】
図１において、ループ分岐予測装置３８は、命令デコード装置３３から出力される命令デコード情報と、プレディケートフラグ制御装置３７から出力されるプレディケートフラグの値により、次回のループが最終周であることを示すループ最終周フラグを生成する処理部である。
【００４２】
命令フェッチ装置３１は、命令デコード装置３３からループ分岐命令の実行を指示された場合には、ループ分岐予測装置３８から供給されるループ最終周フラグを参照し、この内容が無効（例えば値として０）を表していれば分岐が成立するものと判断（次回もループを実行するものと判断）して、分岐処理、即ち分岐先のアドレスに対する命令フェッチを行う。供給されたループ最終周フラグが有効（例えば値として１）を表していれば、命令フェッチ装置３１は、今回がループの最終周であると判断し、分岐不成立と判断して分岐処理を行う。即ち、命令フェッチ装置３１は、分岐先からではなく、プログラムカウンタの値として連続する後続のアドレスに対する命令フェッチと命令供給を行う。
【００４３】
図３に、本実施形態におけるループ用分岐命令を含むプログラムの例を示す。図３（ａ）は、Ｃ言語で記述されたプログラムであり、図３（ｂ）は、図３（ａ）に示したプログラムに対応するアセンブリプログラムである。この例では、ループ変数の増減値が−２である。この例では、ＢＬＯＯＰ命令が、ループ用分岐命令に相当する。つまり、ＢＬＯＯＰ命令は、ＢＬＯＯＰ命令が次に実行される際の実行可否条件を、ループ用分岐命令（ここでは、ＢＬＯＯＰ命令）の１回前の実行時に生成し、この結果をプレディケートフラグに反映することを特徴とするループ用分岐命令に相当する。なおＲ４の初期値は、Ｎ−２である。
【００４４】
図３において、ＳＥＴＬＢ命令は、Ｌ＿ＨＥＡＤラベルで示されたアドレスと、当該アドレスに対応する命令をループ用命令バッファのＴＲ０番地に格納する。ループ用命令バッファを複数実装するプロセッサにおいては、ＴＲ０、ＴＲ１のように名称指定でそれぞれを識別する。
【００４５】
ここで、ＢＬＯＯＰ命令の動作説明のために、Ｃ言語における機能表現を図４に示す。ＢＬＯＯＰ命令は行頭の［Ｃ０］で示されるように、プレディケートフラグＣ０で条件実行指定されているので、プレディケートフラグＣ０が真であればＢＬＯＯＰ命令が実行され、偽であればＢＬＯＯＰ命令は実行されない。
【００４６】
ＢＬＯＯＰ命令のオペランドでＣ０を指定しているため、Ｒ４が０以下であれば、Ｃ０には偽、そうでなければ真の値が書き込まれる。
【００４７】
さらに、オペランド指定されたＲ４，０ｘ２によりＲ４から２を減算し、識別子ＴＲ０で指定したループ用命令バッファのアドレスに分岐が行われる。
【００４８】
ＢＬＯＯＰ命令は、現在の命令実行において、次回の実行時の条件を直接生成することが特徴である。これにより、様々なループ条件下においても正確に次回の分岐予測を行うことができる。
【００４９】
ループ用分岐命令の実装は、条件生成方法に関してさまざまな形態が考えられる。上述の例ではレジスタＲ４が０以下であるか否かを判定しているが、値の一致判定やゼロ判定や符号判定などでも良い。上述の例では、指定したレジスタＲ４から即値を減算する機能を並列実行するが、これについてもこの演算内容に限る必要は無い。
【００５０】
なお、例示したＢＬＯＯＰ命令を用いても、例えば減算値を０ｘ０とし、ＢＬＯＯＰ命令より前に比較命令を置くことで、ループ回数が予め決定されないループ型のループ（Ｃ言語におけるｗｈｉｌｅループ）に対する制御を実現する事ができる。
【００５１】
プレディケート機能を用いて、ループの条件生成を行うことにより、多重ループへ容易に対応することができる。例えば２重ループの例では、プレディケートフラグＣ０を内側ループ用、プレディケートフラグＣ１を外側ループ用として使用することにより、お互いを識別する事ができる。
【００５２】
また一般的な演算結果の特徴を示すフラグである、キャリーフラグやサインフラグやゼロフラグなどを使用する場合と異なり、プレディケートフラグを使用すれば、ループ内にループ判定以外の条件文が出現してもお互いを識別する事ができる。
【００５３】
図５に、第１の実施形態に係るプロセッサの実装回路の例を示す。
命令フェッチ装置３１は、フェッチ用プログラムカウンタ４１と、セレクタ４２と、加算器４３と、分岐ターゲットアドレス生成部４４と、命令割当て装置４５とを含む。
【００５４】
命令デコード装置３３は、命令デコード回路４６を含む。
プレディケートフラグ制御装置３７は、複数のプレディケートフラグレジスタ５２と、マルチプレクサ５３とを含む。
【００５５】
ループ分岐予測装置３８は、ループ最終周フラグレジスタ５４を含む。
命令フェッチ装置３１内のフェッチ用プログラムカウンタ（ＰＣ）４１は、命令フェッチのためのアドレスを格納するレジスタである。フェッチ用プログラムカウンタ４１から送出されたフェッチ用アドレスに基づき、命令メモリ３２は、当該フェッチ用アドレスに記憶されている命令を命令フェッチ装置３１に出力する。
【００５６】
命令フェッチ装置３１内の命令割当て装置４５は、フェッチした命令列の中から実行すべき命令を取り出し、命令デコード装置３３に供給する。
【００５７】
命令デコード装置３３内の命令デコード回路４６は、供給された命令をデコードし、命令の動作ごとに適切な制御信号をプロセッサ内の各装置に供給する。
【００５８】
命令実行装置３４は、図の例では演算器として、比較器（ＣＭＰ）４７と、算術論理演算器（ＡＬＵ）４８と、積和演算器（ＭＡＣ）４９とを含む。レジスタファイル３５から読み出された演算用オペランドデータがオペランド読み出しバス５０で選択され、各演算器に供給される。さらに各演算器で演算した演算結果がオペランド書き込みバス５１経由でレジスタファイル３５に書き込まれる。
【００５９】
実行する命令が比較命令の場合は、比較器４７で比較演算が行われ、結果は１ビットの真／偽（ｔｒｕｅ／ｆａｌｓｅ）の形でプレディケートフラグ制御装置３７に出力され、命令で指定したＣ０からＣ３の識別番号に対応するプレディケートフラグレジスタ５２に書き込まれる。
【００６０】
なお本実施形態では、プレディケートフラグをＣ０からＣ３の４レジスタの例を示しているが、当然ながら実装数は任意である。
【００６１】
通常のプレディケートの使用形態であるため図中には明記しないが、各プレディケートフラグレジスタ５２の値は、命令実行可否の決定のために命令デコード装置３３にて参照され、プレディケートフラグレジスタの値が偽の場合は、命令をＮＯＰとしてデコードし命令を無効化する。
【００６２】
ループ用分岐命令を実行する場合は、ループ用分岐命令のオペランドで指定した識別番号（Ｃ０〜Ｃ３）に対応するプレディケートフラグレジスタ５２の内容を、マルチプレクサ（ＭＵＸ）５３にて選択し、ループ分岐予測装置３８に出力する。
【００６３】
ループ最終周フラグレジスタ５４の内容は、マルチプレクサ５３で選択されたプレディケートフラグの内容の反転値と、命令デコード装置３３にてデコードされた命令がループ分岐命令であることを示す信号と、ループ実行中であることを示す信号の論理積により生成される。つまり、ループにおけるループ分岐命令の実行時に、プレディケートフラグが偽となった場合に、ループ最終周フラグレジスタ５４の値が真（１）となる。
【００６４】
フェッチ用プログラムカウンタ４１の内容は、加算器４３でインクリメントされた値か、分岐ターゲットアドレス生成部４４で生成された値かを、セレクタ４２で選択された値により書き換えられる。
【００６５】
セレクタ４２は、実行すべき命令が、ループ用分岐命令ではなく、かつその他の分岐命令でもない場合は、加算器４３で生成されたインクリメント値を選択して出力する。
【００６６】
実行すべき命令がループ用分岐命令以外の分岐命令の場合には、セレクタ４２は、分岐ターゲットアドレス生成部４４で生成された値を選択する。
【００６７】
実行すべき命令がループ用分岐命令の場合には、ループ最終周フラグレジスタ５４から出力されたループ最終周フラグの値が偽（０）の場合には分岐が成立すると判断し、セレクタ４２は、分岐ターゲットアドレス生成部４４で生成された値を選択する。当該ループ最終周フラグの値が真（１）の場合には、セレクタ４２は、実行すべき命令がループの最終周に位置するために分岐が成立しないと判断し、加算器４３で生成されたインクリメント値を選択する。
【００６８】
図６に、本実施形態のプロセッサの動作の一例を示す。
命令フェッチ装置３１は、フェッチ用プログラムカウンタ４１を参照し、命令メモリ３２より命令をフェッチする（Ｓ１）。命令デコード装置３３は、供給された命令をデコードする（Ｓ２）。
【００６９】
命令デコード装置３３は、デコードした命令の内容をもとに、命令がループ用分岐命令以外の分岐命令か否かを判定する（Ｓ３）。命令がループ用分岐命令以外の分岐命令の場合には（Ｓ３でＹＥＳ）、フェッチ用プログラムカウンタ４１に、分岐ターゲットアドレス生成部４４に記憶されている分岐先アドレスが格納され、命令フェッチ装置３１は、分岐先アドレスに格納されている命令フェッチを行う（Ｓ１０）。その後、命令デコード装置３３にて、フェッチされた命令のデコードが行なわれる（Ｓ２）。
【００７０】
デコードした命令がループ用分岐命令以外の分岐命令ではない場合には（Ｓ３でＮＯ）、命令デコード装置３３は、デコードした命令がループ用分岐命令であるか否かを判断する（Ｓ４）。デコードした命令が、ループ用分岐命令ではない場合（Ｓ４でＮＯ）、すなわち、ループ用分岐命令でもなく、かつ他の分岐命令でもない場合には、命令実行装置３４にて当該命令の実行が行なわれる（Ｓ６）。その後、Ｓ１以降の処理が繰り返される。
【００７１】
デコードした命令がループ用分岐命令の場合には（Ｓ４でＹＥＳ）、ループ分岐予測装置３８は、当該命令が最終周予測された分岐命令か否かを判定する（Ｓ５）。これは、図５におけるループ最終周フラグレジスタ５４の値をもとに判定する。最終周予測された状態であれば（Ｓ５でＹＥＳ）、ループ先頭に戻るための分岐処理は行わず、即ちループ分岐不成立として、後続の命令を継続実行するために、命令実行装置３４は、命令を実行した後、命令フェッチ装置３１が後続アドレスの命令をフェッチする（Ｓ１）。
【００７２】
デコードした命令が、最終周予測された分岐命令で無いと判定された場合は（Ｓ５でＮＯ）、ループ分岐予測装置３８は、次回の分岐が最終周であるかを判定する（Ｓ７）。これは図５におけるループ最終周フラグレジスタ５４の前段の論理回路において行われる。
【００７３】
次回の分岐が最終周である場合には（Ｓ７でＹＥＳ）、ループ分岐予測装置３８は、ループ最終周フラグレジスタ５４に真をセットし（Ｓ８）、命令実行装置３４が、当該命令を実行する（Ｓ９）。その後、分岐先アドレスの命令がフェッチされ（Ｓ１０）、Ｓ２以降の処理が繰り返される。
【００７４】
次回の分岐が最終周でないと判断された場合は（Ｓ７でＮＯ）、命令実行装置３４が、当該命令を実行し（Ｓ９）、その後、Ｓ１０、Ｓ２以降の処理が繰り返される。
【００７５】
次に、タイミング図を用いて命令の実行サイクルの関係について説明する。
まず説明の簡単のために、プロセッサのパイプラインステージを図７に示す構成とし、プログラムは図８のようにループ内が３サイクル（３命令）である場合について説明する。
【００７６】
図９は、ループ最終周における分岐予測が無い場合の、プロセッサの動作を示すタイミング図である。図中の＃ｉは、ループ処理におけるｉ番目の繰り返しを示す。
【００７７】
まずループ最終周以外については、最終周から２回前のＢＬＯＯＰ命令である「ＢＬＯＯＰ（＃Ｎ−２）」から「ＬＤ（＃Ｎ−１）」の間には、分岐予測ミスによるペナルティサイクルは発生しない。これは最終周以外の分岐は常に「成立」と予測するためである。
【００７８】
しかしながら、本来はループ終了であるはずの「ＢＬＯＯＰ（＃Ｎ）」においても、分岐が成立すると予測するため、ループ先頭への分岐が行われ「ＬＤ（＃Ｎ＋１）」以降についても命令フェッチと供給が行われる。
【００７９】
この例におけるプロセッサのパイプラインステージ構成においては、プレディケートによる条件判定サイクルが「ＥＭ」ステージであり、その場合には「ｔ１０」のサイクルにおいて始めて分岐が不成立であった事が判明する。
【００８０】
したがって、「ｔ１１」サイクルから、本来の次命令である「ＳＴ」命令のためのフェッチが開始される。「ｔ８」から「ｔ１０」までに予測を誤ってフェッチ及び供給した命令は、パイプラインフラッシュ動作により実行はキャンセルされるが、無駄なサイクルが挿入されることによる性能劣化が生じる。
【００８１】
次に本実施形態の分岐予測動作について、図１０を用いて説明する。
ループ最終周の２周前である「ＢＬＯＯＰ（＃Ｎ−２）」の命令により、Ｒ４レジスタは２減算され０となる。
【００８２】
続くループ最終周の１周前である「ＢＬＯＯＰ（＃Ｎ−１）」の命令では、Ｒ４レジスタが０以下となったため、プレディケートフラグＣ０の値を偽（０）に変更する。
【００８３】
さらに、ループ分岐予測装置３８において、Ｃ０フラグの結果をもとに、ループ最終周フラグを生成する。本例では、Ｃ０フラグが偽となったことをうけて、ループ最終周予測が真となる。
【００８４】
これが次回の分岐命令が最終であることの予測生成に相当する。
命令フェッチ装置３１では、後続のアドレスに対する命令フェッチを継続し、この命令フェッチは分岐予測により有効となるため、分岐最終周における命令フェッチのミスペナルティは発生しない。
【００８５】
さらに、最終周の「ＢＬＯＯＰ（＃Ｎ）」の条件判定サイクル「ｔ１１」において、ループの最終周予測が完了する。これにより、安全に最終周の予測を完了することができるため、異なるループに処理を進めても予測ミスによる性能劣化を引き起こすことがない。
【００８６】
また、対象ループ内の処理を実行中に割込みや例外が発生し、割込み処理ルーチンへ処理が移行する場合にも、予測の整合性を維持する必要がある。なぜなら、割込み処理ルーチンの中で、新たにループ構造が存在する場合に、ループ用分岐命令にて、割込み処理前のループ構造による分岐予測の結果を誤って使用してしまう可能性があるためである。
【００８７】
この予測結果の誤使用を防ぐためには、割込みや例外などの分岐や、ループ処理以外の分岐により、対象ループ外に処理が遷移する場合には、分岐予測を完了する構成をとることで実現が可能である。
【００８８】
図１１に、ループ最終周予測に関する状態遷移の例を示す。すなわち、ループの開始時には、ループの最終周ではないことを示す状態６２である。この状態において、ＢＬＯＯＰ命令を実行することにより次回がループの最終周であると判定された場合には、ループの最終周であることを示す状態６３に遷移する。この状態において、ループの最終周であり、かつＢＬＯＯＰ命令を実行することにより分岐が成立しないと判断された場合、ループの最終周以外のＢＬＯＯＰ命令を実行した場合、またはＢＬＯＯＰ命令以外の分岐命令を実行した場合には、状態６２に遷移する。
【００８９】
さらに、分岐予測ミスが多発する場合には、分岐予測機能を抑制する機構を設けることで、安全なプロセッサ稼働を実現する事ができる。例えば、分岐予測ミスが所定の回数以上発生した場合には、分岐予測を行なわないようにすればよい。
【００９０】
次に、多重ループやループ内の条件分岐に対応するための構成について説明する。
図１２と図１３に２重ループを含むプログラムの一例を示す。図１２は、Ｃ言語により記述されたプログラムであり、図１３は図１２に示したプログラムに対応するアセンブリプログラムである。
【００９１】
多重ループにおいて、分岐予測の誤判定を防ぐ単純な方法は最内ループのみを分岐予測の対象とすることである。
【００９２】
誤判定の例として、図１３の例においては、外側ループにてＣ３を使用するＢＬＯＯＰ命令の実行時に、次回が最終周と判断してループ最終周フラグをセットしたとして説明する。
【００９３】
単にループ用分岐命令（ＢＬＯＯＰ）のみを分岐命令の対象として検出する構成の場合には、外側ループによりループ最終周フラグがセットされた後、内側ループ用の初回のＢＬＯＯＰ命令を検出した際に、本来は分岐成立と扱うべきところを、誤って最終回として判断し、分岐不成立として動作を行ってしまう。
【００９４】
これを防ぐ方法として、現在予測対象としているループのプレディケートフラグ識別子（例ではＣ２やＣ３）が、前回のループ用分岐命令検出時の内容と一致するか否かを判定する構成を採ると良い。
【００９５】
他の構成方法として、分岐ターゲットレジスタ識別子（例ではＴＲ０やＴＲ１）が、前回のループ用分岐命令検出時の内容と一致するか否かを判定することもできる。
【００９６】
図１３の例では、外側ループでは、プレディケート識別子としてＣ３が指定され、分岐ターゲットレジスタ識別子としてＴＲ０が指定されている。
【００９７】
このいずれかの情報を保持しておき、新たなループ用分岐命令検出時に、当該情報とこの分岐命令用の識別子とを比較する。
【００９８】
上述の例では、多重ループにおいても、最も内側のループのみを分岐予測の対象とする構成であり、少ないハードウェアコスト下での実装に適した方法を示した。
【００９９】
さらに本発明では、本実施形態で示すループ用分岐命令を用いて、多重ループの外側のループ群においても、少ない回路投資にて正確なループ最終周の分岐予測を行うことができる。
【０１００】
図１４に示すように、ループ用分岐命令に付随するプレディケートフラグ識別子ごとに、ループ最終周フラグを有するテーブルを用意する。
【０１０１】
これにより、多重ループにおけるお互いのループ用分岐命令の区別が行える上、各々のループについて、ループ最終周であるかを判定する事ができる。
【０１０２】
この方法のテーブル用ハードウェアに必要な回路資源はプレディケート毎にたかだか数ｂｉｔであるため、単純なカウンタ方式においてプログラムカウンタ等の情報を多量に保持するテーブル構成と比べて、遙かに少コストで多重ループに対応したループ最終周予測を行なうことができるプロセッサを実現する事ができる。
【０１０３】
図１５には、プレディケートフラグ識別子のかわりに、分岐先のアドレスを保持する分岐ターゲットレジスタの識別子を用いて、ループを区別する構成例を示す。
【０１０４】
以上のように本実施の形態によれば、ループの最終周よりも１つ前の繰り返しにおいて、次の繰り返しが最終周であることが予測され、分岐命令のプレディケートに利用される。このため、最終周では、分岐命令が実行されずに後続の命令を実行させるようにすることができる。よって、ループ終了後のプロセッサ状態の変更として、分岐方向を的確に変更可能である。このため、分岐ペナルティサイクルに伴う命令実行性能の劣化を抑制することができる。
【０１０５】
（第２の実施形態）
第２の実施形態は、プロセッサの処理状態として、電力状態を変更することを特徴とする。
【０１０６】
図１６は、本発明の第２の実施形態に係るプロセッサの構成を示すブロック図である。
第２の実施形態に係るプロセッサは、図１に示した第１の実施形態に係るプロセッサの構成に加え、電力制御装置７１を備えたものである。
【０１０７】
電力制御装置７１以外の処理部が行なう処理は、第１の実施形態と同様である。このため、その詳細な説明はここでは繰り返さない。
【０１０８】
電力制御装置７１は、ループ最終周フラグの情報をもとに電力制御を行う。
図１７に、電力制御装置７１の構成例を示す。ループ最終周フラグの値を反転させるインバータ７１ａと、インバータ７１ａの出力と、ループ実行中であることを示すループ実行中信号との論理積を演算するＡＮＤゲート７１ｂと、ＡＮＤゲート７１ｂの出力を反転させるインバータ７１ｃとを含む。
【０１０９】
この構成例では、最終周以外のループ実行時において、クロックイネーブル信号が０になり、それ以外の場合にはクロックイネーブル信号が１となる。ＡＮＤゲート８１が、現クロック信号とクロックイネーブル信号との論理積を演算し、演算結果をゲーテッドクロック信号として命令メモリ３２に供給することにより、最終周以外のループ実行時において、命令メモリ３２へのクロック供給を停止することができる。また、ループの最終周においては、命令メモリ３２へのクロック供給を再開させることができる。
【０１１０】
一般に、例えばループ部を対象とした電力制御として、命令メモリシステムの停止制御が考えられる。例えば、ループ対象箇所の命令をループ用命令バッファに格納し、ループ実行中にはこのバッファから命令をフェッチさせることで、命令メモリシステムへのアクセスを不要とし、命令メモリシステムの動作を停止させることができる。
【０１１１】
命令メモリシステムの停止は、簡単にはメモリへのアクセス要求信号の送出を抑制することで実現できる。さらに効果的な低電力化のためには、メモリシステムへのクロック供給自身を停止するクロックゲーティングを行うのが良い。
【０１１２】
しかしながら、負荷の重いクロックラインへの論理挿入はプロセッサの動作速度向上に対するネックとなりやすく、高速プロセッサではその適用が困難となる。
【０１１３】
そこで図１７に示した構成を用いることで、ループ終了後の命令メモリシステムへのクロック供給の再開を、メモリへのアクセス要求が発生するよりも早いサイクルで充分な余裕をもって行うことができる。このため、高速プロセッサにおいても命令メモリシステムへのクロック停止による省電力化を実現する事ができる。
【０１１４】
図１８に、図１７に示した電力制御装置７１をパワーゲーティングに用いた構成を示している。
【０１１５】
つまり、インバータ７１ｃの出力をパワーゲートイネーブル信号として利用し、パワーゲートイネーブル信号が１の場合に電源を供給するようにしている。
【０１１６】
ＬＳＩの製造プロセスの微細化に伴って増加の一途を辿っているリーク電流を削減するために、通常の論理用ＭＯＳ回路に直列にリーク阻止用のトランジスタを挿入して電力制御を行うパワーゲーティングの方法が知られている。
【０１１７】
この方法においても、パワーゲーティングのためのトランジスタへのスイッチ操作は高負荷であるために時間がかかるので、論理動作が必要となるよりもはるかに早いタイミングで、スイッチの開通操作が必要である。
【０１１８】
そこで図１８に示した構成を用いることにより、前述のクロックゲーティングへの適用と同様に、アクセスが必要となるよりも早いサイクルでパワーゲーティングの操作を先行的に行え、例えばループ実行中の命令メモリシステム全体のリーク電流削減を容易に行う事ができる。
【０１１９】
以上のように本実施の形態によれば、ループ処理実行中に命令メモリ３２へのクロック供給または電力供給を停止させるとともに、ループの再収集において、命令メモリ３２へのクロック供給または電力供給を再開させることができる。このため、ループ終了後のプロセッサ状態の変更として、電力制御状態を先行的に変更可能である。よって、電力制御のためのペナルティサイクルに起因する性能劣化を伴わずに省電力化が可能である。
【０１２０】
（第３の実施形態）
第３の実施形態は、プロセッサの処理状態として、命令発行制約を変更することを特徴とする。
【０１２１】
図１９は、本発明の第３の実施形態に係るプロセッサの構成を示すブロック図である。
第３の実施形態に係るプロセッサは、図１に示した第１の実施形態に係るプロセッサの構成に加え、命令発行制御装置１０１を備えたものである。
【０１２２】
命令デコード装置３３および命令発行制御装置１０１以外の処理部が行なう処理は、第１の実施形態と同様である。このため、その詳細な説明はここでは繰り返さない。
【０１２３】
命令デコード装置３３は、命令発行制御装置１０１から出力される制御信号に基づいて、命令発行を行なう。
【０１２４】
命令発行制御装置１０１は、ループ最終周フラグの情報をもとに、命令デコード装置３３での命令発行を制御する。
【０１２５】
例えば、マルチスレッドパイプライン構成をとるプロセッサにおいては、スレッド毎の命令発行数を可変制御することで、プロセッサシステム全体のスループット性能の向上を図ることができる。
【０１２６】
図２０は、命令デコード装置３３で発行される命令を時系列に示した図である。命令デコード装置３３は、５つの命令を同時に発行できるものとする。
【０１２７】
例えば、処理を集中的に素早く行うべきループ処理のスレッド（同図のスレッドＡ）には、ループ実行中（時刻ｔ０およびｔ１）に命令発行数の割当てを多めにし、ループ外では（時刻ｔ２、ｔ３）、他のスレッド（同図のスレッドＢ）に命令発行数の割当てを譲ることで、全体の処理を効率化することができる。
【０１２８】
本発明においては、ループ最終周の分岐判定が容易であるので、ループ以後の命令発行数を的確に変更することができる。
【０１２９】
また、プログラム容量の削減のために、多ｂｉｔ長であるがフルセットの命令種類を有する命令フォーマットモードと、容量削減のために命令の組合せを限定したコンパクトなサブセットモードといった、複数の命令ｂｉｔ長の命令フォーマットを有するプロセッサを構成可能である。
【０１３０】
このようなプロセッサにおいては、例えば、図２１に示すように、通常は容量削減版命令フォーマットモードでプロセッサが動作し、ループのように処理能力が必要な局面において、フルセット版の命令フォーマットモードに切り替えることで、処理性能と命令メモリ容量の削減の両立を図ることができる。
【０１３１】
本発明を用いれば、ループ最終周の判定が容易なので、この両立制御を容易にかつ的確に実現できる。
【０１３２】
以上のように本実施の形態によれば、ループ終了後のプロセッサ状態の変更として、命令発行条件の的確な変更が可能である。このため、命令発行数の動的制御によりシステム全体の性能向上を実現可能である。
【０１３３】
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
【産業上の利用可能性】
【０１３４】
本発明は、単一または複数構成からなるマイクロプロセッサ（マイクロコンピュータ，マイクロコントローラ，デジタルシグナルプロセッサを含む）を含む情報処理装置等に適用可能である。
【図面の簡単な説明】
【０１３５】
【図１】本発明の第１の実施形態に係るプロセッサの構成を示すブロック図である。
【図２】プレディケートフラグを用いたアセンブリプログラムの一例を示す図である。
【図３】ループ用分岐命令を含むプログラムの例を示す。（ａ）は、Ｃ言語で記述されたプログラムであり、（ｂ）は、（ａ）に示したプログラムに対応するアセンブリプログラムである。
【図４】ループ用分岐命令（ＢＬＯＯＰ命令）の動作を説明するプログラムの一例を示す図である。
【図５】第１の実施形態に係るプロセッサの実装回路の一例を示す図である。
【図６】プロセッサの動作手順を説明するためのフローチャートである。
【図７】想定するプロセッサのパイプライン構成を説明するための表である。
【図８】プロセッサの動作手順を説明するためのプログラムの一例を示す図である。
【図９】プロセッサの動作手順を説明するためのタイミングチャートである。
【図１０】プロセッサの動作手順を説明するためのタイミングチャートである。
【図１１】プロセッサの制御手順を説明するための状態遷移図である。
【図１２】多重ループを説明するプログラムの一例を示す図である。
【図１３】多重ループを説明するプログラムの一例を示す図である。
【図１４】多重ループにおける最終周判定を説明するための図である。
【図１５】多重ループにおける最終周判定を説明するための図である。
【図１６】本発明の第２の実施形態に係るプロセッサの構成を示すブロック図である。
【図１７】第２の実施形態に係る電力制御装置の構成を示すブロック図である。
【図１８】第２の実施形態に係る電力制御装置の構成を示すブロック図である。
【図１９】本発明の第３の実施形態に係るプロセッサの構成を示すブロック図である。
【図２０】第３の実施形態に係るプロセッサの適用例を示す図である。
【図２１】第３の実施形態に係るプロセッサの適用例を示す図である。
【図２２】プロセッサで実行されるプログラムの一例を示す図であり、（ａ）は、Ｃ言語で記述されたプログラムであり、（ｂ）は、（ａ）に示されるプログラムに対応するアセンブリプログラムである。
【図２３】ループ処理を含むプログラムの一例を示す図である。
【符号の説明】
【０１３６】
３１  命令フェッチ装置
３２  命令メモリ
３３  命令デコード装置
３４  命令実行装置
３５  レジスタファイル
３６  データメモリ
３７  プレディケートフラグ制御装置
３８  ループ分岐予測装置
５２  プレディケートフラグレジスタ
５４  ループ最終周フラグレジスタ
７１  電力制御装置
１０１  命令発行制御装置
【図１】
0005043560.tif 000002
【図２】
0005043560.tif 000003
【図３】
0005043560.tif 000004
【図４】
0005043560.tif 000005
【図５】
0005043560.tif 000006
【図６】
0005043560.tif 000007
【図７】
0005043560.tif 000008
【図８】
0005043560.tif 000009
【図９】
0005043560.tif 000010
【図１０】
0005043560.tif 000011
【図１１】
0005043560.tif 000012
【図１２】
0005043560.tif 000013
【図１３】
0005043560.tif 000014
【図１４】
0005043560.tif 000015
【図１５】
0005043560.tif 000016
【図１６】
0005043560.tif 000017
【図１７】
0005043560.tif 000018
【図１８】
0005043560.tif 000019
【図１９】
0005043560.tif 000020
【図２０】
0005043560.tif 000021
【図２１】
0005043560.tif 000022
【図２２】
0005043560.tif 000023
【図２３】
0005043560.tif 000024