(57)【特許請求の範囲】
【請求項１】
ｍビットの命令コードをｎビット（但し、ｍ、ｎは、ｍ＞ｎの関係を有する整数）に変換してメモリに書き込むことによってプログラム格納用のメモリの容量を削減する命令ビット長削減方法であって、
ソースプログラムをｍビットの命令コードで構成されるオブジェクトプログラムに変換する際に、同一のレジスタを続けて使用する命令コードが複数ある場合に、これらの命令コードが連続するように変換する処理と、
前記ｍビットの命令コードの内で有効ビット数がｎビット以下の命令コードに対して、下位のビット位置に無効ビットを配置すると共に、前記レジスタを指定するオペランドを上位ｎビット中の一定のビット位置に配置する処理と、
前記ｍビットの命令コードの内で有効ビット数がｎビットを越える命令コードに対して、前記レジスタを指定するオペランドを削除する処理と、
前記オブジェクトプログラムを構成する各命令コードの下位のｍ−ｎビットを削除し、上位ｎビットを前記プログラム格納用のメモリに書き込む処理とを、
順次行うことを特徴とする命令ビット長削減方法。
【請求項２】
ｍビットの命令コードをｎビット（但し、ｍ、ｎは、ｍ＞ｎの関係を有する整数）に変換してメモリに書き込むことによってプログラム格納用のメモリの容量を削減する命令ビット長削減方法であって、
ソースプログラムをｍビットの命令コードで構成されるオブジェクトプログラムに変換する際に、該ｍビットの命令コードの内の有効ビットを上位のビット位置に配置し、無効ビットを下位のビット位置に配置する処理と、
前記オブジェクトプログラムを構成する各命令コードの有効ビット数を調べ、その有効ビット数がｎビットを越えているときには、その超過した有効ビットをその命令コードの前に実行される命令コードの上位ｎビットの内で未使用のビット位置に書き込む処理と、
前記オブジェクトプログラムを構成する各命令コードの下位のｍ−ｎビットを削除し、上位ｎビットを前記プログラム格納用のメモリに書き込む処理とを、
順次行うことを特徴とする命令ビット長削減方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリに格納する中央装置装置（以下、「ＣＰＵ」という）の命令コードのビット長を削減する方法に関するものである。
【背景技術】
【０００２】
携帯機器に使用される大規模集積回路（以下、「ＬＳＩ」という）では、コストや消費電力を低減するために、命令セットを単純化して内部構造を簡素化することができる縮小命令セットＣＰＵ（以下、「ＲＩＳＣ」という）が使用されることが多い。また、最近のシステムではソフトウエアの規模が増大しており、ＬＳＩにおいてソフトウエアを格納するためのメモリの面積が、ＣＰＵ自体の面積よりも大きい場合が多い。このような状況下では、ソフトウエアを格納するメモリのサイズを小さくすることがコスト削減のための重要課題となる。
【０００３】
図２は従来のＲＩＳＣにおける縮小命令セットの一例を示す説明図であり、図３は図２中の命令・オペランドの説明図である。
【０００４】
この縮小命令セットは、命令ビット長とデータビット長を何れも３２ビットとし、スタックポインタやプログラムカウンタを含めて１６個のレジスタを有するＲＩＳＣに対応するものである。
【０００５】
図４は、図２の縮小命令セットに対する命令コードの割付例を示す図であり、図中の空白部分は未使用ビットである。この図に示すように、縮小命令セットの内の基本命令セットでは、命令ビット長が３２ビット未満である。しかし、携帯機器でも音声や動画の再生を扱うことが多くなってきており、単純な基本命令セットでは所望の性能が出せないため、アプリケーションプログラムに応じて比較と分岐を同時に実行する比較分岐命令のような、拡張命令を実装することが多い。このような拡張命令は、使用するオペランドが多かったり、分岐先を示す即値の相対アドレスや演算に使用する即値のビット長が大きくなったりするため、命令ビット長が最大の３２ビットとなっている。
【０００６】
ＲＩＳＣでは、１命令１ワード（例えば、３２ビット）を原則としているため、命令コードの中に未使用のビットが多数含まれていても、１ワードのサイズを最大のビット数を有する命令コードに合わせる必要があり、プログラムを格納するメモリのサイズが大きくなる。このため、縮小命令セットによるＣＰＵの簡素化と、プログラムの大規模化によるメモリサイズの増加という、相反する状況が生じてきている。
【０００７】
プログラム格納用のメモリサイズを削減する方法としては、下記特許文献１に記載されるように命令コード変換装置を用いてプログラムコードを圧縮する手法や、可変長命令を用いる手法が従来から提案されている。
【０００８】
例えば、可変長命令を用いる手法では、命令セットとして、使用するオペランドが少なくてビット長が短い命令と、使用するオペランドが大きいか大きな即値を扱うビット長の長い命令を混在させる。図２の縮小命令セットを例にした場合、レジスタ比較命令やレジスタ分岐命令を１６ビット命令、その他の命令を３２ビット命令として定義する。これにより、プログラムコードにおける未使用のビットが削減され、プログラム格納用のメモリサイズを小さくすることが出来る。
【０００９】
【特許文献１】特開２００１−２２２４２６号公報
【発明の開示】
【発明が解決しようとする課題】
【００１０】
しかしながら、可変長命令を用いる手法では、命令コードを任意のビット長で定義しようとすると、アドレス計算のビット長が増加することに加えて、分岐時などの命令の頭出しの仕組みが複雑になるため、命令の境界をバイト（８ビット）単位に区切ることが普通である。このため、例えば１７ビットで表現できる命令であっても２４ビットで構成しなければならず、命令コードの割付によっては最適化が難しいという課題があった。
【００１１】
本発明は、命令間の依存関係を利用することにより、命令コード変換装置等のリソースの追加を必要とせず、かつ、命令コードのビット長をバイト単位に区切る必要もなく、プログラム格納用のメモリサイズを小さくすることを目的としている。
【課題を解決するための手段】
【００１２】
本発明は、ｍビットの命令コードをｎビット（但し、ｍ、ｎは、ｍ＞ｎの関係を有する整数）に変換してメモリに書き込むことによってプログラム格納用のメモリの容量を削減する命令ビット長削減方法において、ソースプログラムをｍビットの命令コードで構成されるオブジェクトプログラムに変換する際に、同一のレジスタを続けて使用する命令コードが複数ある場合に、これらの命令コードが連続するように変換する処理と、前記ｍビットの命令コードの内で有効ビット数がｎビット以下の命令コードに対して、下位のビット位置に無効ビットを配置すると共に、前記レジスタを指定するオペランドを上位ｎビット中の一定のビット位置に配置する処理と、前記ｍビットの命令コードの内で有効ビット数がｎビットを越える命令コードに対して、前記レジスタを指定するオペランドを削除する処理と、前記オブジェクトプログラムを構成する各命令コードの下位のｍ−ｎビットを削除し、上位ｎビットを前記プログラム格納用のメモリに書き込む処理を、順次行うことを特徴としている。
【発明の効果】
【００１３】
本発明では、ソースプログラムをオブジェクトプログラムに変換する際に、同一のレジスタを続けて使用する命令コードが複数ある場合に、これらの命令コードが連続するように変換する。また、変換したｍビットの命令コードの内で有効ビット数がｎビット以下の命令コードに対しては、下位のビット位置に無効ビットを配置すると共にレジスタを指定するオペランドを上位の一定のビット位置に配置する。一方、命令コードの有効ビット数がｎビットを越える命令コードに対しては、レジスタを指定するオペランドを削除する。この結果、オブジェクトプログラムを構成する各命令コードの有効ビット数はｎビット以下になる。従って、上位ｎビットをプログラム格納用のメモリに書き込むことで、プログラム格納用のメモリサイズを小さくすることができるという効果がある。
【発明を実施するための最良の形態】
【００１４】
この発明の前記並びにその他の目的と新規な特徴は、次の好ましい実施例の説明を添付図面と照らし合わせて読むと、より完全に明らかになるであろう。但し、図面は、もっぱら解説のためのものであって、この発明の範囲を限定するものではない。
【実施例１】
【００１５】
図１は、本発明の実施例１を示す命令ビット長の削減方法の説明図である。以下、この図１と、関連する図５〜図６を随時参照しつつ、命令ビット長の削減方法の具体例を説明する。
【００１６】
（ステップ１）  命令コード割付処理
この命令ビット長の削減方法では、先ず、高級言語等で記述されたソースプログラムを、コンパイラ等を使用して、ＲＩＳＣで実行可能なオブジェクトコードに変換する。このオブジェクトコードは、１コード当たり３２ビットの圧縮されていない命令コードである。
【００１７】
図５は、本発明の実施例１の命令セットの説明図であり、図６は、図５の命令セットに対する命令コードの割付例を示す図である。
【００１８】
図５に示すように、この命令セットはＲＩＳＣで実行可能な１コード当たり３２ビットの命令コードで、図２の縮小命令セットと同一の命令を備えているが、コード内に格納できる即値（ｉｍｍ１４，ｉｍｍ１６等）のビット数が若干制限されている。即ち、命令コードの有効ビット数が２８ビットで収まるように、即値のビット数が最大２ビット程度削減されている。
【００１９】
また、命令コードの割付は、図６に示すように、図４とは異なっている。即ち、この命令コードの割付では、３２ビットの命令コードの内の下位のビット０〜３が未使用状態になるように、有効な命令コードを上位ビット側に詰めた状態で配置する。また、有効な命令コードの内で一定のビット位置（例えば、ビット１６〜１９）には、条件分岐等の拡張命令で利用可能なディスティネーションレジスタが位置するように配置する。
【００２０】
更に、ｌｄｉｈ命令で未使用になっている２ビットには、次のｏｒｉ命令の即値の上位２ビットを書き込む。
【００２１】
一方、比較分岐命令のような拡張命令で、３２ビットの命令コードをすべて有効ビットとして使用しているものは、ディスティネーションレジスタを指定するためのソースレジスタ番号（ｓｒｃ１）を下位ビット（即ちビット０〜３）に配置する。
【００２２】
（ステップ２）  命令コード格納処理
ステップ１で生成された１コード当たり３２ビットの圧縮されていない命令コードを、１ワード当たり２８ビットで構成されるプログラムメモリに格納する。このとき、３２ビットの命令コードの内、下位の４ビット（ビット０〜３）を無視し、上位の２８ビット（ビット４〜３１）だけをプログラムメモリに格納する。
【００２３】
（ステップ３）  命令コードの読み出し処理
プログラムメモリに格納された命令コード（２８ビット）は、ＣＰＵから与えられるアドレスＡＤＲに従って読み出され、第１の命令読出用レジスタＲＥＧ１に格納される。このとき、命令読出用レジスタＲＥＧ１に格納されていた１つ前の命令コードは、第２の命令読出用レジスタＲＥＧ２に移送される。なお、命令読出用レジスタＲＥＧ１，ＲＥＧ２は、何れも２８ビット構成となっている。
【００２４】
命令読出用レジスタＲＥＧ１に格納された２８ビットは、ＣＰＵに対する命令コードのビット４〜３１の命令ビットとして与えられ、命令読出用レジスタＲＥＧ２に格納された２８ビットの内のビット１８〜２１とビット１６〜１９は、それぞれセレクタＳＥＬの第１入力と第２入力に与えられる。
【００２５】
更に、命令読出用レジスタＲＥＧ１に格納された２８ビットの内の演算コード部分（ビット２６〜３１）はデコーダＤＥＣに与えられ、この命令コードがｌｄｉｈ命令であるか否かが判定される。もしもｌｄｉｈ命令であれば、デコーダＤＥＣからセレクタＳＥＬに第１入力を選択させる制御信号が出力され、ｌｄｉｈ命令でなければ第２入力を選択させる制御信号が出力される。セレクタＳＥＬで選択された命令読出用レジスタＲＥＧ２のビット１８〜２１またはビット１６〜１９は、ＣＰＵに対する命令コードのビット０〜３の命令ビットとして与えられる。
【００２６】
ＣＰＵは、命令読出用レジスタＲＥＧ１から与えられる２８ビットとセレクタＳＥＬから与えられる４ビット、合計３２ビットの命令コードを解読して処理を行う。
【００２７】
図７は、図５の命令コードを使用したプログラム例を示す図であり、図８は、図７のプログラムの動作説明図である。これらの図７及び図８を参照して、具体的な動作例を説明する。
【００２８】
先ず、最初の２つの命令で、初期化対象となるメモリの３２ビットの開始アドレスをＣＰＵ内のレジスタＲ１にセットする。ここで、１番目のｌｄｉｈ命令では、上位１６ビットをセットするが、使用していない２ビットが次のｏｒｉ命令のために、命令読出用レジスタＲＥＧ２に保持される。２番目のｏｒｉ命令では、１４ビットの即値の上位に、１番目のｌｄｉｈ命令で命令読出用レジスタＲＥＧ２に保持された２ビットが追加され、レジスタＲ１に書き込まれる。このｏｒｉ命令のディスティネーションレジスタの番号は、命令読出用レジスタＲＥＧ２に保持される。
【００２９】
３番目のｌｄｉｌ命令では、ＣＰＵ内のレジスタＲ２に初期化するメモリのサイズをセットする。この命令は、１つ前の算術演算命令との依存関係がないので、命令読出用レジスタＲＥＧ２に保持していたレジスタ番号は使用されない。
【００３０】
４番目のａｄｄ命令では、レジスタＲ１，Ｒ２の内容を加算した結果をＣＰＵ内のレジスタＲ３にセットし、初期化終了アドレスとする。このｏｒｉ命令のディスティネーションレジスタの番号は、命令読出用レジスタＲＥＧ２に保持される。
【００３１】
５番目のｌｄｉｌ命令では、ＣＰＵ内のレジスタＲ４に初期化する値である０ｘ００００００００をセットする。この命令は、１つ前の算術演算命令との依存関係がないので、命令読出用レジスタＲＥＧ２に保持していたレジスタ番号は使用されない。
【００３２】
６番目のｓｕｂｉ命令では、レジスタＲ３の内容から４を引いて、初期化するメモリのアドレスの１つを選択する。このｓｕｂｉ命令のディスティネーションレジスタの番号は、命令読出用レジスタＲＥＧ２に保持される。
【００３３】
７番目のｃｍｐｂｉｇｔ命令では、１つ前の６番目の命令実行時に保持していたレジスタ番号で選択されるレジスタＲ３の内容とレジスタＲ１の内容を比較して、レジスタＲ３の値が大きければ、プログラムカウンタの値に−４を加算して分岐する。これにより、プログラムカウンタの値は６番目の命令を指定することになり、６番目と７番目の命令が、繰り返えして実行される。そして、レジスタＲ３の内容がレジスタＲ１の内容以下になった時点で、８番目の命令に進む。
【００３４】
８番目のｓｗｉ命令では、レジスタＲ３の値で指定されるメモリのアドレスに、レジスタＲ４の内容を書き込む。
【００３５】
以上のように、この実施例１の命令ビット長の削減方法では、命令間の依存関係を利用して、前に使用したレジスタ番号を命令読出用レジスタＲＥＧ２に保持しておき、次の命令で同じレジスタを参照するときに、保持していたレジスタ番号を使用するようにしている。これにより、命令コードが３２ビットの命令セットであっても、１コード当たりの実質のビット数を例えば２８ビットに削減することが可能になり、プログラム格納用のメモリサイズを小さくすることができるという利点がある。
【実施例２】
【００３６】
実施例２の命令ビット長の削減方法は、実際のプログラムで使用される命令コードのビット数の平均値が３２ビットよりもかなり少ないことに鑑み、未使用ビットにそれ以降で実行される命令コードの一部を割り当てることによって、プログラムメモリに格納する命令コードのビット数を削減するものである。
【００３７】
図９は、本発明の実施例２を示す命令ビット長の削減方法の説明図であり、図１０は、この実施例２の命令コードの割付例を示す図である。
【００３８】
本実施例では、従来と同様の図２の縮小命令セットを使用するが、命令コードの割付は、図１０に示すように、中間の未使用ビットをなくすように左詰めしている。これにより、３２ビットの命令コードの内の右側に未使用領域がまとめられた構成となっている。
【００３９】
本実施例では、命令コードとして実際に使用される有効ビット数の平均値を想定して閾値とし、プログラムメモリに格納する１命令コード当たりのビット数をこの閾値とする。そして、有効ビット数が閾値を越える命令コードの超過ビットを、それ以前に実行される命令コードの未使用領域に格納しておき、実行時には、未使用領域に格納されている命令コードの一部をバッファに保持しておき、後続の命令コードに追加して使用する。
【００４０】
次に、図９に従って、本実施例の命令ビット長の削減処理を説明する。
処理に先立ち、各命令コードにおける有効なビット数を格納した命令別コード長テーブルＣＯＤと、プログラム中の分岐命令による分岐先を登録するための分岐先アドレス表ＢＡＤと、命令コードの不足ビットを一時的に保存するためのバッファＢＵＦを準備する。なお、バッファＢＵＦの大きさは、圧縮しようとする命令コードのサイズ（閾値）から、ｎｏｐ命令の有効ビット数を差し引いたものであれば良い。ｎｏｐ命令の有効ビットは５ビットであるので、閾値を例えば２３ビットとすると、バッファＢＵＦの最小サイズは１８ビットとなる。
【００４１】
処理の開始で、先ず、コンパイラ等を使用して、ソースプログラムをＲＩＳＣで実行可能なオブジェクトコードに変換する（ステップＳ１１）。このオブジェクトコードは、図１０に示す左詰めされた圧縮されていない３２ビットの命令コードで構成されている。
【００４２】
次に、オブジェクトコードを上から下に、即ち実行時の読み出し順にサーチして分岐命令を捜し、各分岐命令の分岐先のアドレスを分岐先アドレス表ＢＡＤに登録する（ステップＳ１２）。
【００４３】
分岐命令のサーチが完了すると、命令コードの調査を行う。このときは、オブジェクトコードを下から上に、即ち実行時とは逆の順番に読み出す（ステップＳ１３）。この処理は、すべての命令コードの調査が完了するまで繰り返して行われ、すべての命令コードの調査が完了した時点でステップＳ２３へ進むことになる（ステップＳ１４）。
【００４４】
読み出した命令コードのアドレスが分岐先アドレス表ＢＡＤに登録されているか否かをチェックし（ステップＳ１５）、登録されたアドレスであれば、バッファＢＵＦにデータが存在するか否かを調査し、もしもバッファＢＵＦにデータが存在すれば、ｎｏｐ命令を追加して、バッファＢＵＦ内のデータをその追加したｎｏｐ命令の未使用領域に移す（ステップＳ１６）。
【００４５】
読み出した命令コードのアドレスが分岐先アドレス表ＢＡＤに登録されていない場合、命令別コード長テーブルＣＯＤを参照して、その命令コードのコード長が閾値よりも長いか否かを判定する（ステップＳ１７）。命令コードのコード長が閾値よりも長い場合は、命令コードの超過ビットをバッファＢＵＦへ右シフトして移す（ステップＳ１８）。このとき、バッファＢＵＦが満杯であれば、ｎｏｐ命令を追加して、バッファ内のデータをその追加したｎｏｐ命令の未使用領域に移す（ステップＳ２０）。
【００４６】
一方、命令コードのコード長が閾値よりも短い場合は（ステップＳ２１）、バッファＢＵＦから左シフトしてデータを取り出し、その命令コードの未使用領域に移す（ステップＳ２２）。なお、命令コードのコード長が閾値と同じであれば、ステップＳ１６，Ｓ１８，Ｓ２０，Ｓ２２等のバッファ処理は行わず、ステップＳ１３に戻って次の命令コードの読み出しを行う。
【００４７】
オブジェクトコードのすべての命令コードの調査が完了した時点で、ステップＳ２３に進み、分岐命令の分岐先アドレスの変更を行う。これは、ステップＳ１６，Ｓ２０でｎｏｐ命令を追加したことで、分岐先のアドレスが変化したことに対応するための処理である。
【００４８】
図１１は、図１０の命令コードを使用したプログラム例を示す図である。また、図１２（ａ），（ｂ）は、実施例２の命令ビット長の圧縮と復元の説明図である。
【００４９】
図１１は、図９のステップＳ１１で生成されたオブジェクトコードの一例で、図１２（ａ）は、この図１１のプログラムの命令ビット長の圧縮例を示している。以下、これらの図１１及び図１２（ａ）に従って、命令ビット長の圧縮処理の具体例を説明する。
【００５０】
先ず、図１２（ａ）の最後のｓｗ命令に着目し、このｓｗ命令のコード長が閾値より長いか短いかを判定する。この場合、閾値が２３ビットに設定されており、コード長は２４ビットであるので、１ビットだけ長い。従って、超過ビット（図中にａと記したビット）を、バッファＢＵＦへ右シフトして移す。
【００５１】
次に、ｓｗ命令の１つ上のｃｍｐｂ命令に着目する。このｃｍｐｂ命令のコード長は３２ビットであるので、超過ビットは９ビットである。従って、この超過ビット（図中にｂと記したビット）を、バッファＢＵＦへ右シフトして移す。これにより、バッファＢＵＦには、ｃｍｐｂｉｇｔ命令とｓｗ命令の超過ビット（ｂ，ａ）が左詰めに格納される。
【００５２】
更に、ｃｍｐｂｉｇｔ命令の１つ上のｓｕｂｉ命令に着目する。このｓｕｂｉ命令のコード長は３０ビットであるので、超過ビットは７ビットである。従って、この超過ビット（図中にｃと記したビット）を、バッファＢＵＦへ右シフトして移す。これにより、バッファＢＵＦには、ｓｕｂｉ命令と、ｃｍｐｂｉｇｔ命令と、ｓｗ命令の超過ビット（ｃ，ｂ，ａ）が左詰めに格納される。
【００５３】
更に、ｓｕｂｉ命令の１つ上のｌｄｉｌ命令に着目する。このｌｄｉｌ命令のコード長は２６ビットであるので、超過ビットは３ビットである。一方、バッファＢＵＦには既に１７ビットが格納されており、３ビットを追加して格納する余地はない。このため、ｓｕｂｉ命令の１つ上にｎｏｐ命令を追加し、このｎｏｐ命令の未使用領域にバッファＢＵＦ内のデータをすべて移す。これにより、バッファＢＵＦは空になる。その後、ｌｄｉｌ命令に対する処理を行う。
【００５４】
このような処理を、図１１のオブジェクトコードの最後の命令（ｓｗ命令）から順に最初の命令（ｌｄｉ命令）まで行うことにより、図１２（ａ）に示すように、要所要所にｎｏｐ命令が追加されると共に、その未使用領域に後の命令コードの一部が格納されたプログラムが生成される。
【００５５】
その後、ｎｏｐ命令の追加によって分岐先が変更される分岐命令の分岐先アドレスを変更する。そして、３２ビットの命令コードの内の下位のビット０〜８を削除し、上位のビット９〜３１をプログラムメモリに格納する。これにより、プログラムメモリの１ワード当たりのビット数を２３ビットに圧縮することができる。
【００５６】
このように圧縮されたプログラムが格納されたプログラムメモリを読み出して実行する場合は、圧縮時と同様の命令別コード長テーブルＣＯＤとバッファＢＵＦを使用し、圧縮時とは逆の処理によって元の３２ビットの命令コードを復元することができる。即ち、閾値よりもビット長の短い命令コードで未使用ビットがある場合は、その未使用ビットを右シフトしてバッファＢＵＦへ書き込み、閾値よりもビット長の長い命令コードの場合は、バッファＢＵＦを左シフトして読み出すことにより、不足ビットを取り出すようにする。
【００５７】
図１２（ｂ）は、図１２（ａ）のように圧縮された命令ビット長を復元する様子を示したものである。
【００５８】
先ず、最初のｎｏｐ命令をプログラムメモリから読み出し、未使用ビット（１８ビット）を右シフトしてバッファＢＵＦに書き込む。これにより、バッファＢＵＦには、の超過ビット（図中にｈと記したビット）、３番目のｏｒ命令の超過ビット（図中にｇと記したビット）、４番目のｌｄｉ命令の超過ビット（図中にｆと記したビット）、５番目のａｄｄ命令の超過ビット（図中にｅと記したビット）、及び６番目のｌｄｉ命令の超過ビット（図中にｄと記したビット）が、左詰めで格納される。
【００５９】
次に、２番目のｌｄｉ命令をプログラムメモリから読み出し、不足する３ビットをバッファＢＵＦを左シフトして読み出して追加する。これにより、ｌｄｉ命令の有効ビット数２６ビットが得られる。
【００６０】
更に、３番目のｏｒ命令、４番目のｌｄｉ命令、５番目のａｄｄ命令でも同様の処理が行われ、それぞれ元の命令コードが復元されてＣＰＵに与えられる。
【００６１】
以上のように、この実施例２の命令ビット長の削減方法では、命令コードの内の未使用ビットに後の命令コードの一部を格納することにより、命令ビット長を平均化して全体としてビット長を短くしている。従って、プログラム格納用のメモリサイズを小さくすることができるという利点がある。
【００６２】
なお、本発明は、上記実施例に限定されず、種々の変形が可能である。この変形例としては、例えば、次のようなものがある。
（ａ）  命令セットは、図２や図５に例示したものに限定されない。
（ｂ）  命令コードの長さや割付は、図６や図１０に例示したものに限定されない。即ち、削減前の命令コードは、３２ビットに限らず任意のｍビットで良い。また、削減後の命令コードは、２８ビットや２３ビットに限らず任意のｎビットで良い。
（ｃ）  実施例２におけるプログラムメモリに格納するビット数（閾値）や、バッファのサイズは、例示したものに限定されない。
【図面の簡単な説明】
【００６３】
【図１】本発明の実施例１を示す命令ビット長の削減方法の説明図である。
【図２】従来のＲＩＳＣにおける縮小命令セットの一例を示す説明図である。
【図３】図２中の命令・オペランドの説明図である。
【図４】図２の縮小命令セットに対する命令コードの割付例を示す図である。
【図５】本発明の実施例１の命令セットの説明図である。
【図６】図５の命令セットに対する命令コードの割付例を示す図である。
【図７】図５の命令コードを使用したプログラム例を示す図である。
【図８】図７のプログラムの動作説明図である。
【図９】本発明の実施例２を示す命令ビット長の削減方法の説明図である。
【図１０】実施例２の命令コードの割付例を示す図である。
【図１１】図１０の命令コードを使用したプログラム例を示す図である。
【図１２】実施例２の命令ビット長の圧縮と復元の説明図である。
【符号の説明】
【００６４】
ＢＡＤ    分岐先アドレス表
ＢＵＦ    バッファ
ＣＯＤ    命令別コード長テーブル
ＤＥＣ    デコーダ
ＭＥＭ    プログラムメモリ
ＲＥＧ１，ＲＥＧ２    命令読出用レジスタ
ＳＥＬ    セレクタ
【図１】
0004921310.tif 000002
【図２】
0004921310.tif 000003
【図３】
0004921310.tif 000004
【図４】
0004921310.tif 000005
【図５】
0004921310.tif 000006
【図６】
0004921310.tif 000007
【図７】
0004921310.tif 000008
【図８】
0004921310.tif 000009
【図９】
0004921310.tif 000010
【図１０】
0004921310.tif 000011
【図１１】
0004921310.tif 000012
【図１２】
0004921310.tif 000013