(57)【特許請求の範囲】
【請求項１】
外部から与えられる第１のアドレスでアクセスするアドレス空間が、圧縮命令を格納する圧縮命令格納領域又は非圧縮命令を格納する非圧縮命令格納領域であるかを識別する識別手段と、
外部から与えられる前記識別手段の前記圧縮命令格納領域と前記非圧縮領域とをそれぞれ任意のアドレスに設定するレジスタと、
１つのメモリ内に前記圧縮命令格納領域と前記非圧縮命令格納領域の２つの領域があり、前記メモリをアクセスするために、これらの２つの領域にそれぞれ対応する第２のアドレスを前記識別手段の結果に基づいて、生成するアドレス生成手段と、
前記第２のアドレスで前記メモリをアクセスし、前記メモリから読み出された命令コードを前記識別手段の結果に基づいて、前記圧縮命令格納領域である場合には伸張変換し、あるいは前記非圧縮命令格納領域である場合には無変換する命令コード変換回路と
を有することを特徴とする命令コード変換装置。
【請求項２】
外部から与えられる第１のアドレスでアクセスするアドレス空間が、圧縮命令を格納する圧縮命令格納領域又は非圧縮命令を格納する非圧縮命令格納領域であるかを識別する識別手段と、
１つのメモリ内に前記圧縮命令格納領域と前記非圧縮命令格納領域の２つの領域があり、前記メモリをアクセスするために、これらの２つの領域にそれぞれ対応する第２のアドレスを前記識別手段の結果に基づいて、生成するアドレス生成手段と、
前記第２のアドレスで前記メモリをアクセスし、前記メモリから読み出された命令コードを前記識別手段の結果に基づいて、前記圧縮命令格納領域である場合には伸張変換し、あるいは前記非圧縮命令格納領域である場合には無変換する命令コード変換回路と
を有し、
前記圧縮命令領域と前記非圧縮命令領域は、メモリ・マネージメント・ユニットを用いて物理アドレス空間をプログラマブルに分割されたページ単位に割り当てられていることを特徴とする命令コード変換装置。
【請求項３】
前記圧縮命令コードは、ｍビット固定長、又はｍビット／ｎ（ｎ≧ｍ）ビット可変長とし、前記非圧縮命令コードはｎビット固定長とする
ことを特徴とする請求項１又は２に記載の命令コード変換装置。
【請求項４】
前記命令コード変換回路により伸張変換された非圧縮命令コードを格納するバッファメモリと、
前記バッファメモリに格納されたアドレスの連続する複数個の前記非圧縮命令コードを１ブロックとして、そのブロックの先頭アドレスである前記第１のアドレス又は第２のアドレスの上位ビットを格納するブロックアドレス記憶レジスタと、
前記ブロックアドレス記憶レジスタに格納したアドレスと同じビット数の前記第１又は第２のアドレスの上位ビットと、前記ブロックアドレス記憶レジスタに格納されたアドレスを比較する比較回路と、
前記識別手段の結果に基づいて、非圧縮命令格納領域の場合には、前記命令コード変換回路から出力された無変換の非圧縮命令コードを選択し、圧縮命令格納領域の場合には、前記比較回路の結果に基づいて、前記アドレスが一致の場合には前記バッファメモリに格納済みの前記非圧縮命令コードを前記バッファメモリから出力する非圧縮命令コード、あるいは前記アドレスが不一致の場合には前記命令コード変換回路で伸張変換された非圧縮命令コードを前記バッファメモリに格納するとともに出力する非圧縮命令コードを選択する選択回路と
を有することを特徴とする請求項１，２及び３のいずれか１項に記載の命令コード変換装置。
【請求項５】
前記バッファメモリは、さらに前記非圧縮命令コードが前記ブロックの何番目まで格納されているかを示す有効アドレス記憶レジスタを有し、
前記有効アドレス記憶レジスタのビット数と同じビット数の前記第１又は第２のアドレスの下位ビットより前記有効アドレス記憶レジスタの内容が大きく、かつ前記比較回路の結果が一致の場合は、前記バッファメモリから前記非圧縮命令コードを出力し、それ以外の場合は、前記有効アドレス記憶レジスタのビット数と同じビット数の前記第１又は第２のアドレスの下位ビットより前記有効アドレス記憶レジスタの内容が大きくなるまで前記命令コード変換回路で伸張変換された非圧縮命令コードを前記バッファメモリに格納して前記有効アドレス記憶レジスタの内容を更新し、前記有効アドレス記憶レジスタの内容が前記第１又は第２のアドレスより大きくなった時点での非圧縮命令コードを前記選択回路に出力すること特徴とする請求項４記載の命令コード変換装置。
【請求項６】
前記請求項１，２，３，４及び５のいずれか１項に記載の命令コード変換装置と、
前記圧縮命令コード及び非圧縮命令コードを格納するメモリと、
前記命令コード変換装置と前記メモリとの間に置かれ、前記命令コード変換装置から出力されたメモリアドレスとメモリリード要求信号に従い、前記メモリをアクセスし、前記メモリから前記圧縮命令コード又は非圧縮命令コードを読み出し、前記命令コード変換装置に出力するメモリインタフェースと、
前記命令コード変換装置と接続され、前記命令コード変換装置に実行すべき命令を読み出すためのＣＰＵアドレスとリード要求信号を前記命令コード変換装置に出力し、前記ＣＰＵアドレスは前記命令コード変換装置で前記メモリアドレスに変換され、また、前記リード要求信号は前記命令コード変換装置で前記メモリリード要求信号を生成し、前記メモリインタフェース経由で受け取った前記圧縮命令コード又は非圧縮命令コードを前記命令コード変換装置で変換した命令コードを受信して実行するＣＰＵと
を有することを特徴とする情報処理システム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、圧縮命令を含む命令コードを変換する命令コード変換装置、及び前記命令コード変換装置を含んで情報処理を行う情報処理システムに関する。
【０００２】
【従来の技術】
ＣＰＵ、特にＲＩＳＣプロセッサの場合に、多ビットの固定長命令コード（３２ビット長が多い）は、一般的に可変長命令コード（８〜３２ビット長が多い）のＣＩＳＣプロセッサに比べてコード効率が低く、プログラムメモリの使用量が増える。コストにセンシビリティなパーソナル機器においては、より大容量なメモリの使用やより多くのメモリチップの搭載が必要となるプロセッサの採用は困難であった。コード効率が悪くなるのは、そのＲＩＳＣプロセッサのアーキテクチャによって差違があるが、以下の２点が大きな要因である。
【０００３】
（ａ）命令コードが３２ビット長固定と長いこと。
【０００４】
（ｂ）命令の種類が少ないこと。
【０００５】
そこで、コード効率を改善するため、要因（ａ）に対する施策としては、１６ビット固定長のＲＩＳＣプロセッサや１６／３２ビットの可変長のＲＩＳＣプロセッサが開発された。また、要因（ｂ）に対する施策としては、ＣＩＳＣ並みの豊富な命令を持つＲＩＳＣプロセッサが開発された。１６ビット固定長のプロセッサは、命令が１６ビット長なので、命令数に制約があることと、扱えるイミディエイト値に制約（例えば１６ビットデータは直接扱えない）があることの２点で要因（ｂ）が残り、コード効率は大きく改善されない。また、必要命令数が増えるため、３２ビット固定長のプロセッサに比べて周波数あたりの性能が低くなる。
【０００６】
そこで、１６／３２ビットの可変長のＲＩＳＣプロセッサが登場した。高速処理は３２ビット長命令で実行し、コード効率優先の処理は１６ビット長命令又は１６ビット／３２ビット長命令の混在で実行させる。
【０００７】
既存のプロセッサに追加する命令セットとしては、命令モード（元の３２ビット長の命令を実行するモードと、追加された１６ビット長又は１６ビット／３２ビット長の命令を実行するモードとがある）を切り換える命令や、元の３２ビット長命令セットにはない独自命令を追加しているため、ＣＰＵの改変が必要である。例えば追加された圧縮命令セットを伸張する命令コード伸張回路をＣＰＵ内に追加するとともに、元の３２ビット長命令セットにはない独自命令のための命令解読回路が追加されている。さらに、パイプライン制御回路などＣＰＵ内の回路の変更が行われている。命令モードを示すレジスタは、プログラムカウンタの最下位ビットに割り当て、このレジスタの値で命令コード伸張回路と命令解読回路とを制御させる。
【０００８】
ＣＩＳＣ風の複雑な命令を搭載したＲＩＳＣプロセッサでは、ＣＰＵの命令実行回路が複雑となり、ＲＩＳＣ本来の思想である命令を単純化し、周波数を上げて高速処理を行うことが困難である。したがって、比較的低速（１００ＭＨｚ未満）のプロセッサしか現在は開発されていない。
【０００９】
一方、コード効率を上げるには、下記に示すような様々な手法が従来から提案されている。
【００１０】
第１の方法は、プログラムのコードを生成するコンパイラ／アセンブラを改良して、よりステップ数の少ない、あるいはコードの短い命令コード列を生成させる方法である。ソースプログラムはＣ言語などの高級言語で一般的に記述されている。ソースプログラムはコンパイラによってアセンブリ言語で記述されたプログラムに変換される。アセンブリ言語のプログラムはアセンブラによってＣＰＵが認識可能な命令コードで記述されたオブジェクトプログラムに変換される。ステップ数とは、命令コードの数を指し、同じソースプログラムからできるだけ少ない数の命令コードに変換されるようにこれらのコンパイラ／アセンブラを改良する。一方、ＣＰＵによっては、同一の機能を果たす命令コードを複数持っている。アセンブラはその命令コードの中からより短いコード長の命令コードに変換するようアセンブラを改良する。このアセンブラの機能は最適化と呼ばれ、この機能を改良することでコードを短くする。
【００１１】
第２の方法は、ＣＰＵに命令を追加して、よりステップ数の少ないあるいはコードの短いコード列を生成させる方法である。既存の命令では複数の命令で表現せざるを得なかったものを、１つの命令で表現できるようにする場合と、既存の命令をより短いコードで表現する場合とがある。
【００１２】
第３の方法は、第２の方法の変形で、追加された命令を１命令単位に元からＣＰＵが持っている命令コードに伸張する方法で、追加命令として、既存の命令コードより短い命令コードを用意する。
【００１３】
第４の方法は、ＣＰＵの命令を新規の命令に変更し、よりステップ数の少ない、あるいはコードの短いコード列を生成させる方法である。
【００１４】
第５の方法は、ＣＰＵが持つ命令のコードで記述されたプログラムを、その全体あるいは一部をソフトウェアで圧縮し、実行前にソフトウェアまたはハードウェアで伸張する方法である。この方法は、ファイルの圧縮／解凍と同様、ＺＩＰ形式やＬＺＨ形式など様々な手法に基づき、実行前のプログラムメモリ使用容量を削減することができる。
【００１５】
第６の方法は、第５の方法の変形で、プログラムを複数のブロックに分割し、そのブロック毎にソフトウェアで圧縮し、ブロック毎にハードウェアで伸張しながら実行させる方法である。
【００１６】
上記第１の方法では、ＣＰＵの持つ命令コードを最も有効に活用するところまでしかコード効率の改善ができないので限界がある。さらなる改善が必要となった場合は第２〜６の方法を取る必要がある。第２および第４の方法は、新しいＣＰＵを開発することを意味し、コンパイラ／アセンブラなどの言語ツール、ＩＣＥ／デバッガなどの検証ツール、ＯＳ，Ｃｏ−ｓｉｍｕｌａｔｉｏｎなどのＣＰＵとプログラムやシステムの開発支援ツールの開発には、膨大なリソースと開発期間とを要する。特に汎用ＣＰＵの場合、ユーザによって開発環境が異なるため、複数の開発支援ツールを揃える必要があり、その開発負担は極めて大きい。
【００１７】
第３の方法は、追加された命令が既存の命令に比べてコード長が短くなるため、その追加命令をプログラムメモリから読み出すためにプログラムメモリに与えるアドレスが、ＣＰＵアドレスと一致するようＣＰＵの改変が行われる。例えば図２３に示すように、既存の命令が３２ビット固定長で、追加の命令が１６ビット長である場合は、３２ビット長の命令コードは４バイトのメモリを使用するため、命令が追加される前のＣＰＵアドレスは４の倍数であるが、１６ビット長の命令コードは２バイトのメモリを使用するため、追加後は２の倍数でなければならない。そのため、ＣＰＵアドレスが２の倍数となるようＣＰＵの改造を行っている。また、追加された命令セットと元の命令セットとを混在させることができるよう、どちらの命令セットであるかを選択するための命令も追加している。第３の方法は、上記第２の方法に比べれば、ＣＰＵの改変、プログラム開発支援ツールの開発にかかるリソース、期間は節約できるものの、開発は容易でない。
【００１８】
第５の方法では、データも含めて圧縮できるので、大きな圧縮効果が得られる可能性があるが（圧縮効果はプログラムに依存する）、命令の伸張に時間がかかり、また圧縮されたプログラム／データを格納したメモリ以外に、伸張したプログラム／データを格納できるメモリが必要となり、その実施は限定された分野になる。特にソフトウェアで伸張する場合は、伸張そのものに大幅な時間を要し、伸張されるまで実行できない。ハードウェアで伸張するにしても、圧縮されたプログラム／データが格納されたメモリをすべて読み出すため、時間がかかる。
【００１９】
第６の方法では、ブロック単位にプログラムを分割して圧縮／伸張するため、その伸張に要する時間はブロックのサイズにもよるが、第５の方法に比べて大幅に改善される。また、圧縮後のプログラムはブロック毎にサイズが異なるため、伸張用にＣＰＵアドレスとメモリアドレスとの対応情報をプログラムメモリに格納しておかなければならない。すなわち、ＣＰＵからのアドレスから圧縮された命令の格納アドレスを得るためのインデックステーブルをプログラムメモリに格納し、圧縮された命令コードを伸張するには、メモリからインデックステーブルを読み出し、その読み出した情報から生成されたアドレスで再びプログラムメモリから圧縮された命令コードを読み出し、さらに圧縮の際に使った情報を格納したデコードルックアップテーブルがプログラムメモリ以外に用意され、そのデコードルックアップテーブルから読み出す必要があり、伸張作業に相当な時間がかかり、さらにデコードルックアップテーブルによるチップコストへの影響も多大である。
【００２０】
また、従来の情報処理システムにおいて、プロセッサとプログラムメモリとのバス幅を多ビットにすると、１回のバスサイクルで命令を取り込め、性能向上に貢献する。しかしながら、バス幅が大きいと多ピンパッケージ品が必要となり、バス本数に応じて基板面積が増大し、複数のメモリチップが必要になるなど、コストやサイズに大きな影響を与えることになる。一方、バス幅を減らすだけだと、１つの命令が１回のバスサイクルで読み込めず、性能を低下させてしまう。そこで、１６ビット長の命令にすれば、１６ビットバスで１回で読み込めるため、コストサイズを抑え、かつ性能の低下をミニマイズできる。
【００２１】
【発明が解決しようとする課題】
以上説明したように、従来の情報処理装置において、３２ビット固定長のプロセッサに、１６ビット固定長あるいは１６／３２ビット可変長の命令を追加する場合には、ＣＰＵを新規に開発あるいは新規に近いＣＰＵの改変を行って、実現していた。このため、ＣＰＵ改変やプログラムやシステムの開発支援ツールの開発に多くの手間と時間がかかるといった不具合を招いていた。また、ＣＰＵの改変等を行うことなくコード効率を改善するために命令の圧縮手法を採用しているが、従来の圧縮手法にあっては、圧縮された命令を元に戻す伸張作業に時間がかかり、伸張作業のためにシステムのサイズやコストに大きな影響を及ぼす構成が必要になるといった不具合を招いていた。
【００２２】
そこで、この発明は、上記に鑑みてなされたものであり、その目的とするところは、ＣＰＵを新規設計／改変することなく、命令の追加を実現してコード効率を向上させ、命令を格納するプログラムメモリの容量を削減できる命令コード変換装置、ならびに情報処理システムを提供することにある。
【課題を解決するための手段】
上記目的を達成するために、課題を解決する第１の手段は、外部から与えられる第１のアドレスでアクセスするアドレス空間が、圧縮命令を格納する圧縮命令格納領域又は非圧縮命令を格納する非圧縮命令格納領域であるかを識別する識別手段と、外部から与えられる前記識別手段の前記圧縮命令格納領域と前記非圧縮領域とをそれぞれ任意のアドレスに設定するレジスタと、１つのメモリ内に前記圧縮命令格納領域と前記非圧縮命令格納領域の２つの領域があり、前記メモリをアクセスするために、これらの２つの領域にそれぞれ対応する第２のアドレスを前記識別手段の結果に基づいて、生成するアドレス生成手段と、前記第２のアドレスで前記メモリをアクセスし、前記メモリから読み出された命令コードを前記識別手段の結果に基づいて、前記圧縮命令格納領域である場合には伸張変換し、あるいは前記非圧縮命令格納領域である場合には無変換する命令コード変換回路とを有することを特徴とする。
【００２３】
第２の手段は、外部から与えられる第１のアドレスでアクセスするアドレス空間が、圧縮命令を格納する圧縮命令格納領域又は非圧縮命令を格納する非圧縮命令格納領域であるかを識別する識別手段と、１つのメモリ内に前記圧縮命令格納領域と前記非圧縮命令格納領域の２つの領域があり、前記メモリをアクセスするために、これらの２つの領域にそれぞれ対応する第２のアドレスを前記識別手段の結果に基づいて、生成するアドレス生成手段と、前記第２のアドレスで前記メモリをアクセスし、前記メモリから読み出された命令コードを前記識別手段の結果に基づいて、前記圧縮命令格納領域である場合には伸張変換し、あるいは前記非圧縮命令格納領域である場合には無変換する命令コード変換回路とを有し、前記圧縮命令領域と前記非圧縮命令領域は、メモリ・マネージメント・ユニットを用いて物理アドレス空間をプログラマブルに分割されたページ単位に割り当てられていることを特徴とする。
【００２４】
第３の手段は、前記第１又は第２の手段の命令コード変換装置と、圧縮命令コード、又は前記圧縮命令コード及び非圧縮命令コードを格納するメモリと、前記命令コード変換装置と前記メモリとの間に置かれ、前記命令コード変換装置から出力されたメモリアドレスとメモリリード要求信号に従い、前記メモリをアクセスし、前記メモリから前記圧縮命令コード又は非圧縮命令コードを読み出し、前記命令コード変換装置に出力するメモリインタフェースと、前記命令コード変換装置と接続され、前記命令コード変換装置に実行すべき命令を読み出すためのＣＰＵアドレスとリード要求信号を前記命令コード変換装置に出力し、前記ＣＰＵアドレスは前記命令コード変換装置で前記メモリアドレスに変換され、また、前記リード要求信号は前記命令コード変換装置で前記メモリリード要求信号を生成し、前記メモリインタフェース経由で受け取った前記圧縮命令コード又は非圧縮命令コードを前記命令コード変換装置で変換した命令コードを受信して実行するＣＰＵとを有することを特徴とする。
【００２８】
【発明の実施の形態】
以下、図面を用いてこの発明の実施形態を説明する。
【００２９】
図１は本発明の一実施形態に係る情報処理システムの構成を示す図である。
【００３０】
図１において、情報処理システムは、プログラムメモリ１と、メモリインタフェース２と、命令コード変換装置３と、ＣＰＵ４を備え、既存のＣＰＵ４を改変することなくプログラムのコード効率を向上させ、命令を格納するプログラムメモリ１の使用容量を削減するために、ＣＰＵ４に実行させるプログラム（命令コード列）を圧縮ソフトウェアによって圧縮し、生成されたオブジェクト（圧縮命令コード列）を、プログラムメモリ（ＣＰＵチップの外部に置かれたメモリあるいはＣＰＵチップに内蔵されたメモリ、内蔵メモリの場合には、当然メモりインタフェースも命令コード変換装置も内蔵される）１に格納し、ＣＰＵ４から出力される命令コード読み出し（フェッチ）のためのアドレスとプログラムメモリ１に入力されるアドレスとが単純な操作（シフト）で得られるように関連付け、ＣＰＵ４からの命令コード読み出し要求で、ＣＰＵアドレスをプログラムメモリアドレスに変換し、そのアドレスでメモリインタフェース２を介してプログラムメモリ１をアクセスして圧縮命令コードを読み出し、ＣＰＵ４とメモリインタフェース２との間に設けられた命令コード変換装置３によって圧縮命令コードをＣＰＵ４が実行できる命令コードに伸張してＣＰＵ４に渡し、ＣＰＵ４に伸張された命令コードで実行する。伸張された命令コードはＣＰＵ４が元から持っていた命令と同一である。
【００３１】
圧縮命令コードが格納されるプログラムメモリ１のアドレスとＣＰＵ４からのアドレスの関連付けを図２に示すように単純化する。例えば、ＣＰＵ４の命令コードが３２ビット固定長で、圧縮命令コードが１６ビット固定長である場合は、ＣＰＵ４のアドレスは４の倍数、プログラムメモリ１のアドレスは２の倍数となるが（図２（ａ））、ＣＰＵアドレスを右（下位側）へ１ビットシフトした値をプログラムメモリアドレスとすれば（図２（ｂ））、前述した従来の第３の方法にあるように、ＣＰＵを改変してＣＰＵアドレスを２の倍数にする必要はなく、ＣＰＵ４からのアドレス出力は４の倍数のままでよい。プログラムメモリ１へ与えるアドレスは命令コード変換装置３で２の倍数になるようにアドレス変換する。
【００３２】
詳細に説明すると、３２ビット固定長の命令コードを実行するＣＰＵ４に、１６ビット固定長の圧縮命令コードを扱わせる場合では、ＣＰＵ４は３２ビット固定長の命令をフェッチしようとしてアドレスの下位４ビットに０→４→８→Ｃ（１６進数）を出力する。プログラムメモリ１は、このＣＰＵ４からのアドレスを１ビット右シフトした０→２→４→６番地に１６ビット長の圧縮命令を格納する。ＣＰＵ４からの出力アドレスの下位ビットが４のとき、プログラムメモリ１の２番地から１６ビット長の圧縮命令コードが読み出され、命令コード変換装置３によりＣＰＵ４が実行可能な３２ビット長の命令コードに変換してＣＰＵ４に渡す。ＣＰＵ４はこの３２ビット長コードの命令を実行し、アドレス出力の下位４ビットは４から８に切り換わる。
【００３３】
圧縮命令コードが１６ビット固定長ではなく、図３（ａ）に示すように１６／３２ビットの可変長である場合について、図３を参照して説明する。
【００３４】
可変長の場合は、例えばプログラムメモリ１の２番地と４番地に３２ビット長の圧縮命令コード（命令２）が入っている場合がありうる。この命令２をフェッチする場合は、（図３（ｂ））に示すようにＣＰＵ４はまずアドレスの下位４ビットが４となるアドレスを出力し、右に１ビットシフトした２番地のプログラムメモリ１から圧縮命令コード（命令２）の上位１６ビットをまず読み出し、ＣＰＵ４にはノーオペレーション命令（ＮＯＰ）の３２ビットコードを渡す。ＣＰＵ４はＮＯＰを実行し、アドレス出力の下位４ビットは４から８に切り換わる。次に、８を右シフトした４番地のプログラムメモリ１から圧縮命令コード（命令２）の下位１６ビットが読み出され、この３２ビットの圧縮命令コードに対応したＣＰＵ４が実行可能な３２ビット長の命令コード（命令２Ｂ’）に命令コード変換装置３が変換してＣＰＵ４に渡す。ＣＰＵ４はこの３２ビット長コードの命令２Ｂ’を実行し、アドレス出力の下位４ビットは８からＣに切り換わる。このようにして、ＮＯＰをＣＰＵ４に実行させることで、ＣＰＵアドレスとプログラムメモリアドレスの関連付けの単純化を維持させる。
【００３５】
なお、圧縮命令コードによっては、ＮＯＰではなく他の３２ビットコードの命令２Ａ’に変換してもよい。この場合には、ＣＰＵ４の既存命令２つ（各３２ビット長で合わせて６４ビット）を１つの３２ビット長の圧縮命令コードで記述したことになり、図４に示すように圧縮効果が上がる。一方、ＮＯＰに変換された場合は、その３２ビット長の圧縮命令コードは２命令サイクルの実行時間が少なくともかかるので、実行時間よりもコード効率を優先する場合に、この命令コード変換を使用するものとする。
【００３６】
また、このアドレスの関連付けの単純化は、前述した従来の第６の方法で問題となるアドレス変換のためのアドレス対応情報をプログラムメモリ１に格納する必要がなくなるため、伸張にかかる時間はアドレス対応情報を読み出す時間がなくなる分、大幅に削減される。さらに、前述した第６の方法では、アドレス対応情報をプログラムメモリに置くので、その分コード効率を低下させているが、本発明ではアドレス対応情報はプログラムメモリ１に置く必要はなく、コード効率が上がる。
【００３７】
一般的には、圧縮命令コードは、ＣＰＵ４の既存の命令コードに比べて表現できる情報が少なくなるため、命令数が減る。そのため、コンパイラは圧縮をかける対象となるプログラムに関しては、サブセットのＣＰＵ命令しかないものとしてコンパイルしなければならない。場合によっては、圧縮命令コードで記述されたプログラムの方が、既存の命令コード（非圧縮命令コード）で記述されたプログラムより大きくなることも有り得るが、非圧縮命令コードには命令によって使用されないビットがあったり、扱うデータが小さい値が多く、命令コード中のデータ領域の上位ビットがすべて“０”であったり“１”であったりなど、なくてもよい部分がある。例えばプログラムで扱うデータとしては、１〜８ビット程度で表現できる数値が多い。しかしながら、ＣＰＵ４の既存命令の多くは命令コード中に１６ビット程度のデータフィールドを持つ。したがって、１５〜８ビット程度の無駄がある場合が多々プログラムに存在する。この部分を削除した命令コードを圧縮命令コードとして用意することで、プログラムを圧縮する。
【００３８】
圧縮には上記のように１命令コード単位に圧縮するだけでなく、複数の非圧縮命令コードをそれより少ない圧縮命令コードに圧縮する方法も考えられる。例えば、非圧縮命令コード２命令分を圧縮命令コード１命令にすることで、さらなる圧縮を図ることができる。図５に圧縮のための新命令とそれを伸張した既存命令のそれぞれの命令コードを示す。
【００３９】
このような圧縮は、図６に示すように以下の手順で行われる。
【００４０】
まず、コンパイラは、コンパイラ言語（Ｃ言語などの高級言語）で記述されたソースプログラムからサブセットの非圧縮命令で表現したアセンブラソースプログラムを生成する。アセンブラは、アセンブラソースプログラムをリロケータブルオブジェクトに変換し、さらにリンカによって非圧縮命令コードで記述されたアブソリュートオブジェクトファイルを生成する。このファイルは、さらにオブジェクトコンバータによってｈｅｘフォーマット等のオブジェクトに変換される。あるいは、圧縮ソフトウェアによって、上記アブソリュートオブジェクトファイルを圧縮命令コードで記述されたアブソリュートオブジェクトファイルに変換して圧縮する。圧縮されたファイルは、さらにオブジェクトコンバータによって、ｈｅｘフォーマット等のオブジェクトに変換される。これらのオブジェクトをプログラムメモリ１に格納する。
【００４１】
圧縮命令コードとしては、すべて同一の長さ（ビット長）である固定長、あるいは長さが異なる複数のビット長を持つ可変長のいずれかが考えられる。可変長の場合は、その命令コードとして、例えば図７（ａ）に示したように、常に命令コードの最上位コードでしかビット長を判別できないエンコード方式があり、例えば３２ビット長の命令コードの上位１６ビットの一部を判別に使用する。一方、どのコード位置でもビット長を識別できるエンコード方式があり、例えば３２ビット長の命令コードの上位１６ビットの一部でも下位１６ビットの一部でも判別に使用可能な方式が考えられる（図７（ｂ））。一般的には、前者のエンコード方式がオペコード（命令の種類を識別するための命令コード中の特定のビットフィールド）が少ないため、コード効率のよい命令コードとなる。
【００４２】
前者のエンコード方式の圧縮命令コードを使う場合には、図８ならびに図９に示すように、１命令ずつ命令コード変換するのではなく、あるサイズのブロック単位で命令コード変換を行う必要がある。これは、割り込みなどの例外が発生した場合に、例外からの復帰で３２ビット長の命令コード変換を正しく行うためである。例えば、３２ビット長の圧縮命令コード（命令２）が命令コード変換装置３により、ＣＰＵ４の元の命令２Ａ’と命令２Ｂ’に伸張され、命令２Ｂ’を実行途上で例外が起きた場合に、例外復帰後３２ビット長の圧縮命令コードの下位１６ビットが格納されているアドレス（ＣＰＵアドレスの８番地）から再開するため、圧縮命令コードの上位１６ビットが再フェッチされないので、命令コード変換を正しく行うことができない。これを防ぐため、ブロックに分割し、ブロックの先頭は必ず１６ビット長の圧縮命令コード又は３２ビット長の上位１６ビットの圧縮命令コードになるようにオブジェクトを生成し、ブロックの先頭から伸張をすれば、常に正しい伸張を行うことが可能となる。
【００４３】
このブロック単位の伸張には、上記制約すなわちブロックをまたぐ３２ビット長のコードは許されないこと以外に、ブロック内にデータを置くことはできない。データと命令コードの区別ができないため、伸張すべきか否かが決定できないからである。前述した圧縮ソフトウェアによりブロックをまたぐ場合はＮＯＰを挿入してまたがないように調整を行うものとする。ブロックのサイズを大きくすることで、またぐ可能性を減らすことが可能であるが、サイズが大きすぎると、コード変換された命令を格納するバッファメモリの容量が大きくなり、コストに影響を与える。また、サイズ分の命令読み出し／変換作業時間が必要なので、実行時間に影響を与える。これらのトレードオフを勘案してバッファサイズが決められる。
【００４４】
次に、図１０を参照して本発明をさらに詳細に説明する。
【００４５】
ＣＰＵ４は、例えば３２ビット固定長の非圧縮命令コードＣ１，Ｃ２，Ｃ３…を実行できるものとする。コード効率が上がる圧縮命令コードとして、例えば１６ビットあるいは３２ビットの可変長の命令コードＡ１，Ａ２，Ａ３…を用意し、前述したソフトウェアで圧縮命令コードによるオブジェクトを生成する。プログラムソースの一部は、圧縮をかけない場合を想定する。これは、（ａ）圧縮命令コードだけでは命令数が不足しプログラムのすべてを圧縮命令コードで実現できないことがあり（非圧縮命令の数と圧縮命令コード長に左右されるが、特定のＣＰＵリソースを扱う命令コードを圧縮命令コードで用意できなかった場合などが考えられる）、（ｂ）圧縮命令コードは、命令数が非圧縮命令よりも通常少なくなるため、命令ステップ数が増え、圧縮の効果が失われることがあり、（ｃ）圧縮命令コードは伸張してから実行されるため、非圧縮命令に比べて実行時間が延びる場合があり、プログラムの実行時間に制約がある部分が存在したりする。上記（ａ）〜（ｃ）の場合には圧縮をかけられない、あるいは圧縮をかけるべきではない。したがって、非圧縮命令コード（３２ビット固定長の命令コードＢ１，Ｂ２，Ｂ３…）によるオブジェクトも生成される。圧縮命令コードと非圧縮命令コードで表現されるオブジェクトがともにプログラムメモリ（メモリは１つでも複数でもよい）１に格納される。
【００４６】
可変長の命令コードＡ１、Ａ２、Ａ３…は、最上位コードにオペコードを置くエンコード方式とする。この場合は、本発明では読み出された命令が何ビットの命令コードであるかを認識するため、圧縮命令コードを置くプログラムメモリは、あるサイズ、例えば１６ビット長の命令で３２命令分のブロックに分割する。ブロックの先頭は必ず圧縮命令コードの最上位コードが来るように、またブロック内にはデータが入らないように、図１１ならびに図１２に示すように、前述したソフトウェアでオブジェクトを生成する。
【００４７】
プログラムメモリ１から命令コードＡ１，Ａ２，Ａ３…（圧縮命令コード）およびＢ１，Ｂ２，Ｂ３…（非圧縮命令コード）を読み出す際、圧縮命令コードあるいは非圧縮命令コードを区別する手段として、ＣＰＵ４からのアドレスを使う。例えば、アドレスがある範囲にある場合を圧縮命令コード領域とみなし、この範囲外を非圧縮命令コード領域とする。アドレス範囲は固定されていてもよいが、レジスタを設けて任意に設定できるようにした方がメモリの無駄な空きが少なくて済み、よりコード効率を上げることができる。この例では、アドレス範囲を使う場合を説明する。
【００４８】
例えば、圧縮／非圧縮命令コードのプログラム領域は、ＣＰＵ４からのアドレスの上位８ビットを使って区別する。上位８ビットが０４〜７Ｆの範囲は圧縮命令コードでプログラムをプログラムメモリ１に格納し、これ以外の範囲には非圧縮命令コードで書かれたプログラムをプログラムメモリ１に格納する。命令コード変換装置３はＣＰＵ４からのアドレス上位８ビットを見て、圧縮命令コードか否か判断し、圧縮されているときは伸張し、されていないときはそのままＣＰＵ４に命令コードを渡す。
【００４９】
命令コードの一部を使う場合には、例えば命令コードの上位何ビットかを圧縮命令コードと非圧縮命令コードとで異なる値となるよう割り当てる。この場合は、圧縮命令コードと非圧縮命令コードが１命令毎に混在させることが可能で、より高いコード効率を得ることができる場合もある。ＣＰＵ４の外に、ＣＰＵ４の命令で値をセット可能なレジスタを設ける場合には、そのレジスタの値に応じて区別する。例えばそのレジスタをある分岐命令が実行されたことをＣＰＵ４の外部で検出可能であれば、その検出結果でＣＰＵ４の外部のレジスタの値を反転させる。
【００５０】
別の例を挙げると、ＭＭＵ（メモリ・マネージメント・ユニット）を使用する場合には、属性の１つとしてレジスタを設けておき、ＣＰＵ４から出力された仮想アドレスに対応してその属性レジスタの値を使って区別する。属性レジスタはＣＰＵ４の命令で値がセット可能である。外部から入力される信号で区別する場合には、例えばプログラムメモリ１毎に属性の１つとして命令コードの区別を持たせ、そのプログラムメモリ１がアクセスされた際、その属性を命令コード変換装置３に入力する。
【００５１】
ＣＰＵ４から命令をフェッチするために出力される信号は、そのＣＰＵ４のアーキテクチャによって異なる。非ハーバードアーキテクチャの場合は、ＣＰＵ４から命令フェッチであることを示す信号（この信号はデータアクセスであるか命令フェッチであるかを区別する）、読み出しを示す信号およびアドレス信号が出力される。上記で命令フェッチ用の読み出し信号とデータアクセス用の読み出し信号が独立している場合には、前記命令フェッチであることを示す信号はなくてもよい。また、メモリがプログラム用とデータ用とに分かれている場合には、アドレス信号をデコードすることで命令フェッチであるか否かが判別できるので、命令フェッチであることを示す信号は必要ない。この例では、アドレス範囲で命令フェッチか否か判別できる場合を説明する。
【００５２】
一方、ハーバードアーキテクチャの場合には、命令フェッチ用のアドレス信号はデータアクセス用のアドレス信号と独立しているため、命令フェッチであることを示す信号は必要ない。
【００５３】
ＣＰＵ４から命令フェッチの要求があると、ＣＰＵ４からのアドレス信号をデコードして、命令フェッチであることを認識するとともに圧縮／非圧縮命令コードのどちらのアクセスであるかも認識する。圧縮命令のコードのフェッチ要求であった場合は、ＣＰＵ４からのアドレス信号からまずブロックの先頭アドレスを算出する。この例では１６ビット長命令×３２命令分／１ブロックなので、アドレス信号の下位７ビットを“０”にマスクする。さらに、その先頭アドレスを右に１ビットシフトする。シフトされたアドレスから１ブロック分のプログラムメモリ１を順次読み出すようメモリインタフェース２に要求を出す。メモリインタフェース２は、読み出し要求されたアドレスに従いプログラムメモリ１をアクセスし、圧縮命令コードを読み出し、命令コード変換装置３へ返す。
【００５４】
まず、ブロックの先頭は必ず命令の最上位コードとなることから、命令コードのオペコードをデコードしてその命令に必要な圧縮命令コードをすべて読み出し、その圧縮命令コードに対応する元の３２ビットの命令コードに伸張する。例えば、先頭の圧縮命令コードが１６ビット長の命令であった場合は、即３２ビットの命令コードに伸張される。先頭の圧縮命令コードが３２ビット長であった場合には、まず先頭のアドレスから圧縮命令コードの上位１６ビットを読み出し、３２ビット長であることを認識し、先頭に引き続く次のアドレス、すなわち先頭アドレス＋２のプログラムメモリ１から下位１６ビットを読み出し、対応する３２ビットの命令コード２個に伸張する。３２ビットの圧縮命令コードが元の命令の１個にしか機能的に対応できない場合には、２個のうち一方はＮＯＰの命令コードに伸張する。必ず２個にするのは、ＣＰＵアドレスとプログラムメモリ１が１対１に対応し、アドレス変換が右への１ビットシフトという単純な関連付けとなるからである。
【００５５】
伸張された命令は、命令コード変換装置３内に設けられたバッファメモリに格納される。バッファメモリのサイズは、この例では３２ビット×３２命令分必要となる。先頭の圧縮命令コードの伸張が済むと、次の圧縮命令コードの読み出しと伸張とバッファメモリへの格納を同様に行い、ＣＰＵ４からの出力アドレスと一致するアドレスまで伸張が済んだところでＣＰＵ４に伸張された命令コードを返し、命令を実行させる。
【００５６】
命令コード変換装置３は、ＣＰＵ４に伸張した命令コードを返した後も圧縮命令コードの読み出し／伸張および格納をブロックの最終アドレスまで続けて行う。ただし、ＣＰＵ４が分岐命令を実行あるいは割込みなどの例外を検出して、出力アドレスがブロック外に出た場合は、そのブロックでの伸張作業を中止し、直ちに新しいブロックでの伸張作業を行う。これは、伸張における実行時間が必要以上に延びることを防ぐためである。なお、ブロックの境界をまたぐループ処理に伴う分岐が頻繁に行われると、何度も同じブロックの伸張作業が発生するため、バッファメモリは少なくとも２ブロック分用意することで、この問題を回避することができる。バッファメモリのサイズとループ処理における分岐距離の分布次第では、バッファメモリをさらに用意すべきである。分岐距離の分布は、プログラムに依存するが、ＣＰＵ４の命令セットアーキテクチャが支配的であるので、ＣＰＵ４に応じて最適なバッファメモリのサイズと数を設定するようにすればよい。
【００５７】
非圧縮命令コードの命令フェッチ要求であった場合は、ＣＰＵ４からのアドレスを変換せず、メモリインタフェース２に与え、プログラムメモリ１から非圧縮命令コードを読み出す。読み出された非圧縮命令コードは、そのままＣＰＵ４に渡される。一方、命令フェッチでなく、データのアクセス（読み出しあるいは書き込み）要求であった場合は、ＣＰＵ４のアドレスを変換せず、メモリインタフェース２に与え、プログラムメモリ１からデータを読み出し／プログラムメモリ１へデータの書き込みをを行う。
【００５８】
バッファメモリを再利用できるよう、すなわち伸張された命令コードがバッファメモリに格納されて、その命令コードが保持されている場合に、再度伸張することなくバッファメモリの内容を利用することができるよう、バッファメモリは、図１３に示すように、伸張された命令コード群を記憶するメモリ（レジスタでもよい）の他に、以下の付加情報を記憶するレジスタとで構成される。
【００５９】
（ａ）どのＣＰＵアドレスに対応した伸張命令コードが格納されているかを示すため、その上位アドレスを記憶するレジスタ（以下、ブロックアドレス記憶レジスタと呼ぶ）を１ブロック単位に１つ持つ。（ｂ）伸張された命令コードが格納済みか否かを示すレジスタを持つ。各アドレスに１ビットの有効ビットを持ってもよいし、先頭から順次格納するわけだから何番目まで格納したかを示すレジスタ（以下、有効アドレス記憶レジスタと呼ぶ）を１ブロック単位に１つ持ってもよい。
【００６０】
伸張途上のブロックを無効とする場合は、上記（ｂ）の付加情報は必須ではない。この場合には、伸張が完了しているブロックか否かを示す少なくとも１ビットのレジスタを代わりに持つ。なお、上記（ｂ）のレジスタは、リセット時、あるいは上記（ａ）の付加情報が書き換えられたとき、すべてのバッファメモリの内容が無効であることを示すよう初期化される必要がある。例えば、前者のアドレス毎の有効ビットの場合は、有効ビットの内容が“１”のとき、そのアドレスのバッファメモリに伸張された命令コードが格納済みで、有効ビットの内容が“０”のとき未格納であるとすると、初期化で全有効ビットを“０”にする。また、後者のブロック毎の有効記憶レジスタの場合、バッファメモリに伸張された命令コードがいっさい無い状態のとき、このレジスタの内容が“０”になっており、アドレスの下位ビット（この例では、下位７ビット）が“０”に伸張命令コードが格納されると“２”に変化し、最終アドレスまで格納されると４０（１６進数）となるものとすると、初期化でこのレジスタは“０”に設定されればよい。
【００６１】
バッファメモリは、少なくとも２ブロック分用意されているため、例外検出や分岐命令実行により、現在伸張作業途上のブロックあるいはブロックの最終アドレスに置かれた命令の実行により（例外検出や分岐命令実行による場合を含む）、伸張作業の完了したブロックの外へ飛び出した後、再びこのブロックに戻った場合には、上述した付加情報を記憶したレジスタ群によって伸張が完了していることが判明した場合は、プログラムメモリ１から読み出すのではなく、バッファメモリから読み出すことで命令フェッチの応答時間を短縮できる。
【００６２】
また、伸張作業がブロックの最終アドレスまで完了していない場合は、バッファメモリからＣＰＵがフェッチした命令コードを返している間に残っている圧縮命令コードの読み出し／伸張／バッファメモリへの格納を実行させて、さらに命令フェッチの応答時間を短縮すこともできる。
【００６３】
バッファメモリを少なくとも２ブロック分用意しているので、上述した付加情報に加え、図１３に示すように、どのブロックのバッファメモリを次に使用するかを示すレジスタ（以下、バッファメモリ使用指定レジスタと呼ぶ）が必要となる。例えば、バッファメモリが２ブロック分用意されている場合には、このレジスタは少なくとも１ビットで構成され、例えばこのレジスタの内容が“０”の時は、バッファメモリ０が次に使用され、“１”の時はバッファメモリ１が次に使用される。リセット時は、どちらを使用してもよいので、このレジスタは必ずしも初期化しなくてもよい。一方のブロックを使用して伸張した命令コードの格納が行われた場合には、このレジスタは不使用のブロック番号を示すように変化する。一方、両方のブロックを使用すると、古い方のブロック番号を示すようにこのレジスタの内容を変化させる。
【００６４】
割り込み例外やオーバーフロー例外等の例外が頻繁に起こるプログラムの場合は、バッファメモリは、メインルーチン格納用と例外ルーチン格納用と複数持たせた方がさらにバッファメモリ再利用効率が上がる。また、頻繁に使用されるサブルーチン、例えば割り込みを一時的に禁止する処理などがある場合も、バッファメモリは、メインルーチン格納用とサブルーチン格納用と複数持たせる方がよい。メインルーチンなのか否かは、一般的にＣＰＵからのアドレス出力を利用して、アドレス空間でバッファメモリを使い分ける。図１４にＣＰＵのアドレス空間の分割例とバッファメモリの対応例を示す。
【００６５】
本発明は、上述した７つのキーワードの組み合わせにより、図１５に示すように多種多様な実施形態が想定される。
【００６６】
キーワード１：圧縮命令が、固定長命令又は可変長命令を扱う。可変長の場合は、さらに命令の長さを判別するオペコードが特定のコードにのみ存在するか、あるいはすべてのコードに存在するかに分かれる。
【００６７】
キーワード２：伸張後の命令が１命令か複数の命令か。複数の命令の場合には、さらに可変長命令で２語以上の長さのときだけその長さ分だけ複数になるか、圧縮命令コードの長さにかかわらず複数になるかに分かれる。
【００６８】
キーワード３：圧縮命令コードと非圧縮命令コードを混在可能か、圧縮命令だけが使用可能か。混在の場合は、さらに非圧縮命令か圧縮命令かを識別する手段として、ＣＰＵからのアドレス、命令コードの一部、レジスタの値、あるいは外部からの信号に細分化される。
【００６９】
キーワード４：ＣＰＵからのアクセスが命令フェッチかデータアクセスかを識別する方法として、上述した４つの方法が考えられる。
キーワード５：ブロック外にＣＰＵのアドレスが命令フェッチで変化した場合には、そのブロックの伸張作業を継続するか中止するか。
【００７０】
キーワード６：バッファメモリの再利用のための付加情報として、伸張された命令コードが格納済みであるか否かを示すレジスタとして、アドレス毎に有効ビットを設けるか、どのバッファメモリ内アドレスまで格納が完了しているかを示すレジスタをブロック毎に設けるか、あるいはブロックの最終アドレスまで格納が完了していることを示すレジスタをブロック毎に設けるか。
【００７１】
キーワード７：伸張が最終アドレスまで完了していない場合は、先行して伸張作業を開始するか、要求があるまで放置するか。
【００７２】
上記キーワードは、命令コード変換装置３をプログラムメモリ（外部メモリでも内蔵メモリでもよい）１をアクセスするメモリインタフェース２とＣＰＵ４との間に置いたものであったが、他の変形例として、命令コード変換装置３を命令キャッシュをアクセスする命令キャッシュインタフェースとＣＰＵ４との間に置く場合も実施できる。図１において、プログラムメモリ１を命令キャッシュ、メモリインタフェース１を命令キャッシュインタフェースと置き換えた場合である。
【００７３】
内蔵プログラムメモリや命令キャッシュメモリを対象とする場合は、そのメモリインタフェースはバンド幅を上げる、すなわち一度に複数の圧縮命令コードを読み出せるようにすることで伸張の際のメモリの読み出しにかかる時間を短縮できるので、より伸張作業時間を大きく削減できる。
【００７４】
外部プログラムメモリを対象とする場合において、命令キャッシュのリフィルサイズとバッファメモリのサイズを合わせると、ブロックの途中にある圧縮命令コードの伸張の際に、必ずブロックの先頭アドレスからＣＰＵが命令フェッチ要求するので、伸張の際のメモリの読み出しペナルティが命令キャッシュのリフィルで隠れる。
【００７５】
また、専用のバッファメモリではなく、二次キャッシュあるいは一次キャッシュをバッファメモリの代わりに使用するようにすれば、コスト／命令フェッチ時間の点でさらに有利となる。
【００７６】
図１０に示す構成では、１６ビットの圧縮命令コードあたり、１つの３２ビットのＣＰＵ命令コードに伸張する場合を説明した。コード効率をさらに上げるには、１６ビットの圧縮命令コードあたり、１を越えるＣＰＵ命令コードに伸張する。ＣＰＵアドレスとメモリアドレスの関連づけの単純化を維持して、１を越えるＣＰＵ命令コードに伸張するには、サブルーチンコールを利用するのがよい。例えば３２ビット長の１つの圧縮命令コードから４つのＣＰＵ命令コードを伸張したい場合は、サブルーチンコール命令とリターン命令を追加した６つのＣＰＵ命令コードに伸張する。サブルーチンはある限られたアドレス空間（命令コード変換装置が占有する予約領域とする）を使用する。
【００７７】
具体的な例として、図１６に示すように、プログラムメモリ１のビットセット処理を行う圧縮命令コードからサブルーチンコール命令＋ロード命令＋オア命令＋リターン命令＋ストア命令の５つのＣＰＵ命令に伸張する。最初の２つの命令（コール命令およびロード命令）は３２ビットの圧縮命令コードの置かれていたアドレスに相当するバッファメモリに格納し、残る３命令はコールされたアドレスＸ番地から始まる３ワードのサブルーチン用メモリ（ＲＯＭ）にあらかじめ格納しておく。このＲＯＭは命令コード変換装置３内に置かれる。アドレスＸは圧縮命令コードと１対１に対応させておく。１対１に対応させることで、サブルーチンが実行途上に例外が検出された場合は、元の圧縮命令コードを読み出さないで、ＲＯＭから再開するアドレスにある命令コードを読み出してＣＰＵ４に返す。
【００７８】
サブルーチン用メモリはＲＯＭでなくＲＡＭで構成されてもよい。サブルーチン用メモリの容量は圧縮命令コードから展開される命令数分だけ最大必要となる。サブルーチン内で展開される命令が、単純な命令コードならばＲＯＭでなくロジックで組んでもよい。例えば前述のビットセット処理ならば、サブルーチンに置かれる３つの命令コードは、（ａ）オア命令：セットしたいビット位置にのみ１が立ち、残りが０となるイミディエイト（即値）を持つ命令コードとなり、この即値はアドレスＸと１対１に対応するから簡単なロジックで構成できる。アドレスＸのビット６〜４を即値と対応づけるとアドレスＸのビット６〜４が０００（２進数）の時、即値は０００００００００００００００１（２進数）とする。即値以外の命令コードフィールドはオア命令として固定の値となる。例えばある命令コードの場合には、即値以外は００１１０１００００１００００１（２進数）となる。（ｂ）ストア命令：セットしたいメモリのアドレスを指定するためのオフセット値とベースレジスタ番号が上記（ａ）と同様、アドレスＸに対応づけられていれば簡単なロジックで構成できる。図１６に示す例ではベースレジスタはｒ０に限定している。（ｃ）リターン命令：常に一定の命令コードなので、アドレスＸから単純に生成される簡単なロジックで構成される。
【００７９】
次に、この発明の実施形態をさらに詳細に説明する。
図１７は図１０に示す命令コード変換装置３を具体的に構成したシステム全体の一実施形態を示す図である。
【００８０】
図１７において、この情報処理システムは、複数の１６ビット固定長の圧縮命令コードＡ１、Ａ２、Ａ３…および３２ビット固定長の非圧縮命令コードＢ１、Ｂ２、Ｂ３…を格納したプログラムメモリ１（プログラムメモリ１は１つでも複数でもよい）と、プログラムメモリ１から命令コードを読み出すメモリインタフェース２と、圧縮命令コードを非圧縮命令コードに変換する命令コード変換装置３と、３２ビット固定長の命令コードを実行できるＣＰＵ４とを備え、命令コード変換装置３は、ＣＰＵ４から出力されるＣＰＵアドレスＣＡ４をデコードして、圧縮命令コード領域か非圧縮命令コード領域かを識別して領域判定信号Ｓ５を出力するアドレスデコーダ５と、アドレスデコーダ５によってＣＰＵアドレスＣＡ４が圧縮命令コード領域であると判定された場合は、ＣＰＵアドレスＣＡ４を右へ１ビット（３２ビット÷１６ビット÷２＝１ビット）シフトし、非圧縮命令コード領域であると判定された場合には、ＣＰＵアドレスＣＡ４をそのままメモリインタフェース２に出力するアドレスシフタ６と、メモリインタフェース２を介してプログラムメモリ１から読み出された命令コードＡ１、Ａ２、Ａ３…またはＢ１、Ｂ２、Ｂ３…をアドレスデコーダ５のデコード結果（領域判定信号Ｓ５）に応じて圧縮命令コードである場合は、命令コードＡ１、Ａ２、Ａ３…に対応する命令コードＣ１、Ｃ２、Ｃ３…に変換して出力し、非圧縮命令コードである場合は、命令コードＢ１、Ｂ２、Ｂ３…をそのまま出力する命令コード変換回路７と、命令コード変換回路７で変換された命令コードＣ１、Ｃ２、Ｃ３…を格納するバッファメモリ８と、バッファメモリ８に格納される命令コードの変換前の命令コードが置かれていたプログラムメモリ１のメモリアドレスの上位ビットを記憶するブロックアドレス記憶レジスタ９と、バッファメモリ８の命令コード毎に設けられた有効ビットと、アドレスシフタ６の出力アドレスの上位ビットとブロックアドレス記憶レジスタ９に記憶されたアドレスとを比較する比較回路１０と、バッファメモリ８からアドレスシフタ６の出力アドレスに対応したアドレス（アドレスシフタ６の出力アドレスの下位６ビット）から読み出された命令コードＣ１、Ｃ２、Ｃ３…と命令コードＢ１、Ｂ２、Ｂ３…とをアドレスデコーダ５のデコード結果に応じて選択する選択回路１１と、アドレスシフタ６の出力アドレスの下位ビットに対応した有効ビットの出力とアドレスデコーダ５のデコード結果と比較回路１０の比較結果（一致信号Ｓ１０）とＣＰＵ４からのリード要求信号Ｓ４とから、メモリインタフェース２に対するメモリリード要求信号Ｓ１２を生成するメモリリード要求制御回路１２と、アドレスデコーダ５のデコード結果である領域判定信号Ｓ５とメモリリード要求制御回路１２の出力であるメモリリード要求信号Ｓ１２と比較回路１０の出力である一致信号Ｓ１０の値に応じて前記有効ビットの初期化、及びブロックアドレス記憶レジスタ９の書き込みを行う書き込み信号Ｓ１３ａ、ならびにアドレスシフタ６の出力アドレスの下位ビットに対応するバッファメモリ８の有効ビットの書き込みを行う書き込み信号Ｓ１３ｂを生成する制御回路１３とを備えて構成される。プログラムメモリ１に��、圧縮命令コードＡ１、Ａ２、Ａ３…が格納された領域と非圧縮命令コードＢ１、Ｂ２、Ｂ３…が格納された領域があり、ＣＰＵ４からのＣＰＵアドレスＣＡ４の値で区分されている。
【００８１】
次に、命令のフェッチから実行まてのシーケンスを、圧縮命令コード領域におけるアクセスのタイミングチャートを示す図１８、ならびに非圧縮命令コード領域におけるアクセスのタイミングチャートを示す図１９を参照して説明する。
【００８２】
例えばＣＰＵ４から命令フェッチのためのＣＰＵアドレスＣＡ４は、３２ビット出力され、そのアドレス範囲が００００００００〜３ＦＦＦＦＦＦＦ（１６進数）のときは圧縮命令コードを使い、これ以外の範囲のときは非圧縮命令コードを使うものとする。図１７に示すように、プログラムメモリ１の０００００９００番地から圧縮命令コードＡ１、Ａ２、Ａ３、Ａ４…が、４０００００００番地から非圧縮命令コードＢ１、Ｂ２、Ｂ３…が、それぞれあらかじめ格納されているものとする。ＣＰＵ４から命令フェッチのためのＣＰＵアドレスＣＡ４として、００００１２０４が出力された場合は、アドレスデコーダ５は、ＣＰＵアドレスＣＡ４の値が圧縮命令コード領域であることを判定し、アドレスシフタ６は、ＣＰＵアドレスＣＡ４を１ビット右にシフトし、シフトしたアドレス０００００９０２をメモリインタフェース２に出力し、メモリインタフェース２はシフトされたアドレス０００００９０２をプログラムメモリ１に与える。プログラムメモリ１の０００００９０２番地から圧縮命令コードＡ２が読み出され、メモリインタフェース２が圧縮命令コードＡ２を取り込み、命令コード変換回路７に渡す。ＣＰＵアドレスＣＡ４の値が圧縮命令コード領域であるとアドレスデコーダ５が判定しているので、命令コード変換回路７は、圧縮命令コードＡ２に対応する３２ビットの命令コードＣ２に変換する。命令コードＣ２はＣＰＵ４に渡されて、ＣＰＵ４は命令コードＣ２を実行する。
【００８３】
ＣＰＵ４が命令コードＣ２を実行すると、ＣＰＵアドレスＣＡ４を更新し、通常アドレス００００１２０８が出力される。命令コードＣ２が分岐命令や例外発生命令などプロクラムの流れを変える命令であった場合は、その飛ひ先のアドレスが出力される。アドレス００００１２０４のときと同様なシーケンスで、００００１２０８に対応するアドレスから読み出された圧縮命令コードＡ３は、命令コードＣ３に変換されて実行される。
【００８４】
次に、ＣＰＵ４がＣＰＵアドレスＣＡ４として、アドレス４０００００００を出力した場合を説明する。アドレスデコーダ５は、ＣＰＵアドレスＣＡ４の値が非圧縮命令コード領域であることを判定し、アドレスシフタ６は、ＣＰＵアドレスＣＡ４をシフトせず、アドレス４０００００００のままメモリインタフェース２に出力し、メモリインタフェース２はアドレス４０００００００をプログラムメモリ１に与える。プログラムメモリ１のアドレス４０００００００番地から非圧縮命令コードＢ１が読み出され、メモリインタフェース２が取り込み、命令コード変換回路７に渡す。アドレス４０００００００は、アドレスデコーダ５により非圧縮命令コード領域と判定されているので、命令コード変換回路７は、非圧縮命令コードＢ１を変換せず、そのままＣＰＵ４に渡す。ＣＰＵ４は命令コードＢ１を実行する。
【００８５】
命令コードＢ１が分岐命令などプログラムの流れを変える命令でなけれは、ＣＰＵ４はＣＰＵアドレスＣＡ４をアドレス４０００００００から＋４した４００００００４を出力する。アドレス４０００００００のときと同様なシーケンスで非圧縮命令コードＢ２が読み出され、ＣＰＵ４に変換されずに渡されて実行される。このようにＣＰＵ４は、既存の命令セットてある命令コードＣ１、Ｃ２、Ｃ３…あるいはＢ１、Ｂ２、Ｂ３…しか受け取らないため、圧縮命令コードＡ１、Ａ２、Ａ３の追加によって、ＣＰＵ４を改変する必要は全くない。
【００８６】
ブロックアドレス記憶レジスタ９は、アドレスシフタ６の出力であるメモリアドレスＭＡ６の代わりにＣＰＵアドレスＣＡ４を記憶させてもよい。この場合には、比較回路１０は、ブロックアドレス記憶レジスタ９の出力のブロックアドレスＢＡ９とＣＰＵアドレスＣＡ４の上位ビットとを比較するように変える。
【００８７】
選択回路１１は、バッファメモリ８から読み出された命令コードＯＣ８と命令コード変換回路７から出力される命令コードＯＣ７とをアドレスデコーダ５の出力の領域判定信号Ｓ５で選択するマルチプレクサで構成してもよい。また、メモリリード要求制御回路１２の出力であるメモリリード要求信号Ｓ１２に応じて図２０に示すようにマルチプレクサで構成してもよい。
【００８８】
バッファメモリ８は、命令コード変換された命令コードが格納されている場合に、再度プログラムメモリ１から圧縮命令コードＡ１、Ａ２、Ａ３…を読み出さず、バッファメモリ８から読み出すことで、命令コードＣ１、Ｃ２、Ｃ３…をＣＰＵ４に速やかに返すことを目的とする。バッファメモリ８にＣＰＵ４から要求された命令コードが格納済みであるかを判断するため、プログラムメモリ１はあるサイズ（例えば１６ビット長の命令で３２命令分）のブロックに分割され、そのブロックのアドレスの上位ビット（この実施形態では３２ビット−６ビット＝２６ビット）をブロックアドレス記憶レジスタ９に格納する。格納するか否かは、まず格納前にブロックアドレス記憶レジスタ９の出力であるブロックアドレスＢＡ９とアドレスシフタ６の出力のメモリアドレスＭＡ６の上位ビットとを比較回路１０で比較し、不一致ならばブロックアドレス記憶レジスタ９にブロックのアドレスの上位ビットを格納するとともに有効ビットの内アドレスシフタ６の出力のメモリアドレスＭＡ６の下位ビット（この実施形態では６ビット）で指定されるビットを“１”に、他のビットをすべて“０”に設定する。なお、ブロックアドレス記憶レジスタ９と有効ビットの書き込みはメモリインタフェース２を介して命令コードを読み出して変換を行い、バッファメモリ８へ書き込む際に行う。一方、一致ならば、ブロックアドレス記憶レジスタ９への格納は行っても行わなくともよいが、有効ビットは以下のように処理する。有効ビットが既に“１”になっている場合は、バッファメモリ８に変換後の命令コードが格納されているからメモリインタフェース２へはメモリリード要求を行わず、バッファメモリ８からアドレスシフタ６の出力のメモリアドレスＭＡ６の下位ビットで指定されるアドレスから命令コードを読み出し、ＣＰＵ４に渡す。なお、処理時間の短縮を図るために有効ビットのチェックと同時にバッファメモリ８の読み出しを開始する。有効ビットが“０”ならばバッファメモリ８から読み出した命令コードは捨てる。一方、有効ビットが“０”の場合には、メモリインタフェース２に対してメモリリード要求を行い、メモリインタフェース２を介して読み込まれた命令コードが変換され、バッファメモリ８に書き込む際に、有効ビットを“１”に書き換える。
【００８９】
上記実施形態において、コード効率をさらに上げるため、命令コード変換装置３によって圧縮命令コードを使用する領域をプログラマブルに設定てきる１つ以上の領域設定用レジスタを追加して、非圧縮命令コードで格納されるメモリ領域と圧縮命令コードで格納されるメモリ領域を連続させるようにしてもよい。この場合には、アドレスデコーダ５はアドレス００００００００から３ＦＦＦＦＦＦＦの固定アドレス空間のデコードではなく、上記領域設定レジスタの内容とＣＰＵアドレスＣＡ４とを比較するデコードとなる。
【００９０】
なお、初期化プログラムが圧縮命令コードを使えないようにするには、上記領域設定レジスタのデフォルト値を、リセットハンドラプログラム領域を含まないようにするか、あるいは別の初期化用レジスタを追加し、この初期化用レジスタの内容で圧縮命令コードの許可／禁止を行い、かつ圧縮命令コード許可レジスタの初期値を“禁止”に設定する。ＣＰＵ４がデバツグモードの際は、上記圧縮命令コード許可レジスタによって圧縮命令コードの禁止を行い、かつプログラムメモリ１には圧縮前の命令コードを置くことで、デバッグ装置やデバッガは既存のものを流用することが可能となる。
【００９１】
プログラムメモリ１に圧縮命令コードを置いてデバッグする際には、デバッガの負担を軽減するために、圧縮前の命令コードをＣＰＵ４を使ってプログラムメモリ１に書き込む際、命令コード変換装置３に圧縮処理（すなわち、与えられた命令コードを命令コードを圧縮命令コードに変換する）を行う命令コード逆変換回路を付加してもよい。
【００９２】
次に、先の実施形態に対してさらにコード効率を上げるため、図１７に示す構成の命令コード変換装置３の構成を変え、圧縮命令コードとして１６ビット固定長ではなく、１６ビット／３２ビットの可変長を導入した実施形態を、新たな命令コード変換装置３０の構成を含むシステム全体の構成を示す図２１及び図２２を参照して説明する。なお、図２１に示す構成と図２２に示す構成は、※１、※２で示す箇所で連結されているものとする。
【００９３】
３２ビット長の圧縮命令コードは、上位１６ビットＩＨ１、ＩＨ２、ＩＨ３、…と下位１６ビットＩＬ１、ＩＬ２、ＩＬ３…から構成されているものとする。ＩＨ１とＩＬ１がペアとなって１つの３２ビット長の命令コードとなる。また、３２ビット長の圧縮命令コードに対応するＣＰＵ４の命令コードペア（３２ビット×２命令）はＤＨ１／ＤＬ１、ＤＨ２／ＤＬ２、ＤＨ３／ＤＬ３…とする。１６ビット長の圧縮命令コードＡ１、Ａ２、Ａ３…に対応するＣＰＵ４の命令コードは、前記実施形態と同様の命令コードＣ１、Ｃ２、Ｃ３…とする。圧縮命令コードは、３２ビット長の上位１６ビットのコードの上位６ビット、または１６ビット長のコードの上位６ビットを使ってビット長が識別できるものとする。例えば上位６ビットが００００００〜００００１１，０１００１１（２進数）の場合は３２ビット長、０００１００〜０１００１０，０１１０００の場合は１６ビット長とする。命令コード例は、前述した図５に示す。
【００９４】
プログラムメモリ１の圧縮命令コード領域は、例えば１６ビット長で３２命令単位のブロックに分割され、３２ビット長の圧縮命令コードがブロックをまたがないよう、またデータがブロック内に置かれないよう前述した圧縮ソフトウエアによりオブジェクトが生成され、プログラムメモリ１にあらかじめ格納されているものとする。この実施形態の命令コード変換装置３０は、前述した実施形態の命令コード変換装置３に比べて、１つのバッファメモリ８に代えて２つのバッファメモリ８ａ、８ｂとし、１つのブロックアドレス記憶レジスタ９に代えて２つのブロックアドレス記憶レジスタ９ａ、９ｂとし、メモリインタフェース２に与えるアドレスＭＡ１４を生成するアドレスジェネレータ１４と、上位コード記憶レジスタ１６ａ、１６ｂの内容をバッファメモリ使用指定レジスタ２７の出力Ｓ２７で選択する選択回路１７、コード長記憶レジスタ１９ａ、１９ｂの内容をバッファメモリ使用指定レジスタ２７の出力Ｓ２７で選択する選択回路２０、バッファメモリ８ａ、８ｂの内容をバッファメモリ使用指定レジスタ２７の出力Ｓ２７で選択する選択回路２２、上位コード記憶レジスタ１６ａ、１６ｂの書き込み信号Ｓ１５ａ、Ｓ１５ｂを生成する制御回路１５、選択回路１１の選択信号Ｓ２１を生成する制御回路２１、有効アドレス記憶レジスタ２４ａ、２４ｂのリセット信号Ｓ２３ａ、Ｓ２３ｂ、及びカウントアップ信号Ｓ２３ｃ、Ｓ２３ｄとアドレスジェネレータ１４のカウントアップ信号Ｓ２３ｅとを生成する制御回路２３、有効アドレス記憶レジスタ２４ａ、２４ｂの内容ＳＡ２４ａ、ＳＡ２４ｂをバッファメモリ使用指定レジスタ２７の出力Ｓ２７で選択する選択回路２５、選択回路２５の出力Ａ２５とアドレスシフタ６の出力アドレスＭＡ６の下位ビットとを大小比較する比較回路２６、ブロックアドレス記憶レジスタ９ａ、９ｂの内容アドレスＢＡ９ａ，ＢＡ９ｂとアドレスＭＡ６の上位ビットとが一致しているかをチェックする比較回路１０ａ、１０ｂ、メモリインタフェース２を介して読み込まれた命令コードＯＣ２が３２ビット長の圧縮命令コードの上位１６ビットであった場合にこれを記憶する上位コード記憶レジスタ１６ａ、１６ｂ、メモリインタフェース２を介して読み込まれた命令コードＯＣ２が１６ビット長の圧縮命令コードか３２ビット長の圧縮命令コードかを検出するコード長検出回路１８、メモリインタフェース２を介して読み込まれた命令コードＯＣ２が１６ビット長の圧縮命令コードか３２ビット長の圧縮命令コードかを記憶するコード長記憶レジスタ１９ａ、１９ｂ、バツファメモリ８ａ、８ｂのどこまでコード変換されて格納されているかを示す有効アドレス記憶レジスタ２４ａ、２４ｂ、どのバッファメモリ８ａ、８ｂを次回使用するかを記憶するバッファメモリ使用指定レジスタ２７を備えて構成される。
【００９５】
プログラムメモリ１の圧縮命令コード領域は、１６ビット×３２命令＝５１２ビット（６４バイト）単位のブロックに分割されているので、バッファメモリ８ａ、８ｂのサイズは、それぞれ３２ビット×３２命令＝１０２４ビット（１２８バイ卜）となる。有効アドレス記憶レシスタ２４ａ、２４ｂは、例えばその値が“０”のときはバッファメモリ８ａ、８ｂに有効な（コード変換済み）の命令コードか格納されていないことを示し、１命令コードがバッファメモリ８ａ、８ｂに格納される毎に前記カウントアップ信号Ｓ２３ｃ、Ｓ２３ｄによって＋２される。したがって、１ブロック分３２命令がすべて格納されると、３２×２＝６４（１０進数）が有効アドレス記憶レシスタ２４ａ、２４ｂにセットされる。バッファメモリ使用指定レジスタ２７の内容が、例えば“０”のときバッファメモリ８ａ、ブロックアドレス記憶レシスタ９ａ、有効アドレス記憶レジスタ２４ａ、コード長記憶レジスタ１９ａが選択されるものとする。
【００９６】
次に、命令コードの読み出しからＣＰＵ４による命令実行のシーケンスを説明する。
【００９７】
ＣＰＵ４が圧縮命令コードを格納した領域のプログラムメモリ１をアクセスしようとすると、ＣＰＵ４からのＣＰＵアドレスＣＡ４からアドレスデコーダ５によって圧縮命令コード領域であると判定されると、アドレスシフタ６によってＣＰＵアドレスＣＡ４を右に１ビットシフトしたアドレスＭＡ６を出力する。バッファメモリ８ａ、８ｂのサイズに対応したブロックの上位アドレスとなる前記アドレスＭＡ６の上位ビット（この例では３２ビット−６ビット＝２６ビット）が、各バッファメモリ８ａ、８ｂに対応するブロックアドレス記憶レジスタ９ａ、９ｂの内容と一致しているか否かがチェックされる。一致していた場合は、一致した方のバッファメモリ側の有効アドレス記憶レジスタ２４ａ、２４ｂの内容をチェックし、有効アドレス記憶レジスタ２４ａ、２４ｂの内容が“０”の場合、あるいはブロツクアドレス記憶レジスタ９ａ、９ｂがともに不一致の場合は、前記ブロックの先頭アドレスから圧縮命令コードを読み出すべく、アドレスジェネレータ１４の出力であるメモリアドレスＭＡ１４を前記ブロックの先頭アドレスに設定し、メモリインタフェース２に前記ブロックの先頭アドレスを与え、プログラムメモリ１から圧縮命令コードＩＨ１、ＩＨ２、ＩＨ３…、あるいは圧縮命令コードＡ１、Ａ２、Ａ３…を読み込む。
【００９８】
バッファメモリ使用指定レジスタ２７の内容で選ばれたブロツクアドレス記憶レジスタ９ａ、９ｂのいずれかに、前記ブロックの先頭アドレスを書き込むとともに、バッファメモリ使用指定レジスタ２７の内容で選ばれた有効アドレス記憶レジスタ２４ａ、２４ｂのいずれかを“０”にクリアする。読み込まれた圧縮命令コードの上位６ビットをコード長検出回路１８で１６ビット長か３２ビット長かを判定し、バッファメモリ使用指定レジスタ２７の内容て選ばれたコード長記憶レジスタ１９ａ、１９ｂに判定結果をセットする。判定結果は、例えば１６ビット長のときは００（２進数）、３２ビット長のときは１０（２進数）とする。コード長記憶レジスタ１９ａ、１９ｂは、１６ビット長の命令コードを処理中が“００”、３２ビット長の命令コードの上位１６ビットを処理中が“１０”、下位１６ビットの処理中が“１１”となるものとする。
【００９９】
１６ビット長の圧縮命令コード（Ａ１、Ａ２、Ａ３…）であった場合は、直ちに命令コード変換回路７でコード変換され、バッファメモリ使用指定レジスタ２７の内容で選ばれたバッファメモリ８ａ、８ｂのいずれかに格納される。格納されると、バッファ使用レジスタ２７て選ばれた有効アドレス記憶レジスタ２４ａ、２４ｂのいずれかは＋２される。３２ビット長の圧縮命令コード（ＩＨ１、ＩＨ２、ＩＨ３…）であった場合には、バッファメモリ使用指定レジスタ２７の内容で選ばれた上位コード記憶レジスタ１６ａ、１６ｂのいずれかに上位コード（ＩＨ１、ＩＨ２、ＩＨ３…）を記憶し、またバッファメモリ使用指定レジスタ２７の内容で選ばれたコード長記憶レシスタ１９ａ、１９ｂの内容を“００”から“１０”に更新するとともに、下位１６ビット分の命令コードを読み出すために、ブロック先頭アドレスに＋２したアドレスをアドレスジェネレータ１４によって生成し、メモリインタフェース２を介してプログラムメモリ１をアクセスする。プログラムメモリ１から下位１６ビットの圧縮命令コード（ＩＬ１、ＩＬ２、ＩＬ３…）を読み出し、命令コード変換回路７に与える。
【０１００】
命令コード変換回路７は、先に読み出した上位１６ビットの命令コードと後で読み出した下位１６ビットの命令コードを連結した３２ビットの圧縮命令コードを、少なくとも２つの３２ビット長のＣＰＵ命令コード（命令コードペアＤＨ１／ＤＬ１、ＤＨ２／ＤＬ２、ＤＨ３／ＤＬ３…の中から選択される）に変換し、バッファメモリ使用指定レジスタ２７の内容で選ばれたバッファメモリ８ａ、８ｂの２ワードに格納する。格納とともにバッファ使用レジスタ２７て選はれた有効アドレス記憶レジスタ２４ａ、２４ｂのいずれかは＋４される。
【０１０１】
ＣＰＵ４が命令フェッチのために要求したアドレスを右に１ビットシフトしたアドレスの下位６ビット値（バッファメモリ８ａ、８ｂのサイズが３２命令分であるため）と、バッファメモリ使用指定レジスタ２７て選ばれた有効アドレス記憶レジスタ２４ａ、２４ｂの内容との比較を比較回路２６が行い、６ビット値がバッファメモリ使用指定レジスタ２７の内容で選ばれた有効アドレス記憶レジスタ２４ａ、２４ｂの内容より小さくなるまで、アドレスジェネレータ１４は生成アドレスを＋２づつ更新し、メモリインタフェース２を介してプログラムメモリ１から圧縮命令コードの読み出し、命令コード変換回路７による命令コードの変換、バッファメモリ８ａ、８ｂへの格納、有効アドレス記憶レジスタ２４ａ、２４ｂの更新を繰り返し行う。
【０１０２】
上記６ビットの値が有効アドレス記憶レジスタ２４ａ、２４ｂの内容より小さくなると、ＣＰＵ４の要求した命令が読み込まれ、変換されてバッファメモリ８ａ、８ｂに格納されたこととなるので、直ちに変換された命令コードを、命令コード変換回路７からＣＰＵ４に渡し、実行させる。命令実行と並行して、１ブロック分の圧縮命令コードの読み出し、命令コード変換、バッファメモリ８ａ、８ｂヘの格納を継続する。ＣＰＵ４が命令を実行すると、ＣＰＵアドレスＣＡ４が更新される。ＣＰＵアドレスＣＡ４が命令コード変換途上あるいは変換完了のブロック内のアドレスであるか否かを、ＣＰＵアドレスＣＡ４を右に１ビットシフトするアドレスシフタ６の出力の上位ビット（下位６ビット以外のビット）と、ブロックアドレス記憶レジスタ９ａ、９ｂとを比較して判断し、一致していればブロック内と判断され、バッファメモリ使用指定レジスタ２７の値を一致した方のバッファメモリ８ａ、８ｂ側を示す値にセットする。不一致ならばブロック外に飛び出したこととなり、最後に使用したバッファメモリ８ａ、８ｂでない方のバッファメモリ８ａ、８ｂ側を示す値として、バッファメモリ使用レシスタ２７を更新する。
通常は、ＣＰＵ４が実行する命令は、プログラムの流れが変わらないため、ＣＰＵ４の要求する命令は既にバッファメモリ８ａ、８ｂに格納されているコードが多く、格納済みであるコードを有効アドレス記憶レジスタ２４ａ、２４ｂから判定して、メモリインタフェース２にアクセス要求を出さずに、すなわちプログラムメモリ１から再び圧縮命令コードを読み出さず、バッファメモリ８ａ、８ｂからＣＰＵ４に伸張された命令コードを返す。ＣＰＵ４が分岐命令を実行したり、例外を検出すると、プロクラムの流れが変わりブロック外に飛び出すことがある。ブロック外に飛び出した場合には、飛び先の命令フェッチをすみやかに始められるよう、変換途上のブロックの命令読み出し／命令コード変換／バッファメモリ８ａ、８ｂへの格納を直ちに中止させる。中止しても既に変換された命令コードはバッファメモリ８ａ、８ｂがオーバーライトされない限り残っているので、再びこのブロックに戻ってきた場合の伸張作業は途中から再開できるので、伸張にかかる時間を短縮できる。この短縮をより効果的にするために、バッファメモリとして、サブルーチン用、例外ルーチン用を追加してもよい。本実施例ては、これらのバッファモリは省略しているが、バッファメモリは少なくとも６ブロック分あることが望ましい。
【０１０３】
命令コード変換回路７は、３２ビット長の圧縮命令コードの変換に際し、一方をＮＯＰ命令コードする場合、上位１６ビットＩＨ１、ＩＨ２、ＩＨ３…であることを、上位１６ビットコードの一部ビットから認識すると、命令コード変換回路７はＮＯＰ命令コードを発生し、バッファメモリ８ａ、８ｂに格納する。後続の３２ビット長の圧縮命令コードの下位１６ビットＩＬ１、ＩＬ２、ＩＬ３をプログラムメモリ１から読み出し、命令コードＤＬ１、ＤＬ２、ＤＬ３…にコード変換し、バッファメモリ８ａ、８ｂに格納する。例えばプログラムメモリ１の２番地、４番地に、３２ビット長の圧縮命令コードの上位１６ビットＩＨ１、下位１６ビットＩＬ１が格納されていたとすると、バッファメモリ８ａ、８ｂの４番地にＮＯＰ命令コードを、８番地に命令コードＤＬ１を格納する。
【０１０４】
なお、ＮＯＰ命令コードと命令コードＤＬ１とを逆にバッファメモリ８ａ、８ｂに格納してもよい。すなわちＮＯＰから実行されてもよいし、ＮＯＰが後で実行されてもよい。この選択はＣＰＵ４のアーキテクチャで決めればよい。また、前後の命令との関係で、動的にＮＯＰ命令コードを先に実行するように変換したり、後に実行するように変換してもよい。また、３２ビット長の圧縮命令コードによっては、一方をＮＯＰに伸張するのてはなく、２つの３２ビット長のＣＰＵ命令コードＤＨ１、ＤＬ１に伸張することで、さらにコード効率を上けることが可能となる。
【０１０５】
上記実施形態では、３２ビット長の命令コードは、ブロック境界をまたがないようオブジェクト生成の際に制約を持たせることを前提とした実施形態を説明したが、この発明のさらに他の実施形態として、ブロックに対応したプログラムメモリにブロックに格納されている命令が１６ビット長なのか３２ビット長なのか表す情報をプログラムとは別に持たせてもよい。この場合には、ブロック境界をまたぐことも可能である。例えば１６ビット長ならば“０”、３２ビット長の上位１６ビットならば同じく“０”、下位１６ビットならば“１”とする３２ビットの情報をプログラムメモリにおいて、伸張に先立ち、この情報を読み出せば、ブロック境界で３２ビット長のコードがまたいでいる場合に、そのブロックの先頭の情報が“１”となっているので認識できる。また、例外からの復帰で３２ビット長のコードの下位１６ビットから再開しようとしていることも情報が“１”となっていることから認識でき、直前のアドレスから３２ビット長の上位１６ビットを読み出せばよいことがわかり、ブロックの先頭から読み出すというペナルティはなくなる。ただし、３２命令（１６ビット×３２命令＝６４バイト）毎に３２ビット（４バイト分）プログラムメモリを消費する。すなわち、元々３２ビット×３２命令＝１２８バイトがワースト４バイト増えた１３２バイト、ベスト６４バイト＋４バイト＝６８バイトとなる。
【０１０６】
この情報ペナルティをさらに低減するため、１６ビット長なら００又は０１、３２ビット長の上位１６ビットは１０、下位１６ビットは１１と各２ビット化した情報とし、かつ１６ビット長と３２ビット長のオペコードを同一のものを使うことができる（１６ビット長か３２ビット長かの区別は、この２ビットの情報で行うことができるため）ことを利用して、１６ビット長の命令を増やし、ほとんど１６ビット長の命令コードにオブジェクトが生成できれば、プログラムはブロックあたり６４バイト＋８バイト＝７２バイトに近づく。したがって、７２／１２８＝５６．２５％ピークのコード効率が得られる。
【０１０７】
前記命令コードのビット長を表す情報を命令コードの一部ととらえると、前述の「どの位置でもビット長を識別できるエンコード方式」（図７参照）に相当する。
【０１０８】
このように、上記実施形態においては、ＣＰＵアドレスとプログラムメモリアドレスとの対応を単純化することで、アドレス変換のためのインデックステーブルなとを持つ必要はなく、単純に右へ１ビットシフトするだけてあるため、コスト／伸張時間の点において優れている。また、シフト回路は、マルチプレクサで構成可能で、そのアドレス変換は１ｎｓ未満となり、一方従来のインデックステーブルの場合にはメモリの種類にもよるが、数ｎｓから数百ｎｓかかることになる。
【０１０９】
さらに、ＣＰＵが応用されるシステムによってプログラムは異なるため、多用される命令コードも異なり、本発明は、ＣＰＵの外部で命令コードを変換するので、応用システムに合わせて異なる圧縮命令セットを用意することも、ＣＰＵを改変するよりはるかに容易に、よりコード効率の高い命令セットをインプリメントできる。
【０１１０】
命令コード変換装置３、３０の命令コード変換装置７に、コード変換テーブルメモリを付加し、このメモリに予め圧縮前の命令コードと圧縮後の命令コードの対応情報を書き込んでおき（例えば、このメモリがマスクＲＯＭであった場合は、マスクＲＯＭの製造工程で書き込み、ＳＲＡＭやフリップフロップなど書き換えできる場合は、ＣＰＵ４からデータとして書き込めるようにしておき、圧縮命令コード実行に先立って書き込みを行う）、伸張の際、一部又はすべての圧縮コードをこのメモリに書き込まれた対応情報に基づき命令コード変換を行う。このような構成をとることで、プログラムに応じて最も多用される命令コードをより短い圧縮命令コードに割り当てることが可能となり、よりコード効率を改善することが容易に実現できる。
【０１１１】
また、実行時間よりもコード効率を上げてプログラムメモリ容量を削減することができる。このような削減が要求される応用システムとして、例えばＣＰＵチップの扱うことができるプログラムメモリ空間を越える容量を必要とする応用システムに好適である。例えばＣＰＵは３２ビットのプログラムアドレスを持つがＣＰＵチップとしては２８ビット分しか外部にアドレスを出力しない場合に、２８ビット分のアドレス空間を越えたプログラムが必要な応用で、圧縮することで２８ビット分のアドレス空間に収まる場合などである。
【０１１２】
また、プログラムメモリにコストの高いメモリを使用する応用システムでは、メモリコストを削減することによりシステム全体のコストを削減できる。コード効率の向上により、プログラムメモリチップの個数が削減され、応用システムのコストが低減でき、プログラムメモリチップ自身のコストだけでなく、アセンブリ／テスト／基板／配線などのコストも削減できる。さらに、コード効率の向上により、プログラムメモリチップが減少し、応用システムの実装容積が削減できる。内蔵プログラムメモリの場合には、ＣＰＵチップに内蔵プログラムメモリ容量を越えることは回避され、内蔵プログラムメモリ容量が低減され、チップサイズは縮小可能となり、パッケージの小型化も可能となる。また、チップサイズの縮小により信頼性／性能を向上させることもできる。
【０１１３】
一方、プログラムメモリとのバス幅に制約があるが、実行時間は上げたいというような応用システムに好適である。例えば１６ビットバスでプログラムメモリに接続されたシステムにおいて、非圧縮命令コードが３２ビット長である場合は、３２ビットの命令コードを読み出すのに２回のバスサイクルがかかる。圧縮命令コードを１６ビット長にすれば１回のバスサイクルで読み出させるので、実行時間が短縮できる。
【０１１４】
【発明の効果】
以上説明したように、この発明によれば、ＣＰＵを新規設計／改変することなく、命令の追加を実現してコード効率を向上させ、命令を格納するプログラムメモリの容量を削減できる命令コード変換装置、命令コード生成方法ならびに情報処理システムを提供することができる。
【図面の簡単な説明】
【図１】本発明の一実施形態に係る情報処理システムの構成を示す図である。
【図２】ＣＰＵアドレスとプログラムメモリとのアドレス対応関係を示す図である。
【図３】ＣＰＵアドレスとプログラムメモリとのアドレス対応関係を示す図である。
【図４】圧縮命令コードの例を示す図である。
【図５】命令コードの一例を示す図である。
【図６】命令コードの圧縮手順を示す図である。
【図７】命令コードのエンコード方式を示す図である。
【図８】プログラムメモリにおける例外復帰後の再開を実行する際の格納例を示す図である。
【図９】ブロック概念の有無における、プログラムメモリにおける例外復帰後の再開を実行する際の格納例を示す図である。
【図１０】本発明の一実施形態に係る情報処理システムの構成を示す図である。
【図１１】プログラムメモリとバッファメモリとの対応関係を示す図である。
【図１２】図１１におけるブロック境界の制約を示す図である。
【図１３】バッファメモリと付加情報レジスタ群との対応関係を示す図である。
【図１４】アドレス空間の分割とバッファメモリとの関係を示す図である。
【図１５】本発明のキーワードの組み合わせを示す図である。
【図１６】サブルーチン用メモリに展開される圧縮命令コードの一例を示す図である。
【図１７】本発明の一実施形態に係る情報処理システムの構成を示す図である。
【図１８】図１７に示すシステムの一タイミングチャートを示す図である。
【図１９】図１７に示すシステムの他のタイミングチャートを示す図である。
【図２０】図１７に示す選択回路１１をマルチプレクサで構成した場合の選択例を示す図である。
【図２１】本発明の他の実施形態に係る情報処理システムの構成を示す図である。
【図２２】本発明の他の実施形態に係る情報処理システムの構成を示す図である。
【図２３】従来のコード効率を上げる方法におけるアドレスの対応関係を示す図である。
【符号の説明】
１  プログラムメモリ
２  メモリインタフェース
３  命令コード変換装置
４  ＣＰＵ
５  アドレスデコーダ
６  アドレスシフタ
７  命令コード変換回路
８，８ａ，８ｂ  バッファメモリ
９，９ａ，９ｂ  ブロックアドレス記憶レジスタ
１０，１０ａ，１０ｂ，２６  比較回路
１１，１７，２０，２２，２５  選択回路
１２  メモリリード要求制御回路
１３，１５，２１，２３    制御回路
１４  アドレスジェネレータ
１６ａ、１６ｂ  上位コード記憶レジスタ
１８  コード長検出回路
１９ａ、１９ｂ  コード長記憶レジスタ
２４ａ、２４ｂ  有効アドレス記憶レジスタ
２７  バッファメモリ使用指定レジスタ
【図１】
0003556556.tif 000002
【図２】
0003556556.tif 000003
【図３】
0003556556.tif 000004
【図４】
0003556556.tif 000005
【図５】
0003556556.tif 000006
【図６】
0003556556.tif 000007
【図７】
0003556556.tif 000008
【図８】
0003556556.tif 000009
【図９】
0003556556.tif 000010
【図１０】
0003556556.tif 000011
【図１１】
0003556556.tif 000012
【図１２】
0003556556.tif 000013
【図１３】
0003556556.tif 000014
【図１４】
0003556556.tif 000015
【図１５】
0003556556.tif 000016
【図１６】
0003556556.tif 000017
【図１７】
0003556556.tif 000018
【図１８】
0003556556.tif 000019
【図１９】
0003556556.tif 000020
【図２０】
0003556556.tif 000021
【図２１】
0003556556.tif 000022
【図２２】
0003556556.tif 000023
【図２３】
0003556556.tif 000024