(57)【要約】【課題】状態変化に応じて動的に、且つ効率的にプログラムコードを生成出来るプロセッサシステム及びプログラムコード生成方法を提供すること。【解決手段】第１プログラム５６及び第２プログラム５７を保持するメモリ装置５と、前記第１プログラム５６及び第２プログラム５７を用いたプログラムコードの生成を命令する第１プロセッサ２と、前記命令に応答して前記メモリ装置５から前記第１プログラム５６及び第２プログラム５７を読み出し、前記第１プログラム５６及び第２プログラム５７が互いにデータの依存関係を有しない場合に前記第１プログラム５６及び第２プログラム５７をひとつの前記プログラムコード５８に纏める第２プロセッサ４とを具備し、前記第１プログラム５６のいずれか２つの命令列の間に前記第２プログラム５７のいずれかの命令列を位置させるようにして前記プログラムコード５８が生成される。【選択図】図１３
2008052437.tif 000002
【特許請求の範囲】
【請求項１】
それぞれが複数の命令列を含み、該命令列の少なくとも１つとして演算命令を備える第１プログラム及び第２プログラムを保持するメモリ装置と、
少なくとも前記第１プログラム及び第２プログラムを用いたプログラムコードの生成を命令する第１プロセッサと、
前記第１プロセッサの命令に応答して前記メモリ装置から前記第１プログラム及び第２プログラムを読み出し、前記第１プログラム及び第２プログラムが互いにデータの依存関係を有しない場合に、前記第１プログラム及び第２プログラムをひとつの前記プログラムコードに纏める第２プロセッサと
を具備し、前記第２プロセッサは、前記第１プログラムに含まれるいずれか２つの命令列の間に、前記第２プログラムに含まれるいずれかの命令列を位置させるようにして、前記プログラムコードを生成する
ことを特徴とするプロセッサシステム。
【請求項２】
前記第１プログラムは、前記命令列の少なくとも１つとして無演算命令を含み、
前記第２プロセッサは、前記メモリ装置から読み出された前記第２プログラムがデータストリームとして入力され、該第２プログラムに含まれるレジスタ番号を変更するレジスタ変更部と、
前記第１プログラムと、前記レジスタ変更部において前記レジスタ番号が変更された前記第２プログラムがデータストリームとして入力され、前記第１プログラムと前記第２プログラムとのいずれかに含まれる前記命令列を交互に出力して、前記プログラムコードのデータストリームを生成するプログラム合成部と、
前記レジスタ変更部に対して、前記レジスタ番号が前記第１プログラム及び第２プログラムとの間で互いに異なるように変更するよう命令し、前記プログラム合成部に対して、前記第１プログラムにおける前記無演算命令のタイミングで前記第２プログラムの前記演算命令を出力するよう命令する制御部と
を備えることを特徴とする請求項１記載のプロセッサシステム。
【請求項３】
前記メモリ装置は、複数の前記命令列を含み、該命令列の少なくとも１つとして前記演算命令を備え、且つ前記第１プログラム及び第２プログラムと前記データの依存関係を有する第３プログラムを更に保持し、
前記第２プロセッサは、前記メモリ装置から読み出された前記第２プログラムがデータストリームとして入力され、該第２プログラムに含まれるレジスタ番号を変更する第１レジスタ変更部と、
前記第１プログラムと、前記第１レジスタ変更部において前記レジスタ番号が変更された前記第２プログラムがデータストリームとして入力され、前記第１プログラムと前記第２プログラムとのいずれかに含まれる前記命令列を交互に出力することにより、前記第１プログラムと前記第２プログラムとが纏められた第４プログラムを生成するプログラム合成部と、
前記第１プロセッサにより前記第１乃至第３プログラムを用いて前記プログラムコードの生成を命令された場合に、前記第４プログラムに含まれる前記レジスタ番号を変更する第２レジスタ変更部と、
前記第１レジスタ変更部に対して、前記レジスタ番号が前記第１プログラム及び第２プログラムとの間で互いに異なるように変更するよう命令し、前記プログラム合成部に対して、前記第１プログラムにおける前記無演算命令のタイミングで前記第２プログラムの前記演算命令を出力するよう命令し、前記第２レジスタ変更部に対して、前記レジスタ番号が前記第３プログラムと前記第４プログラムとの間の前記データの前記依存関係を満たすように変更するよう命令する制御部と
を備えることを特徴とする請求項１記載のプロセッサシステム。
【請求項４】
前記第２プロセッサは、前記プログラム合成部からの出力に前記無演算命令が含まれる場合、該無演算命令を削除する無演算命令除去部を更に備える
ことを特徴とする請求項２または３記載のプロセッサシステム。
【請求項５】
メモリ装置から、それぞれが複数の命令列を含み、該命令列の少なくとも１つとして演算命令を備える第１プログラム及び第２プログラムを読み出すステップと、
読み出した前記第２プログラムに含まれるレジスタ番号を、前記第１プログラムとの間で互いに異なるように変更するステップと、
前記第１プログラムに含まれる演算命令と、前記レジスタ番号が変更された前記第２プログラムに含まれる前記演算命令とを交互に出力するステップと、
前記交互に出力された前記演算命令を第３プログラムとして出力するステップと、
前記第３プログラムを実行するステップと
を具備することを特徴とするプログラムコード生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、プロセッサシステム及びプログラムコード生成方法に関する。例えば、複数のプロセッサを備えたプロセッサシステムの構成に関する。
【背景技術】
【０００２】
従来、アプリケーションからプログラムコードを生成するためには、コンパイラ、アセンブラ、及びリンカなどのツールを用いて、静的に行う手法が一般的であった。しかし、これらのツールを用いてプログラムコードを生成する場合、その生成時間が長いことがリアルタイム処理の弊害となる。
【０００３】
そこで、プロセッサ内の演算リソースを時分割で共有実行するようにして、２つの独立したプログラムを動的に合成する手法が提案されている。この技術は、例えばＳＭＴ（Simultaneous Multithreading）やＨＴ（Hyper Threading）として知られている（例えば非特許文献１参照）。
【０００４】
しかしながら上記技術は、１つのプロセッサを仮想的に２つのプロセッサに見せる技術にすぎず、プロセッサの性能を最大限に引き出すには十分と言えるものではなかった。
【特許文献１】インテル、ハイパー・スレッディング・テクノロジー、［online］、［平成１８年７月８日検索］、インターネット＜URL: http://www.intel.co.jp/jp/developer/technology/hyperthread/index.htm＞、＜URL: http://www.intel.co.jp/jp/developer/technology/computing/htt/index.htm＞
【発明の開示】
【発明が解決しようとする課題】
【０００５】
この発明は、状態変化に応じて動的に、且つ効率的にプログラムコードを生成出来るプロセッサシステム及びプログラムコード生成方法を提供する。
【課題を解決するための手段】
【０００６】
この発明の一態様に係るプロセッサシステムは、それぞれが複数の命令列を含み、該命令列の少なくとも１つとして演算命令を備える第１プログラム及び第２プログラムを保持するメモリ装置と、少なくとも前記第１プログラム及び第２プログラムを用いたプログラムコードの生成を命令する第１プロセッサと、前記第１プロセッサの命令に応答して前記メモリ装置から前記第１プログラム及び第２プログラムを読み出し、前記第１プログラム及び第２プログラムが互いにデータの依存関係を有しない場合に、前記第１プログラム及び第２プログラムをひとつの前記プログラムコードに纏める第２プロセッサとを具備し、前記第２プロセッサは、前記第１プログラムに含まれるいずれか２つの命令列の間に、前記第２プログラムに含まれるいずれかの命令列を位置させるようにして、前記プログラムコードを生成する。
【０００７】
またこの発明の一態様に係るプログラムコード生成方法は、メモリ装置から、それぞれが複数の命令列を含み、該命令列の少なくとも１つとして演算命令を備える第１プログラム及び第２プログラムを読み出すステップと、読み出した前記第２プログラムに含まれるレジスタ番号を、前記第１プログラムとの間で互いに異なるように変更するステップと、前記第１プログラムに含まれる演算命令と、前記レジスタ番号が変更された前記第２プログラムに含まれる前記演算命令とを交互に出力するステップと、前記交互に出力された前記演算命令を第３プログラムとして出力するステップと、前記第３プログラムを実行するステップとを具備する。
【発明の効果】
【０００８】
この発明によれば、状態変化に応じて動的に、且つ効率的にプログラムコードを生成出来るプロセッサシステム及びプログラムコード生成方法を提供出来る。
【発明を実施するための最良の形態】
【０００９】
以下、この発明の実施形態を、図面を参照して説明する。この説明に際し、全図にわたり、共通する部分には共通する参照符号を付す。
【００１０】
［第１の実施形態］  
この発明の実施形態に係るプロセッサシステム及びプログラムコード生成方法について、図１を用いて説明する。図１は、本実施形態に係るプロセッサシステムのブロック図である。
【００１１】
図示するようにプロセッサシステム１は、第１プロセッサ２、第２プロセッサ３、コードジェネレータ４、及びメモリ装置５を備えている。第１プロセッサ２は、コードジェネレータ４の動作を制御する。メモリ装置５は、複数のプログラム片を保持する。プログラム片については後述する。コードジェネレータ４は、第１プロセッサ２の制御に基づいて、メモリ装置５からプログラム片を読み出して、プログラムコードを生成する。第２プロセッサ３は、コードジェネレータ４で生成されたプログラムコードを実行する。上記第１プロセッサ２、第２プロセッサ３、コードジェネレータ４、及びメモリ装置５は、プロセッサバス６によって互いに通信可能に接続されている。
【００１２】
第１プロセッサ２及び第２プロセッサ３は、例えばＲＩＳＣ（Reduced Instruction Set Computer）プロセッサ、ＤＳＰ（Digital Signal Processor）、またはＧＰＵ（Graphic Processing Unit）等である。また、メモリ装置５は、ＲＡＭ（Random Access Memory）、ＥＥＰＲＯＭ（Electrically Erasable and Programmable ROM）、フラッシュメモリ等の半導体メモリや、ＨＤＤ（Hard Disc Drive）やＤＶＤ（Digital Versatile Disc）−ＲＷ等の書き込み可能な記憶装置である。
【００１３】
次に、上記プログラム片について説明する。図２は、Ｃ言語で記載したプログラムの一例である。図示するように、プログラム中にはｉｆ文で分岐することにより行われる第１乃至第４の処理が含まれる。図３は、図２のプログラムの処理を示すフローチャートである。
【００１４】
図示するように、条件αが満たされる場合（ステップＳ１０、ＹＥＳ）には、第１の処理が行われ（ステップＳ１１）、プログラムは終了する。条件αが満たされない場合（ステップＳ１０、ＮＯ）には、まず第２の処理が行われる（ステップＳ１２）。そして条件βが満たされる場合（ステップＳ１３、ＹＥＳ）には引き続き第３の処理が行われ（ステップＳ１４）、条件βが満たされない場合（ステップＳ１３、ＮＯ）には第４の処理が行われる（ステップＳ１５）。
【００１５】
プログラム片とは、上記のように１つのプログラムに含まれる個々の処理を、それぞれ個々のプログラムとして断片化したものである。プログラム片同士は、互いにデータの依存関係を有していても有していなくても構わない。すなわち、あるプログラム片において得られたデータを別のプログラム片で用いる場合もあれば、使用するデータがプログラム片間で全く異なるものであっても良い。つまりプログラム片は、１つのプログラムに含まれる命令を自由な単位で細分化することで作成出来る。但し、プログラム片にはループ処理や、再帰関数実行処理を含めないことが望ましい。プログラム片の作成の様子を図４の概念図として示す。図示するように、第１乃至第４の処理に関するプログラムは、それぞれプログラム片Ａ乃至Ｄとして、メモリ装置５に格納される。プログラム片は、第２プロセッサ３において実行可能なように、コンパイル及びアセンブルがなされたバイナリ形式でメモリ装置５に保持される。これらのプログラム片は、互いにデータの依存関係を有する場合もあれば、全く独立した処理である場合もある。プログラム片を作成する場合、当該プログラム片に含まれる命令列の間には、必要に応じてＮＯＰが挿入される。ＮＯＰとは無演算命令のことであり、プログラムコードにおいてデータハザードやパイプラインハザードが生じることにより実行待ちが発生する箇所に挿入される。
【００１６】
また、図２のプログラムにおいて、例えば条件αが満たされる場合の処理として、第１の処理だけでなく、他の処理も行われる場合がある。この場合について図５を用いて説明する。図５はプログラムと、プログラム片との関係を示す概念図である。
【００１７】
図示するように、プログラム上では第１の処理に引き続き第１’の処理と第１”の処理とが記述されていたとする。ここで、これら３つの処理は互いに関連性が無く、時間的に並列的に処理可能なプログラムであったとする。すると、これらの３つの処理に関するプログラムは、それぞれプログラム片Ａ、Ａ’、Ａ”として断片化される。  
以上のように、プログラムを構成する各機能をモジュール化したものがプログラム片である。
【００１８】
次にコードジェネレータ４の構成について図６を用いて説明する。図６はコードジェネレータ４のブロック図である。コードジェネレータ４は、メモリ装置５に格納されるプログラム片のうち必要なものを読み出して、それらを組み合わせることによってプログラムコードを生成する。以下、複数のプログラム片を組み合わせて新たなプログラムコードを生成することを、「合成」と呼ぶことがある。
【００１９】
図示するようにコードジェネレータ４は、データ転送部１０、制御部１１、コード変換部１２、及び合成部１３を備えている。図中において実線矢印はプログラム片及び合成によって得られたプログラムコードの流れを示し、破線矢印はそれ以外の例えば制御信号などの流れを示す。
【００２０】
データ転送部１０はＤＭＡ（Direct Memory Access）コントローラを備えており、プロセッサバス６を介してメモリ装置５との間で、データのＤＭＡ転送を行う。更に、第１プロセッサ２から与えられる制御コマンドを制御部１１へ転送すると共に、制御部１１のステータスを第１プロセッサ２から参照可能とする。
【００２１】
制御部１１は第１プロセッサ２から与えられる制御コマンドに基づいて、コード変換部１２、合成部１３、及びデータ転送部１０の動作を制御する。制御コマンドには、複数のプログラム片のシャッフル（shuffle）による合成コマンドと、連結による合成コマンドとが含まれる。「連結による合成」とは、複数のプログラム片を適切な順序に並べることでプログラムコードを生成することである。また「シャッフルによる合成」とは、複数のプログラム片に含まれる命令を混ぜ込むことにより１つのプログラム片としてプログラムコードを生成することである。なお、プログラム片間でデータの依存関係が無い場合にはシャッフル及び連結の両方を行うことが出来るが、データの依存関係がある場合にはシャッフルは出来ず、連結のみが可能である。連結及びシャッフルの詳細については後述する。
【００２２】
また制御部１１は処理のステートを保持する。このステートは、データ転送部１０を介して第１プロセッサ２によって参照可能である。ステートには、コード変換部１２及び合成部１３の実行状態、処理結果（例えば合成後のプログラムサイズなど）、またはエラー情報等が含まれる。
【００２３】
コード変換部１２は、プログラム片の使用レジスタをオフセットする。なおプログラム片は、プログラムコードストリーム（program code stream）としてデータ転送部１０からコード変換部１２へ入力される。プログラムコードストリームとはプログラム片そのものであるが、プログラム片の先頭から１行ずつ順番にデータストリームとして命令列がコード変換部１２に入力される。
【００２４】
合成部１３は、２つのプログラム片をシャッフルする。合成部１３には、コード変換部１２及び／またはデータ転送部１０から、プログラム片がプログラムコードストリームとして入力される。
【００２５】
コード変換部１２及び合成部１３の構成と動作について図７を用いて説明する。図７はコード変換部１２及び合成部１３のブロック図である。まずコード変換部１２について説明する。図中において実線矢印はプログラムコードストリーム及びレジスタのオフセット値の流れを示し、破線矢印はそれ以外の例えば制御信号などの流れを示す。図示するようにコード変換部１２は、コード解析部２０及びレジスタ加減部３０を備えている。
【００２６】
コード解析部２０は、オペコードデコード部２１及びオペランド分解部２２を含んでいる。オペコードデコード部２１は、データ転送部１０から与えられるプログラムコードストリームを受信してデコードし、演算命令を得る。デコード結果は、オペランド分解部２２及びレジスタ加減部２１に与えられる。オペランド分解部２２はプログラムコードストリームを受信し、オペコードデコード部２１で得られた演算命令に従って、プログラムコードストリームからオペランド（レジスタ番号）を分離する。
【００２７】
レジスタ加減部３０は、統合部３１、加算器３２、及びマルチプレクサ３３を備えている。加算器３２は、オペランド分解部２２から与えられるレジスタ番号に対して、制御部１１から与えられるオフセット値を加算する。マルチプレクサ３３は、加算器３２における加算結果であるレジスタ番号と、オペランド分解部２２から与えられるレジスタ番号とのいずれかを選択する。統合部３１は、マルチプレクサ３３で選択されたレジスタ番号と、オペコードデコード部２１から与えられる演算命令とを統合して、プログラムコードに再構成する。そして再構成したプログラムコードを、プログラムコードストリームとして合成部１３へ出力する。
【００２８】
合成部１３は、ＮＯＰ（no-operation instruction）判定部４０、４１、ストリーム制御部４２、４３、及びシャッフル部４４を備えている。ＮＯＰ判定部４０、４１はそれぞれ、データ転送部１０及びコード変換部１２から与えられるプログラムコードストリームにおいてＮＯＰが含まれるか否かを判定する。ストリーム制御部４２、４３は、シャッフル部４４の命令に応じて、プログラムコードストリームの停止及び再開を制御する。シャッフル部４４は、ストリーム制御部４２、４３から与えられるプログラムコードストリームを１つのプログラムコードストリームにマージして、データ転送部１０へ出力する。より具体的には、一方のプログラムコードストリームを出力している間は、他方のプログラムコードストリームの出力を停止するように、ストリーム制御部４２、４３を制御する。この際、一方のプログラムストリームの２つの命令列間に、他方のプログラムストリームのいずれか１つの命令列が位置するように、２つのプログラムストリームをマージする。より具体的には、例えば、いずれか一方のプログラムコードストリームにおけるＮＯＰを、他方のプログラムコードストリームにおける演算命令で置き換えるようにマージする。これが「シャッフル」である。
【００２９】
次に、上記構成のプロセッサシステム１の動作について、コードジェネレータ４におけるプログラムコードの生成に着目して説明する。図８はプロセッサシステム１の動作の流れを示すフローチャートである。
【００３０】
図示するように、まず第１プロセッサ２がコードジェネレータ４に対して、複数のプログラム片を読み出してプログラムコードを生成するように命令する（ステップＳ２０）。この命令を制御部１１が受信する（ステップＳ２１）。すると制御部１１の命令に従って、データ転送部１０がメモリ装置５に格納される複数のプログラム片を読み出す（ステップＳ２２）。制御部１１は、データ転送部１０で読み出したプログラム片のうち、いずれかについてシャッフルを行うか否かを決定する（ステップＳ２３）。シャッフルを行うか否かについては、ステップＳ２０において予め第１プロセッサから命令が与えられている。シャッフルしない場合（ステップＳ２４、ＮＯ）には、データ転送部１０は読み出した複数のプログラム片の順番を整える（連結する）ことによりプログラムコードを生成し、出力する（ステップＳ２５）。そして、データ転送部１０から出力されたプログラムコードを、第２プロセッサ３が実行する（ステップＳ２６）。
【００３１】
ステップＳ２３においてシャッフルする（ステップＳ２４、ＹＥＳ）と判定した場合には、コード変換部１２及び合成部１３が複数のプログラム片についてシャッフルを行い、１つのプログラム片にする。シャッフルが終了すると、ステップＳ２５に進み、シャッフルにより得られたプログラム片と、シャッフルしなかったプログラム片とを連結し、またはシャッフルにより得られたプログラム片同士を連結して、プログラムコードを得る。  
上記のようにして、コードジェネレータ４で得られたプログラムコードが第２プロセッサ３で実行される。
【００３２】
次に、上記ステップＳ２７のシャッフル処理の詳細について図９を用いて説明する。図９は、ステップＳ２７の処理の内容を示すフローチャートである。  
図示するように、まずコード解析部２０は、バイナリ形式のプログラムコードストリーム（プログラム片）を受信する（ステップＳ３０）。すると、オペコードデコード部２１がプログラムコードストリームをデコードして、演算命令を抽出する（ステップＳ３１）。更にオペランド分解部２２が、プログラムコードストリームからレジスタを抽出する（ステップＳ３２）。次に加算器３２が、制御部１１から与えられるオフセット値と、オペランド分解部２２で抽出されたレジスタのレジスタ番号とを加算する（ステップＳ３３）。引き続きマルチプレクサ３３が適切なレジスタを選択した後（ステップＳ３４）、統合部３１がオペコードデコード部２１で得られた演算命令と、マルチプレクサ３３で選択されたレジスタとを統合する（ステップＳ３５）。以上のコード変換部１２における処理の結果、レジスタ番号が適切な値とされたプログラム片５０が得られる。
【００３３】
次に、コード変換部１２の統合部３１から与えられるプログラム片と、データ転送部１０から与えられる別のプログラム片とにおけるＮＯＰの位置を、合成部１３のＮＯＰ判定部４１が探索する（ステップＳ３６）。次にストリーム制御部４２、４３が、シャッフル部４４の制御に基づいて、一方のプログラム片のＮＯＰの位置に他方のプログラム片の演算命令が位置するように、プログラムコードストリームを出力する（ステップＳ３７）。すなわち、いずれか一方のプログラム片における演算命令の位置をずらす。そしてシャッフル部４４はストリーム制御部４２、４３から与えられるプログラムコードストリームをマージする（ステップＳ３８）。その結果、２つのプログラム片がシャッフルされたプログラム片５１が得られる。その後、シャッフル部４４はプログラム片５１をデータ転送部１０へ出力する。
【００３４】
上記の処理につき、具体例を用いて以下説明する。まずプログラム片の具体例について図１０を用いて説明する。図１０はプログラム片の作成の様子を示す概念図である。ここでは、ベクトル積和演算（ｙ＝Ｘ・Ｚ）の例について示す。
【００３５】
まず、Ｃ言語等のプログラミング言語によって、ベクトル積和演算プログラム５３がユーザによって作成される。このベクトル積和演算プログラム５３をコンパイルすることによって、例えば図示するようなプログラム５４が得られる。引き続き、プログラム５４にＮＯＰが挿入されることによりアセンブラコード５５が生成される。これが、ベクトル積和演算に関するプログラム片となる。但し、実際にメモリ装置５に保持される際には、更にコンパイルを行ってバイナリ形式とされる。なお、図中における各行が、各々の命令列である。
【００３６】
図１０における演算命令について、図１１を用いて簡単に説明する。図１１は演算命令と演算内容との対応関係を示している。図示するように、演算命令「fm a, b, c」は、レジスタaに、レジスタbの内容とレジスタcの内容とを乗算した結果を格納させる命令である。また演算命令「fma a, d, e, a」は、レジスタd,eの内容を乗算した結果と、それまでレジスタaに保持されていた内容とを加算し、この加算結果をレジスタaに格納させる命令である。
【００３７】
すると図１０のプログラム片５５の例であると、$0がデータ出力用のレジスタとして用いられることが分かる。以下、レジスタを示す$i（iは０〜８の自然数）のうち、iをレジスタ番号と呼び、また説明の簡単化のためにレジスタ$iの内容を単にレジスタ$iと呼ぶことにする。まず１行目の命令において、レジスタ$1、$5の乗算結果がレジスタ$0に格納される。次に７行目の命令において、レジスタ$2、$6の乗算結果とレジスタ$0との加算結果がレジスタ$0に上書きされる。次に１３行目の命令において、レジスタ$3、$7の乗算結果とレジスタ$0との加算結果がレジスタ$0に上書きされる。最後に１９行目の命令において、レジスタ$4、$8の乗算結果とレジスタ$0との加算結果がレジスタ$0に上書きされる。
【００３８】
上記のようなベクトル積和演算に関する２つのプログラム片をシャッフルする場合について、以下説明する。なお、２つのプログラム片をそれぞれ第１プログラム片５６、第２プログラム片５７と呼び、第１プログラム片５６、第２プログラム片５７の内容は共に図１０のプログラム片５５と同じであるとする。そして、第１プログラム片５６がデータ転送部１０から直接合成部１３に入力され、第２プログラム片５７がコード変換部１２に入力されるものとする。
【００３９】
まずコード変換部１２における処理について図１２を用いて説明する。図１２はプログラム片の概念図であり、コード変換部１２における処理の様子を示している。第２プログラム片（ストリーム）５７を受信したコード解析部２１は、まずストリーム５７をデコードして演算命令とレジスタとを分離する（ステップＳ３０〜Ｓ３２）。
【００４０】
引き続きレジスタ加減部３０は、制御部１１から与えられるオフセット値（＋１０）を、ストリーム５７内のレジスタに加算する。なおオフセット値（＋１０）は一例に過ぎず、他の値であっても良い。オフセット値とは、第１プログラム片５６と第２プログラム片５７とで、両者のレジスタ番号を互いに異なる値にするために使用されるものである。従ってオフセット値は、両者の使用するレジスタを区別できる値であれば良い。引き続き、マルチプレクサ３３が加算器３２での加算結果を選択して、統合部３１で演算命令とレジスタとが統合される（ステップＳ３３〜Ｓ３５）。統合部で得られたプログラムコードストリームを、以下第３プログラム片と呼ぶことにする。図１２に示すように、第３プログラム片５８は第２プログラム片においてレジスタ$0〜$8がレジスタ$10〜$18に変更されたものである。
【００４１】
次に合成部１３において処理が行われる。この様子を図１３に示す。図１３はプログラム片の概念図であり、合成部１３における処理の様子を示している。合成部１３は第１プログラム片５６と第３プログラム片５７とをシャッフルする。図示するように、第１プログラム片５６と第３プログラム片５７とは、共に１、７、１３、１９行目に演算命令を有している。従ってシャッフル部４４は、第３プログラム片５８の演算命令の位置が、第１プログラム片５６のＮＯＰの場所に位置するように、ストリーム制御部４２、４３を制御する（ステップＳ３６〜Ｓ３８）。
【００４２】
すなわち、まずストリーム制御部４２が第１プログラム片５６の１行目を出力する。次にストリーム制御部４３が第３プログラム片５８の１行目を出力する。これにより、第３プログラム片５８の１行目の命令が、第１プログラム片５６の２行目のＮＯＰを置換したことになる。その後ストリーム制御部４２はＮＯＰを出力した後、第１プログラム片５６の７行目を出力し、次にストリーム制御部４３が第３プログラム片５８の７行目を出力する。引き続きストリーム制御部４２が第１プログラム片５６の１３行目を出力し、次にストリーム制御部４３が第３プログラム片５８の１３行目を出力する。最後にストリーム制御部４２が第１プログラム片５６の１９行目を出力し、次にストリーム制御部４３が第３プログラム片５８の１９行目を出力する。以上の結果、１、７、１３、１９行目に第１プログラム片５６の演算命令を有し、２、８、１４、２０行目に第３プログラム片５８の演算命令を有するプログラム片５９が得られる。すなわち、第１プログラム片５６と第２プログラム片５７とがマージされて、一つのプログラム片５９とされる。更に言い換えれば、第１プログラム片５１の２、８、１４、２０行目のＮＯＰが、第３プログラム片５８の１、７、１３、１９行目の演算命令に置き換えられたものが、プログラム片５９である。
【００４３】
なお、上記の例では２つのプログラム片をシャッフルする場合について説明したが、３つ以上のプログラム片がシャッフルされても良い。次に、６つのプログラム片をシャッフルして一つのプログラム片にマージする例について説明する。以下では、図１４に示すプログラム片を６つシャッフルする場合について説明する。図１４は第１プログラム片６０のアセンブラコードであり、図１０を用いて説明したプログラム片と同様の内容である。
【００４４】
まずコード変換部１２は、第１プログラム片６０のレジスタ番号を＋１０することによって、図１５に示す第２プログラム片６１を生成する。更に第１プログラム片６０のレジスタ番号を＋２０することによって、図１６に示す第３プログラム片６２を生成する。引き続き、第１プログラム片６０のレジスタ番号をそれぞれ＋３０、＋４０、＋５０することによって、図１７乃至図１９に示す第４乃至第６プログラム片６３〜６５を生成する。
【００４５】
そして合成部１３が、第１乃至第６プログラム片６０〜６５をマージして、図２０に示す一つのプログラム片６６にする。すなわちプログラム片６６においては、１、７、１３、１９行目に第１プログラム片６０の演算命令が位置し、２、８、１４、２０行目に第２プログラム片６１の演算命令が位置し、３、９、１５、２１行目に第３プログラム片６２の演算命令が位置し、４、１０、１６、２２行目に第４プログラム片６３の演算命令が位置し、５、１１、１７、２３行目に第５プログラム片６４の演算命令が位置し、６、１２、１８、２４行目に第６プログラム片６５の演算命令が位置する。
【００４６】
合成部１３における第１乃至第６プログラム片６０〜６５のシャッフルは、例えば次のような方法で行うことが出来る。まず、第１プログラム片６０のストリームがＮＯＰ判定部４０に入力され、第２プログラム片６１のストリームがＮＯＰ判定部４１に入力され、両者がストリーム制御部４２、４３及びシャッフル部４４でマージされる。次にマージ結果がＮＯＰ判定部４０に入力され、第３プログラム片６２のストリームがＮＯＰ判定部４１に入力され、両者がマージされる。次にマージ結果がＮＯＰ判定部４０に入力され、第４プログラム片６３のストリームがＮＯＰ判定部４１に入力され、両者がマージされる。この処理を第６プログラム片６５まで繰り返すことにより、プログラム片６６が得られる。
【００４７】
上記のように、この発明の第１の実施形態に係るプロセッサシステム及びプログラムコード生成方法であると、下記（１）の効果が得られる。  
（１）効率的にプログラムコードを生成出来る。  
本実施形態に係るプロセッサシステムであると、機能毎にプログラムを断片化した複数のプログラム片を予め用意している。そして、プログラムの実行時に、必要なプログラム片を読み出し、これらをシャッフルして一つのプログラム片に纏めている。従って、プログラムコードを効率的に生成でき、且つ高速なプログラムコードを生成出来る。本効果について、以下詳細に説明する。
【００４８】
図２１は、プロセッサが処理Ａ、処理Ｂ、処理Ｃを実行する際の様子を示す概念図である。縦軸は、ある期間を１０のステップに分けて示しており、そのうちハッチングを付与した領域が、プロセッサが実際に処理を実行している期間を示している。図示するように、プロセッサが処理Ａを実行する際には、プロセッサは処理ステップ１、３、７、１０において処理を行う。またプロセッサが処理Ｂを実行する際には、プロセッサは処理ステップ５、８において処理を行う。更にプロセッサが処理Ｃを実行する際には、プロセッサは処理ステップ２、４、９において処理を行う。このように、プロセッサがある処理をある期間に実行する際、多くの場合において、当該期間の全ての時間に処理を行っているわけではなく、無駄な空き時間が存在するのが一般的である。
【００４９】
そこで本実施形態では、これらの無駄時間を無くすべく、処理Ａ〜Ｃをひとつのプログラムにまとめて、プロセッサに実行させている。この様子を示しているのが図２２である。図示するようにプロセッサは、処理Ａの空き時間に処理Ｂを行い、処理Ａ、Ｂの空き時間に処理Ｃを行う。その結果、プロセッサの空き時間を削減し、効率的に処理を行うことが出来る。
【００５０】
図２２の処理を実現するために本実施形態では、上記処理Ａ、Ｂ、Ｃをそれぞれプログラム片として用意し、実行時にこれらを１つのプログラム片として纏めてプログラムコードを生成している。この点について図２３を用いて説明する。図２３は、プログラム片の合成の様子を示す概念図である。
【００５１】
図示するように、例えばメモリ装置５にプログラム片Ａ〜Ｊが保持されていたとする。そして第１プロセッサ２から、プログラム片Ａ、Ｂ、Ｃ、Ｅ、Ｉ、Ｊを用いてプログラムコードを作成するよう命令がなされたとする。この際、プログラム片Ａ、Ｂ、Ｃは互いに時間的な処理の重なりがなく、データの依存関係も無かったとする。データの依存関係とは、例えば一方の演算結果を他方が使用するような場合等である。またプログラム片Ｉ、Ｊも同様であったとする。するとコードジェネレータ４は、プログラム片Ａ、Ｂ、Ｃをシャッフルして一つのプログラム片Ａ’に纏める。更にコードジェネレータ４は、プログラム片Ｉ、Ｊをシャッフルして一つのプログラム片Ｉ’に纏める。そしてコードジェネレータ４は、プログラム片Ａ’と、プログラム片Ｅと、プログラム片Ｉ’とを連結して、プログラムコードを生成する。
【００５２】
生成されたプログラムコードは、第２プロセッサ３において実行される。この際、第２プロセッサ３は、プログラム片Ａ、Ｂ、Ｃを実行する際、及びプログラム片Ｉ、Ｊを実行する際には、図２２に示すように、これらのプログラム片に対応する処理を並列的に行う。
【００５３】
プログラムコードの別の生成の例について図２４を用いて説明する。図２４は、プログラム片の合成の様子を示す概念図である。図示するように、メモリ装置５にプログラム片Ａ〜Ｊが保持されていたとする。そして第１プロセッサ２から、プログラム片Ａ、Ｅ、Ｇ、Ｈ、Ｉ、Ｊを用いてプログラムコードを作成するよう命令がなされたとする。するとコードジェネレータ４は、プログラム片Ａ、Ｅを連結して一つのプログラム片Ａ’に纏める。次にコードジェネレータ４は、プログラム片Ａ’、Ｇをシャッフルして一つのプログラム片Ａ”に纏める。引き続きコードジェネレータ４は、プログラム片Ａ”、Ｈを連結して一つのプログラム片Ａ’”に纏める、更にコードジェネレータ４は、プログラム片Ａ’”、Ｉ、Ｊをシャッフルして、プログラムコードを生成する。  
このように、データの依存関係に基づいてコードジェネレータ４は、連結とシャッフルの複数の組み合わせによってプログラムコードを生成する。
【００５４】
以上のように、第１プロセッサの命令に応じて必要なプログラム片のみを必要に応じてシャッフルしてプログラムコードを動的に生成することによって、高速なプログラムコードを効率的に生成出来る。また、シャッフルするプログラム片に応じて、３つ以上のプログラム片をシャッフル出来る。すなわち、一つのプロセッサを擬似的に３つの以上のプロセッサとして動作させることが出来る。従って、従来のＳＭＴ技術に比べて、プロセッサの性能を十分に引き出すことができ、プロセッサシステムの処理能力を飛躍的に向上させることが出来る。
【００５５】
［第２の実施形態］  
次に、この発明の第２の実施形態に係るプロセッサシステム及びプログラムコード生成方法について説明する。本実施形態は上記第１の実施形態において、コード変換部１２を複数設けたものである。図２５は、本実施形態に係るコードジェネレータのブロック図である。
【００５６】
図示するようにコードジェネレータ４は、上記第１の実施形態で説明した図６の構成において、２つのコード変換部１２を備えている。コード変換部１２の出力は、合成部１３のＮＯＰ判定部４０、４１にそれぞれ入力される。その他の構成及び動作は第１の実施形態と同様であるので説明は省略する。
【００５７】
本実施形態に係る構成であると、上記第１の実施形態で説明した（１）の効果に加えて、下記（２）の効果を得られる。  
（２）プログラムコードの生成をより高速化出来る。  
本実施形態に係る構成であると、２つのコード変換部１２が設けられている。従って、シャッフルすべきプログラム片が３つ以上の場合であっても、２つのプログラム片について同時にレジスタ番号の変更を行うことが出来る。従って、プログラムコードの生成を高速化出来る。
【００５８】
なお図２５ではコード変換部１２が２つの場合を示しているが、勿論、３つ以上であっても良い。この場合には、とりあえずコード変換部１２においてレジスタの置換を行い、合成部１３における処理が終了するたびに、コード変換部１２の出力を合成部１３に入力すれば良い。勿論、例えばコード変換部１２を３つ設けた場合に、合成部１３におけるＮＯＰ判定部及びストリーム制御部４２を３つ設ければ、待ち時間無しに３つのプログラム片をシャッフル出来る。
【００５９】
［第３の実施形態］  
次に、この発明の第３の実施形態に係るプロセッサシステム及びプログラムコード生成方法について説明する。本実施形態は上記第１または第２の実施形態において、ＮＯＰを削除するものである。図２６は、本実施形態に係るコードジェネレータ４のブロック図である。
【００６０】
図示するようにコードジェネレータ４は、第２の実施形態で説明した図２５の構成において、更にＮＯＰ除去部７０を備えている。勿論、コード変換部１２が一つしか設けられていない構成や、３つ以上設けられた構成であっても良い。その他の構成は上記第１、第２の実施形態と同様であるので、説明は省略する。
【００６１】
ＮＯＰ除去部７０は、ＮＯＰ判定部７１及びストリーム制御部７２を備えている。ＮＯＰ判定部７１は、合成部１３から出力されるプログラムコードストリームを受信する。そして、受信したプログラムコードストリームに含まれるＮＯＰを検出する。ストリーム制御部７２は、ＮＯＰ除去部７０において検出されたＮＯＰを除去する。そして、ＮＯＰが除去されたプログラムコードストリームを、データ転送部１０へ出力する。
【００６２】
次に、本実施形態に係るコードジェネレータにおけるシャッフル処理の詳細について、図２７を用いて説明する。図２７は、第１の実施形態で説明した図８におけるステップＳ２７の処理の内容を示すフローチャートであり、特にＮＯＰ除去部７０における処理を示している。  
まずコード変換部１２及び合成部１３において、図９で説明したステップＳ３８までの処理が行われる。その結果、２つ以上のプログラム片がシャッフルされたプログラム片５１が得られる。
【００６３】
次にＮＯＰ判定部７１が、合成部１３から出力されるプログラム片（プログラムコードストリーム）５１を受信し、ＮＯＰの位置を探索する（ステップＳ４０）。引き続きストリーム制御部７２が、ＮＯＰ判定部７１で検出されたＮＯＰを除去する（ステップＳ４１）。その結果、ＮＯＰが除去されたプログラム片（プログラムコードストリーム）６７が得られる。そしてストリーム制御部７２は、プログラム片６７をデータ転送部１０へ出力する。
【００６４】
以上の処理の具体例を、図２８を用いて説明する。図２８はプログラム片５１、６７の概念図であり、ＮＯＰ除去部７０における処理の様子を示している。例えば、合成部１３において図示するようなプログラム片５１が得られたとする。なお図２８に示すプログラム片５１の内容は、第１の実施形態で説明したプログラム片５９と同様である。
【００６５】
するとＮＯＰ判定部７１は、プログラムコードストリーム中の３〜６行目、９〜１２行目、１５〜１８行目、及び２１〜２５行目にＮＯＰがあることを検出する。その検出結果に従ってストリーム制御部７２は、プログラムコードストリーム中の３〜６行目、９〜１２行目、１５〜１８行目、及び２１〜２５行目に位置するＮＯＰを除去して、図示するようなプログラム片６７を生成する。つまり、ストリームを出力する際に、１、２行目の演算命令を出力した後、３〜６行目のＮＯＰを出力することなく、７、８行目の演算命令を出力する。
【００６６】
上記のように、この発明の第３の実施形態に係るプロセッサシステムであると、上記第１の実施形態で説明した（１）の効果、及び第２の実施形態で説明した（２）の効果に加えて、下記（３）の効果が得られる。  
（３）プログラムサイズを縮小出来る。  
ＮＯＰは無演算の命令であるから、それ自体は無くてもプログラムの実行に困ることはない。そこで本実施形態では、合成部１３において複数のプログラム片をシャッフルした後、ＮＯＰ除去部７０においてＮＯＰを除去している。その結果、プログラム片のサイズを小さくすることが出来る。例えば図２８の例であると、アセンブラコードのレベルにおいて、合成部１３でシャッフルされた状態では２５行のプログラムコードであったものが、ＮＯＰを除去することで８行のプログラムコードに変換することが出来る。その結果、高速に実行可能なプログラム片が得られる。
【００６７】
［第４の実施形態］  
次に、この発明の第４の実施形態に係るプロセッサシステム及びプログラムコード生成方法について説明する。本実施形態は上記第１または第２の実施形態において、レジスタを置換する手法に関するものである。図２９は、本実施形態に係るコードジェネレータ４のブロック図である。
【００６８】
図示するようにコードジェネレータ４は、第２の実施形態で説明した図２５の構成において、更に入出力変換部８０を備えている。勿論、コード変換部１２が一つしか設けられていない構成や、３つ以上設けられた構成であっても良い。その他の構成は上記第１、第２の実施形態と同様であるので、説明は省略する。
【００６９】
入出力変換部８０は、コード解析部８１及びレジスタ置換部８２を備えている。コード解析部８１は、合成部１３から出力されるプログラムコードストリームを受信する。そして、受信したプログラムコードストリームに含まれるレジスタ番号を検出する。レジスタ置換部８２は、制御部１１からレジスタ置換情報を受信する。レジスタ置換情報とは、いずれかのレジスタのレジスタ番号を所定のレジスタ番号に変更せよ、との情報である。そしてレジスタ置換部８２は、コード解析部８１で検出されたレジスタ番号のいずれかが、レジスタ置換情報において置換対象とされていた場合、当該レジスタ番号をレジスタ置換情報に従って置換する。
【００７０】
次に、本実施形態に係るコードジェネレータにおけるシャッフル処理の詳細について、図３０を用いて説明する。図３０は、第１の実施形態で説明した図８におけるステップＳ２７の処理の内容を示すフローチャートである。  
まずコード変換部１２及び合成部１３において、図９で説明したステップＳ３８までの処理が行われる。その結果、２つ以上ののプログラム片がシャッフルされたプログラム片５１が得られる。
【００７１】
次にコード解析部８１が、合成部１３から出力されるプログラム片（プログラムコードストリーム）５１を受信し、プログラム片５１に含まれるレジスタ番号を抽出する（ステップＳ５０）。引き続きレジスタ置換部８２が、ステップＳ５０で抽出されたレジスタ番号を、レジスタ置換情報に従って置換する（ステップＳ５１）。その結果、レジスタ番号が置換されたプログラム片（プログラムコードストリーム）６８が得られる。そしてレジスタ置換部８２は、プログラム片６８をデータ転送部１０へ出力する。
【００７２】
以上の処理の具体例を、図３１を用いて説明する。図３１はプログラム片５１、６８の概念図であり、入出力変換部８０における処理の様子を示している。例えば、合成部１３において図示するようなプログラム片５１が得られたとする。なお図３１に示すプログラム片５１の内容は、第１の実施形態で説明したプログラム片５９と同様である。
【００７３】
コード解析部８１は、プログラムコードストリーム中に含まれるレジスタ番号$0〜$8、$10〜$18を抽出する。次にレジスタ置換部８２は、抽出されたレジスタ番号とレジスタ置換情報とを比較して、置換対象となるレジスタ番号の有無を確認する。レジスタ置換情報が例えば図３１に示すようであったとする。すなわち、レジスタ番号$1〜$4をレジスタ番号$50〜$53に置換し、レジスタ番号$5〜$8をレジスタ番号$60〜$63に置換し、レジスタ番号$11〜$14をレジスタ番号$70〜$73に置換し、レジスタ番号$15〜$18をレジスタ番号$80〜$83に置換し、レジスタ番号$0、$10をレジスタ番号$100、$110に置換する内容であったとする。図３１の例であると、プログラム片５１に含まれるレジスタ番号は全て置換対象であるので、レジスタ置換部８２は上記レジスタ置換情報に従ってレジスタ番号を置換し、図示するようなプログラム片６８を生成する。
【００７４】
上記のように、この発明の第４の実施形態に係るプロセッサシステムであると、上記第１の実施形態で説明した（１）の効果、及び第２の実施形態で説明した（２）の効果に加えて、下記（４）の効果が得られる。  
（４）プロセッサにおけるプログラム生成支援処理を軽減し、他のプロセスの処理効率を向上出来る。  
例えば２つのプログラム片が互いに全く関連性の無い処理を行う場合には、両者が使用するレジスタは互いに異なっていなければならない。逆にあるプログラム片で使用したデータを別のプログラム片で使用する場合、当該データについては両プログラム片でレジスタ番号を一致させる必要がある。例えば最も簡単な例であると、最初のプログラム片における演算結果を次のプログラム片が使用する場合、最初のプログラム片の演算結果が格納されるレジスタ番号と、次のプログラム片において該演算結果を受けるレジスタ番号とは、等しくなければならない。
【００７５】
この点、制御部１１は第１プロセッサ２の命令により、連結させるべきプログラム片とそれらの関連性について把握している。つまり、いずれのプログラム片についてレジスタ番号を一致させるか、または異ならせる必要があるかが分かっている。従って本実施形態では、入出力変換部８０を設けることによって、プログラム片間において適切なレジスタ番号となるように、各プログラム片のレジスタ番号を変更している。その結果、ソフトウェアの支援無しにレジスタ番号を適切に変更し、複数のプログラム片を連結出来る。つまり、本実施形態に係る入出力変換部８０が設けられない場合、レジスタ番号の変換処理は第１プロセッサ２が行わなければならない。これがプロフラム生成支援処理である。しかし本実施形態であると、レジスタ番号の変換処理をコードジェネレータ４の入出力変換部８０で行っている。従って、第１プロセッサ２はレジスタ番号の変換処理を行う必要がなく、第１プロセッサの負荷が軽減される。その結果第１プロセッサは、軽減された負荷の代わりに他のプロセスの処理を行うことが出来、第１プロセッサにおける処理効率を向上出来る。
【００７６】
より具体的には、例えば第１乃至第３プログラム片を合成してプログラムコードを生成する場合を考える。この際、第１、第２プログラム片間にはデータの依存関係が無く、第３プログラム片と第１、第２プログラム片との間にはデータの依存関係があったとする。そして、第１、第２プログラム片をシャッフルして第４プログラム片を生成し、該第４プログラム片と第３プログラム片とを連結することによりプログラムコードを生成する場合を考える。すると、第４プログラム片と第３プログラム片とは互いにデータの依存関係があるから、これを満たすようにレジスタ番号を変更する必要がある。そこで、第４プログラム片が得られた後、該第４プログラム片におけるレジスタ番号を入出力変換部８０が変更する。この際、第３プログラム片との連結を考慮して、上記依存関係が満たされるように、制御部１１が入出力変換部８０を制御する。
【００７７】
［第５の実施形態］  
次に、この発明の第５の実施形態に係るプロセッサシステム及びプログラムコード生成方法について説明する。本実施形態は、上記第３の実施形態と第４の実施形態とを組み合わせたものである。図３２は、本実施形態に係るコードジェネレータ４のブロック図である。
【００７８】
図示するようにコードジェネレータ４は、第２の実施形態で説明した図２５の構成において、第３の実施形態で説明したＮＯＰ除去部７０と、第４の実施形態で説明した入出力変換部８０とを備えている。ＮＯＰ除去部７０及び入出力変換部８０の構成は、それぞれ第３、第４の実施形態で説明したとおりである。
【００７９】
次に、本実施形態に係るコードジェネレータにおけるシャッフル処理の詳細について、図３３を用いて説明する。図３３は、第１の実施形態で説明した図８におけるステップＳ２７の処理の内容を示すフローチャートである。  
まずコード変換部１２及び合成部１３において、図９で説明したステップＳ３８までの処理が行われる。その結果、２つ以上ののプログラム片がシャッフルされたプログラム片５１が得られる。
【００８０】
次にＮＯＰ除去部７０で処理が行われる。すなわち第３の実施形態で説明したとおり、ＮＯＰ判定部７１が、合成部１３から出力されるプログラム片（プログラムコードストリーム）５１を受信し、ＮＯＰの位置を探索する（ステップＳ４０）。引き続きストリーム制御部７２が、ＮＯＰ判定部７１で検出されたＮＯＰを除去する（ステップＳ４１）。その結果、ＮＯＰが除去されたプログラム片（プログラムコードストリーム）６７が得られる。
【００８１】
次に入出力変換部８０で処理が行われる。すなわち第４の実施形態で説明したとおり、コード解析部８１が、ストリーム制御部７２から出力されるプログラム片（プログラムコードストリーム）６７を受信し、プログラム片６７に含まれるレジスタ番号を抽出する（ステップＳ５０）。引き続きレジスタ置換部８２が、ステップＳ５０で抽出されたレジスタ番号を、レジスタ置換情報に従って置換する（ステップＳ５１）。その結果、レジスタ番号が置換されたプログラム片（プログラムコードストリーム）６８が得られる。そしてレジスタ置換部８２は、プログラム片６８をデータ転送部１０へ出力する。
【００８２】
以上の処理の具体例を、図３４を用いて説明する。図３４はプログラム片５１、６７、６８の概念図であり、ＮＯＰ除去部７０及び入出力変換部８０における処理の様子を示している。例えば、合成部１３において図示するようなプログラム片５１が得られたとする。なお図３４に示すプログラム片５１の内容は、第１の実施形態で説明したプログラム片５９と同様である。
【００８３】
するとＮＯＰ除去部７０は、プログラムコードストリーム中の３〜６行目、９〜１２行目、１５〜１８行目、及び２１〜２５行目に位置するＮＯＰを除去して、図示するようなプログラム片６７を生成する。引き続き入出力変換部８０は、プログラムコードストリーム中に含まれるレジスタ番号$0〜$8、$10〜$18を、レジスタ置換情報に従って置換し、図示するようなプログラム片６８を生成する。
【００８４】
上記のように、この発明の第５の実施形態に係るプロセッサシステムであると、上記第１乃至第４の実施形態で説明した（１）乃至（４）の効果が得られる。
【００８５】
［第６の実施形態］  
次に、この発明の第６の実施形態に係るプロセッサシステム及びプログラムコード生成方法について説明する。本実施形態は上記第１乃至第５の実施形態において、第１プロセッサ２によるコードジェネレータ４の制御方法に関するものである。
【００８６】
一例として、図３５に示すプログラムを実行する場合を例に挙げて説明する。図３５はＣ言語で記述したプログラムである。本プログラムでは条件α、条件β、条件γの３つの条件分岐が存在する。図３５のプログラムをフローチャート化したものを図３６に示す。
【００８７】
上記３つの条件分岐によって、図３５のプログラムは次の６つのケースに場合分けされる。  
＜ケース１＞  
条件α、β、γのいずれも満たされない場合。この場合、条件αが満たされず（ステップＳ６０、ＮＯ）、条件βが満たされない（ステップＳ６１、ＮＯ）ため、まず第１の処理が４回行われる（ステップＳ６２）。次に条件γも満たされない（ステップＳ６３、ＮＯ）ので、第３の処理が行われ（ステップＳ６４）、最後に第４の処理が行われる（ステップＳ６５）。
【００８８】
＜ケース２＞  
条件βが満たされ、条件α、γが満たされない場合。この場合、条件αが満たされず（ステップＳ６０、ＮＯ）、条件βが満たされる（ステップＳ６１、ＹＥＳ）ため、まず第１の処理が２回行われる（ステップＳ６６）。次に条件γが満たされない（ステップＳ６３、ＮＯ）ので、第３の処理が行われ（ステップＳ６４）、最後に第４の処理が行われる（ステップＳ６５）。
【００８９】
＜ケース３＞  
条件αが満たされ、条件γが満たされない場合（この場合、条件βによる分岐は存在しない）。この場合、条件αが満たされる（ステップＳ６０、ＹＥＳ）ため、まず第１の処理が１回行われる（ステップＳ６７）。次に条件γが満たされない（ステップＳ６３、ＮＯ）ので、第３の処理が行われ（ステップＳ６４）、最後に第４の処理が行われる（ステップＳ６５）。
【００９０】
＜ケース４＞  
条件α、βが満たされず、条件γが満たされる場合。この場合、条件αが満たされず（ステップＳ６０、ＮＯ）、条件βが満たされない（ステップＳ６１、ＮＯ）ため、まず第１の処理が４回行われる（ステップＳ６２）。次に条件γが満たされる（ステップＳ６３、ＹＥＳ）ので、第２の処理が行われ（ステップＳ６８）、最後に第４の処理が行われる（ステップＳ６５）。
【００９１】
＜ケース５＞  
条件αが満たされず、条件β、γが満たされる場合。この場合、条件αが満たされず（ステップＳ６０、ＮＯ）、条件βが満たされる（ステップＳ６１、ＹＥＳ）ため、まず第１の処理が２回行われる（ステップＳ６６）。次に条件γが満たされる（ステップＳ６３、ＹＥＳ）ので、第２の処理が行われ（ステップＳ６８）、最後に第４の処理が行われる（ステップＳ６５）。
【００９２】
＜ケース６＞  
条件α、γが満たされる場合（この場合も、条件βによる分岐は存在しない）。この場合、条件αが満たされる（ステップＳ６０、ＹＥＳ）ので、まず第１の処理が１回行われる（ステップＳ６７）。次に条件γが満たされる（ステップＳ６３、ＹＥＳ）ので、第２の処理が行われ（ステップＳ６８）、最後に第４の処理が行われる（ステップＳ６５）。
【００９３】
また図３７の概念図に示すように、メモリ装置５は、第１乃至第４の処理に関するプログラムを断片化して、それぞれをプログラム片Ａ〜Ｄとして保持する。前述の通りこれらのプログラム片Ａ〜Ｄはバイナリ形式とされて、第２プロセッサ３において実行可能な形式とされている。また、プログラム中の第２の処理と第４の処理とは、互いにデータの依存関係を有する。つまり、例えば第４の処理は、第２の処理の処理結果を用いて行われるような処理である。その他の処理同士は依存関係が無く、例えば同時に実行しても、お互いに影響を与える処理では無いものと仮定する。
【００９４】
第１プロセッサ２は、上記ケース１乃至６のそれぞれの場合につき、コードジェネレータ４が読み出すべきプログラム片と、読み出されたプログラム片のうちシャッフルすべきプログラム片及び連結すべきプログラム片の情報を、合成テーブルとして保持する。図３８は、合成テーブルの模式図である。なお図３８において「×」はシャッフルすることを示し、「＋」は連結することを示す。
【００９５】
ケース１の場合、第１の処理が４回行われ、第３、第４の処理がそれぞれ１回行われる。そして、これらの処理には依存関係が無い。従って合成テーブルは、ケース１の合成情報として４つのプログラム片Ａと、１つのプログラム片Ｃ、Ｄを読み出し、且つこれらをシャッフルする、という情報を保持する。
【００９６】
ケース２の場合、第１の処理が２回行われ、第３、第４の処理がそれぞれ１回行われる。そして、これらの処理には依存関係が無い。従って合成テーブルは、ケース２の合成情報として２つのプログラム片Ａと、１つのプログラム片Ｃ、Ｄを読み出し、且つこれらをシャッフルする、という情報を保持する。
【００９７】
ケース３の場合、第１の処理が１回行われ、第３、第４の処理がそれぞれ１回行われる。そして、これらの処理には依存関係が無い。従って合成テーブルは、ケース３の合成情報として１つのプログラム片Ａ、Ｃ、Ｄを読み出し、且つこれらをシャッフルする、という情報を保持する。
【００９８】
ケース４の場合、第１の処理が４回行われ、第２、第４の処理がそれぞれ１回行われる。そして、第２、第４の処理には依存関係があるが、これらと第１の処理との間には依存関係が無い。従って合成テーブルはケース４の合成情報として、プログラム片Ｂ、Ｄをシャッフルすることなく連結し、その連結結果と４つのプログラム片Ａをシャッフルする、という情報を保持する。
【００９９】
ケース５、ケース６の場合は、上記ケース４において読み出すべきプログラム片Ａの数をそれぞれ２つ、１つにしたものである。
【０１００】
第１プロセッサ２は、上記の合成テーブルを用いて、コードジェネレータ４を制御する。例えば実行すべき内容がケース３に該当する場合、第１プロセッサ２はケース３の合成情報に基づいてコードジェネレータ４を制御する。するとコードジェネレータ４は、プログラム片Ａ、Ｂ、Ｃを各１つずつメモリ装置５から読み出し、上記第１乃至第５の実施形態で説明した方法を用いてこれらのプログラム片Ａ、Ｂ、Ｃをシャッフルして一つのプログラム片とする。
【０１０１】
［第７の実施形態］  
次に、この発明の第７の実施形態に係るプロセッサシステム及びプログラムコード生成方法について説明する。上記第１の実施形態においては、一方のプログラムコードストリームにおけるＮＯＰを、他方のプログラムコードストリームにおける演算命令で置き換えることにより、２つのプログラム片をシャッフルする場合について説明した。本実施形態は上記方法とは異なるシャッフル方法に関するものである。なお、プロセッサシステムの構成、及びシャッフル以外のプログラムコード生成方法は、上記第１乃至第６の実施形態と同様であるので説明は省略する。図３９は、本実施形態に係るシャッフル方法のフローチャートであり、第１の実施形態において図９を用いて説明したステップＳ３７、Ｓ３８に相当する。
【０１０２】
図示するように、まず２つのプログラムコードストリーム（プログラム片）が、コードジェネレータ４の備える合成部１３のストリーム制御部４２、４３にそれぞれ入力される（ステップＳ７０）。前述の通り、プログラム片はデータストリームとしてストリーム制御部４２、４３へ入力される。すなわち、プログラム片における命令列が１行毎にストリーム制御部４２、４３へ入力される。ストリーム制御部４２、４３に入力された２つのプログラム片の命令列が共に演算命令であった場合（ステップＳ７１、ＹＥＳ）、いずれか一方のストリーム制御部４２、４３のみが（ストリーム制御部が３つ以上ある場合には、そのうちのいずれか１つのみが）、入力された演算命令をシャッフル部４４へ出力する（ステップＳ７２）。そしてシャッフル部４４は、ストリーム制御部４２、４３のいずれか一方により入力された演算命令を出力する（ステップＳ７３）。
【０１０３】
ステップＳ７３においてシャッフル部４４により出力された演算命令が、当該プログラム片における最終行の命令列で無い場合（ステップＳ７４、ＮＯ）、当該プログラム片における次の行の命令列が、ストリーム制御部４２、４３の一方に入力され、ステップＳ７１に戻る。他方、ステップＳ７３においてシャッフル部４４により出力された演算命令が、当該プログラム片における最終行の命令列である場合（ステップＳ７４、ＹＥＳ）、ストリーム制御部４２、４３の他方が命令列を順次シャッフル部４４へ出力し（ステップＳ７６）、シャッフル部４４は入力された命令列を出力して（ステップＳ７７）、処理は終了する。
【０１０４】
ステップＳ７１において、ストリーム制御部４２、４３に入力された２つのプログラム片の命令列のうち、少なくともいずれか一方がＮＯＰである場合（ステップＳ７１、ＮＯ）、次に両方がＮＯＰであるか否かを判定する（ステップＳ７８）。いずれか一方のプログラム片の命令列のみがＮＯＰであった場合（ステップＳ７８、ＮＯ）、一方のプログラム片におけるＮＯＰと、他方のプログラム片における演算命令とがシャッフル部４４へ出力される（ステップＳ７９）。そしてシャッフル部４４は、入力された演算命令を出力し、ＮＯＰは出力しない（ステップＳ８０）。他方、ステップＳ７８において両方のプログラム片の命令列がＮＯＰであった場合（ステップＳ７８、ＹＥＳ）、ストリーム制御部４２、４３はそれぞれＮＯＰをシャッフル部４４へ出力する（ステップＳ８１）。そしてシャッフル部４４はＮＯＰを出力する（ステップＳ８２）。
【０１０５】
ステップＳ８０またはステップＳ８２の後、シャッフル部４４に入力されたプログラム片の命令列が、当該プログラム片における最終行の命令列で無い場合（ステップＳ８３、ＮＯ）、２つのプログラム片における次の行の命令列が、ストリーム制御部４２、４３の一方に入力され、ステップＳ７１に戻る。他方、いずれかが最終行の命令列である場合（ステップＳ８３、ＹＥＳ）、ステップＳ７６に進む。
【０１０６】
なお、ステップＳ７４またはステップＳ８３において、２つのプログラム片における命令列が、各プログラム片における最終行の命令列であった場合には、ステップＳ７６、Ｓ７７が省略されて、処理は終了する。
【０１０７】
上記処理の具体例につき、以下詳細に説明する。一例として、図４０に示す第１プログラム片８５と第２プログラム片８６とをシャッフルする場合について説明する。図４０は、第１、第２プログラム片８５、８６の内容を示す概念図であり、それぞれ５行の命令列を含んでいる。図中において太字で示しているのが演算命令であり、細字で示しているのが無演算命令（ＮＯＰ）である。第１プログラム片８５は次のような内容である。すなわち、１行目の命令列“and”は論理積演算を行う演算命令であり、２行目の命令列“a”はワードの加算命令であり、３、４行目の命令列“nop”は無演算命令であり、５行目の命令列“mpy”はワードの例えば下位１６ビットの乗算を行う演算命令である。また第２プログラム片８６は次のような内容である。すなわち、１行目の命令列“fm”は浮動小数点数の乗算を行う演算命令であり、２、３、５行目の命令列“nop”は無演算命令であり、４行目の命令列“fma”は浮動小数点数の乗算及び加算を行う演算命令である。勿論、図４０に示すプログラム片は一例に過ぎず、どのような処理内容であっても良い。
【０１０８】
以下、図４１乃至図４６を用いて処理の流れを説明する。図４１乃至図４６は合成部１３の一部領域のブロック図である。まず図４１に示すように、第１、第２プログラム片８５、８６のストリームがそれぞれストリーム制御部４２、４３に入力される（ステップＳ７０）。ストリームであるから、まず第１プログラム片８５における１行目の命令列“and”と、第２プログラム片８６における１行目の命令列“fm”がストリーム制御部４２、４３に入力され（ステップＳ７１、ＹＥＳ）、これらがシャッフル部４４への入力候補となる。図４１の例であると、ストリーム制御部４２によって第１プログラム片８５の演算命令“and”がシャッフル部４４へ入力される（ステップＳ７２）。そして、シャッフル部４４が演算命令“and”を出力する（ステップＳ７３）。
【０１０９】
第１プログラム片８５における１行目の“and”は最終行の命令列でないから（ステップＳ７４、ＮＯ）、次に図４２に示すように第１プログラム片８５における２行目の命令列“a”がストリーム制御部４２に入力される（ステップＳ７５）。従って、第１プログラム片８５における２行目の命令列“a”と、第２プログラム片８６における１行目の命令列“fm”とが、シャッフル部４４への入力候補となる（ステップＳ７１、ＹＥＳ）。図４２の例であると、ストリーム制御部４２によって第２プログラム片８６の演算命令“fm”がシャッフル部４４へ入力される（ステップＳ７２）。そして、シャッフル部４４が演算命令“fm”を出力する（ステップＳ７３）。
【０１１０】
第２プログラム片８６における１行目の“fm”は最終行の命令列でないから（ステップＳ７４、ＮＯ）、次に図４３に示すように第２プログラム片８６における２行目の命令列“nop”がストリーム制御部４３に入力される（ステップＳ７５）。従って、第１プログラム片８５における２行目の命令列“a”と、第２プログラム片８６における２行目の命令列“nop”とが、シャッフル部４４への入力候補となる（ステップＳ７１：ＮＯ、ステップＳ７８：ＮＯ）。するとストリーム制御部４２、４３はそれぞれ、演算命令“a”及び無演算命令“nop”をシャッフル部４４へ入力する（ステップＳ７９）。シャッフル部４４は、ストリーム制御部４３から与えられる命令列がＮＯＰであることをＮＯＰ判定部４１により把握出来るので、ストリーム制御部４２から与えられる演算命令“a”を出力する（ステップＳ８０）。
【０１１１】
第１、第２プログラム片８５、８６における命令列はいずれも最終行の命令列でない（ステップＳ８３、ＮＯ）。従って、図４４に示すように第１プログラム片８５における３行目の命令列“nop”と、第２プログラム片８６における３行目の命令列“nop”とが、ストリーム制御部４２、４３にそれぞれ入力される（ステップＳ８４）。すると、シャッフル部４４への入力候補は共にＮＯＰであるので（ステップＳ７１：ＮＯ、ステップＳ７８：ＹＥＳ）、ストリーム制御部４２、４３はそれぞれ、無演算命令“nop”をシャッフル部４４へ入力する（ステップＳ８１）。そしてシャッフル部４４は“nop”を出力する（ステップＳ８２）。
【０１１２】
以後、第１、第２プログラム片８５、８６につき同様の処理を行う。すなわち図４５に示すように、第１、第２プログラム片８５、８６の命令列“nop”、“fma”が、それぞれストリーム制御部４２、４３に入力され、これらがシャッフル部４４へ入力される。そしてシャッフル部４４は、ストリーム制御部４３から与えられる演算命令“fma”を出力する。引き続き図４６に示すように、第１、第２プログラム片８５、８６の命令列“mpy”、“nop”が、それぞれストリーム制御部４２、４３に入力され、これらがシャッフル部４４へ入力される。そしてシャッフル部４４は、ストリーム制御部４２から与えられる演算命令“mpy”を出力する。
【０１１３】
以上の結果、第１、第２プログラム片８５、８６の最終行に達したので、処理は終了する。図４７は、上記シャッフルの様子を示す概念図である。図示するように、シャッフルにより得られたプログラムコード８７の５、６行目は、第１プログラム片８５における４行目の“nop”を第２プログラム片８６における４行目の“fma”で置き換えるようにして得られる。他方、プログラムコード８７の１〜３行目は、第１プログラム片８５における１行目と２行目の間に、第２プログラム片８６における１行目の“fm”を挿入することで得られる。このように、一方のプログラム片のＮＯＰを他方のプログラム片の演算命令で置き換えるだけでなく、例えば一方のプログラム片における２つの演算命令間に、他方のプログラム片の演算命令を挿入することによってシャッフルを行っても良い。いずれにせよシャッフル処理の内容は、２つのプログラム片が、互いの命令列が交互に位置するようにして１つに纏められるもので出来れば、上記手法に限られるものでは無く、種々の方法を採用することが出来る。
【０１１４】
上記のように、この発明の第１乃至第７の実施形態に係るプロセッサシステム及びプログラムコード生成方法であると、１つのプログラムを機能毎に断片化し、これをプログラム片としてメモリ装置に保持させている。そして、プログラムを実行する際には、必要なプログラム片のみを必要な数だけ読み出し、且つ、データの依存関係が無く時間的に並列処理が可能な複数のプログラム片を、互いのＮＯＰを埋めるようにしてマージして、１つのプログラム片に纏めている。そして、マージ出来ないものについては、適切な順序で互いに連結する。これにより、実行すべきプログラムコードが動的に生成される。従って、プロセッサの性能を十分に引き出すことができ、プロセッサシステムの処理能力を飛躍的に向上させることが出来る。
【０１１５】
なお、上記実施形態ではいくつかの具体的なプログラムを例示して説明したが、これらはあくまで一例にすぎず、上記実施形態はプログラムの内容に関わらず実施可能である。また、第１プロセッサ２はコードジェネレータ４に対してレジスタに関する補助情報を送付しても良い。補助情報とは、例えば各プログラム片で使用されるレジスタ番号の範囲や、入出力に使用するレジスタ番号、または定数レジスタに使用する目的などで番号を固定されるレジスタ番号などである。プログラム片に固定レジスタが含まれる場合には、コード変換部は固定レジスタについてのレジスタ番号とオフセット値との加減算は行わない。
【０１１６】
また上記実施形態では、パイプラインが１本であるプロセッサを例に説明した。しかし、複数のプログラムを並列に実行可能、すなわち複数のパイプラインを実行可能なプロセッサにも上記実施形態は適用可能である。図４８はプログラム片の模式図であり、２本のパイプラインを有するプロセッサの場合におけるシャッフルの様子を示す。
【０１１７】
図示するように、第１プログラム片、第２プログラム片、及びシャッフルされたプログラム片は、それぞれ２列の命令列（２本のパイプライン）を備えている。各列の命令は、時間的に並列に実行される。この場合、同一のパイプライン同士でシャッフルが行われる。なお、「lnop」はＮＯＰと同様に無演算命令であり、lnopを埋めるようにシャッフルが行われる。
【０１１８】
また、図４９のプロセッサシステムのブロック図に示すように、第２プロセッサが存在しない場合でも、上記実施形態は適用出来る。この場合、第１プロセッサ２が第２プロセッサとしての機能を果たす。つまり、第１プロセッサ２がコードジェネレータ４に対してプログラムコードの生成を指示し、この指示によってコードジェネレータ４で生成されたプログラムコードを第１プロセッサ２自身が実行する。コードジェネレータ４が第２プロセッサとしての機能を果たす場合であっても良い。更に図５０のプロセッサシステムのブロック図に示すように、第２プロセッサ３は複数設けられていても良い。この場合、コードジェネレータ４で生成された複数のプログラムコードが、各第２プロセッサ３に割り当てられ、第２プロセッサ３の各々は割り当てられたプログラムコードを実行する。この場合において、いずれかの第２プロセッサ３がコードジェネレータ４としての機能を備えていても良い。
【０１１９】
更に、上記実施形態ではハードウェアを用いてプログラム片のシャッフルを行う場合について説明した。しかし、ソフトウェアを用いて行っても良い。図５１はコードジェネレータ４のブロック図である。図示するようにコードジェネレータ４は、データ転送部１０、ＣＰＵ９０、メインメモリ９１、及びメモリ装置９２を備えている。データ転送部１０、ＣＰＵ９０、メインメモリ９１、及びメモリ装置９２は、プロセッサバス９７によって通信可能とされている。
【０１２０】
上記構成において、データ転送部１０は上記実施形態と同様の機能を有する。またメモリ装置９２は、コード変換プログラム９３、シャッフルプログラム９４、ＮＯＰ除去プログラム９５、及び入出力変換プログラム９６を保持している。コード変換プログラム９３はコード変換部１２における処理を実現するプログラムであり、図９におけるステップＳ３１〜Ｓ３５の処理を行う。シャッフルプログラム９４はシャッフル部４４における処理を実現するプログラムであり、図９におけるステップＳ３６〜Ｓ３９の処理を行う。ＮＯＰ除去プログラム９５はＮＯＰ除去部７０における処理を実現するプログラムであり、図２７におけるステップＳ４０〜Ｓ４２の処理を行う。入出力変換プログラム９６は入出力変換部８０における処理を実現するプログラムであり、図３０におけるステップＳ５０〜Ｓ５２の処理を行う。
【０１２１】
なお、本願発明は上記実施形態に限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で種々に変形することが可能である。更に、上記実施形態には種々の段階の発明が含まれており、開示される複数の構成要件における適宜な組み合わせにより種々の発明が抽出されうる。例えば、実施形態に示される全構成要件からいくつかの構成要件が削除されても、発明が解決しようとする課題の欄で述べた課題が解決でき、発明の効果の欄で述べられている効果が得られる場合には、この構成要件が削除された構成が発明として抽出されうる。
【図面の簡単な説明】
【０１２２】
【図１】この発明の第１の実施形態に係るプロセッサシステムのブロック図。
【図２】プログラムの概念図。
【図３】図２に示すプログラムのフローチャート。
【図４】この発明の第１の実施形態に係るプロセッサシステムにおいて、メモリ装置に保持されるプログラム片と、プログラムの概念図との関係を示す図。
【図５】この発明の第１の実施形態に係るプロセッサシステムにおいて、メモリ装置に保持されるプログラム片と、プログラムの概念図との関係を示す図。
【図６】この発明の第１の実施形態に係るプロセッサシステムの備えるコードジェネレータのブロック図。
【図７】この発明の第１の実施形態に係るコードジェネレータの備えるコード変換部及び合成部のブロック図。
【図８】この発明の第１の実施形態に係るプロセッサシステムにおける処理の様子を示すフローチャート。
【図９】この発明の第１の実施形態に係るコードジェネレータにおける処理の様子を示すフローチャート。
【図１０】この発明の第１の実施形態に係るプロセッサシステムにおいて、プログラム片作成の様子を示す概念図。
【図１１】演算命令と演算内容との関係図。
【図１２】この発明の第１の実施形態に係るプロセッサシステムにおいて使用されるプログラム片の概念図であり、コード変換部における処理の様子を示す図。
【図１３】この発明の第１の実施形態に係るプロセッサシステムにおいて使用されるプログラム片の概念図であり、合成部における処理の様子を示す図。
【図１４】この発明の第１の実施形態に係るプロセッサシステムにおいて使用されるプログラム片の概念図。
【図１５】この発明の第１の実施形態に係るプロセッサシステムにおいて使用されるプログラム片の概念図。
【図１６】この発明の第１の実施形態に係るプロセッサシステムにおいて使用されるプログラム片の概念図。
【図１７】この発明の第１の実施形態に係るプロセッサシステムにおいて使用されるプログラム片の概念図。
【図１８】この発明の第１の実施形態に係るプロセッサシステムにおいて使用されるプログラム片の概念図。
【図１９】この発明の第１の実施形態に係るプロセッサシステムにおいて使用されるプログラム片の概念図。
【図２０】この発明の第１の実施形態に係るプロセッサシステムにおいて使用されるプログラム片の概念図であり、複数のプログラム片がシャッフルされた生成されたプログラム片を示す図。
【図２１】プロセッサにおける処理の様子を示す模式図。
【図２２】この発明の第１の実施形態に係るプログラムコード生成方法によって生成されたプログラム片を実行するプロセッサの処理の様子を示す模式図。
【図２３】この発明の第１の実施形態に係るプロセッサシステムの備えるメモリ装置及びコードジェネレータのブロック図であり、プログラム片を合成する様子を示す図。
【図２４】この発明の第１の実施形態に係るプロセッサシステムの備えるメモリ装置及びコードジェネレータのブロック図であり、プログラム片を合成する様子を示す図。
【図２５】この発明の第２の実施形態に係るコードジェネレータのブロック図。
【図２６】この発明の第３の実施形態に係るコードジェネレータのブロック図。
【図２７】この発明の第３の実施形態に係るコードジェネレータにおける処理の様子を示すフローチャート。
【図２８】この発明の第３の実施形態に係るプロセッサシステムにおいて使用されるプログラム片の概念図であり、ＮＯＰ除去部における処理の様子を示す図。
【図２９】この発明の第４の実施形態に係るコードジェネレータのブロック図。
【図３０】この発明の第４の実施形態に係るコードジェネレータにおける処理の様子を示すフローチャート。
【図３１】この発明の第４の実施形態に係るプロセッサシステムにおいて使用されるプログラム片の概念図であり、入出力変換部における処理の様子を示す図。
【図３２】この発明の第５の実施形態に係るコードジェネレータのブロック図。
【図３３】この発明の第５の実施形態に係るコードジェネレータにおける処理の様子を示すフローチャート。
【図３４】この発明の第５の実施形態に係るプロセッサシステムにおいて使用されるプログラム片の概念図であり、ＮＯＰ除去部及び入出力変換部における処理の様子を示す図。
【図３５】プログラムの概念図。
【図３６】図３５に示すプログラムのフローチャート。
【図３７】この発明の第６の実施形態に係るプロセッサシステムにおいて、図３５に示すプログラムと、プログラム片との関係を示す図。
【図３８】この発明の第６の実施形態に係るプロセッサシステムにおいて、第１プロセッサの備える合成テーブルの模式図。
【図３９】この発明の第７の実施形態に係るコードジェネレータにおけるシャッフル処理のフローチャート。
【図４０】この発明の第７の実施形態に係るプロセッサシステムにおいて使用されるプログラム片の概念図。
【図４１】この発明の第７の実施形態に係るコードジェネレータのブロック図であり、シャッフル処理の様子を示す図。
【図４２】この発明の第７の実施形態に係るコードジェネレータのブロック図であり、シャッフル処理の様子を示す図。
【図４３】この発明の第７の実施形態に係るコードジェネレータのブロック図であり、シャッフル処理の様子を示す図。
【図４４】この発明の第７の実施形態に係るコードジェネレータのブロック図であり、シャッフル処理の様子を示す図。
【図４５】この発明の第７の実施形態に係るコードジェネレータのブロック図であり、シャッフル処理の様子を示す図。
【図４６】この発明の第７の実施形態に係るコードジェネレータのブロック図であり、シャッフル処理の様子を示す図。
【図４７】この発明の第７の実施形態に係るコードジェネレータにおいて、プログラム片と、このプログラム片をシャッフルして得られるプログラムコードの概念図。
【図４８】この発明の第１乃至第７の実施形態の第１変形例に係るプロセッサシステムにおいて使用されるプログラム片の概念図であり、シャッフルの様子を示す図。
【図４９】この発明の第１乃至第７の実施形態の第２変形例に係るプロセッサシステムのブロック図。
【図５０】この発明の第１乃至第７の実施形態の第３変形例に係るプロセッサシステムのブロック図。
【図５１】この発明の第１乃至第７の実施形態の第４変形例に係るプロセッサシステムの備えるコードジェネレータのブロック図。
【符号の説明】
【０１２３】
１…プロセッサシステム、２…第１プロセッサ、３…第２プロセッサ、４…コードジェネレータ、５、９２…メモリ装置、６、９７…プロセッサバス１０…データ転送部、１１…制御部、１２…コード変換部、１３…合成部、２０…コード解析部、２１…オペコードデコード部、２２…オペランド分解部、３０…レジスタ加減部、３１…統合部、３２…加算器、３３…マルチプレクサ、４０、４１…ＮＯＰ判定部、４２、４３、７２…ストリーム制御部、４４…シャッフル部、５０、５１、５５、５７〜６８…プログラム片、５３、５４…プログラム、７０…ＮＯＰ除去部、７１…ＮＯＰ判定部、８０…入出力変換部、８１…コード解析部、８２…レジスタ置換部、９０…ＣＰＵ、９１…メインメモリ、９３…コード変換プログラム、９４…シャッフルプログラム、９５…ＮＯＰ除去プログラム、９６…入出力変換プログラム
【図１】
2008052437.tif 000003
【図２】
2008052437.tif 000004
【図３】
2008052437.tif 000005
【図４】
2008052437.tif 000006
【図５】
2008052437.tif 000007
【図６】
2008052437.tif 000008
【図７】
2008052437.tif 000009
【図８】
2008052437.tif 000010
【図９】
2008052437.tif 000011
【図１０】
2008052437.tif 000012
【図１１】
2008052437.tif 000013
【図１２】
2008052437.tif 000014
【図１３】
2008052437.tif 000015
【図１４】
2008052437.tif 000016
【図１５】
2008052437.tif 000017
【図１６】
2008052437.tif 000018
【図１７】
2008052437.tif 000019
【図１８】
2008052437.tif 000020
【図１９】
2008052437.tif 000021
【図２０】
2008052437.tif 000022
【図２１】
2008052437.tif 000023
【図２２】
2008052437.tif 000024
【図２３】
2008052437.tif 000025
【図２４】
2008052437.tif 000026
【図２５】
2008052437.tif 000027
【図２６】
2008052437.tif 000028
【図２７】
2008052437.tif 000029
【図２８】
2008052437.tif 000030
【図２９】
2008052437.tif 000031
【図３０】
2008052437.tif 000032
【図３１】
2008052437.tif 000033
【図３２】
2008052437.tif 000034
【図３３】
2008052437.tif 000035
【図３４】
2008052437.tif 000036
【図３５】
2008052437.tif 000037
【図３６】
2008052437.tif 000038
【図３７】
2008052437.tif 000039
【図３８】
2008052437.tif 000040
【図３９】
2008052437.tif 000041
【図４０】
2008052437.tif 000042
【図４１】
2008052437.tif 000043
【図４２】
2008052437.tif 000044
【図４３】
2008052437.tif 000045
【図４４】
2008052437.tif 000046
【図４５】
2008052437.tif 000047
【図４６】
2008052437.tif 000048
【図４７】
2008052437.tif 000049
【図４８】
2008052437.tif 000050
【図４９】
2008052437.tif 000051
【図５０】
2008052437.tif 000052
【図５１】
2008052437.tif 000053