(57)【特許請求の範囲】
【請求項１】
高級言語プログラムから複数の操作記述が配置された複数のスロットを含む長語命令形式の機械命令プログラムを生成するコンパイラにおいて、
前記高級言語プログラムから前記プロセッサが同時に並列実行できる複数の操作を各スロットに配置した長語命令形式の命令を生成したのち、
前記命令に含まれるｎｏｐを前記ｎｏｐと同一のスロット中であるか否かに関係なく後に実行される有効な操作に置き換えるとともに、置き換えたことを示す情報と前記置き換えられた有効な操作のあったスロットの情報を前記置き換えられた有効な操作に対応する命令に付加することを特徴とするコンパイラ。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンパイラとプロセッサと記憶媒体とに関し、特に単一命令方式またはVLIW(Very Long Instruction Word)方式のプロセッサの実行コード効率を向上させる技術に関するものを含む。
【０００２】
【従来の技術】
近年の電子技術の発展により、高性能なプロセッサが普及し、あらゆる分野で用いられている。そのようなプロセッサでは命令の並列処理により高い性能を達成している。VLIWと呼ばれるアーキテクチャも命令の並列処理の１つの形態であり、VLIWアーキテクチャを採るプロセッサ（以下、「VLIWプロセッサ」という。）は、内部に複数の演算器を備え、１つの命令に置かれたスロットと呼ばれる複数のフィールドに指定されたオペレーションを同時並列に実行する。このようなVLIWプロセッサの機械命令プログラムは、コンパイラによって高級言語で記述されたプログラムにおけるオペレーションレベルでの並列性が検出されスケジューリングされた後に生成されたものである。機械命令プログラムは実行コードとも呼ばれる。
【０００３】
（第１の従来技術）
図２１は、第１の従来技術におけるプロセッサの構成図である。
【０００４】
第１の従来技術におけるプロセッサは２つのオペレーションを並列実行するもので、図５に示すような第１と第２の２つのスロットからなる命令列で構成されるプログラムがROM１に格納され、それぞれのスロットに書かれたオペレーションが第１命令解読器４と第２命令解読器５とで解読された後、第１演算器１３と第２演算器１４とで実行される。
【０００５】
（第２の従来技術）
図２２は、第２の従来技術におけるプロセッサの構成図である。
【０００６】
第２の従来技術におけるプロセッサは３つのオペレーションを並列実行するものだが、基本的な考え方は第１の従来技術におけるプロセッサと同一であり、図１４に示すような第１から第３の３つのスロットからなる命令列で構成されるプログラムがROM４１に格納され、それぞれのスロットに書かれたオペレーションが第１命令解読器４５から第３命令解読器４７で解読された後、第１演算器５８から第３演算器６０で実行される。つまり、１つの命令を構成するスロットの数が増えたに過ぎない。
【０００７】
【発明が解決しようとする課題】
しかしながら、上記の従来技術ではいずれも、命令中に置かれたノーオペレーションコード（nopコード）によってプログラムサイズが増大する問題がある。なお、プログラムサイズの増大はコード効率の低下とも表現される。VLIWプロセッサの命令の各スロットにはプロセッサが備える複数の演算器に対応したオペレーションが指定されるが、オペレーションの依存関係等により、常に並列実行可能なスロットの数だけのオペレーションがスケジューリングできるとは限らないからである。有効なオペレーションが置けない場合、コンパイラはそのスロットにnopコードを生成する。
【０００８】
上記の第１の従来技術では、例えば図５に示すように、命令２ではBとCの２つの有効なオペレーションを指定することができるが、命令１では第２スロットに有効なオペレーションを指定することができずにnopとなっている。また上記の第２の従来技術では、例えば図１４に示すように、命令１では第２と第３スロットに、命令２では第３スロットに有効なオペレーションを指定することができずにnopとなっている。このように一般にVLIWプロセッサは、命令の並列度が増すほど挿入されるnopコードの数が増加し、コード効率がさらに悪化するという問題がある。これは、コンパイラにおいて全スロットに有効なオペレーションがスケジューリングできる確率が並列度に逆比例することに起因する。
【０００９】
そこで、本発明はかかる点に鑑みてなされたものであり、命令中の無駄領域を低減するコンパイラとプロセッサとを提供することを第１の目的とする。
【００１０】
また、本発明の第２の目的は、VLIWプロセッサにおける命令の並列度の向上に伴うnopコードの増大を軽減するコンパイラとプロセッサとを提供することである。
【００１１】
【課題を解決するための手段】
本願発明のコンパイラは、高級言語プログラムからプロセッサが同時に並列実行できる複数の操作を各スロットに配置した長語命令形式の命令を生成したのち、前記命令に含まれるｎｏｐを前記ｎｏｐと同一のスロット中であるか否かに関係なく後に実行される有効な操作に置き換えるとともに、置き換えたことを示す情報と前記置き換えられた有効な操作のあったスロットの情報を前記置き換えられた有効な操作に対応する命令に付加することを特徴するものである。これにより、ｎｏｐを有効なオペレーションに置き換えることができ、コードサイズを縮小化できる。
【００１３】
【発明の実施の形態】
以下、本発明の実施の形態について、図面を用いて詳細に説明する。
【００１４】
（実施の形態１）
実施の形態１は、ｎｏｐの代わりに有効なオペレーションが配置された命令を一旦蓄積しその後実行するもので、コードサイズの減少を図るものである。
【００１５】
１．コンパイラ
図１は、コンパイラの構成を示すブロック図である。
【００１６】
コンパイラ１０２は、ユーザが記述したＣ言語プログラム１０１を翻訳し、機械命令プログラム１１２を出力する。
【００１７】
コンパイラ１０２は、Ｃ言語プログラム１０１を読込用バッファ１０４に読み込むファイル読込部１０３と、読込用バッファ１０４に読み込まれたＣ言語プログラムの構文や意味を解析して中間コードを生成し中間コード用バッファ１０６に書き込む構文解析部１０５と、中間コード用バッファ１０６に格納された中間コードを入力して命令の２並列実行を目的とする命令のスケジューリングを行い、未圧縮の機械命令プログラムを生成し暫定出力バッファ１０８に書き込む機械命令生成部１０７と、暫定出力バッファ１０８に格納された未圧縮の機械命令プログラムを圧縮して目的とする機械命令プログラムを生成し出力用バッファ１１０に書き込む機械命令圧縮部１０９と、出力用バッファ１１０に格納された機械命令プログラムをファイルに出力するファイル出力部１１１とから構成される。ここで「機械命令プログラムの圧縮」とは、機械命令プログラムの各命令に含まれるnopコードを有効なオペレーションに置き換えることを言う。この圧縮を行う機械命令圧縮部１０９を除く各要素は、公知の技術に基づいて構成すればよいのでここでは説明を省略する。機械命令圧縮部１０９は、以下に詳細に説明するが、次の原理に基づいて動作する。
【００１８】
命令の順に未圧縮の機械命令プログラムを検索して、同順の第１スロットのnopコードと第２スロットのnopコードとのペアを抽出し、このnopコードペアの第１スロットおよび第２スロットを、該ペア以降に最初に現れる有効オペレーションのペアの第１スロットおよび第２スロットのオペレーションでそれぞれ置き換え、置き換えたことをマーキングするとともに、置き換えに使った有効オペレーションのペアを削除する。これにより、２つの有効なオペレーションを含む命令を、これよりも前に存在するｎｏｐの代わりに配置し、ｎｏｐを削減するものである。
【００１９】
図２から図４は、機械命令圧縮部１０９の処理フローを示したフローチャートである。
【００２０】
機械命令圧縮部１０９の処理フローは、以下の動作例を用いて詳細に説明する。
【００２１】
１．１  機械命令圧縮部１０９の動作例
図５は、未圧縮の機械命令プログラムの例示図であり、機械命令生成部１０７が上記した第１の従来技術にならって生成したものである。
【００２２】
命令は第１と第２の２つのスロットで構成され、AからJの記号は有効なオペレーションが、nopはnopコードが生成されていることを示す。
【００２３】
図６は、圧縮された機械命令プログラムの例示図であり、機械命令圧縮部１０９が図５の未圧縮の機械命令プログラムを以下の手順で圧縮したものである。
【００２４】
命令は第１と第２の２つのスロットで構成され、各スロットは１ビットの蓄積ビットとオペレーション（OP）フィールドとからなる。AからJの記号は図５と同様、有効なオペレーションを示す。
【００２５】
以下に、図５のプログラムを入力とした場合における機械命令圧縮部１０９の動作について図２から図６を用いて説明する。
【００２６】
図２に示すように、先ず初期化を行う。初期化は、命令ポインタNを最初の命令、即ち図５の命令１に合わせること、命令先取カウンタmを１にすること、第１スロットnopカウンタC1および第２スロットnopカウンタC2を０にすること、第１スロットバッファカウンタB1を０にすること、第２スロットバッファカウンタB2を０にすることである（ステップS201）。ここで、N、m、C1、C2、B1、B2は機械命令圧縮部１０９の内部的に作られたパラメータである。
【００２７】
次に、Nで示される命令、即ち図５の命令１の型を評価する。命令１は第１スロットが有効なオペレーションAで第２スロットがnopコードなので、「OP(1):nop(2)型」が該当し処理Aへ飛ぶ（ステップS202）。(1)、(2)は第１スロット、第２スロットを意味する。
【００２８】
図３に示す処理Aでは、最初に第２スロットnopカウンタC2をインクリメントしC2=1と、第２スロットバッファカウンタB2をインクリメントしB2=1とする（ステップS301）。次いで機械命令圧縮部１０９の内部的に作られたパラメータC1Xに第１スロットnopカウンタC1の値を代入し、C1X=0となる（ステップS302）。次いで(N+m)で示される命令、即ち図５の命令２の型を評価する。命令２は第１、第２スロットがそれぞれ有効なオペレーションA、Bなので、「OP(1):OP(2)型」が該当しステップS312へ飛ぶ（ステップS303）。今、B2=1でB2≦2を満たしているが、ステップS307のC1X≧1を満たさず（C1=0)次にステップS305へ飛ぶ。ここで、C1X≧１を条件としているのは、OP(1):OP(2)をOP(1):NOP(2)に置き換えるというように、第２スロットのみを置き換えることにより新たに置き換え対象が生成されることを防止するためである。すなわち、この条件を付加することにより、OP(1):OP(2)は最終的にはNOP(1):NOP(2)に置き換えられ、削除されることになる。また、B2≦2を条件としているのは、後述する図７に示すプロセッサは第１、２スロットそれぞれについて２組のバッファを備えており、これを越える置き換えを防止するためである。ここでは(N+m)で示される命令、即ち図５の命令２は最後の命令でないのでステップS306へ移り（ステップS305）、命令先取カウンタmを２にして次の命令に進め、ステップS303に戻る（ステップS306）。
【００２９】
次に(N+m)で示される命令、今度は図５の命令３の型を評価する。命令３は第１スロットが有効なオペレーションDで第２スロットがnopコードなので、「OP(1):nop(2)型」が該当しステップS305へ飛ぶ（ステップS303）。(N+m)で示される命令、即ち図５の命令３は最後の命令でないのでステップS306へ移り（ステップS305）、命令先取カウンタmを３にして次の命令に進め、ステップS303に戻る（ステップS306）。
【００３０】
次に(N+m)で示される命令、今度は図５の命令４の型を評価する。命令４は第１スロットがnopコードで第２スロットが有効なオペレーションEなので、「nop(1):OP(2)型」が該当しステップS304へ飛ぶ（ステップS303）。ここでC1Xに１が足されてC1X=1になる（ステップS304）。(N+m)で示される命令、即ち図５の命令４は最後の命令でないのでステップS306へ移り（ステップS305）、命令先取カウンタmを４にして次の命令に進め、ステップS303に戻る（ステップS306）。
【００３１】
次に(N+m)で示される命令、即ち図５の命令５の型を評価する。命令５は第１、第２スロットがそれぞれ有効なオペレーションF、Gなので、「OP(1):OP(2)型」が該当しステップS312へ飛ぶ（ステップS303）。今、B2=1でB2≦2を満たしており、かつステップS307のC1X≧1（C1X=1)を満たしてステップS308へ飛ぶ。ここでOP(2)は有効なままなのでステップS309へ飛び（ステップS308）、Nで示される命令、即ち図５の命令１の第１スロットの蓄積ビットを”０”にセットするとともに、第２スロットの蓄積ビットを”１”にセットしてOPフィールドをnopの代わりにオペレーションGで埋める。このように、OP(2)が有効であることを確認しているのは、OP(2)が存在していてもすでにｎｏｐの代わりに配置され、実質的には存在しない命令である場合があるからである。こうして図６の命令１が生成される。続いて(N+m)で示される命令、即ち図５の命令５のOP(2)を無効にする（ステップS309）。このときOP(1)はまだ有効なままなので処理Aを終了し、ステップS206へ飛ぶ（ステップS310）。なお、後述するが、OP(1)が無効であるとき（すでに置き換えられているとき）、ステップS311で命令を削除する。
【００３２】
処理Aから戻って、Nで示される命令、即ち図５の命令１は最後の命令でないでのステップS207に移り（ステップS206）、命令ポインタNを次の命令、即ち図５の命令２に進め、命令先取カウンタmを１に戻し、ステップS202へ戻る（ステップS207）。
【００３３】
引き続いてNで示される命令、即ち図５の命令２の型を評価する。命令２は上記の通り「OP(1):OP(2)型」が該当しステップS205に移る（ステップS202）。ここでNで示される命令、即ち図５の命令２の第１および第２スロットの蓄積ビットを”０”にセットする。こうして図６の命令２が生成される。続いてNで示される命令、即ち図５の命令２は最後の命令でないでのステップS207に移り（ステップS206）、命令ポインタNを次の命令、即ち図５の命令３に進め、命令先取カウンタmを１に戻し、ステップS202へ戻る（ステップS207）。
【００３４】
引き続いてNで示される命令、即ち図５の命令３の型を評価する。命令３は上記の通り「OP(1):nop(2)型」が該当し処理Aへ飛ぶ（ステップS202）。
【００３５】
処理Aでは、最初に第２スロットnopカウンタC2をインクリメントしC2=2と、第２スロットバッファカウンタB2をインクリメントしB2=2とする（ステップS301）。次いでパラメータC1Xに第１スロットnopカウンタC1の値を代入し、C1X=0となる（ステップS302）。次いで(N+m)で示される命令、即ち図５の命令４の型を評価する。命令４は上記の通り「nop(1):OP(2)型」が該当しステップS304へ飛ぶ（ステップS303）。ここでC1Xに１が足されてC1X=1になる（ステップS304）。(N+m)で示される命令、即ち図５の命令４は最後の命令でないのでステップS306へ移り（ステップS305）、命令先取カウンタmを２にして次の命令に進め、ステップS303に戻る（ステップS306）。
【００３６】
次に(N+m)で示される命令、即ち図５の命令５の型を評価する。命令５は上記の通り「OP(1):OP(2)型」が該当しステップS307へ飛ぶ（ステップS303）。今、C1X=1なのでC1X≧1を満たしてステップS308へ飛ぶ。ここでOP(2)は以前に無効にされているのでステップS305へ飛ぶ（ステップS308）。(N+m)で示される命令、即ち図５の命令５は最後の命令でないのでステップS306へ移り（ステップS305）、命令先取カウンタmを３にして次の命令に進め、ステップS303に戻る（ステップS306）。
【００３７】
次に(N+m)で示される命令、即ち図５の命令６の型を評価する。命令６は第１スロットがnopコードで第２スロットが有効なオペレーションHなので、「nop(1):OP(2)型」が該当しステップS304へ飛ぶ（ステップS303）。ここでC1Xに１が足されてC1X=2になる（ステップS304）。(N+m)で示される命令、即ち図５の命令６は最後の命令でないのでステップS306へ移り（ステップS305）、命令先取カウンタmを４にして次の命令に進め、ステップS303に戻る（ステップS306）。
【００３８】
次に(N+m)で示される命令、即ち図５の命令７の型を評価する。命令７は第１、第２スロットがそれぞれ有効なオペレーションI、Jなので、「OP(1):OP(2)型」が該当しステップS312へ飛ぶ（ステップS303）。今、B2=2でB2≦2を満たしており、かつステップS307のC1X≧1(C1X=2)を満たしてステップS308へ飛ぶ。ここでOP(2)は有効なままなのでステップS309へ飛び（ステップS308）、Nで示される命令、即ち図５の命令３の第１スロットの蓄積ビットを”０”にセットするとともに、第２スロットの蓄積ビットを”１”にセットしてOPフィールドをnopの代わりにオペレーションJで埋める。こうして図６の命令３が生成される。続いて(N+m)で示される命令、即ち図５の命令７のOP(2)を無効にする（ステップS309）。このときOP(1)はまだ有効なままなので処理Aを終了し、ステップS206へ飛ぶ（ステップS310）。
【００３９】
処理Aから戻って、Nで示される命令、即ち図５の命令３は最後の命令でないでのステップS207に移り（ステップS206）、命令ポインタNを次の命令、即ち図５の命令４に進め、命令先取カウンタmを１に戻し、ステップS202へ戻る（ステップS207）。
【００４０】
引き続いてNで示される命令、即ち図５の命令４の型を評価する。命令４は上記の通り「nop(1):OP(2)型」が該当し処理Bへ飛ぶ（ステップS202）。
【００４１】
処理Bでは、最初に第１スロットnopカウンタC1をインクリメントしC1=1と、第１スロットバッファカウンタB1をインクリメントしB1=1とする（ステップS401）。次いで機械命令圧縮部１０９の内部的に作られたパラメータC2Xに第２スロットnopカウンタC2の値を代入し、C2X=2となる（ステップS402）。次いで(N+m)で示される命令、即ち図５の命令５の型を評価する。命令５は上記の通り「OP(1):OP(2)型」が該当しステップS412へ飛ぶ（ステップS403）。今、B1=1でB1≦2を満たしており、かつステップS407のC2X≧1(C2X=2)を満たしてステップS408へ飛ぶ。ここでOP(1)は有効なままなのでステップS409へ飛び（ステップS408）、Nで示される命令、即ち図５の命令４の第２スロットの蓄積ビットを”０”にセットするとともに、第１スロットの蓄積ビットを”１”にセットしてOPフィールドをnopの代わりにオペレーションFで埋める。こうして図６の命令４が生成される。続いて(N+m)で示される命令、即ち図５の命令５のOP(1)を無効にする（ステップS409）。次にOP(2)は以前に無効にされているのでステップS411へ飛ぶ（ステップS410）。ここで(N+m)で示される命令、即ち図５の命令５を削除し、第１スロットnopカウンタC1および第２スロットnopカウンタC2をデクリメントしC1=0、C2=1と、第１スロットバッファカウンタB1および第２スロットバッファカウンタB2をデクリメントしB1=0、B2=1となる（ステップS411）。これで処理Bを終了し、ステップS206へ飛ぶ。
【００４２】
処理Bから戻って、Nで示される命令、即ち図５の命令４は最後の命令でないでのステップS207に移り（ステップS206）、命令ポインタNを次の命令、即ち図５の命令６（命令５は削除された）に進め、命令先取カウンタmを１に戻し、ステップS202へ戻る（ステップS207）。
【００４３】
引き続いてNで示される命令、即ち図５の命令６の型を評価する。命令６は上記の通り「nop(1):OP(2)型」が該当し処理Bへ飛ぶ（ステップS202）。
【００４４】
処理Bでは、最初に第１スロットnopカウンタC1をインクリメントしC1=1と、第１スロットバッファカウンタB1をインクリメントしB1=1になる（ステップS401）。次いでパラメータC2Xに第２スロットnopカウンタC2の値を代入し、C2X=1となる（ステップS402）。次いで(N+m)で示される命令、即ち図５の命令７の型を評価する。命令７は上記の通り「OP(1):OP(2)型」が該当しステップS412へ飛ぶ（ステップS403）。今、B1=1でB1≦2を満たしており、かつステップS407のC2X≧1(C2X=１)を満たしてステップS408へ飛ぶ。ここでOP(1)は有効なままなのでステップS409へ飛び（ステップS408）、Nで示される命令、即ち図５の命令６の第２スロットの蓄積ビットを”０”にセットするとともに、第１スロットの蓄積ビットを”１”にセットしてOPフィールドをnopの代わりにオペレーションIで埋める。こうして図６の命令５が生成される。続いて(N+m)で示される命令、即ち図５の命令７のOP(1)を無効にする（ステップS409）。次にOP(2)は以前に無効にされているのでステップS411へ飛ぶ（ステップS410）。ここで(N+m)で示される命令、即ち図５の命令７を削除し、第１スロットnopカウンタC1および第２スロットnopカウンタC2をデクリメントしC1=0、C2=0と、第１スロットバッファカウンタB1、第２スロットバッファカウンタB2をデクリメントしB1=0、B2=0となる（ステップS411）。これで処理Bを終了し、ステップS206へ飛ぶ。
【００４５】
処理Bから戻って、Nで示される命令、即ち図５の命令６は最後の命令なので（命令７は削除された）全ての処理を終了する（ステップS206）。
【００４６】
以上のように、図５の未圧縮の機械命令プログラムは図６に示す圧縮された機械命令プログラムに変換される。なお、上記動作例で図３および図４における未通過のステップがあるが、図３および図４は２つのスロットについて相補的であるので説明を省略する。
【００４７】
２．プロセッサ
図７は、プロセッサの概略構成図である。
【００４８】
このプロセッサは、命令フェッチステージ（以下、IFステージ）、解読およびレジスタ読出しステージ（以下、DECステージ）、実行ステージ（以下、EXステージ）の３つのステージからなる３段パイプライン構造を成している。
【００４９】
図７において、１は機械語プログラムを格納するROM、２と３は機械語命令（以下、命令と略す）の第１スロットと第２スロットの内容を格納するそれぞれＩ１ラッチとＩ２ラッチ、４と５はそれぞれＩ１ラッチ２とＩ２ラッチ３に保持された命令の第１スロットと第２スロットの内容を解読しプロセッサ各部を制御する第１命令解読器と第２命令解読器、６はオペランド格納するレジスタファイル、７と８はそれぞれＩ１ラッチ２とＩ２ラッチ３の内容の一部とレジスタファイル６の出力との２入力から１つを選択するＤ１セレクタとＤ２セレクタ、９と１０はそれぞれＤ１セレクタ７とＤ２セレクタ８の出力を格納するＤ１１ラッチとＤ１２ラッチ、１１と１２はレジスタファイル６の出力を格納するＤ２１ラッチとＤ２２ラッチ、１３はＤ１１ラッチ９およびＤ２１ラッチ１１の内容を用いて算術論理演算を行う第１演算器、１４はＤ１２ラッチ１０およびＤ２２ラッチ１２の内容を用いて算術論理演算を行う第２演算器で、第１演算器１３と第２演算器１４の出力はともにレジスタファイル６に接続される。１５と１６はそれぞれＩ１ラッチ２とＩ２ラッチ３に保持された命令の第１スロットと第２スロットの内容を保持するＩＢ１１バッファとＩＢ１２バッファで、両者を合わせてＩＢ１バッファと記す。１７と１８はそれぞれＩ１ラッチ２とＩ２ラッチ３に保持された命令の第１スロットと第２スロットの内容を保持するＩＢ２１バッファとＩＢ２２バッファで、両者を合わせてＩＢ２バッファと記す。ＩＢ１バッファおよびＩＢ２バッファへは各スロットの蓄積ビットが”１”の時に内容が取込まれる。２３、２４はＩＢ１バッファまたはＩＢ２バッファをいずれかを選択して出力するセレクタ、１９はROM１から読出された命令の第１スロットの内容またはセレクタ２３のいずれかを選択してＩ１ラッチ２に出力するＩ１セレクタ、２０はROM１から読出された命令の第２スロットの内容またはセレクタ２４のいずれかを選択してＩ２ラッチ３に出力するＩ２セレクタ、２１、２２はＩ１ラッチ２、Ｉ２ラッチ３に格納されたデータの蓄積ビットが”１”のときｎｏｐ（Ｎｏ  Ｏｐｅｒａｔｉｏｎ）を出力するｎｏｐ生成器、２５、２６は蓄積ビットが”１”となったときは書き込み信号を”０”、”１”と反転して出力し、蓄積ビットが”０”のときは”０”を出力する書き込み信号生成器、２７、２８は命令の蓄積完了を検出するＡＮＤ回路、２９は蓄積した命令をデコード・実行する場合に命令フェッチを止めるための信号等を生成するＯＲ回路、３０、３１はクロックドバッファである。なお、ｎｏｐ生成器２１、２２はＩ１ラッチ２、Ｉ２ラッチ３の出力のそれぞれのビットと、蓄積ビットを反転したものとの論理積を演算するＡＮＤ回路で構成されており、蓄積ビットが”１”のときは、ｎｏｐを意味する（００・・・０）2を出力する。また、書き込み信号生成器２５、２６はＴ形フリップフロップとＡＮＤ回路からなり、正転出力とＴ型フリップフロップのトリガ入力（Ｉ１ラッチ２、Ｉ２ラッチ３の蓄積ビット）との論理積をとるＡＮＤ回路の出力をＩＢ１１バッファ１５、ＩＢ１２バッファ１６への書き込み信号とし、反転出力とＴ型フリップフロップのトリガ入力との論理積をとるＡＮＤ回路の出力をＩＢ２１バッファ１７、ＩＢ２２バッファ１８への書き込み信号としている。
【００５０】
レジスタファイル６は、レジスタR0からR7の汎用レジスタを含み、読出し４ポート、書込み２ポートを有する。即ち、同時に４つのレジスタ（重複は可）の読出しと２つのレジスタ（重複は不可）の書込みを許す。Ｄ１セレクタ７およびＤ２セレクタ８はそれぞれ第１命令解読器４および第２命令解読器５の指示により、命令に即値などの定数値を伴う場合はこれを選択する。
【００５１】
このプロセッサはいわゆるVLIW（Very Long Instruction Word）形式の命令に基づいており、１つの命令で２つの演算などの操作が定義される。第１スロットのオペレーションは、Ｉ１ラッチ２に格納され第１命令解読器４で解読され第１演算器１３で実行される。また第２スロットのオペレーションは、Ｉ２ラッチ３に格納され第２命令解読器５で解読され第２演算器１４で実行される。このようにして同時に２つの操作を実行するためVLIW形式のプロセッサは効率が高い。
【００５２】
２．１  プロセッサの動作例
以下に、図６の機械命令プログラムがROM１に格納された場合における上記構成をもつプロセッサの動作について図８を用いて説明する。
【００５３】
図８は、図６の機械命令プログラムがROM１に格納された場合におけるプロセッサの動作タイミング図である。同図は、プロセッサの動作をパイプラインのIFステージでROM１から読出される命令、DECステージで解読される命令、EXステージで実行される命令と、ＩＢ１バッファおよびＩＢ２バッファが保持する命令をマシンサイクルと呼ばれるタイミング毎に示している。以下、時間が経過する順にタイミング毎にその動作を説明する。なお図中、「：」はスロットの区切りを表し、左が第１スロット、右が第２スロットを意味し、「−」は有効なオペレーションが保持されていないもしくは作用していないことを表す。
【００５４】
また、初期状態として、ＩＢ１１バッファ１５、ＩＢ１２バッファ１６、ＩＢ２１バッファ１７、ＩＢ２２バッファ１８はリセットされているものとする。
【００５５】
（タイミングt1）
・IFステージ：命令１
命令１がROM１から読出され、第１スロット（蓄積ビットが”０”でオペレーションA）がＩ１ラッチ２に、第２スロット（蓄積ビットが”１”でオペレーションG）がＩ２ラッチ３に格納される。すなわち、ＩＢバッファにはまだオペレーションが蓄積されていない（蓄積ビットが”１”でない）ので、Ｉ１ＳＥＬ１９、Ｉ２ＳＥＬ２０はいずれも、ＲＯＭ１からの出力を選択し出力する。
【００５６】
（タイミングt2）
・DECステージ：命令１
蓄積ビットが”１”であるＩ２ラッチ３の内容（蓄積ビットが”１”でオペレーションG）がＩＢ１２バッファ１６に取込まれる。具体的には、蓄積ビットが”１”であるため、書き込み信号生成器２６によりＩＢ１２バッファ１６の書き込み信号がイネーブルとなり、Ｉ２ラッチ３の内容がＩＢ１２バッファ１６に蓄積されることとなる。また、Ｉ２ラッチ３に格納された命令１の第２スロットの蓄積ビットが”１”であるため、ｎｏｐ生成器２２はｎｏｐ（００・・・０）2を出力し、第２命令解読器５はＥＸステージで実質的に何らの動作もしないようなデコード結果を出力する。
【００５７】
一方、Ｉ１ラッチ２に格納された命令１の第１スロットが第１命令解読器４で解読される。解読された結果としてオペレーションAであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１１ラッチ９とＤ２１ラッチ１１に格納される。
・IFステージ：命令２
命令２がROM１から読出され、第１スロット（蓄積ビットが”０”でオペレーションB）がＩ１ラッチ２に、第２スロット（蓄積ビットが”０”でオペレーションC）がＩ２ラッチ３に格納される。
【００５８】
（タイミングt3）
・EXステージ：命令１
Ｄ１１ラッチ９とＤ２１ラッチ１１に格納されたオペランドを第１演算器１３に入力してオペレーションAの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。一方、オペレーションGは蓄積ビットが”１”でｎｏｐ生成器２２によりｎｏｐに無効化されているため、第２演算器１４は作用しない。
・DECステージ：命令２
Ｉ１ラッチ２に格納された命令２の第１スロットが第１命令解読器４で解読される。解読された結果としてオペレーションBであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１１ラッチ９とＤ２１ラッチ１１に格納される。一方、Ｉ２ラッチ３に格納された命令２の第２スロットが第２命令解読器５で解読される。解読された結果としてオペレーションCであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１２ラッチ１０とＤ２２ラッチ１２に格納される。このとき、オペレーションB,Cいずれの蓄積ビットも”０”であるため、いずれのＩＢバッファの書き込み信号もイネーブルとならず、書き込みは行われない。
・IFステージ：命令３
命令３がROM１から読出され、第１スロット（蓄積ビットが”０”でオペレーションD）がＩ１ラッチ２に、第２スロット（蓄積ビットが”１”でオペレーションJ）がＩ２ラッチ３に格納される。
【００５９】
（タイミングt4）
・EXステージ：命令２
Ｄ１１ラッチ９とＤ２１ラッチ１１に格納されたオペランドを第１演算器１３に入力してオペレーションBの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。一方、Ｄ１２ラッチ１０とＤ２２ラッチ１２に格納されたオペランドを第２演算器１４に入力してオペレーションCの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。
・DECステージ：命令３
蓄積ビットが”１”であるＩ２ラッチ３の内容（蓄積ビットが”１”でオペレーションJ）がＩＢ２２バッファ１８に取込まれる。具体的には、蓄積ビットが”１”であるため、ＩＢ１２バッファ１６またはＩＢ２２バッファ１８にデータの書き込みをしようとするが、すでにＩＢ１２バッファ１６にはデータを書き込んだので、書き込み信号生成器２６によりＩＢ２２バッファ１８の書き込み信号がイネーブルになる。また、Ｉ２ラッチ３に格納された命令３の第２スロットの蓄積ビットが”１”であるため、ｎｏｐ生成器２２はｎｏｐを出力し、第２命令解読器５はＥＸステージで実質的に何らの動作もしないようなデコード結果を出力する。
【００６０】
一方、Ｉ１ラッチ２に格納された命令３の第１スロットが第１命令解読器４で解読される。解読された結果としてオペレーションDであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１１ラッチ９とＤ２１ラッチ１１に格納される。
・IFステージ：命令４
命令４がROM１から読出され、第１スロット（蓄積ビットが”１”でオペレーションF）がＩ１ラッチ２に、第２スロット（蓄積ビットが”０”でオペレーションE）がＩ２ラッチ３に格納される。
【００６１】
（タイミングt5）
・EXステージ：命令３
Ｄ１１ラッチ９とＤ２１ラッチ１１に格納されたオペランドを第１演算器１３に入力してオペレーションDの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。一方、オペレーションJは蓄積ビットが”１”でｎｏｐ生成器２２によりｎｏｐに無効化されているため第２演算器１４は作用しない。
・DECステージ：命令４
蓄積ビットが”１”であるＩ１ラッチ２の内容（蓄積ビットが”１”でオペレーションF）がＩＢ１１バッファ１５に取込まれる。具体的には、蓄積ビットが”１”であるため、書き込み信号生成器２５によりＩＢ１１バッファ１５の書き込み信号がイネーブルとなり、Ｉ１ラッチ２の内容がＩＢ１１バッファ１５に蓄積されることとなる。また、Ｉ２ラッチ２に格納された命令４の第１スロットの蓄積ビットが”１”であるため、ｎｏｐ生成器２１はｎｏｐを出力し、第１命令解読器４はＥＸステージで実質的に何らの動作もしないようなデコード結果を出力する。
【００６２】
一方、Ｉ２ラッチ３に格納された命令４の第２スロットが第２命令解読器５で解読される。解読された結果としてオペレーションEであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１２ラッチ１０とＤ２２ラッチ１２に格納される。
・IFステージ：ＩＢ１バッファ蓄積命令
ＩＢ１１バッファ１５とＩＢ１２バッファ１６との蓄積ビットが共に”１”であるため、ＡＮＤ回路２７は蓄積バッファにデータが蓄積されたとして”１”を出力し、さらにＯＲ回路２９が命令フェッチを中断すべく”１”を出力する。これにより、命令フェッチは中断される。これとともに、ＩＢ１１バッファ１５の蓄積ビットが”１”であるので、セレクタ２３、２４はＩＢ１バッファを選択・出力する。さらにＯＲ回路２９の出力により、Ｉ１セレクタ１９、Ｉ２セレクタ２０はそれぞれＩＢ１１バッファ１５、ＩＢ２１バッファ１６を選択し、蓄積された命令はＩ１ラッチ２、Ｉ２ラッチ３に格納される。これにより、ＩＢ１１バッファ１５およびＩＢ２１バッファ１６に格納された命令を使用したことになるので、クロックドバッファ３０によりタイミングを調整して、ＩＢ１１バッファ１５およびＩＢ２１バッファ２１の内容をリセットし、蓄積ビットを”０”とする。なお、ここではバッファそのものをリセットしているが、蓄積ビットのみを”０”としても良い。なお、図面では省略しているが、Ｉ１セレクタ１９およびＩ２セレクタ２０は蓄積された命令を選択するときは蓄積ビットを”０”にして、Ｉ１ラッチ２、Ｉ２ラッチ３に出力する。ｎｏｐ生成器２１、２２が蓄積された命令をｎｏｐに無効化する事を防止するためである。また、セレクタ２３、２４の切り換え信号をＩＢ１１バッファ１５の蓄積ビットのみとしているのは、蓄積された命令が実行されるときは常にＩＢ１１バッファ１５およびＩＢ１２バッファ１６（またはＩＢ２１バッファ１７およびＩＢ２２バッファ１８）の蓄積ビットが”１”となっているため、ＩＢ１２バッファ１６の蓄積ビットまでを見る必要はなく、またＩＢ１バッファに蓄積された命令を実行するということはＩＢ２バッファに蓄積された命令はまだ実行しない状態を意味するからである。このため、ＩＢ１１バッファ１５の蓄積ビットに限らず、いずれかの蓄積ビットの値により切り換え信号とできる。
【００６３】
（タイミングt6）
・EXステージ：命令４
オペレーションFは蓄積ビットが”１”でｎｏｐ生成器２１によりｎｏｐに無効化されているため、第１演算器１３は作用しない。一方、Ｄ１２ラッチ１０とＤ２２ラッチ１２に格納されたオペランドを第２演算器１４に入力してオペレーションEの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。
・DECステージ：ＩＢ１バッファ蓄積命令
Ｉ１ラッチ２に格納された第１スロットが第１命令解読器４で解読される。解読された結果としてオペレーションFであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１１ラッチ９とＤ２１ラッチ１１に格納される。一方、Ｉ２ラッチ３に格納された第２スロットが第２命令解読器５で解読される。解読された結果としてオペレーションGであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１２ラッチ１０とＤ２２ラッチ１２に格納される。
・IFステージ：命令５
命令５がROM１から読出され、第１スロット（蓄積ビットが”１”でオペレーションI）がＩ１ラッチ２に、第２スロット（蓄積ビットが”０”でオペレーションH）がＩ２ラッチ３に格納される。
【００６４】
（タイミングt7）
・EXステージ：ＩＢ１バッファ蓄積命令
Ｄ１１ラッチ９とＤ２１ラッチ１１に格納されたオペランドを第１演算器１３に入力してオペレーションFの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。一方、Ｄ１２ラッチ１０とＤ２２ラッチ１２に格納されたオペランドを第２演算器１４に入力してオペレーションGの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。
・DECステージ：命令５
蓄積ビットが”１”であるＩ１ラッチ２の内容（蓄積ビットが”１”でオペレーションI）がＩＢ２１バッファ１７に取込まれる。具体的には、蓄積ビットが”１”であるため、ＩＢ１１バッファ１５またはＩＢ２１バッファ１７にデータの書き込みをしようとするが、すでにＩＢ１１バッファ１５にはデータを書き込んだので、書き込み信号生成器２５によりＩＢ２１バッファ１７の書き込み信号がイネーブルとなる。また、Ｉ１ラッチ２に格納された命令５の第１スロットの蓄積ビットが”１”であるため、ｎｏｐ生成器２１はｎｏｐを出力し、第１命令解読器４はＥＸステージで実質的に何らの動作もしないようなデコード結果を出力する。
【００６５】
一方、Ｉ２ラッチ３に格納された命令５の第２スロットが第２命令解読器５で解読される。解読された結果としてオペレーションHであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１２ラッチ１０とＤ２２ラッチ１２に格納される。
・IFステージ：ＩＢ２バッファ蓄積命令
ＩＢ２１バッファ１７とＩＢ２２バッファ１８との蓄積フラグが共に”１”であるため、ＡＮＤ回路２７は蓄積バッファにデータが蓄積されたとして”１”を出力し、さらにＯＲ回路２９が命令フェッチを中断すべく”１”を出力する。これにより、命令フェッチは中断される。これとともに、ＩＢ１１バッファ１５の蓄積ビットが”０”である（ＩＢ２バッファに蓄積された命令が存在する可能性がある）ので、セレクタ２３、２４はＩＢ２バッファを選択・出力する。さらに、ＯＲ回路２９の出力によりＩ１セレクタ１９、Ｉ２セレクタ２０はそれぞれＩＢ２１バッファ１７、ＩＢ２２バッファ１８を選択し、蓄積された命令はＩ１ラッチ２、Ｉ２ラッチ３に格納される。これにより、ＩＢ２１バッファ１７およびＩＢ２２バッファ１８に格納された命令を使用したことになるので、クロックドバッファ３１によりタイミングを調整して、ＩＢ２１バッファ１７およびＩＢ２２バッファ１８の内容をリセットし、蓄積フラグを”０”とする。
【００６６】
（タイミングt8）
・EXステージ：命令５
オペレーションIは蓄積ビットが”１”でｎｏｐ生成器２１によりｎｏｐに無効化されているため、第１演算器１３は作用しない。一方、Ｄ１２ラッチ１０とＤ２２ラッチ１２に格納されたオペランドを第２演算器１４に入力してオペレーションHの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。
・DECステージ：ＩＢ２バッファ蓄積命令
Ｉ１ラッチ２に格納された第１スロットが第１命令解読器４で解読される。解読された結果としてオペレーションIであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１１ラッチ９とＤ２１ラッチ１１に格納される。一方、Ｉ２ラッチ３に格納された第２スロットが第２命令解読器５で解読される。解読された結果としてオペレーションJであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１２ラッチ１０とＤ２２ラッチ１２に格納される。
【００６７】
（タイミングt9）
・EXステージ：ＩＢ２バッファ蓄積命令
Ｄ１１ラッチ９とＤ２１ラッチ１１に格納されたオペランドを第１演算器１３に入力してオペレーションIの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。一方、Ｄ１２ラッチ１０とＤ２２ラッチ１２に格納されたオペランドを第２演算器１４に入力してオペレーションJの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。
【００６８】
３．記録媒体
本発明の記録媒体の実施の形態として、図６の機械命令プログラム１１２を記録した磁気ディスク（フロッピーディスクやハードディスクなど）、光ディスク（CD-ROMやPDなど）、光磁気ディスク、半導体メモリ（ROMやフラッシュメモリなど）がある。
【００６９】
以上のように本実施の形態によれば、コンパイラの機械命令圧縮部１０９が、同順の第１スロットのnopコードと第２スロットのnopコードとのペアを抽出し、このnopコードペアの第１スロットおよび第２スロットを、該ペア以降に最初に現れる有効オペレーションのペアの第１スロットおよび第２スロットのオペレーションでそれぞれ置き換え、置き換えに使った有効オペレーションのペアを削除することにより命令中の無駄領域が低減され、プログラムサイズの削減を図ることができる。
【００７０】
また本実施の形態のプロセッサによれば、散在する従来のnopコードの位置に埋められた有効オペレーションを蓄積するＩＢ１バッファおよびＩＢ２バッファを設け、ＩＢ１バッファまたはＩＢ２バッファのいずれかに有効オペレーションが２つ揃った時点でこれを実行することにより、従来の処理性能を保つつ圧縮された機械命令プログラムの実行が可能である。
【００７１】
さらに本実施の形態によれば、従来のnopコードの位置に該nopコードと同じスロットにある有効オペレーションを埋めるという考え方に基づくため、第１スロットと第２スロットとの間でオペレーションを相互に転送する必要がなくなりプロセッサの構成が簡単になるという効果を有する。具体的には、Ｉ１ラッチ２のオペレーションはＩＢ１１バッファ１５またはＩＢ２１バッファ１７にのみ蓄積し、それらに蓄積したオペレーションはＩ１ラッチ２にのみ戻せばよく、逆にＩ２ラッチ３のオペレーションはＩＢ１２バッファ１６またはＩＢ２２バッファ１８にのみ蓄積し、それらに蓄積したオペレーションはＩ２ラッチ３にのみ戻せばよいため、第１スロットと第２スロットとの間の転送路および転送制御手段を必要としない。
【００７２】
なお、本実施形態のプロセッサでは、Ｉ１セレクタ１９およびＩ２セレクタ２０をそれぞれＩ１ラッチ２およびＩ２ラッチ３の入力側に設けているが、それぞれＩ１ラッチ２およびＩ２ラッチ３の出力側に設け、第１命令解読器４および第命令２解読器５の入力を選択するようにしてもよい。このようにする際は、ＩＢ１バッファおよびＩＢ２バッファへの入力をIFステージにおいてROM１から直接行うように変更しなければならないが、ＩＢ１バッファおよびＩＢ２バッファへの取り込みやＩ１セレクタ１９およびＩ２セレクタ２０の選択については本実施形態と同様に蓄積ビットの値で制御すればよい。
【００７３】
また、本実施形態のプロセッサでは、ＩＢ１バッファとＩＢ２バッファとの２つの蓄積バッファを設けているが、いかなる数であってもよい。蓄積バッファの数が多くなるほどnopコードを有効オペレーションで埋める機会が増加し、プログラムサイズの一層の削減が図れる。このことは、例えば本実施形態のプロセッサにおけるＩＢ２バッファがないものとすると、図５の命令３の第２スロットのnopコードは有効オペレーションで埋められないことから容易に伺い知れる。
【００７４】
（実施の形態２）
実施の形態２は、実施の形態１から、nopコードのスロットの有効オペレーションでの埋め方の自由度を高めたものである。
【００７５】
１．コンパイラ
コンパイラの構成は、機械命令圧縮部１０９の動作を除いて実施の形態１に記したものと同じである。機械命令圧縮部１０９は図１０から図１２に示すもので、次の原理に基づいて動作する。
【００７６】
命令の順に未圧縮の機械命令プログラムを検索して、第１スロットと第２スロットのいずれかにかかわらず出現順序が連続する２つのnopコードを抽出し、これらのnopコードのスロットを、該２つのnopコードの以降に最初に現れる有効オペレーションのペアの第１スロットおよび第２スロットのオペレーションでそれぞれ置き換え、置き換えたことをマーキングするとともに、置き換えに使った有効オペレーションのペアを削除し、削除されたペアの直前の命令の第１スロットと第２スロットのいずれかに削除したことをマーキングする。すなわち、実施の形態１のコンパイラでは各スロット毎にnopを削除していたが、本実施の形態におけるコンパイラはスロットを意識せず、nopを出現順に有効なオペレーションに置き換えるものである。このため、いずれかのスロットにnopが集中していた場合でも有効なオペレーションに置き換えることができる。
【００７７】
１．１  機械命令圧縮部１０９の動作例
図９は、圧縮された機械命令プログラムの例示図であり、機械命令圧縮部１０９が図５の未圧縮の機械命令プログラムを上述の手順で圧縮したものである。圧縮された命令は第１と第２の２つのスロットで構成され、各スロットは蓄積ビットと位置ビットとオペレーション（OP）フィールドとからなる。AからJの記号は有効なオペレーションを示す。蓄積ビットと位置ビットは次のようにエンコードしている。
００、０１  何もしない
１０  ＩＢ１バッファに蓄積すべし
１１  ＩＢ２バッファに蓄積すべし
具体的に説明すると、図５の命令５のオペレーションFとオペレーションGとを命令１と命令３とのnopコードのスロットに埋め、命令７のオペレーションIとオペレーションJとを命令４と命令６とのnopコードのスロットに埋め、埋められた以上のスロットの蓄積ビットを０１にセットし、命令５と命令７とを削除する。オペレーションFとオペレーションGとオペレーションIとオペレーションJとは、この順にＩＢ１バッファの第１スロット、第２スロット、ＩＢ２バッファの第１スロット、第２スロットに蓄積されることを前提にしており、削除された命令５の直前の命令４の第２スロットの蓄積ビットには１０を、削除された命令７の直前の命令６の第２スロットの蓄積ビットには１１をセットする。その他のスロットの蓄積ビットは００である。このようにして生成された機械命令プログラムが図９に示すものである。なお図９の命令５は図５の命令６から生成したものである。
【００７８】
図１０と図２とを比べると、ｎｏｐカウンタが１つである点(S501)、位置ビットをセットする点(S505)が異なる。ｎｏｐカウンタを１つとしたのは、本実施の形態では、実施の形態１とは異なりスロットを意識する必要がないからである。ただし、このｎｏｐカウンタは図２のｎｏｐカウンタとは全く異なる用途に使用されるもので、位置ビットの値を決定するためにｎｏｐが出願する度に”０”、”１”を繰り返すものである。
【００７９】
図１１、１２は図３、４と基本的に同じであるが、位置ビットの値をｎｏｐカウンタによって決定しているところが大きく異なる(S609,S709)。また、前述したｎｏｐカウントの用途のため、命令を削除したときはC=0とする点も異なる(S611,S711))。
【００８０】
２．プロセッサ
図１３は、プロセッサのIFステージ部分の概略構成図である。
【００８１】
DECステージおよびEXステージの図示していない部分は図７と同じ構成であり、また実施の形態１と同一の構成要素には同一の符号を付している。図７と比べると、セレクタ３２、３３を有している点が異なる。すなわち、位置ビットの値により、Ｉ１ラッチ２に格納された命令であってもＩＢ１２バッファ１６またはＩＢ２２バッファ１８に、Ｉ２ラッチ３に格納された命令であってもＩＢ１１バッファ１５またはＩＢ２１バッファ１７に命令を蓄積することが可能となり、実施の形態１と比べてさらにｎｏｐを軽減することができる。他の動作は、実施の形態１と同じであるため説明は省略する。
【００８２】
３．記録媒体
本発明の記録媒体の実施の形態として、図９の機械命令プログラムを記録した磁気ディスク（フロッピーディスクやハードディスクなど）、光ディスク（CD-ROMやPDなど）、光磁気ディスク、半導体メモリ（ROMやフラッシュメモリなど）がある。
【００８３】
以上のように本実施の形態によれば、コンパイラの機械命令圧縮部１０９が、第１スロットと第２スロットのいずれかにかかわらず出現順序が連続する２つのnopコードを抽出し、このnopコードスロットを、該２つのnopコードの以降に最初に現れる有効オペレーションのペアの第１スロットおよび第２スロットのオペレーションでそれぞれ置き換え、置き換えに使った有効オペレーションのペアを削除することにより命令中の無駄領域が低減され、プログラムサイズの削減を図ることができる。
【００８４】
また本実施の形態のプロセッサによれば、散在する従来のnopコードの位置に埋められた有効オペレーションを蓄積するＩＢ１バッファおよびＩＢ２バッファを設け、実行させるべき位置の直前の命令中の蓄積ビットでＩＢ１バッファまたはＩＢ２バッファのいずれかを指定して蓄積したオペレーションを実行することにより、従来の処理性能を保つつ圧縮された機械命令プログラムの実行が可能である。
【００８５】
さらに本実施の形態によれば、スロットの位置にかかわらず出現順にnopコードを有効オペレーションで埋めるという考え方に基づくため、nopコードが第１スロットと第２スロットとのいずれにあるかを識別する必要がなくなり、コンパイラの構成が実施の形態１のものより簡単になるという効果を有する。
【００８６】
なお、本実施形態のプロセッサでは、Ｉ１セレクタ１９およびＩ２セレクタ２０をそれぞれＩ１ラッチ２およびＩ２ラッチ３の入力側に設けているが、それぞれＩ１ラッチ２およびＩ２ラッチ３の出力側に設け、第１解読器４および第２解読器５の入力を選択するようにしてもよい。このようにする際は、ＩＢ１バッファおよびＩＢ２バッファへの入力をIFステージにおいてROM１から直接行うように変更し、ROM１から読出された命令の蓄積ビットの値によってＩＢ１セレクタ３１とＩＢ２セレクタ３２とを制御するように変更しなければならないが、ＩＢ１バッファおよびＩＢ２バッファへの取り込みやＩ１セレクタ１９およびＩ２セレクタ２０の選択については本実施形態と同様に蓄積ビットの値で制御すればよい。
【００８７】
また、本実施形態のプロセッサでは、ＩＢ１バッファとＩＢ２バッファとの２つの蓄積バッファを設けているが、いかなる数であってもよい。蓄積バッファの数が多くなるほどnopコードを有効オペレーションで埋める機会が増加し、プログラムサイズの一層の削減が図れる。このことは、例えば本実施形態のプロセッサにおけるＩＢ２バッファがないものとすると、図５の命令４の第１スロットのnopコードは有効オペレーションで埋められないことから容易に伺い知れる。
【００８８】
（実施の形態３）
実施の形態３は、２つのスロットしかない命令で３つのオペレーションを並列実行するVLIWアーキテクチャのコンパイラおよびプロセッサである。
【００８９】
１．コンパイラ
コンパイラの構成は、機械命令生成部１０７と機械命令圧縮部１０９との動作を除いて実施の形態１に記したものと同じである。機械命令生成部１０７は、中間コード用バッファ１０６に格納された中間コードを入力して命令の３並列実行（実施の形態１は２並列実行）を目的とする命令のスケジューリングを行い、未圧縮の機械命令プログラムを生成し暫定出力バッファ１０８に書き込む。機械命令圧縮部１０９は次の原理に基づいて動作する。
【００９０】
命令の順に未圧縮の機械命令プログラムを検索して、第３スロットを除く第１スロットと第２スロットのいずれかにかかわらず出現順序が連続する３つのnopコードを抽出し、これらのnopコードのスロットを、該３つのnopコードの以降に最初に現れる３つの有効オペレーションが指定される命令の第１スロットから第３スロットのオペレーションでそれぞれ置き換え、置き換えたことをマーキングするとともに、置き換えに使った３つの有効オペレーションが指定される命令を削除し、削除されたペアの直前の命令の第１スロットと第２スロットのいずれかに削除したことをマーキングする。
【００９１】
１．１  機械命令圧縮部１０９の動作例
図１５は、圧縮された機械命令プログラムの例示図であり、機械命令圧縮部１０９が図１４の未圧縮の機械命令プログラムを上述の手順で圧縮したものである。圧縮された命令は第１と第２の２つのスロットで構成され、各スロットは２ビットの蓄積ビットとオペレーション（OP）フィールドとからなる。AからHの記号は有効なオペレーションを示す。蓄積ビット（左側）と実行ビット（右側）の２ビットは次のようにエンコードしている。
００  何もしない
１０  オペレーションは置き換えられたものであり、ＩＢバッファに第１、第２、第３スロットの順に逐次蓄積すべし
０１  直後の命令が削除されたので、ＩＢバッファの命令を実行すべし
１１  （未使用）
具体的に説明すると、図１４の命令５のオペレーションFとオペレーションGとオペレーションHとを命令１の第２スロットと命令３の第２スロットと命令４の第１スロットとのnopコードのスロットに埋め、埋められた以上のスロットの蓄積ビットを０１にセットし、命令５を削除する。オペレーションFとオペレーションGとオペレーションHとは、この順にＩＢバッファの第１スロット、第２スロット、第３スロットに蓄積されることを前提にしており、削除された命令５の直前の命令４の第２スロットの蓄積ビットは”１”と実行ビットは”０”とセットする。その他のスロットの蓄積ビットは”０”と実行ビットは”０”とセットする。このようにして生成された機械命令プログラムが図１５に示すものである。なお「ＩＢバッファ」は次に説明する。
【００９２】
２．プロセッサ
図１６は、プロセッサの概略構成図である。
【００９３】
図７と比べると、２つのスロットしかない命令で３つのオペレーションを並列実行するために、２つのスロットの命令をＩＢ３バッファ４１を含む３つのバッファに蓄積することにより内部で３つのスロットの命令に変換するものである。そして、３つ目のスロットの命令を与えるためのＩ３ラッチ３８、ｎｏｐ生成器３９、第３命令解読器４０を有し、さらに３つ目のスロットの命令を実行するためのＤ３セレクタ３４、Ｄ１３ラッチ３５、Ｄ２３ラッチ３６及び第３演算器３７を有する点で異なる。また、リングカウンタ４２により、ＩＢ１バッファ１５、ＩＢ２バッファ１６、ＩＢ３バッファ４１の書き込み信号を順にイネーブルにする。
【００９４】
２．１  プロセッサの動作例
以下に、図１５の機械命令プログラムがROM１に格納された場合における上記構成をもつプロセッサの動作について図１７を用いて説明する。
【００９５】
図１７は、図１５の機械命令プログラムがROM１に格納された場合におけるプロセッサの動作タイミング図である。同図は、プロセッサの動作をパイプラインのIFステージでROM４１から読出される命令、DECステージで解読される命令、EXステージで実行される命令と、ＩＢバッファが保持する命令をマシンサイクルと呼ばれるタイミング毎に示している。以下、時間が経過する順にタイミング毎にその動作を説明する。なお図中、「：」はスロットの区切りを表し、左が第１スロット、中央が第２スロット、右が第３スロットを意味し、「−」は有効なオペレーションが保持されていないもしくは作用していないことを表す。
【００９６】
（タイミングt1）
初期状態として、ＩＢ１バッファ１５、ＩＢ２バッファ１６、ＩＢ３バッファ４１がリセットされ、それぞれに（０・・・００）2が格納されているものとする。また、リングカウンタ４２も初期状態として（００１）2にセットされ、Ｉ１ラッチ２またはＩ２ラッチ３に蓄積ビットが”１”の最初のオペレーションが格納されると（１００）2となり、ＩＢ１バッファ１５にオペレーションが蓄積されることとなる。
・IFステージ：命令１
命令１がROM１から読出され、第１スロット（オペレーションA）がＩ１ラッチ２に、第２スロット（オペレーションF）がＩ２ラッチ３に格納される。Ｉ３ラッチ３８にはＩＢ３バッファ４１の（０・・・００）2が格納される。
【００９７】
（タイミングt2）
・DECステージ：命令１
蓄積ビットが”１”であるＩ２ラッチ３の内容（オペレーションF）がＩＢ１バッファ１５に取込まれる。具体的には、蓄積ビットが”１”である最初のオペレーションなのでリングカウンタ４２が（１００）2を出力することにより、ＩＢ１バッファ１５の書き込み信号がイネーブルとなり、Ｉ２ラッチ３の内容がＩＢ１バッファ１５に蓄積される。
【００９８】
Ｉ１ラッチ２に格納された命令１の第１スロットが第１命令解読器４で解読される。解読された結果としてオペレーションAであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１１ラッチ９とＤ２１ラッチ１１に格納される。一方、Ｉ２ラッチ３に格納された命令１の第２スロットの蓄積ビットが”１”であるため、ｎｏｐ生成器２２はｎｏｐを出力し、第２命令解読器５はＥＸステージで実質的に何らの動作もしないようなデコード結果を出力する。また、３つのスロットの命令を実行する場合以外は第３演算器３７を動作させる必要がないため、実行ビットが”０”のときは、ｎｏｐ生成器３９はｎｏｐを出力する。
・IFステージ：命令２
命令２がROM１から読出され、第１スロット（オペレーションB）がＩ１ラッチ２に、第２スロット（オペレーションC）がＩ２ラッチ３に格納される。Ｉ３ラッチ３１には再びＩＢ３バッファ４１の（０・・・００）2が格納される。
【００９９】
（タイミングt3）
・EXステージ：命令１
Ｄ１１ラッチ９とＤ２１ラッチ１１に格納されたオペランドを第１演算器１３に入力してオペレーションAの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。一方、第２演算器１４と第３演算器３７はｎｏｐ生成器２２、３９により無効化されているため作用しない。
・DECステージ：命令２
Ｉ１ラッチ２に格納された命令２の第１スロットが第１命令解読器４で解読される。解読された結果としてオペレーションBであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１１ラッチ９とＤ２１ラッチ１１に格納される。一方、Ｉ２ラッチ３に格納された命令２の第２スロットが第２命令解読器５で解読される。解読された結果としてオペレーションCであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１２ラッチ１０とＤ２２ラッチ１２に格納される。また、Ｉ３ラッチ３８の実行ビットは”０”であるため、ｎｏｐ生成器３９はｎｏｐを出力し、第３命令解読器４０はＥＸステージで実質的に何らの動作もしないようなデコード結果を出力する。
・IFステージ：命令３
命令３がROM１から読出され、第１スロット（蓄積ビットが（００）2でオペレーションD）がＩ１ラッチ２に、第２スロット（蓄積ビットが（０１）2でオペレーションG）がＩ２ラッチ３に格納される。Ｉ３ラッチ３８には再びＩＢ３バッファ４１の（０・・・００）2が格納される。
【０１００】
（タイミングt4）
・EXステージ：命令２
Ｄ１１ラッチ９とＤ２１ラッチ５５に格納されたオペランドを第１演算器１３に入力してオペレーションBの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。一方、Ｄ１２ラッチ１１とＤ２２ラッチ１２に格納されたオペランドを第２演算器１４に入力してオペレーションCの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。また、第３演算器３７はｎｏｐ生成器３９により無効化されているので作用しない。
・DECステージ：命令３
蓄積ビットが（１０）2であるＩ２ラッチ３の内容（オペレーションG）がＩＢ２バッファ１６に取込まれる。具体的には、タイミングt1とほとんど同様の動作であるが、ＩＢ１バッファ１５にはすでにオペレーションFが蓄積されているので、リングカウンタ４２が（０１０）2を出力することにより、ＩＢ２バッファ１６の書き込み信号がイネーブルとなり、ＩＢ２バッファ１６にオペレーションが蓄積される。
【０１０１】
Ｉ１ラッチ２に格納された命令３の第１スロットが第１命令解読器４で解読される。解読された結果としてオペレーションDであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１１ラッチ９とＤ２１ラッチ５５に格納される。一方、Ｉ２ラッチ３に格納された命令３の第２スロットの蓄積ビットが”１”であるため、ｎｏｐ生成器２２はｎｏｐを出力し、第２命令解読器５はＥＸステージで実質的に何らの動作もしないようなデコード結果を出力する。また、実行フラグは”０”であるため、ｎｏｐ生成器３９はｎｏｐを出力し、第３命令解読器４０はＥＸステージで実質的に何らの動作もしないようなデコード結果を出力する。
・IFステージ：命令４
命令４がROM１から読出され、第１スロット（オペレーションH）がＩ１ラッチ２に、第２スロット（オペレーションE）がＩ２ラッチ３に格納される。Ｉ３ラッチ３８には再びＩＢ３バッファ４１の（０・・・００）2が格納される。
【０１０２】
（タイミングt5）
・EXステージ：命令３
Ｄ１１ラッチ９とＤ２１ラッチ５５に格納されたオペランドを第１演算器１３に入力してオペレーションDの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。一方、第２演算器１４と第３演算器３７とはｎｏｐ生成器２２、３９により無効化されているので作用しない。
・DECステージ：命令４
蓄積ビットが”１”であるＩ１ラッチ２の内容（オペレーションH）がＩＢ３バッファ４１に取込まれる。このとき、ＩＢ１バッファ１５、ＩＢ２バッファ１６には既にオペレーションが蓄積されているので、リングカウンタ４２は（００１）2を出力することによりＩＢ３バッファ４１の書き込み信号がイネーブルとなり、ＩＢ３バッファ４１にオペレーションが蓄積される。また、Ｉ１ラッチ２に格納された命令４の第１スロットの蓄積ビットが”１”であるため、ｎｏｐ生成器２１はｎｏｐを出力し、第１命令解読器４はＥＸステージで実質的に何らの動作もしないようなデコード結果を出力する。
【０１０３】
一方、Ｉ２ラッチ３に格納された命令４の第２スロットが第２命令解読器５で解読される。解読された結果としてオペレーションEであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１２ラッチ１１とＤ２２ラッチ１２に格納される。また、実行フラグは”０”であるため、ｎｏｐ生成器３９はｎｏｐを出力し、第３命令解読器４０は実行ステージで実質的に何らの動作もしないようなデコード結果を出力する。
・IFステージ：ＩＢバッファ蓄積命令
Ｉ２ラッチ３に格納された命令４の第２スロットの実行ビットが”１”であるため、命令フェッチ制御部により命令フェッチを中断する。これとともに、Ｉ１セレクタ１９、Ｉ２セレクタ２０がそれぞれＩＢ１バッファ１５、ＩＢ２バッファ１６を選択し、Ｉ１ラッチ２、Ｉ２ラッチ３、Ｉ３ラッチ３８にはＩＢ１バッファ１５、ＩＢ２バッファ１６、ＩＢ３バッファ４１の内容が格納される。そして、Ｉ３ラッチ３８の実行ビットが”１”となると、ＩＢバッファの内容をリセットする。
【０１０４】
（タイミングt6）
・EXステージ：命令４
第１演算器１３、第３演算器３７はｎｏｐ生成器２１、ｎｏｐ生成器３９により無効化されているので作用しない。一方、Ｄ１２ラッチ１０とＤ２２ラッチ１２に格納されたオペランドを第２演算器１４に入力してオペレーションEの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。
・DECステージ：ＩＢバッファ蓄積命令
Ｉ１ラッチ２に格納された第１スロットが第１命令解読器４で解読される。解読された結果としてオペレーションFであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１１ラッチ９とＤ２１ラッチ５５に格納される。一方、Ｉ２ラッチ３に格納された第２スロットが第２命令解読器５で解読される。解読された結果としてオペレーションGであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１２ラッチ１１とＤ２２ラッチ１２に格納される。また、Ｉ３ラッチ３に格納された第３スロットが第３命令解読器４０で解読される。すなわち、実行ビットが”１”であるため、ｎｏｐ生成器３９はＩ３ラッチ３８の内容をそのまま出力し、解読された結果としてオペレーションHであることが判明する。この解読に基づいてレジスタファイル６から汎用レジスタが読出され、読出された値または命令中の定数値がＤ１３ラッチ３５とＤ２３ラッチ３６に格納される。
【０１０５】
（タイミングt7）
・EXステージ：ＩＢバッファ蓄積命令
Ｄ１１ラッチ９とＤ２１ラッチ５５に格納されたオペランドを第１演算器１３に入力してオペレーションFの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。一方、Ｄ１２ラッチ１１とＤ２２ラッチ１２に格納されたオペランドを第２演算器１４に入力してオペレーションGの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。また、Ｄ１３ラッチ３５とＤ２３ラッチ３６に格納されたオペランドを第３演算器３７に入力してオペレーションHの演算を行う。演算結果は必要に応じてレジスタファイル６の汎用レジスタに格納する。
【０１０６】
３．記録媒体
本発明の記録媒体の実施の形態として、図１５の機械命令プログラムを記録した磁気ディスク（フロッピーディスクやハードディスクなど）、光ディスク（CD-ROMやPDなど）、光磁気ディスク、半導体メモリ（ROMやフラッシュメモリなど）がある。
【０１０７】
以上のように本実施の形態によれば、コンパイラの機械命令圧縮部１０９が、第３スロットを除く第１スロットと第２スロットのいずれかにかかわらず出現順序が連続する３つのnopコードを抽出し、これらのnopコードのスロットを、該３つのnopコードの以降に最初に現れる３つの有効オペレーションが指定される命令の第１スロットから第３スロットのオペレーションでそれぞれ置き換え、置き換えに使った３つの有効オペレーションが指定される命令を削除することにより命令中の無駄領域が低減され、プログラムサイズの削減を図ることができる。特に本実施の形態によれば、従来３つのスロットからなる命令で３並列実行していた所を、従来nopコードとなるスロットを利用して２つスロットからなる命令で実行できるため、極めてコード効率が高い。上記に示した動作例では、図１２の３スロット×５命令＝１５スロットが、図１５の２スロット×４命令＝８スロットに圧縮されていることがわかる。
【０１０８】
また本実施の形態のプロセッサによれば、散在する従来のnopコードの位置に埋められた有効オペレーションを蓄積するＩＢバッファを設け、実行させるべき位置の直前の命令中の蓄積ビットでＩＢバッファを指定して蓄積したオペレーションを実行することにより、従来の処理性能を保ちつつ圧縮された機械命令プログラムの実行が可能である。
【０１０９】
なお、本実施形態のプロセッサでは、Ｉ１セレクタ１９およびＩ２セレクタ２０をそれぞれＩ１ラッチ２およびＩ２ラッチ４３の入力側に設けているが、それぞれＩ１ラッチ２およびＩ２ラッチ３の出力側に設け、第１命令解続器４および第２命令解読器４の入力を選択するようにしてもよい。このようにする際は、ＩＢバッファへの入力をIFステージにおいてROM１から直接行うように変更し、ROM１から読出された命令の蓄積ビットの値によってＩＢセレクタ６６を制御するように変更しなければならないが、ＩＢバッファへの取り込みやＩ１セレクタ１９およびＩ２セレクタ２０の選択については本実施形態と同様に蓄積ビットの値で制御すればよい。
【０１１０】
また、本実施形態のプロセッサでは、ＩＢバッファという１つの蓄積バッファを設けているが、複数設けてもよい。蓄積バッファの数が多くなるほどnopコードを有効オペレーションで埋める機会が増加し、プログラムサイズの一層の削減が図れる。
【０１１１】
さらにまた、本実施形態のプロセッサでは、３つの命令解読器と３つの演算器を設けて最大３並列実行を達成しているが、これらを４つずつ設けて４並列実行してもよいし、あるいはそれ以上であってもよい。４並列実行の場合は、本実施形態と同様に２つスロットからなる命令の未圧縮時にnopコードとなるスロットを４つ利用して有効オペレーションを埋めてもよいし、３つスロットからなる命令の未圧縮時にnopコードとなるスロットを４つ利用して有効オペレーションを埋めてもよい。但し前者の場合、ＩＢバッファをもう１スロット分だけ多く備える必要がある。前者は後者に比べて未圧縮時にnopコードとなるスロットが極めて多い場合に有効で、相当のコード効率の向上が望める。このようにすることにより、VLIWプロセッサにおける命令の並列度が向上しても、nopコードの増大を大幅に軽減することができる。
【０１１２】
（実施の形態４）
実施の形態４は、実施の形態３から、第３スロットのオペレーションだけを第１あるいは第２スロットのnopコードのスロットに埋めるように変えたものである。
【０１１３】
１．コンパイラ
コンパイラの構成は、機械命令圧縮部１０９の動作を除いて実施の形態３に記したものと同じである。機械命令圧縮部１０９は次の原理に基づいて動作する。
【０１１４】
命令の順に未圧縮の機械命令プログラムを検索して、第３スロットを除く第１スロットと第２スロットのいずれかにかかわらず１つのnopコードを抽出し、このnopコードのスロットを、該nopコードの以降に最初に現れる第３スロットに有効オペレーションが指定される命令の該オペレーションで置き換え、置き換えたことをマーキングするとともに、置き換えに使った有効オペレーションが指定される命令の第３スロットを削除し、該命令の第１スロットと第２スロットのいずれかに削除したことをマーキングする。
【０１１５】
１．１  機械命令圧縮部１０９の動作例
図１８は、圧縮された機械命令プログラムの例示図であり、機械命令圧縮部１０９が図１２の未圧縮の機械命令プログラムを上述の手順で圧縮したものである。圧縮された命令は第１と第２の２つのスロットで構成され、各スロットは２ビットの蓄積ビットとオペレーション（OP）フィールドとからなる。AからHの記号は有効なオペレーションを、nopは有効でないnopコードを示す。蓄積ビットの２ビットは次のようにエンコードしている。
００  何もしない
０１  オペレーションは置き換えられたものであり、ＩＢバッファに蓄積すべし１０  第３スロットが削除されたので、第３スロットにはＩＢバッファのオペレーションを実行すべし
１１  （未使用）
具体的に説明すると、第３スロットに置かれたオペレーションである、図１４の命令５のオペレーションHを、命令１の第２スロットのnopコードのスロットに埋め、埋められたスロットの蓄積ビットを０１にセットし、命令５の第３スロットを削除する。オペレーションHは、ＩＢバッファに蓄積されることを前提にしており、第３スロットが削除された命令５の第２スロットの蓄積ビットには１０をセットする（第１スロットの蓄積ビットであってもよい）。その他のスロットの蓄積ビットは００である。このようにして生成された機械命令プログラムが図１８に示すものである。ここでは、命令３の第２スロットと命令４の第１スロットのnopコードは置き換えられずに残っている。なお「ＩＢバッファ」は次に説明する。
【０１１６】
２．プロセッサ
図１９は、プロセッサのIFステージ部分の概略構成図である。
【０１１７】
DECステージおよびEXステージの図示していない部分は図１６と同じ構成であり、また図１６と同一の構成要素には同一の符号を付している。このプロセッサは、図１４に示すものと比べると、ＩＢバッファ５０を１つだけ有するものである点で異なる。このため、図１６と比べるとＩＢバッファが１つで足りることはもちろんの事、３つのバッファに左から蓄積するためのセレクタ４１、４２が不要となり回路が簡単化できる。動作は、蓄積先がＩＢバッファ５０に固定される以外は、実施の形態３と同じであるため説明は省略する。
【０１１８】
３．記録媒体
本発明の記録媒体の実施の形態として、図１８の機械命令プログラムを記録した磁気ディスク（フロッピーディスクやハードディスクなど）、光ディスク（CD-ROMやPDなど）、光磁気ディスク、半導体メモリ（ROMやフラッシュメモリなど）がある。
【０１１９】
以上のように本実施の形態によれば、コンパイラの機械命令圧縮部１０９が、第３スロットを除く第１スロットと第２スロットのいずれかにかかわらず１つのnopコードを抽出し、このnopコードのスロットを、該nopコードの以降に最初に現れる第３スロットに有効オペレーションが指定される命令の該オペレーションで置き換え、置き換えに使った有効オペレーションが指定される命令の第３スロットを削除することにより命令中の無駄領域が低減され、プログラムサイズの削減を図ることができる。特に本実施の形態によれば、従来３つのスロットからなる命令で３並列実行していた所を、従来nopコードとなるスロットを利用して２つスロットからなる命令で実行できるため、極めてコード効率が高い。上記に示した動作例では、図１２の３スロット×５命令＝１５スロットが、図１８の２スロット×５命令＝１０スロットに圧縮されていることがわかる。
【０１２０】
また本実施の形態のプロセッサによれば、従来のnopコードの位置に埋められた有効オペレーションを蓄積するＩＢバッファを設け、命令中の蓄積ビットでＩＢバッファを指定して該命令のオペレーションと蓄積したオペレーションとを並列に実行することにより、従来の処理性能を保つつ圧縮された機械命令プログラムの実行が可能である。
【０１２１】
なお、本実施形態のプロセッサでは、ＩＢバッファという１つの蓄積バッファを設けているが、複数設けてもよい。蓄積バッファの数が多くなるほどnopコードを有効オペレーションで埋める機会が増加し、プログラムサイズの一層の削減が図れる。例えば、命令３の第２スロットと命令４の第１スロットのnopコードは置き換えられずに残っているが、未圧縮（図１４）の命令５の直後に第３スロットに有効オペレーションが置かれた命令が１つ後続する場合、または２つ後続する場合、それぞれ、これらのnopコードの一方または両方をその有効オペレーションで埋めることができる。
【０１２２】
さらにまた、本実施形態のプロセッサでは、３つの命令解読器と３つの演算器を設けて最大３並列実行を達成しているが、これらを４つずつ設けて４並列実行してもよいし、あるいはそれ以上であってもよい。４並列実行の場合は、本実施形態と同様に２つスロットからなる命令の未圧縮時にnopコードとなるスロットを２つ利用して有効オペレーションを埋めてもよいし、３つスロットからなる命令の未圧縮時にnopコードとなるスロットを１つ利用して有効オペレーションを埋めてもよい。但し前者の場合、ＩＢバッファをもう１スロット分だけ多く備える必要がある。前者は後者に比べて未圧縮時にnopコードとなるスロットが極めて多い場合に有効で、相当のコード効率の向上が望める。このようにすることにより、VLIWプロセッサにおける命令の並列度が向上しても、nopコードの増大を大幅に軽減することができる。
【０１２３】
以上、本発明に係るコンパイラ及びプロセッサについて、上記の４つの実施形態に基づいて説明したが、本発明はこれら実施形態に限られないことは勿論である。即ち、
（１）上記の４つの実施形態では、１つの命令に２つまたは３つのオペレーションを指定するVLIW形式のアーキテクチャとしているが、１つの命令で１つのオペレーションを指定するVLIW形式でないアーキテクチャでもよい。
【０１２４】
特に、固定長命令の場合には未使用領域を持つ命令が多く定義されることがある。例えば、MIPS RISCアーキテクチャによるプロセッサ“R3000”は３２ビット固定長命令を実行するが、このプロセッサの演算命令は図２３（ａ）に示すように、１２ビットのオペレーションフィールド（「op1」と「op2」で示す）とそれぞれが５ビットの３つのレジスタフィールド（ソースオペランドの「rs」および「rt」と、デスティネーションオペランドの「rd」で示す）から構成され、さらに５ビットの「res」で示す未使用領域を有する。本発明によれば、このような単一オペレーション命令中に生じる無駄領域の発生も回避される。具体的には、図２３（ｂ）に示すようにコンパイラが６つの命令Aから命令Fのそれぞれの未使用領域a〜fを利用して、命令F以降に実行されるべき１つの命令を分割して配置するとともにこの命令を削除し、プロセッサ内に設けた命令蓄積レジスタにこれらを順に蓄積し、命令Fの実行後にこのレジスタの内容を実行する。こうすることにより、プログラム中の無駄領域が解消されコード効率が向上する。また、命令蓄積レジスタの内容の実行は、命令Fの直後でなく命令Fに続く他の命令の実行後でもよいし、また命令Fと並列に実行してもよい。特に後者の思想は、１つの命令で１つのオペレーションを指定するVLIW形式でないアーキテクチャにおいて局所的ではあるが２つのオペレーションを指定するVLIW形式のアーキテクチャを実現できるため有用である。また、このような命令蓄積レジスタを複数設けることにより、さらに３並列以上のVLIWアーキテクチャも実現可能である。なお、６つの命令Aから命令Fは必ずしもすき間なく連続している必要はない。
【０１２５】
（２）上記の４つの実施形態では、命令蓄積レジスタ（ＩＢ１バッファ、ＩＢ２バッファ、ＩＢバッファが相当）を読出すと同時に内容を消去しているが、消去せずに複数回読出して再利用してもよい。例えば、実施の形態３および実施の形態４では２ビットの蓄積ビットが１１である状態を使用していないのでこれを利用し、蓄積ビットが１１の時はＩＢバッファを消去せずに実行する、とすることができる。こうすることにより、例えばプログラムがループを構成するような同じ命令を繰り返し実行する場合に、度々同じ命令を何度もＩＢバッファに蓄積する必要がなくなり、一層コード効率がよくなる。また、命令蓄積レジスタを、読出した直後に内容が消去されるものと消去されず再利用可能なものと２種類設けることも可能である。
【０１２６】
（３）上記の４つの実施形態では、コンパイラにおいて、機械命令生成部１０７が一旦、従来と同じ機械命令プログラムを生成した後に機械命令圧縮部１０９がこれを圧縮しているが、両者の機能を一体にして、従来と同じ機械命令プログラムを生成することなく目的の圧縮された機械命令プログラムを直接生成するようにしてもよい。
【０１２７】
（４）上記の４つの実施形態のプロセッサは、命令フェッチ、解読、実行の３段パイプラインで構成されるとしているが、パイプラインの段数は何段であってもよいし、パイプラインを採らなくともよい。
【０１２８】
【発明の効果】
以上の説明から明らかなように、本発明によればｎｏｐを減少させることができ、コードサイズを小さくすることができる。
【図面の簡単な説明】
【図１】実施の形態１に係るコンパイラの構成を示すブロック図
【図２】実施の形態１に係るコンパイラの機械命令圧縮部１０９の処理フローを示したフローチャート
【図３】実施の形態１に係るコンパイラの機械命令圧縮部１０９の処理フローを示したフローチャート
【図４】実施の形態１に係るコンパイラの機械命令圧縮部１０９の処理フローを示したフローチャート
【図５】未圧縮の機械命令プログラムの例示図
【図６】実施の形態１に係る圧縮された機械命令プログラムの例示図
【図７】実施の形態１に係るプロセッサの概略構成図
【図８】実施の形態１に係るプロセッサの図６の機械命令プログラムに対応した動作タイミング図
【図９】実施の形態２に係る圧縮された機械命令プログラムの例示図
【図１０】実施の形態２に係るコンパイラの機械命令圧縮部１０９の処理フローを示したフローチャート
【図１１】実施の形態２に係るコンパイラの機械命令圧縮部１０９の処理フローを示したフローチャート
【図１２】実施の形態２に係るコンパイラの機械命令圧縮部１０９の処理フローを示したフローチャート
【図１３】実施の形態２に係るプロセッサのIFステージ部分の概略構成図
【図１４】未圧縮の機械命令プログラムの例示図
【図１５】実施の形態３に係る圧縮された機械命令プログラムの例示図
【図１６】実施の形態３に係るプロセッサの概略構成図
【図１７】実施の形態３に係るプロセッサの図１３の機械命令プログラムに対応した動作タイミング図
【図１８】実施の形態４に係る圧縮された機械命令プログラムの例示図
【図１９】実施の形態に係るプロセッサのIFステージ部分の概略構成図
【図２０】実施の形態４に係るプロセッサの図１６の機械命令プログラムに対応した動作タイミング図
【図２１】第１の従来技術におけるプロセッサの概略構成図
【図２２】第２の従来技術におけるプロセッサの概略構成図
【図２３】他の従来技術および他の実施形態に係る命令のフォーマット図
【符号の説明】
１、４１  ROM
２、４２  Ｉ１ラッチ
３、４３  Ｉ２ラッチ
４、４５  第１命令解読器
５、４６  第２命令解読器
６、４８  レジスタファイル
７、４９  Ｄ１セレクタ
８、５０  Ｄ２セレクタ
９、５２  Ｄ１１ラッチ
１０、５３  Ｄ１２ラッチ
１１、５５  Ｄ２１ラッチ
１２、５６  Ｄ２２ラッチ
１３、５８  第１演算器
１４、５９  第２演算器
１５、３３  ＩＢ１１バッファ
１６、３４  ＩＢ１２バッファ
１７、３５  ＩＢ２１バッファ
１８、３６  ＩＢ２２バッファ
１９、６４  Ｉ１セレクタ
２０、６５  Ｉ２セレクタ
２１、３７、６７、７２  制御回路
３１  ＩＢ１セレクタ
３２  ＩＢ２セレクタ
４４  Ｉ３ラッチ
４７  第３命令解読器
５１  Ｄ３セレクタ
５４  Ｄ１３ラッチ
５７  Ｄ２３ラッチ
６０  第３演算器
６１  ＩＢ１バッファ
６２  ＩＢ２バッファ
６３  ＩＢ３バッファ
６６  ＩＢセレクタ
７１  ＩＢバッファ
１０１  Ｃ言語プログラム
１０２  コンパイラ
１０３  ファイル読込部
１０４  読込用バッファ
１０５  構文解析部
１０６  中間コード用バッファ
１０７  機械命令生成部
１０８  暫定出力用バッファ
１０９  機械命令圧縮部
１１０  出力用バッファ
１１１  ファイル出力部
１１２  機械命令プログラム
【図１】
0003692793.tif 000002
【図２】
0003692793.tif 000003
【図３】
0003692793.tif 000004
【図４】
0003692793.tif 000005
【図５】
0003692793.tif 000006
【図６】
0003692793.tif 000007
【図７】
0003692793.tif 000008
【図８】
0003692793.tif 000009
【図９】
0003692793.tif 000010
【図１０】
0003692793.tif 000011
【図１１】
0003692793.tif 000012
【図１２】
0003692793.tif 000013
【図１３】
0003692793.tif 000014
【図１４】
0003692793.tif 000015
【図１５】
0003692793.tif 000016
【図１６】
0003692793.tif 000017
【図１７】
0003692793.tif 000018
【図１８】
0003692793.tif 000019
【図１９】
0003692793.tif 000020
【図２０】
0003692793.tif 000021
【図２１】
0003692793.tif 000022
【図２２】
0003692793.tif 000023
【図２３】
0003692793.tif 000024