以下に添付図面を参照して、この発明にかかるプロセッサ、圧縮装置、圧縮方法、および圧縮プログラムの実施の形態を詳細に説明する。
図1は、命令圧縮と命令実行の流れを示す説明図である。本実施の形態では、命令列を、コンピュータにインストールされている圧縮プログラムで圧縮する。命令列とは、連続する命令の集合であり、たとえば、アドレス順に記憶装置に格納されている。図1では、例として命令IS1〜IS6を命令列としている。命令列の中のいずれかの命令を便宜上、「命令IS」と称す。
図2は、命令ISの構造を示す説明図である。図2では、命令IS1を例に挙げている。命令ISは、オペコードとオペランドが連結された命令コードに、圧縮/非圧縮判定ビットと保存対象/非対象判別ビットが付加された情報である。なお、命令幅は一例として32ビットとする。
圧縮/非圧縮判定ビットとは、その命令ISが圧縮されているか否かを示す圧縮情報である。たとえば、圧縮/非圧縮判定ビットが「1」のときは圧縮を示し、「0」のときは非圧縮を示す。なお、圧縮前では、非圧縮(この例では「0」)とする。保存対象/非対象判別ビットとは、その命令ISを復元元の命令として保存すべきか否かを示す保存情報である。たとえば、保存対象/非対象判別ビットが「1」のときは保存すべきであることを示し、「0」のときは保存すべきでないことを示す。なお、圧縮前では、保存すべきでない(この例では「0」)とする。
図1に戻り、圧縮装置101は、圧縮プログラムがインストールされたコンピュータである。圧縮装置101は、命令列ISsを圧縮する。圧縮装置101では、アドレスが連続する2つの命令間において、オペコードが同一であり、オペランド間に連続性がある場合に、圧縮をおこなう。たとえば、連続する命令IS1,IS2間では、オペコードがともにADDで、オペランドが1増加している。このため、命令IS2は圧縮される。
同様に、命令IS3も圧縮される。命令IS3,IS4間,命令IS4,IS5間,および命令IS5,IS6間では圧縮はおこなわれない。また、命令IS6については、命令IS5を無視して、命令IS4との関係で圧縮が行われる。なお、圧縮の詳細については後述する。
また、圧縮装置101により圧縮された命令群を圧縮命令群issと称す。圧縮命令群issには、復元元となる命令(圧縮されていない)と復元元の命令を参照して復元可能な圧縮命令が混在する。プロセッサ102は、圧縮命令群issをフェッチすることで、圧縮命令を復元して命令を実行する。実行の詳細については後述する。プロセッサ102は、圧縮装置101内のCPU(Central Processing Unit)でもよく、圧縮装置101とは異なるコンピュータのCPUでもよい。また、DSP(Digital Signal Processor)でもよい。
・実施の形態1
つぎに、実施の形態1について説明する。実施の形態1では、図1に示した命令圧縮について説明する。
(圧縮装置101のハードウェア構成例)
図3は、実施の形態1にかかる圧縮装置101のハードウェア構成例を示すブロック図である。図3において、圧縮装置101は、CPU301と、ROM(Read Only Memory)302と、RAM(Random Access Memory)303と、磁気ディスクドライブ304と、磁気ディスク305と、光ディスクドライブ306と、光ディスク307と、ディスプレイ308と、I/F(Interface)309と、キーボード310と、マウス311と、スキャナ312と、プリンタ313と、を備えている。また、各構成部はバス300によってそれぞれ接続されている。
ここで、CPU301は、圧縮装置101の全体の制御を司る。ROM302は、ブートプログラムなどのプログラムを記憶している。RAM303は、CPU301のワークエリアとして使用される。磁気ディスクドライブ304は、CPU301の制御にしたがって磁気ディスク305に対するデータのリード/ライトを制御する。磁気ディスク305は、磁気ディスクドライブ304の制御で書き込まれたデータを記憶する。
光ディスクドライブ306は、CPU301の制御にしたがって光ディスク307に対するデータのリード/ライトを制御する。光ディスク307は、光ディスクドライブ306の制御で書き込まれたデータを記憶したり、光ディスク307に記憶されたデータをコンピュータに読み取らせたりする。
ディスプレイ308は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ308は、たとえば、CRT、TFT液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
インターフェース(以下、「I/F」と略する。)309は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク314に接続され、このネットワーク314を介して他の装置に接続される。そして、I/F309は、ネットワーク314と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F309には、たとえばモデムやLANアダプタなどを採用することができる。
キーボード310は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス311は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
スキャナ312は、画像を光学的に読み取り、圧縮装置101内に画像データを取り込む。なお、スキャナ312は、OCR(Optical Character Reader)機能を持たせてもよい。また、プリンタ313は、画像データや文書データを印刷する。プリンタ313には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
<実施例1>
命令には、いわゆる通常の命令と、VLIWのような複数の命令を含む命令群がある。実施例1では、前者の命令が連続する命令列を圧縮する場合について説明し、実施例2では、後者の複数の命令を含む命令群が連続する命令群列を圧縮する場合について説明する。
(圧縮装置101の機能的構成例)
図4は、実施例1にかかる圧縮装置101の機能的構成例を示すブロック図である。圧縮装置101は、取得部401と、判断部402と、圧縮部403と、設定部404と、を備える。これら制御部となる機能(取得部401〜設定部404)は、具体的には、たとえば、図3に示したROM302、RAM303、磁気ディスク305、光ディスク307などの記憶装置に記憶されたプログラムをCPU301に実行させることにより、または、I/F309により、その機能を実現する。
取得部401は、命令列のうち対象命令を取得する。具体的には、たとえば、取得部401は、図1に示したような命令列を、アドレス順に従って1命令ずつ読み込む。たとえば、先頭アドレス0xF000の命令IS1から順に、命令IS2,IS3,IS4,IS5,IS6を取得する。
判断部402は、取得部401によって取得された対象命令のオペコードと対象命令の先行命令のオペコードが同一であり、かつ、対象命令のオペランドと先行命令のオペランドとの間に連続性があるか否かを判断する。対象命令とは今回読み込まれた命令ISである。先行する命令とは、対象命令の1つ前に読み込まれた命令ISである。たとえば、対象命令が命令IS2とすると、先行命令は命令IS1である。対象命令が命令IS1の場合、先行命令は存在しない。オペランド間の連続性とは、同種のオペランドが規則的に変化している状態である。
オペコードには、オペランドパターンが埋め込まれている。オペランドパターンとはオペランドの構造を示す。オペランドパターンは、オペランドの種類とオペランドの個数と先頭オペランドの開始位置とを含む。たとえば、命令IS1の場合、オペランドの種類はレジスタ、オペランドの個数は3個である。また、先頭オペランドの開始位置は、オペコードを12ビットであるとすると、先頭から15ビット目である。このオペランドパターンは、たとえば、オペコードの上位ビット列に埋め込まれるものとする。
判断部402では、オペランドパターンが対象命令と先行命令とで同一である場合、オペランドの値が連続していれば、連続性ありとする。オペランドパターンが対象命令と先行命令で同一でない場合、オペランドの値をみるまでもなく、連続性なしとする。
たとえば、命令IS1,IS2の場合、命令IS1のオペランドがr0,r16,r32であり、命令IS2のオペランドがr1,r17,r33である。このように、レジスタのアドレスが命令IS1,IS2間で1増加しているため、オペランドの連続性があることになる。1増加していることを示す「+1」は連続性バッファに保持される。また、命令IS2,IS3間でも、命令IS1,IS2間と同じように、レジスタのアドレスが1増加しており、かつ、連続性バッファの値と一致する。したがって、引き続きオペランドの連続性があることになる。連続性なしとなった場合、連続性バッファは初期化される。
このように、レジスタのレジスタ番号やメモリアドレスの変化に規則性がある場合はオペランド間に連続性があることとなる。図1の例では、命令IS1〜IS3間で、オペコードが同一で、かつ、オペランド間に連続性があると判断される。
また、対象となる命令ISの保存対象/非対象判別ビットが「0」(保存すべきでない)である場合、連続性バッファはそのまま維持される。たとえば、命令IS4のあとの命令IS5はNOP(No Operation)であり、後述するように命令IS5の保存対象/非対象判別ビットは「0」に設定される。この場合、命令IS6をプロセッサ102で復元するときは、命令IS5の保存対象/非対象判別ビットは「0」であるため復元されないので、さらにさかのぼって命令IS4との間で、オペコードが同一で、かつ、オペランドに連続性があるか否かが判断される。
オペランドの連続性については、レジスタのレジスタ番号やアドレスの規則的な増減だけではなく、変数のインクリメント、デクリメントも対象となる。また、増減幅も命令ごとに同一であれば、1でなくてもよい。また、レジスタのレジスタ番号が同一値である場合でも、連続性ありとみなす。たとえば、命令の動作を指定するような設定値の場合、同一レジスタ(のレジスタ番号)を指定する場合があるからである。この場合、増減幅を0とする。なお、即値の場合も、増減幅が同一であれば、連続性ありとみなす。また、一定の規則(たとえば、図16に示す式に相当)で変化する場合も連続性ありとみなす。また、即値が同一値である場合であっても、連続性ありとみなす。
また、判断部402は、同一かつ連続性ありでないと判断された場合、対象命令のオペコードの種類に基づいて、対象命令を保存すべき命令であるか否かを判断することとしてもよい。命令の中には、HALT,RET,RFE,EXTW,NOPといったオペランドがないシステム命令がある。このようなシステム命令は、圧縮命令の復元元として利用されない。
図5は、判別テーブルTの一例を示す説明図である。図5において、判別テーブルTには、オペコードごとに保存対象/非対象フラグが設定されている。これにより、対象命令のオペコードがどのオペコードであるかにより、保存すべきであるか否かを判断することができる。たとえば、命令IS1のオペコードはADDであり、保存対象/非対象フラグが「1」(保存すべき)であるため、対象命令を保存すべきと判断する。
対象命令のオペコードが、HALTの場合、保存対象/非対象フラグが「0」(保存すべきでない)であるため、対象命令を保存すべきでないと判断する。なお、判別テーブルTは、図3に示したROM302、RAM303、磁気ディスク305、光ディスク307などの記憶装置に記憶されている。
圧縮部403は、判断部402によって同一かつ連続性ありと判断された場合、対象命令を圧縮する。具体的には、圧縮部403は、判断部402によって同一かつ連続性ありと判断された場合、対象命令に、対象命令が圧縮されていることを示す圧縮情報を付与し、対象命令内の命令コードを削除する。たとえば、圧縮部403では、圧縮する場合には対象命令の圧縮/非圧縮判定ビットを「1」(圧縮)に設定して、圧縮命令にする。すなわち、圧縮する場合は、保存対象/非対象判別ビットや命令コードはすべて削除され、圧縮/非圧縮判定ビットのみとなる。これにより、たとえば、所定ビット幅(例では32ビット。64ビット,128ビット、…でもよい)の命令を1ビットに圧縮することができる。
設定部404は、判断部402によって同一かつ連続性ありでないと判断された場合、対象命令に、対象命令が圧縮されていないことを示す圧縮情報と、対象命令を圧縮非対象の命令として保存すべきことを示す保存情報と、を設定する。具体的には、たとえば、設定部404は、判断部402によって同一かつ連続性ありでないと判断された場合、対象命令は圧縮しないことになる。したがって、設定部404は、対象命令の圧縮/非圧縮判定ビットを「0」(非圧縮)に設定する。また、対象命令は非圧縮であるため、対象命令の保存対象/非対象判別ビットを「1」(保存すべき)に設定する。これにより後続命令が圧縮されると、非圧縮の対象命令は後続命令の復元元になる。
また、設定部404は、判断部402によって同一かつ連続性ありでないと判断された場合に判断部402によって保存すべきと判断された場合、対象命令に、対象命令が圧縮されていないことを示す圧縮情報と、対象命令を保存すべきことを示す保存情報と、を設定する。具体的には、たとえば、設定部404は、対象命令の圧縮/非圧縮判定ビットを「0」(非圧縮)に設定する。また、対象命令の保存対象/非対象判別ビットを「1」(保存すべき)に設定する。これにより後続命令が圧縮されると、非圧縮の対象命令は後続命令の復元元になる。
一方、設定部404は、判断部402によって同一かつ連続性ありでないと判断された場合に判断部402によって保存すべきでないと判断された場合、対象命令に、対象命令が圧縮されていないことを示す圧縮情報と、対象命令を復元元の命令として保存すべきでないことを示す保存情報と、を設定する。具体的には、たとえば、設定部404は、対象命令の圧縮/非圧縮判定ビットを「0」(非圧縮)に設定する。また、対象命令の保存対象/非対象判別ビットを「0」(保存すべきでない)に設定する。これにより、非圧縮の対象命令は後続命令の復元元にならない。
図6は、実施例1にかかる圧縮処理の具体例を示す説明図である。図5では、図1に示した命令群を圧縮する例を示している。圧縮装置101は、まず、アドレス0xF000の命令IS1を読み込む。命令IS1の先行命令はないため、命令IS1の圧縮/非圧縮判定ビットは「0」(非圧縮)となる。また、命令IS1のオペコードはADDであるため、命令IS1の保存対象/非対象判別ビットは「1」(保存すべき)となる。このため、命令IS1については、圧縮後は、保存対象/非対象判別ビットが「0」から「1」に変化しただけである。
命令IS2は、先行命令IS1と同一オペコードであり、かつ、オペランドに連続性があるため、圧縮/非圧縮判定ビットが「1」になり、それ以外は削除される。命令IS3は、先行命令IS2と同一オペコードであり、かつ、オペランドに連続性があるため、圧縮/非圧縮判定ビットが「1」になり、それ以外は削除される。
命令IS4は、先行命令IS3と同一オペコードではない。このため、圧縮/非圧縮判定ビットが「0」に設定される。また、命令IS4のオペコードSTOREであるため保存すべき命令となる。したがって、保存対象/非対象判別ビットが「1」に設定される。このため、命令IS4については、圧縮後は、保存対象/非対象判別ビットが「0」から「1」に変化しただけである。
命令IS5は、先行命令IS4と同一オペコードではない。このため、圧縮/非圧縮判定ビットが「0」に設定される。また、命令IS5はNOPであるため保存すべきでない命令となる。したがって、保存対象/非対象判別ビットが「0」に設定される。このため、命令IS5については、圧縮後は、圧縮前と同じ命令が保存される。
命令IS6は、先行命令IS5と同一オペコードではないが、先行命令IS5の保存対象/非対象判別ビットは「0」に設定されるため、命令IS4を先行命令とする。この場合、命令IS6は、先行命令IS4と同一オペコードであり、かつ、オペランドに連続性があるため、命令IS6の圧縮/非圧縮判定ビットが「1」になり、それ以外は削除される。このように、本実施の形態では、先行命令と同一オペコードであり、かつ、オペランドに連続性がある対象命令が連続すればするほど圧縮効率が高くなる。
(圧縮装置101による圧縮処理手順)
図7は、実施例1にかかる圧縮装置101による圧縮処理手順例を示すフローチャート(その1)である。まず、圧縮装置101は、命令群に命令があるか否かを判断する(ステップS701)。命令がない場合(ステップS701:No)、圧縮処理を終了する。一方、命令がある場合(ステップS701:Yes)、圧縮装置101は、取得部401により、対象命令を取得し(ステップS702)、判断部402により、先行命令と同一オペコードであるか否かを判断する(ステップS703)。同一オペコードである場合(ステップS703:Yes)については、図8で説明する。
一方、同一オペコードでない場合(ステップS703:No)、圧縮装置101は、判断部402により、先行命令の保存対象/非対象判別ビットを参照して、先行命令が非保存対象であるか否かを判断する(ステップS704)。非保存対象である場合(ステップS704:Yes)、先行命令は、オペランドがないシステム命令である。したがって、先行命令の1つ前の命令(先行命令が対象命令であったときの先行命令)と対象命令とでオペコードが同一で、かつ、オペランドの連続性がある場合がある。このため、圧縮装置101は、設定部404により、先行命令を、先行命令の1つ前の命令に変更し(ステップS705)、ステップS703に戻る。
ステップS705では、たとえば、対象命令が図6の命令IS6の場合、先行命令は、命令IS5のNOPとなる。NOPは非保存対象であるため、先行命令IS5(NOP)の1つ前の命令IS4を先行命令とする。
また、先行命令が非保存対象でない場合(ステップS704:No)、すなわち、保存対象である場合、圧縮装置101は、設定部404により、連続性バッファを初期化し(ステップS706)、対象命令の圧縮/非圧縮判定ビットを「0」に設定する(ステップS707)。
つぎに、圧縮装置101は、判断部402により、対象命令が保存すべき命令であるか否かを判断する(ステップS708)。具体的には、たとえば、判別テーブルTを参照することで、対象命令のオペコードについて保存対象/非対象フラグが「1」の場合は保存すべき命令で、「0」の場合は保存すべきでない命令となる。
保存すべきである場合(ステップS708:Yes)、圧縮装置101は、設定部404により、対象命令の保存対象/非対象判別ビットを「1」に設定する(ステップS709)。そして、圧縮装置101は、圧縮/非圧縮判定ビットが「0」、保存対象/非対象判別ビットが「1」、対象命令と同一のオペコードおよびオペランドからなる非圧縮命令を圧縮バッファに保存する(ステップS710)。そして、ステップS701に戻る。
また、ステップS708において、保存すべきでないと判断された場合(ステップS708:No)、圧縮装置101は、設定部404により、対象命令の保存対象/非対象判別ビットを「0」に設定する(ステップS711)。そして、圧縮装置101は、圧縮/非圧縮判定ビットが「0」、保存対象/非対象判別ビットが「0」、対象命令と同一のオペコードおよびオペランドからなる非圧縮命令を圧縮バッファに保存する(ステップS712)。すなわち、対象命令をそのまま保存する。そして、ステップS701に戻る。
図8は、圧縮装置101による圧縮処理手順例を示すフローチャート(その2)である。図7のステップS703において、同一オペコードである場合(ステップS703:Yes)、圧縮装置101は、判断部402により、先行命令と対象命令とでオペランドパターンが同一であるか否かを判断する(ステップS801)。オペランドパターンが同一でない場合(ステップS801:No)、オペランドが連続せず圧縮対象外となるため、図7のステップS706に移行して、圧縮装置101は、設定部404により、連続性バッファを初期化する。
一方、オペランドパターンが同一である場合(ステップS801:Yes)、圧縮装置101は、先行命令のオペランドと対象命令のオペランドとの間の差分を検出する(ステップS802)。たとえば、先行命令IS1と対象命令IS2の場合、差分は「+1」である。同様に、先行命令IS2と対象命令IS3の場合、差分は「+1」である。
そして、圧縮装置101は、判断部402により、検出された差分と連続性バッファの値とが同一であるか否かを判断する(ステップS804)。先行命令IS1と対象命令IS2の場合、連続性バッファは初期化されているため、連続性バッファと同一ではない(ステップS804:No)。したがって、圧縮装置101は、設定部404により、連続性バッファを、検出された差分「+1」に更新する(ステップS803)。そして、ステップS707に移行する。
先行命令IS2と対象命令IS3の場合、検出された差分は「+1」であるため、連続性バッファの値「+1」と同一である(ステップS804:Yes)。したがって、圧縮装置101は、圧縮部403により、対象命令の圧縮/非圧縮判定ビットを「1」に設定する(ステップS805)。このあと、圧縮装置101は、圧縮部403により、対象命令の圧縮/非圧縮判定ビットの後続ビット列(保存対象/非対象判別ビット、命令コード)を削除する(ステップS806)。これにより、圧縮/非圧縮判定ビット(=1)のみからなる圧縮命令を圧縮バッファに保存する(ステップS807)。そして、ステップS701に移行する。
このように、圧縮装置101によれば、先行命令に対しオペコードが同一でオペランドに連続性がある対象命令を圧縮することで、命令群の高圧縮化を図ることができる。たとえば、圧縮の条件を満たすmビットの命令がM個連続する場合、非圧縮状態では、(m×M)ビットである。これに対し、圧縮装置101で圧縮すると、先頭の命令のみ非圧縮で、後続の命令が1ビット(圧縮/非圧縮判定ビット)に圧縮される。
したがって、圧縮サイズは(m+M−1)ビットとなる。このように、圧縮によりサイズが縮小されると、最大でバス幅分の圧縮命令を1回のフェッチで取り込むことができるため、メモリアクセス回数の低減を図ることができ、消費電力の低減化を図ることができる。また、NOPなどのシステム命令はオペランドが存在しないため、このような命令を非保存対象とすることで、復元元から除外することができ、復元処理の効率化を図ることができる。
<実施例2>
つぎに、実施例2について説明する。実施例2では、VLIWのように複数の並列実行する命令群が連続する命令列群について圧縮する場合について説明する。
図9は、実施例2にかかる命令群列の一例を示す説明図である。ここでは、VLIWを例に挙げて説明する。命令群列Vsには、図1に示したような命令を複数個(図9では4個)有するVLIW命令が複数存在する。また、命令群列Vsにおいて、命令列ごとに同一位置となる命令は、太枠で囲まれている。たとえば、命令群列Vsの命令列V1〜V4において、アドレス0x0000の先頭命令A1と、アドレス0x0010の先頭命令A2と、アドレス0x0020の先頭命令A3と、アドレス0x0030の先頭命令A4とは、同一位置の命令となる。また、図9の命令群列Vsでは、例として、1命令が実施例1と同じ32ビット、1命令群は4命令列で構成されているため128ビットとする。命令の構造は図2と同様の構成となる。
(圧縮装置101の機能的構成例)
図10は、実施例2にかかる圧縮装置101の機能的構成例を示すブロック図である。図10において、圧縮装置101は、取得部1001と、判断部1002と、圧縮部1003と、設定部1004と、保存部1005と、を備える。これら制御部となる機能(取得部1001〜設定部1004)は、具体的には、たとえば、図3に示したROM302、RAM303、磁気ディスク305、光ディスク307などの記憶装置に記憶されたプログラムをCPU301に実行させることにより、または、I/F309により、その機能を実現する。
取得部1001は、命令群列の中の対象命令群から対象命令を取得する。具体的には、たとえば、取得部1001は、命令群列の先頭アドレス0x0000から命令群V1,V2,V3,V4の順で取得する。また、取得部1001は、命令群V1を取得した場合、命令A1,命令B1,命令C1,命令D1の順で取得する。命令D1の取得後に、つぎにアドレス0x0010の命令群V2を取得することとなる。
判断部1002は、実施例1の判断部1002と同様の判断処理を実行するが、実施例2では、命令群単位で扱われるため、対象命令の先行命令とは、1つ前の命令ではなく、先行命令群における同一位置の命令となる。たとえば、アドレス0x0010の命令B2の先行命令は、アドレス0x0010の命令A1ではなく、先行命令群V1の同一位置となる命令B1である。また、圧縮部1003については、実施例1の圧縮部1003と同様の圧縮処理を実行する。
また、設定部1004についても、実施例1の設定部1004と同様の設定処理を実行するが、判断部1002と同様、対象命令の先行命令は、1つ前の命令ではなく、先行命令群における同一位置の命令となる。なお、実施例2では、連続性バッファは、各命令群の命令の位置ごとに設定される。たとえば、命令A1〜A4は、命令群は異なるが同一位置であるため、当該位置での連続性バッファが用意される。すなわち、図9の例では、連続性バッファは4個設定されることになる。
また、保存部1005は、対象命令群の各対象命令から得られた圧縮情報群を保存するとともに、対象命令群のうち圧縮されずに保存情報が設定された非圧縮の対象命令を、圧縮情報群の後続に保存する。実施例1では、単純に書き出し順に圧縮命令および非圧縮命令を圧縮バッファに書き出していたが、実施例2では、命令群ごとに命令群内の各命令の圧縮/非圧縮判定ビットを先頭にまとめる。このようにまとめられた圧縮/非圧縮判定ビット列を「圧縮情報群」と称す。
保存部1005では、圧縮バッファに圧縮情報群の領域を確保しておき、対象命令群の先頭命令から圧縮/非圧縮判定ビットを書き込む。圧縮/非圧縮判定ビットが「0」(非圧縮)である場合は、圧縮情報群の後続に、保存対象/非対象判別ビット、オペコード、およびオペランドからなる非圧縮命令を書き込むことになる。
保存部1005では、このように、命令群ごとに、圧縮情報群および0個以上の非圧縮命令を圧縮バッファに書き込むが、各命令群において、1つでも命令が圧縮されている場合は、空き領域が発生するため、空き領域分シフトすることで、圧縮後の命令群列の短縮化を図ることができる。このように短縮化することで、フェッチ回数の削減が可能となり、プロセッサ102での処理の高速化および低消費電力化を図ることができる。
図11は、実施例2にかかる圧縮処理の具体例を示す説明図である。図11では、図9に示した命令群列を圧縮する例を示している。(A)は圧縮前の命令群列、(B)は圧縮後の命令群列、(C)は短縮化後の圧縮された命令群列を示している。
(A)において、圧縮装置101は、まず、アドレス0x0000の命令群V1を読み込み、命令群V1をデコードして、命令A1を読み込む。命令群V1の先行命令群はないため、命令A1の先行命令は存在しない。したがって、命令A1の圧縮/非圧縮判定ビットは「0」(非圧縮)となり、(B)において、命令群V1の圧縮情報群C1の先頭ビットに「0」が設定される。命令群V1は先頭命令群であるため、後続の命令B1,C1,D1も同様な結果となる。
(A)において、圧縮装置101は、アドレス0x0000の命令群V1の圧縮処理が終了すると、次のアドレス0x0010の命令群V2を対象命令群として読み込み、命令群V2をデコードして、命令A2を読み込む。命令群V2の先行命令群は命令群V1であるため、命令A2の先行命令は命令A1である。圧縮装置101は、命令A2が判断部1002の圧縮条件(同一オペコード、オペランドの連続性あり)を満たしているため、命令A2の圧縮/非圧縮判定ビットは「1」(圧縮)となる。したがって、(B)において、命令群V1の圧縮情報群C2の先頭ビットに「1」が設定され、保存対象/非対象判別ビット、オペコードおよびオペランドは削除される。命令群V2の後続の命令B2,C2,D2も同様な結果となる。
また、アドレス0x0020の命令群V3では、命令A3,C3が圧縮され、命令F、NOPが非圧縮となる。同様に、アドレス0x0030の命令群V4では、命令A4,D3が圧縮され、命令B3、NOPが非圧縮となる。なお、命令D3の先行命令は命令群V3のNOPであるが、NOPの場合は、連続性バッファにはさらにその前の先行命令D2の差分が保持されているため、命令D3は圧縮されることになる。
また、(B)の状態から(C)の状態に短縮することで、短縮化された圧縮命令群列svsがアドレス0xF100〜0xF120に格納され、アドレス0xF130が空き領域となる。したがって、(A)の状態では、バス幅が128ビットであるとすると、4回のメモリアクセスが必要であるが、(C)の状態では、3回のメモリアクセスとなるため、メモリアクセス回数の低減化を図ることができる。
(圧縮装置101による圧縮処理手順)
図12は、実施例2にかかる圧縮装置101による圧縮処理手順例を示すフローチャートである。まず、圧縮装置101は、命令群列に命令群があるか否かを判断する(ステップS1201)。命令群がある場合(ステップS1201:Yes)、圧縮装置101は、取得部1001により、対象命令群を取得し(ステップS1202)、対象命令群内の命令数N(図9の例ではN=4)ビット分の圧縮情報群の領域を圧縮バッファに確保する(ステップS1203)。そして、対象命令群内の命令位置を示すインデックスiをi=1とする(ステップS1204)。図9の例では、左側からi=1,2,3,4(=N)となる。
このあと、圧縮装置101は、対象命令圧縮処理を実行する(ステップS1205)。対象命令圧縮処理(ステップS1205)では、対象命令群内のi番目の命令である対象命令の圧縮処理を実行する。圧縮処理の内容については、図13および図14で説明する。
対象命令について対象命令圧縮処理(ステップS1205)が実行されたあと、圧縮装置101は、iをインクリメントして(ステップS1206)、i>Nであるか否かを判断する(ステップS1207)。i>Nでない場合(ステップS1207:No)、対象命令圧縮処理(ステップS1205)に戻る。一方、i>Nである場合(ステップS1207:Yes)、ステップS1201に戻ることになる。
また、ステップS1201において、命令群がない場合(ステップS1201:No)、圧縮装置101は、保存部1005により、圧縮バッファに格納された圧縮命令群を、図11の(C)に示したように、空き領域についてビットシフトすることで短縮化する(ステップS1208)。これにより、一連の圧縮処理を終了する。
図13は、図12に示した対象命令圧縮処理(ステップS1205)の詳細な処理手順例を示すフローチャート(その1)である。図13において、圧縮装置101は、判断部1002により、対象命令が先行命令と同一オペコードであるか否かを判断する(ステップS1301)。同一オペコードである場合(ステップS1301:Yes)については、図14で説明する。
一方、同一オペコードでない場合(ステップS1301:No)、圧縮装置101は、判断部1002により、先行命令の保存対象/非対象判別ビットを参照して、先行命令が非保存対象であるか否かを判断する(ステップS1302)。非保存対象である場合(ステップS1302:Yes)、先行命令は、オペランドがないシステム命令である。したがって、先行命令の1つ前の命令群での同一位置命令と対象命令とでオペコードが同一で、かつ、オペランドの連続性がある場合がある。したがって、圧縮装置101は、設定部1004により、先行命令を、先行命令の1つ前の命令群での同一位置命令に変更し(ステップS1303)、ステップS1301に戻る。
たとえば、対象命令が図11の(A)に示した命令D3の場合、先行命令は、命令群V3のNOPとなる。NOPは非保存対象であるため、先行命令(NOP)の1つ前の命令群V2での同一位置命令D2を先行命令とする。
また、先行命令が非保存対象でない場合(ステップS1302:No)、すなわち、保存対象である場合、圧縮装置101は、設定部1004により、i番目の位置の連続性バッファを初期化し(ステップS1304)、対象命令の圧縮/非圧縮判定ビットを「0」に設定する(ステップS1305)。
つぎに、圧縮装置101は、判断部1002により、対象命令が保存すべき命令であるか否かを判断する(ステップS1306)。具体的には、たとえば、判別テーブルTを参照することで、対象命令のオペコードについて保存対象/非対象フラグが「1」の場合は保存すべき命令で、「0」の場合は保存すべきでない命令となる。
保存すべきである場合(ステップS1306:Yes)、圧縮装置101は、対象命令の保存対象/非対象判別ビットを「1」に設定する(ステップS1307)。そして、圧縮装置101は、保存部1005により、圧縮/非圧縮判定ビット「0」を、圧縮バッファ内の圧縮情報群の領域のうちi番目のビット位置に保存する。また、圧縮装置101は、保存部1005により、保存対象/非対象判別ビットが「1」、対象命令と同一のオペコードおよびオペランドを、圧縮バッファ内の圧縮情報群の後続に保存する(ステップS1308)。このようにして、対象命令についての非圧縮命令が保存される。そして、ステップS1206に戻る。
また、ステップS1306において、保存すべきでないと判断された場合(ステップS1306:No)、圧縮装置101は、対象命令の保存対象/非対象判別ビットを「0」に設定する(ステップS1309)。そして、圧縮装置101は、圧縮/非圧縮判定ビット「0」を、圧縮バッファ内の圧縮情報群の領域のうちi番目のビット位置に保存する。また、圧縮装置101は、保存対象/非対象判別ビットが「0」、対象命令と同一のオペコードおよびオペランドを、圧縮バッファ内の圧縮情報群の後続に保存する(ステップS1310)。このようにして、対象命令についての非圧縮命令が保存される。そして、ステップS1206に戻る。
図14は、図12に示した対象命令圧縮処理(ステップS1205)の詳細な処理手順例を示すフローチャート(その2)である。図14において、圧縮装置101は、図13のステップS1301において、同一オペコードである場合(ステップS1301:Yes)、判断部1002により、先行命令と対象命令とでオペランドパターンが同一であるか否かを判断する(ステップS1401)。オペランドパターンが同一でない場合(ステップS1401:No)、オペランドが連続せず圧縮対象外となるため、図12のステップS1304に移行して、圧縮装置101は、設定部1004により、i番目の位置の連続性バッファを初期化する。
一方、オペランドパターンが同一である場合(ステップS1401:Yes)、圧縮装置101は、先行命令のオペランドと対象命令のオペランドとの間の差分を検出する(ステップS1402)。たとえば、先行命令A1と対象命令A2の場合、差分は「+1」である。同様に、先行命令A2と対象命令A3の場合、差分は「+1」である。
そして、圧縮装置101は、判断部1002により、検出された差分と連続性バッファの値とが同一であるか否かを判断する(ステップS1403)。先行命令A1と対象命令A2の場合、i(=1)番目の位置の連続性バッファは初期化されているため、i(=1)番目の位置の連続性バッファと同一ではない(ステップS1403:No)。したがって、圧縮装置101は、i(=1)番目の位置の連続性バッファを、検出された差分「+1」に更新する(ステップS1404)。そして、ステップS1305に移行する。
先行命令A2と対象命令A3の場合、検出された差分は「+1」であるため、i(=1)番目の位置の連続性バッファの値「+1」と同一である(ステップS1403:Yes)。したがって、圧縮装置101は、圧縮部1003により、対象命令の圧縮/非圧縮判定ビットを「1」に設定する(ステップS1405)。このあと、圧縮装置101は、圧縮部1003により、対象命令の圧縮/非圧縮判定ビットの後続ビット列(保存対象/非対象判別ビット、命令コード)を削除する(ステップS1406)。これにより、圧縮装置101は、圧縮/非圧縮判定ビット(=1)のみからなる圧縮命令を、圧縮バッファの圧縮情報群の領域のi番目の位置に保存する(ステップS1407)。そして、ステップS1206に移行する。
このように、圧縮装置101によれば、先行命令に対しオペコードが同一でオペランドに連続性がある対象命令を圧縮することで、命令群列の高圧縮化を図ることができる。たとえば、圧縮の条件を満たすmビットの命令がN個からなる命令群がM個連続する場合、非圧縮状態では、(m×N×M)ビットである。これに対し、圧縮装置101で圧縮すると、先頭の命令群のみ非圧縮で、後続の命令群内の各命令が1ビット(圧縮/非圧縮判定ビット)に圧縮される。
したがって、圧縮サイズは(m×N+(M−1)×N)ビットとなる。このように、圧縮によりサイズが縮小されると、最大でバス幅分の圧縮命令を1回のフェッチで取り込むことができるため、メモリアクセス回数の低減を図ることができ、消費電力の低減化を図ることができる。また、NOPなどのシステム命令はオペランドが存在しないため、このような命令を非保存対象とすることで、復元元から除外することができ、復元処理の効率化を図ることができる。
・実施の形態2
つぎに、実施の形態2について説明する。実施の形態2では、図1に示した命令実行について説明する。実施の形態2では、図1に示したプロセッサ102が、命令列を読み込みながら、非圧縮命令については実行し、圧縮命令については復元元の命令を参照することで復元して、実行する。このように、圧縮された命令列をフェッチすることで、フェッチ回数、すなわち、メモリアクセス回数が低減され、消費電力の低減化を図ることができる。
(プロセッサ102のハードウェア構成例)
図15は、図1に示したプロセッサ102のハードウェア構成例を示すブロック図である。プロセッサ102は、バスを介して、命令RAM151やデータRAM152にアクセス可能に接続されている。バス幅は一例として32ビットとする。命令RAM151には、図6に示した圧縮命令列issや、図11の(B)に示した圧縮命令列群vsまたは(C)に示した圧縮命令列群svsが格納されている。また、プロセッサ102は、入力装置、出力装置、通信装置、DSP、他のCPUなどの周辺モジュール(不図示)ともアクセス可能に接続されている。
プロセッサ102は、コントローラ153と、復旧レジスタ群154と、フェッチコントローラ155と、デコーダ156と、実行ユニット157と、メモリアクセスユニット158と、データレジスタ159と、インターラプトコントローラ1510と、を有する。
コントローラ153は、インターラプトコントローラ1510と、フェッチコントローラ155と、デコーダ156と、実行ユニット157と、メモリアクセスユニット158と、復旧レジスタ群154と、データレジスタ159と(以下、まとめて「接続先」)、に接続されている。コントローラ153は、接続先を制御して、ある接続先からのデータを他の接続先に転送したりする。また、コントローラ153は、フェッチコントローラ155、デコーダ156、実行ユニット157、メモリアクセスユニット158間のパイプライン制御をおこなう。
復旧レジスタ群154は、上段復旧レジスタ1541と中段復旧レジスタ1542と下段復旧レジスタ1543が直列に接続されて構成されている。また、上段復旧レジスタ1541はフェッチコントローラ155およびデコーダ156と接続され、中段復旧レジスタ1542は実行ユニット157に接続され、下段復旧レジスタ1543はメモリアクセスユニット158に接続されている。
各復旧レジスタには、それぞれ、プログラムカウンタ11,21,31、命令バッファ12,22,32、BFI(Bit Field Infomation)レジスタ13,23,33、命令カウンタ14,24,34を有する。プログラムカウンタ11,21,31には、フェッチコントローラ155で計数された値が前段から転送されて保持される。命令バッファ12,22,32には、デコーダ156で得られた命令コードが保持される。BFIレジスタ13,23,33には、デコーダ156で得られた命令コードのオペランドパターンが保持される。命令カウンタ14,24,34は、オペコードが同一でかつオペランドが規則的に連続する連続回数を示す。上段復旧レジスタ1541に保持された値は、中段復旧レジスタ1542に引き継がれ、中段復旧レジスタ1542に保持された値は、下段復旧レジスタ1543に引き継がれる。
フェッチコントローラ155は、プリフェッチバッファ1551と、フェッチバッファ1552と、プログラムカウンタ1553と、を有する。ここでは、プリフェッチバッファ1551とフェッチバッファ1552のビット幅は、バス幅と同一とする。フェッチコントローラ155は、命令RAM151からバス幅分のデータをプリフェッチして、プリフェッチバッファ1551に保持する。
また、フェッチコントローラ155は、フェッチバッファ1552に空きがある場合は、プリフェッチバッファ1551に残存するデータのうち先頭から順に(先入れ先出し)、フェッチバッファ1552に転送する。フェッチコントローラ155は、フェッチバッファ1552に保持されたデータの先頭ビットが「0」である場合、すなわち、圧縮/非圧縮判定ビット=0の場合、非圧縮命令と判断する。この場合、フェッチコントローラ155は、非圧縮命令分のビット列をデコーダ156に転送する。
一方、フェッチコントローラ155は、フェッチバッファ1552に保持されたデータの先頭ビットが「1」である場合、すなわち、圧縮/非圧縮判定ビット=1の場合、非圧縮命令と判断する。この場合、フェッチコントローラ155は、圧縮命令分のビット(ビット値は圧縮されたことを示す圧縮情報=「1」)をデコーダ156に転送する。
プログラムカウンタ1553は、命令RAM151からフェッチされた圧縮命令列の位置を計数する。具体的には、たとえば、プログラムカウンタ1553は、フェッチコントローラ155において非圧縮命令と判断された場合には、非圧縮命令のビット長分(たとえば、32ビットであれば32)、プログラムカウンタ1553の値をインクリメントする。一方、プログラムカウンタ1553は、フェッチコントローラ155において圧縮命令と判断された場合には、圧縮命令のビット長分(たとえば、1ビットであれば1)、プログラムカウンタ1553の値をインクリメントする。
なお、フェッチコントローラ155は、フェッチバッファ1552からデータが転送されると、残余のデータを先頭方向にシフトする。フェッチバッファ1552が空の場合は、フェッチコントローラ155は、プリフェッチバッファ1551のビット幅分のデータをフェッチする。フェッチコントローラ155は、プログラムカウンタ1553の値が更新されると、更新後のプログラムカウンタ1553の値を、上段プログラムカウンタ11に転送する。
デコーダ156は、復旧レジスタ群154の中の上段復旧レジスタ1541に対しアクセス可能に接続されている。上段復旧レジスタ1541は、上段プログラムカウンタ11、上段命令バッファ12、上段BFI(Bit Field Infomation)レジスタ13、上段命令カウンタ14を有する。デコーダ156は、フェッチコントローラ155内のプログラムカウンタ1553の値が更新されて転送されてくると、上段プログラムカウンタ11の値を、更新後のプログラムカウンタの値に更新する。
デコーダ156は、フェッチコントローラ155から転送されてくる命令を解釈して、実行ユニット157に引き渡す。フェッチコントローラ155から転送されてくる命令には非圧縮命令と圧縮命令の2種類がある。たとえば、デコーダ156は、フェッチコントローラ155から転送されてくるデータの先頭ビットが「0」である場合、すなわち、圧縮/非圧縮判定ビット=0の場合、非圧縮命令と判断する。一方、デコーダは、フェッチコントローラ155から転送されてくるデータの先頭ビットが「1」である場合、すなわち、圧縮/非圧縮判定ビット=1の場合、非圧縮命令と判断する。
デコーダ156は、転送されてきた命令が非圧縮命令であると判断された場合、非圧縮命令から命令コードを抽出し、抽出した命令コードを実行ユニット157に転送する。たとえば、図5に示したアドレス0xF100の命令IS1が転送されてくると、先頭2ビット「01」を除く命令コード(オペコードADD、オペランドr0,r16,r32)を実行ユニット157に転送する。
また、デコーダ156は、転送されてきた命令が非圧縮命令であると判断された場合、先頭から2ビット目の保存対象/非対象判別ビットにより、転送されてきた命令について上段命令バッファ12への保存をおこなうか否かを判断する。非保存対象と判断された場合(保存対象/非対象判別ビット=0)は、上段命令バッファ12および上段BFIレジスタ13への保存はおこなわない。
一方、デコーダ156は、転送されてきた命令が保存対象と判断された場合、命令コードのオペランドパターンを解析して、上段BFIレジスタ13に書き込む。たとえば、オペコードの上位ビットにオペランドパターンが書き込まれている場合は、オペランドパターンを上段BFIレジスタ13に書き込む。たとえば、図6に示したアドレス0xF100の命令IS1の場合、上段BFIレジスタ13に書き込まれるオペランドパターンは、オペランドの種類がレジスタ、オペランドの個数が3個、先頭オペランドの開始位置が命令コードの先頭から15ビット目という情報である。
また、デコーダ156は、転送されてきた命令が保存対象と判断された場合、上段命令バッファ12に命令コードを書き込む。たとえば、図6に示したアドレス0xF100の命令IS1が転送されてくると、先頭2ビット「01」を除く命令コード(オペコードADD、オペランドr0,r16,r32)を上段命令バッファ12に書き込む。
また、デコーダ156は、転送されてきた命令が保存対象と判断された場合、命令カウンタを初期値に設定する。たとえば、デコーダ156は、初期値として1を設定する。命令カウンタは、圧縮命令が転送される都度、1ずつカウントアップし、非圧縮命令が転送されると、初期値に戻る。
また、デコーダ156は、転送されてきた命令が圧縮命令であると判断された場合、たとえば、1ビットの圧縮情報である場合、現時点での上段BFIレジスタ13、上段命令バッファ12、および上段命令カウンタ14の値に基づき、元の命令に復元する。たとえば、図6のアドレス0xF120の先頭(左端)のビット「1」が転送されてきた場合、命令IS2内の命令コード(オペコードがADD,オペランドがr1,r17,r33)に復元する。
同様に、図6のアドレス0xF120の先頭(左端)から2番目のビット「1」が転送されてきた場合、命令IS3内の命令コード(オペコードがADD,オペランドがr2,r18,r34)に復元する。復元処理の詳細については後述する。デコーダ156は、復元した命令を実行ユニット157に転送する。デコーダ156は命令を復元した場合、実行ユニット157への転送後に、命令カウンタを1カウントアップする。
また、デコーダ156は、非圧縮命令または復元した命令を実行ユニット157に転送する場合、上段復旧レジスタ1541の値を、中段復旧レジスタ1542に転送する。これにより、中段復旧レジスタ1542の値が更新され、実行ユニット157に転送された命令コードと中段復旧レジスタ1542の値との同期をとることができる。
実行ユニット157は、デコーダ156から転送されてきた命令コードを実行してオペランドで指定されたデータレジスタ159に書き出す。そして、実行ユニット157は、命令コードをメモリアクセスユニット158に転送する。この際、実行ユニット157は、コントローラ153を介して、中段復旧レジスタ1542内の各値を、下段復旧レジスタ1543に転送する。これにより、下段復旧レジスタ1543の値が更新され、メモリアクセスユニット158に転送された命令コードと下段復旧レジスタ1543の値との同期をとることができる。
メモリアクセスユニット158は、実行ユニット157から転送されてくる命令コードにアクセス先となるデータRAM152のアドレスがある場合に、データRAM152にアクセスする。たとえば、転送されてきた命令コードのオペコードがLOADの場合は、命令コード中のデータRAM152のアドレスからデータを読み込み、オペランドで指定されたデータレジスタ159に書き込む。また、転送されてきた命令コードのオペコードがSTOREの場合は、オペランドで指定されたデータレジスタ159の値を命令コード中のデータRAM152のアドレスにデータを書き出す。
インターラプトコントローラ1510は、周辺モジュールからの割込み信号を検出する。インターラプトコントローラ1510は、検出された割込み信号をコントローラ153に伝えることで、コントローラ153は、フェッチコントローラ155、デコーダ156、実行ユニット157、メモリアクセスユニット158に対し、割り込まれた命令を優先実行させる。この場合、メモリアクセスユニット158は、下段復旧レジスタ1543の各値をデータRAM152のスタック領域1520に退避させる。
また、インターラプトコントローラ1510は、周辺モジュールからの割込み処理の完了信号を検出する。インターラプトコントローラ1510は、検出された割込み信号をコントローラ153に伝えることで、コントローラ153は、フェッチコントローラ155、デコーダ156、実行ユニット157、メモリアクセスユニット158に対し、割り込み前の状態への復旧処理を実行させる。具体的には、たとえば、メモリアクセスユニット158での割り込み時の命令コードを、データRAM152のスタック領域1520に退避させられた下段レジスタの各値を用いて、デコーダ156で復元する。割り込み前の状態への復旧処理の詳細については後述する。
(デコーダ156内のオペランド更新部)
つぎに、デコーダ156内のオペランド更新部の詳細について説明する。オペランド更新部は、上段命令バッファ12に保持されているオペランドを、上段BFIレジスタ13に保持されているオペランドパターンにしたがって1オペランドずつ抽出する。そして、抽出されたオペランドと命令カウンタの値により、抽出されたオペランドを更新する。更新処理内容は、たとえば、以下のとおりである。
Operand=Operand OP X・・・・・・・・・・・・・・(1)
X=IC or (IC OP K)・・・・・・・・・・・・・・・・・(2)
OP=+ or − or * or / or >> or <<・・・(3)
ただし、K=係数
上記式(1)において、左辺の「Operand」は更新後のオペランドであり、右辺の「Operand」は更新前のオペランドである。また、上記式(1),(2)において、「OP」は操作であり、上記式(3)で規定したように、四則演算の演算子であったり、シフト操作をおこなう。「X」は変数であり、「IC」は上段命令カウンタ14の値である。「X」は、上段命令カウンタ14の値「IC」そのものまたは上段命令カウンタ14の値「IC」に定数Kを操作した値となる。
たとえば、命令ごとにオペランド(レジスタ番号や変数)が1ずつ増加する場合は、命令カウンタの値自体が1ずつカウントアップするため、「OP」をOP=“+”とし、X=ICに設定する。これにより、式(1)は、以下のようになる。
Operand=Operand+IC・・・(4)
また、命令ごとにオペランド(レジスタ番号や変数)が2ずつ増加する場合は、命令カウンタの値自体が1ずつカウントアップするため、「OP」をOP=“+”とし、K=1に設定する。これにより、式(1)は、以下のようになる。
Operand=Operand+IC+1・・・(5)
また、命令ごとにオペランド(レジスタ番号や変数)が1ずつ減少する場合は、命令カウンタの値自体が1ずつカウントアップするため、上記式(2)のOP=“*”とし、K=−1に設定するとともに、上記式(1)の「OP」をOP=“+”に設定する。これにより、式(1)は、以下のようになる。
Operand=Operand+{IC*(−1)}・・・(6)
また、命令ごとにオペランドがどのような規則的変化をするか、すなわち、「OP」と「K」の組み合わせについては、命令コードで指定される。このような回路構成は、組み合わせ回路により構築可能である。以下、具体例について説明する。
図16は、オペランド更新部の詳細な構成例1を示す説明図である。図16において、オペランド更新部1600は、複数の式A〜式Zと、式設定レジスタ1601と、係数レジスタ1602と、セレクタ1603と、により構成される。複数の式A〜式Zの各々は、組み合わせ回路により構成されている。式設定レジスタ1601には、式変更専用命令があった場合に、式A〜式Zの中からいずれかの式を選択する式設定コードが書き込まれる。係数レジスタ1602には、係数変更専用命令があった場合に、値Kが書き込まれる。
複数の式A〜式Zの各々には、更新前のオペランド(式(1)の右辺のOperand)と、上段命令カウンタ14の値ICと、係数レジスタ1602の値Kが入力される。また、セレクタ1603には、式設定レジスタ1601に書き込まれた式設定コードが入力される。セレクタからの出力が、更新後のオペランド(式(1)の左辺のOperand)となる。
たとえば、図6の圧縮命令列において、0xF100の前のアドレスに、非圧縮命令として、式変更命令と係数変更命令があり、式変更命令のオペランドの値(式A〜Zから使いたい式を指定する選択コード)が式設定レジスタ1601に保持され、係数変更命令のオペランドの値K=0が係数レジスタ1602に保持される。
たとえば、0xF100の命令IS1の場合、式Aが上記式(4)であるとする。式設定レジスタ1601には、式Aの選択コードが保持される。これにより、命令カウンタの値ICと更新前のオペランドであるレジスタ番号r0と係数K=0が入力されて、式(4)により、更新後のオペランドがr1となる。r16、r32についても同様である。
図17は、オペランド更新部1600の詳細な構成例2を示す説明図である。図16では、圧縮命令列に式変更命令と係数変更命令が含まれている例であるが、図17では、復元元の命令のオペコード(またはその一部)が式A〜式Zの選択コードである場合の構成例である。たとえば、オペコードがADDの場合は式Aを選択する選択コードが設定され、オペコードがSTOREの場合は、セレクタ1703により、式Bを選択する選択コードが設定される。また、このような構成では、式変更命令分の命令が不要となり、圧縮率の効率化を図ることができる。
図18は、オペランド更新部1600の詳細な構成例3を示す説明図である。図18では、図16に示した構成例と図17に示した構成例のいずれかの式設定方法を選択できるようにした構成例である。図16の構成例を選択可能であるため、オペコードが異なっていても同じ操作になる場合についても選択可能となる。
具体的には、たとえば、オペランド更新部1600は、式設定方法セレクトレジスタ1801、セレクタ1802,1803を有する。式設定方法セレクトレジスタ1801には、式設定方法変更専用命令があった場合に、オペコードか式設定レジスタに書き込まれた式設定コードのいずれかを選択する選択コードが書き込まれる。セレクタ1802は、式設定方法セレクトレジスタ1801に書き込まれた選択コードにより、オペコードか式設定レジスタに書き込まれた式設定コードのいずれかを選択する。セレクタ1803は、セレクタ1802からの選択信号により、式A〜式Zの中から該当する式を選択して、オペランドを更新する。図16〜図18のいずれの構成例であっても、オペランド更新部1600は、命令ごとのオペランドの規則的な変化に対応することができる。
(プロセッサ102の動作処理手順)
図19は、プロセッサ102の動作処理手順を示すフローチャートである。プロセッサ102は、フェッチコントローラ155によりプリフェッチ(ステップS1901)、フェッチ(ステップS1902)をおこなう。つぎに、プロセッサ102は、フェッチコントローラ155により、フェッチバッファの先頭ビットを参照して、フェッチバッファ内のビット列が圧縮命令であるか非圧縮命令であるかを判断する(ステップS1903)。非圧縮命令である場合(ステップS1903:No)、プロセッサ102は、プリフェッチバッファ1551により非圧縮命令分、プログラムカウンタの値をインクリメントする(ステップS1904)。
このあと、プロセッサ102は、デコーダ156により、非圧縮命令が保存すべき命令であるか否かを判断する(ステップS1905)。具体的には、たとえば、先頭2ビット目の保存対象/非対象判別ビットを参照し、「1」であれば保存されるべき命令、「0」であれば保存されるべきでない命令と判断される。
保存すべきでないと判断された場合(ステップS1905:No)、プロセッサ102は、デコーダ156により、非圧縮命令をデコードする(ステップS1906)。そして、ステップS1914に移行する。一方、保存すべきであると判断された場合(ステップS1905:Yes)、プロセッサ102は、デコーダ156により、非圧縮命令内の命令コードを上段命令バッファ12に保存する(ステップS1907)。このあと、プロセッサ102は、デコーダ156により、非圧縮命令をデコードして(ステップS1908)、非圧縮命令のオペランドパターンを上段BFIレジスタ13に保存し、上段命令カウンタ14を初期化する(ステップS1909)。そして、ステップS1914に移行する。
また、ステップS1903において、圧縮命令であると判断された場合(ステップS1903:Yes)、プロセッサ102は、フェッチコントローラ155により圧縮命令分プログラムカウンタの値をインクリメントする(ステップS1910)。そして、プロセッサ102は、デコーダ156により、上段命令バッファ12に保持されている命令コードを取得する(ステップS1911)。
このあと、プロセッサ102は、上段BFIレジスタ13からオペランドパターンを取得することで、更新対象オペランドを特定し、上段命令カウンタ14の値に基づいて、更新対象オペランドごとに、オペランド更新部1600でオペランドを更新する(ステップS1912)。そして、プロセッサ102は、デコーダ156により、上段命令バッファ12から取得した命令コード内のオペコードと更新後のオペランドを組み合わせることで、圧縮命令を圧縮前の命令に復元する(ステップS1913)。そして、ステップS1914に移行する。
また、プロセッサ102は、ステップS1914において、フェッチコントローラ155によりプリフェッチしたビット列のビット長が一定サイズ以上であるか否かを判断し(ステップS1914)、一定サイズ以上である場合(ステップS1914:Yes)、ステップS1902に戻ってフェッチする(ステップS1902)。
一方、一定サイズ以上でない場合(ステップS1914:No)、ステップS1901に戻ってプリフェッチをおこなう(ステップS1901)。このようにして、フェッチコントローラ155およびデコーダ156が動作することで、非圧縮命令は通常通りデコードされて実行ユニット157に転送され、圧縮命令は元の命令に復元されて実行ユニット157に転送されることになる。
(パイプライン処理)
つぎに、実施の形態2にかかるパイプライン処理について説明する。パイプライン処理では、フェッチコントローラ155による命令フェッチ、デコーダ156によるレジスタリード、実行ユニット157による実行、メモリアクセス部によるメモリアクセスまでの処理(コミット前ステージ)が実行される。このパイプライン処理では、上述したように、デコーダ156によるレジスタリードのステージにおいて、オペランドを更新して圧縮前の命令コードに復元したり、割り込みが発生した場合の復旧処理が実行される。以下の実施例3では、実施例1で圧縮された圧縮命令列でのパイプライン処理を説明し、実施例4では、実施例2で圧縮された圧縮命令群列でのパイプライン処理を説明する。
<実施例3>
(命令実行)
図20〜図36は、実施例3にかかるパイプライン処理例を示す説明図である。まず、図20において、フェッチコントローラ155が、命令RAM151のアドレス0xF100のビット列(命令IS1)をプリフェッチバッファ1551にプリフェッチする。
図21において、フェッチコントローラ155は、プリフェッチバッファ1551にプリフェッチされた命令RAM151のアドレス0xF100のビット列(命令IS1)をフェッチバッファにフェッチする。また、フェッチコントローラ155は、フェッチにより空きになったプリフェッチバッファ1551に、命令RAM151のアドレス0xF120のビット列をプリフェッチバッファ1551にプリフェッチする。
つぎに、図22において、フェッチコントローラ155は、フェッチバッファにフェッチされているアドレス0xF100のビット列(命令IS1)が非圧縮命令であるか否かを判断する。具体的には、たとえば、フェッチコントローラ155は、フェッチバッファの先頭ビット(圧縮/非圧縮判定ビット)が「0」(非圧縮)か「1」(圧縮)かで判断する。アドレス0xF100のビット列の場合、先頭ビットが「0」であるため、アドレス0xF100のビット列は、非圧縮命令のビット列と判定される。この場合、フェッチコントローラ155は、フェッチバッファ内の全ビット列を、デコーダ156に転送する。
また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタを更新する。この場合、転送されるビット列は32ビットであるため、プログラムカウンタの値は、「32」となる。フェッチコントローラ155は、更新後のプログラムカウンタの値「32」を、デコーダ156の上段プログラムカウンタ11に転送する。
また、デコーダ156では、フェッチコントローラ155から非圧縮命令が転送されてくると、非圧縮命令の先頭から2ビット目の保存対象/非対象判別ビットを参照する。この場合、保存対象/非対象判別ビットの値が「1」(保存すべき)であるため、デコーダ156は、非圧縮命令内の命令コードISC1(オペコード:ADD、オペランド:r0,r16,r32)を上段命令バッファ12に保持する。また、デコーダ156は、命令コードISC1のオペランドパターンD1を上段BFIレジスタ13に保持する。そして、デコーダ156は、非圧縮命令が転送されてきたため、上段命令カウンタ14を初期値である「1」に設定する。また、デコーダ156は、フェッチコントローラ155から転送されてきたプログラムカウンタの値を、上段プログラムカウンタ11の値に設定する。
つぎに、図23において、フェッチコントローラ155は、アドレス0xF120のビット列を、プリフェッチバッファ1551から空きになったフェッチバッファ1552にプリフェッチする。また、フェッチコントローラ155は、命令RAM151のアドレス0xF140のビット列を、フェッチにより空きになったプリフェッチバッファ1551にプリフェッチする。
また、デコーダ156は、命令コードISC1と上段復旧レジスタ1541の値を実行ユニット157に転送する。実行ユニット157は、中段復旧レジスタ1542を、上段復旧レジスタ1541の値に更新する。また、実行ユニット157は、デコーダ156から転送されてきた命令コードISC1を、データレジスタ159やデータRAM152を参照することで実行する。
つぎに、図24において、フェッチコントローラ155は、フェッチバッファにフェッチされているアドレス0xF120のビット列が非圧縮命令であるか否かを判断する。アドレス0xF120のビット列の場合、先頭ビットが「1」であるため、アドレス0xF100のビット列の先頭ビットは、圧縮命令であると判定される。この場合、フェッチコントローラ155は、フェッチバッファ内の先頭ビット(=1)を、デコーダ156に転送する。
また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタを更新する。この場合、転送されるビット列は先頭ビット(1ビット)であるため、プログラムカウンタの値は、「33」となる。フェッチコントローラ155は、更新後のプログラムカウンタの値「33」を、デコーダ156の上段プログラムカウンタ11に転送する。
また、デコーダ156では、フェッチコントローラ155から圧縮命令が転送されてくると、上段命令バッファ12に保持されている命令コードISC1、BFIレジスタに保持されているオペランドパターンD1、および命令カウンタの値「1」を読み出す。そして、デコーダ156は、オペランド更新部1600により、読み出した命令コードISC1のオペランドを更新する。これにより、デコーダ156は、元の命令コードISC2(オペコード:ADD、オペランド:r1,r17,r33)に復元する。
また、実行ユニット157は、命令コードISC2と中段復旧レジスタ1542の値をメモリアクセスユニット158に転送する。メモリアクセスユニット158は、下段復旧レジスタ1543を、中段復旧レジスタ1542の値に更新する。また、メモリアクセスユニット158は、転送されてきた命令コードのオペコードにしたがってデータRAM152にアクセスする。命令コードISC1の場合、オペランドにデータRAM152のアドレスがないため、データRAM152にアクセスしないこととなる。
つぎに、図25において、デコーダ156は、復元した命令コードISC2と上段復旧レジスタ1541の値を実行ユニット157に転送する。そして、デコーダ156は、転送後に、上段命令カウンタ14の値を1インクリメントする。実行ユニット157は、中段復旧レジスタ1542を、上段復旧レジスタ1541の値に更新する。したがって、上段復旧レジスタ1541の値と中段復旧レジスタ1542の値は、上段命令カウンタ14の値「2」および中段命令カウンタ24の値「1」のみが異なることとなる。また、実行ユニット157は、デコーダ156から転送されてきた命令コードISC2を、データレジスタ159やデータRAM152を参照することで実行する。
つぎに、図26において、フェッチコントローラ155は、図24での圧縮命令分のビット転送により1ビット空きが生じたため、フェッチバッファ内の残余ビット列(31ビット)を1ビットシフトし、空き領域(1ビット分)に、プリフェッチバッファ1551の先頭ビットをフェッチする。また、メモリアクセスユニット158において、命令コードISC1が処理されると、コミットステージ外の処理(ライトバック)が行われる。
つぎに、図27において、フェッチコントローラ155は、フェッチバッファにフェッチされているビット列が非圧縮命令であるか否かを判断する。このビット列の場合、先頭ビットが「1」であるため、フェッチバッファに保持されているビット列の先頭ビットは、圧縮命令であると判定される。この場合、フェッチコントローラ155は、フェッチバッファ内の先頭ビット(=1)を、デコーダ156に転送する。
また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタを更新する。この場合、転送されるビット列は先頭ビット(1ビット)であるため、プログラムカウンタの値は、「34」となる。フェッチコントローラ155は、更新後のプログラムカウンタの値「34」を、デコーダ156の上段プログラムカウンタ11に転送する。
また、デコーダ156では、フェッチコントローラ155から圧縮命令が転送されてくると、上段命令バッファ12に保持されている命令コードISC1、BFIレジスタに保持されているオペランドパターンD1、および命令カウンタの値「2」を読み出す。そして、デコーダ156は、オペランド更新部1600により、読み出した命令コードISC1のオペランドを更新する。これにより、デコーダ156は、元の命令コードISC3(オペコード:ADD、オペランド:r2,r18,r34)に復元する。
また、実行ユニット157は、命令コードISC2と中段復旧レジスタ1542の値をメモリアクセスユニット158に転送する。メモリアクセスユニット158は、下段復旧レジスタ1543を、中段復旧レジスタ1542の値に更新する。また、メモリアクセスユニット158は、転送されてきた命令コードのオペコードにしたがってデータRAM152にアクセスする。命令コードISC2の場合、オペランドにデータRAM152のアドレスがないため、データRAM152にアクセスしないこととなる。
つぎに、図28において、デコーダ156は、復元した命令コードISC3と上段復旧レジスタ1541の値を実行ユニット157に転送する。そして、デコーダ156は、転送後に、上段命令カウンタ14の値を1インクリメントする。実行ユニット157は、中段復旧レジスタ1542を、上段復旧レジスタ1541の値に更新する。したがって、上段復旧レジスタ1541の値と中段復旧レジスタ1542の値は、上段命令カウンタ14の値「3」および中段命令カウンタ24の値「2」のみが異なることとなる。また、実行ユニット157は、デコーダ156から転送されてきた命令コードISC3を、データレジスタ159やデータRAM152を参照することで実行する。
つぎに、図29において、フェッチコントローラ155は、図28での圧縮命令分のビット転送により1ビット空きが生じたため、フェッチバッファ内の残余ビット列(31ビット)を1ビットシフトし、空き領域(1ビット分)に、プリフェッチバッファ1551の先頭ビットをフェッチする。また、メモリアクセスユニット158において、命令コードISC2が処理されると、コミットステージ外の処理(ライトバック)が行われる。
つぎに、図30において、フェッチコントローラ155は、フェッチバッファにフェッチされているビット列が非圧縮命令であるか否かを判断する。このビット列の場合、先頭ビットが「0」であるため、フェッチバッファ1552内のビット列は、非圧縮命令のビット列と判定される。この場合、フェッチコントローラ155は、フェッチバッファ内の全ビット列を、デコーダ156に転送する。
また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタ1553を更新する。この場合、転送されるビット列は32ビットであるため、プログラムカウンタ1553の値は、「66」となる。フェッチコントローラ155は、更新後のプログラムカウンタの値「66」を、デコーダ156の上段プログラムカウンタ11に転送する。
また、デコーダ156では、フェッチコントローラ155から非圧縮命令が転送されてくると、非圧縮命令の先頭から2ビット目の保存対象/非対象判別ビットを参照する。この場合、保存対象/非対象判別ビットの値が「1」(保存すべき)であるため、非圧縮命令内の命令コードISC4(オペコード:STORE、オペランド:r32,0x0000)を上段命令バッファ12に保持する。また、デコーダ156は、命令コードISC4のオペランドパターンD4を上段BFIレジスタ13に保持する。そして、デコーダ156は、非圧縮命令が転送されてきたため、上段命令カウンタ14を初期値である「1」に設定する。また、デコーダ156は、フェッチコントローラ155から転送されてきたプログラムカウンタの値「66」を、上段プログラムカウンタ11の値「66」に設定する。
つぎに、図31において、フェッチコントローラ155は、プリフェッチバッファ1551内の30ビットのビット列(図30を参照)をフェッチする。また、フェッチコントローラ155は、命令RAM151のアドレス0xF160のビット列「001」を、空きになったプリフェッチバッファ1551にプリフェッチする。そして、フェッチコントローラ155は、フェッチバッファには2ビットの空きがあるため、プリフェッチされた3ビットのうち先頭2ビット「00」を、フェッチバッファにフェッチする。これにより、フェッチバッファには、命令IS5がフェッチされたことになる。
また、デコーダ156は、命令コードISC4と上段復旧レジスタ1541の値を実行ユニット157に転送する。実行ユニット157は、中段復旧レジスタ1542を、上段復旧レジスタ1541の値に更新する。また、実行ユニット157は、デコーダ156から転送されてきた命令コードISC4を、データレジスタ159やデータRAM152を参照することで実行する。また、メモリアクセスユニット158において、命令コードISC3が処理されると、コミットステージ外の処理(ライトバック)が行われる。
つぎに、図32において、フェッチコントローラ155は、フェッチバッファ1552にフェッチされているアドレス0xF160のビット列(命令IS5)が非圧縮命令であるか否かを判断する。アドレス0xF160のビット列の場合、先頭ビットが「0」であるため、アドレス0xF160のビット列は、非圧縮命令(命令IS5)のビット列と判定される。この場合、フェッチコントローラ155は、フェッチバッファ1552内の全ビット列(命令IS5)を、デコーダ156に転送する。
また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタを更新する。この場合、転送されるビット列は32ビットであるため、プログラムカウンタの値は、「98」となる。フェッチコントローラ155は、更新後のプログラムカウンタの値「98」を、デコーダ156の上段プログラムカウンタ11に転送する。
また、デコーダ156では、フェッチコントローラ155から非圧縮命令が転送されてくると、非圧縮命令(命令IS5)の先頭から2ビット目の保存対象/非対象判別ビットを参照する。この場合、保存対象/非対象判別ビットの値が「0」(保存すべきでない)であるため、非圧縮命令内の命令コードISC5(NOP)は上段命令バッファ12に保持されない。同様に、命令コードISC5(NOP)のオペランドパターンも上段BFIレジスタ13に保持されない。
このように、命令コードISC5(NOP)のようなシステム命令コードについては、オペランドの更新処理の対象外とすることで、上段復旧レジスタ1541の値と後続の命令コードとにより、オペランドを更新することができる。そして、デコーダ156は、非圧縮命令が転送されてきたため、上段命令カウンタ14を初期値である「1」に設定する。また、デコーダ156は、フェッチコントローラ155から転送されてきたプログラムカウンタの値「98」を、上段プログラムカウンタ11の値「98」に設定する。
また、実行ユニット157は、命令コードISC4と中段復旧レジスタ1542の値をメモリアクセスユニット158に転送する。メモリアクセスユニット158は、下段復旧レジスタ1543を、中段復旧レジスタ1542の値に更新する。また、メモリアクセスユニット158は、転送されてきた命令コードのオペコードにしたがってデータRAM152にアクセスする。命令コードISC4の場合、オペランドにデータRAM152のアドレス0x0000があるため、データRAM152のアドレス0x0000にアクセス(STORE)することとなる。
つぎに、図33において、フェッチコントローラ155は、プリフェッチバッファ1551のビット列(1ビット)を、空きになったフェッチバッファ1552にフェッチする。また、デコーダ156は、命令コードISC5と上段復旧レジスタ1541の値を実行ユニット157に転送する。実行ユニット157は、中段復旧レジスタ1542を、上段復旧レジスタ1541の値に更新する。また、実行ユニット157は、デコーダ156から転送されてきた命令コードISC5がNOPであるため、何もしない。また、メモリアクセスユニット158において、命令コードISC4が処理されると、コミットステージ外の処理(ライトバック)が行われる。
つぎに、図34において、フェッチコントローラ155は、フェッチバッファ1552にフェッチされているビット列が非圧縮命令であるか否かを判断する。このビット列の場合、先頭ビットが「1」であるため、フェッチバッファ1552に保持されているビット列の先頭ビットは、圧縮命令であると判定される。この場合、フェッチコントローラ155は、フェッチバッファ1552内の先頭ビット(=1)を、デコーダ156に転送する。
また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタ1553を更新する。この場合、転送されるビット列は先頭ビット(1ビット)であるため、プログラムカウンタ1553の値は、「99」となる。フェッチコントローラ155は、更新後のプログラムカウンタ1553の値「99」を、デコーダ156の上段プログラムカウンタ11に転送する。
また、デコーダ156では、フェッチコントローラ155から圧縮命令が転送されてくると、上段命令バッファ12に保持されている命令コードISC4、上段BFIレジスタ13に保持されているオペランドパターンD4、および命令カウンタ14の値「1」を読み出す。そして、デコーダ156は、オペランド更新部1600により、読み出した命令コードISC4のオペランドを更新する。これにより、デコーダ156は、元の命令コードISC6(オペコード:STORE、オペランド:r33,0x0001)に復元する。
また、実行ユニット157は、命令コードISC5(NOP)と中段復旧レジスタ1542の値をメモリアクセスユニット158に転送する。メモリアクセスユニット158は、下段復旧レジスタ1543を、中段復旧レジスタ1542の値に更新する。また、メモリアクセスユニット158は、転送されてきた命令コードのオペコードにしたがってデータRAM152にアクセスする。命令コードISC5の場合、NOPであるため何もしない。
つぎに、図35において、デコーダ156は、復元した命令コードISC6と上段復旧レジスタ1541の値を実行ユニット157に転送する。そして、デコーダ156は、転送後に、上段命令カウンタ14の値を1インクリメントする。実行ユニット157は、中段復旧レジスタ1542を、上段復旧レジスタ1541の値に更新する。したがって、上段復旧レジスタ1541の値と中段復旧レジスタ1542の値は、上段命令カウンタ14の値「2」および中段命令カウンタ24の値「1」のみが異なることとなる。また、実行ユニット157は、デコーダ156から転送されてきた命令コードISC6を、データレジスタ159やデータRAM152を参照することで実行する。
つぎに、図36において、実行ユニット157は、命令コードISC6と中段復旧レジスタ1542の値をメモリアクセスユニット158に転送する。メモリアクセスユニット158は、下段復旧レジスタ1543を、中段復旧レジスタ1542の値に更新する。また、メモリアクセスユニット158は、転送されてきた命令コードのオペコードにしたがってデータRAM152にアクセスする。命令コードISC6の場合、オペランドにデータRAM152のアドレス0x0001があるため、データRAM152のアドレス0x0001にアクセス(STORE)することとなる。また、メモリアクセスユニット158において、命令コードISC6が処理されると、コミットステージ外の処理(ライトバック)が行われる。
このように、圧縮命令列issをパイプライン処理することで、デコーダ156により圧縮命令が復元される。したがって、プロセッサ102は、圧縮前の命令列と同じ命令を実行することができる。また、圧縮命令列issには圧縮命令が含まれているため、命令RAM151からのフェッチ回数が低減される。すなわち、命令RAM151に対するメモリアクセス回数が低減するため、低消費電力化を図ることができる。
(割り込みからの復旧)
つぎに、上述した図20〜図36の命令実行中に、割り込みが発生した場合の割り込みからの復旧処理について説明する。割り込みが発生した場合、プロセッサ102は、コミットステージ移行の処理(ライトバック、…)を完了させてから割り込み処理を実行する。この場合、プロセッサ102は、コミット前ステージの処理について、下段復旧レジスタ1543の値を、一時的に退避させて割り込み処理を実行させ、割り込み処理が終了すると、退避させた下段復旧レジスタ1543の値を用いて、コミット前ステージの処理を復旧する。以下、図31の処理内容のときに割り込みが発生した場合について図37〜図42を用いて説明する。
図37〜図42は、割り込みからの復旧処理を示す説明図である。プロセッサ102は、インターラプトコントローラ1510により、周辺モジュールやタイマにより割り込みの発生を検出すると、コントローラ153を介して、フェッチコントローラ155、デコーダ156、実行ユニット157、メモリアクセスユニット158に対し、割り込み信号を発行することになる。
まず、図37において、メモリアクセスユニット158は、割り込み信号を受信すると、下段復旧レジスタ1543の値やその他汎用レジスタの値を、データRAM152のスタック領域1520に退避させる。
つぎに、図38において、フェッチコントローラ155は、割り込み信号を受信すると、プリフェッチバッファ1551およびフェッチバッファ1552をクリアして、割り込み処理に備える。同様に、デコーダ156、実行ユニット157、メモリアクセスユニット158は、割り込み信号を受信すると、それぞれ上段復旧レジスタ1541、中段復旧レジスタ1542、および下段復旧レジスタ1543の値をクリアして、割り込み処理に備える。そして、プロセッサ102は、割り込み処理を実行する。
つぎに、図39において、デコーダ156は、インターラプトコントローラ1510およびコントローラ153を介して割り込み終了信号を受信すると、スタック領域1520に退避させた下段命令バッファ32の値(命令コードISC1)、下段BFIレジスタ33の値(オペランドパターンD1)、下段命令カウンタ34の値「2」を、上段命令バッファ12の値、上段BFIレジスタ13の値、上段命令カウンタ14の値に設定する。また、フェッチコントローラ155は、再度プリフェッチバッファ1551およびフェッチバッファ1552をクリアして、スタック領域1520に退避させた下段プログラムカウンタ31の値「34」を読み込む。
つぎに、図40において、フェッチコントローラ155は、スタック領域1520から読み出した下段プログラムカウンタ31の値「34」を、フェッチバッファのビット幅(32ビット)で割る。この場合、商が「1」、余りが「1」となる。フェッチコントローラ155は、商「1」にフェッチバッファのビット幅(32ビット)を乗算することで、プリフェッチさせるビット位置を特定する。この場合、商「1」×32ビット=32であるため、圧縮命令列の先頭から32ビット目からのビット列、すなわち、命令RAM151のアドレス0xF120のビット列をプリフェッチバッファ1551にプリフェッチする。そして、フェッチコントローラ155は、プログラムカウンタ1553に、「32」を設定する。
つぎに、図41において、フェッチコントローラ155は、フェッチバッファ1552にフェッチされているビット列が非圧縮命令であるか否かを判断する。このビット列の場合、先頭ビットが「1」であるため、フェッチされているビット列の先頭ビットは、圧縮命令と判定される。この場合、フェッチコントローラ155は、フェッチバッファ1552内の先頭ビットを、デコーダ156に転送する。
また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタ1553を更新する。この場合、転送されるビット列は1ビットであるため、プログラムカウンタ1553の値は、「33」となる。この場合、スタック領域1520に退避させた下段プログラムカウンタ31の値「34」と不一致であるため、フェッチコントローラ155は、更新後のプログラムカウンタの値「33」を、デコーダ156の上段プログラムカウンタ11に転送しない。
また、デコーダ156は、フェッチバッファ1552から圧縮命令が転送されてくるが、プログラムカウンタ1553の値が転送されてこないため、圧縮命令を破棄する。このように、フェッチコントローラ155のプログラムカウンタ1553の値と、スタック領域1520から読み出した下段プログラムカウンタ31の値とが一致するまで、デコーダ156は、フェッチバッファ1552からのビット列を破棄する。これにより、誤ったビット位置で命令が復元されないことになる。
つぎに、図42において、フェッチコントローラ155は、図40で1ビット転送したため、プリフェッチバッファ1551の先頭ビットをフェッチする。このあと、フェッチコントローラ155は、フェッチバッファ1552にフェッチされているビット列が非圧縮命令であるか否かを判断する。このビット列の場合、先頭ビットが「1」であるため、フェッチされているビット列の先頭ビットは、圧縮命令と判定される。この場合、フェッチコントローラ155は、フェッチバッファ1552内の先頭ビットを、デコーダ156に転送する。
また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタ1553を更新する。この場合、転送されるビット列は1ビットであるため、プログラムカウンタ1553の値は、「34」となる。この場合、フェッチコントローラ155は、更新後のプログラムカウンタの値「34」を、デコーダ156の上段プログラムカウンタ11に転送する。
また、デコーダ156は、フェッチバッファ1552から圧縮命令およびプログラムカウンタ1553の値が転送されてきたため、上段復旧レジスタ1541の値により、命令を復元する。これにより、割り込み発生時にメモリアクセスユニット158まで処理されていた命令コードISC2が復元される。これ以降の処理は、図28〜図36と同様に実行されることとなる。これにより、正確な復旧位置で命令を復元することができる。
<実施例4>
つぎに、実施例4について説明する。実施例4では、図11の(C)の圧縮命令群列svsについて命令実行する場合について説明する。圧縮命令群列svsの場合、1つの命令群(非圧縮命令群または復元された命令群)の中に、N個(図11の(A)では4個)の命令が含まれている。したがって、上段命令バッファ12、中段BFIレジスタ22、下段命令バッファ23では、命令ごとに値を保持することになる。また、実施例4では、プリフェッチバッファ1551およびフェッチバッファ1552のビット幅を、例として128ビットとする。
図43〜図55は、実施例4にかかるパイプライン処理例を示す説明図である。まず、図43において、フェッチコントローラ155が、命令RAM151のアドレス0xF000のビット列をプリフェッチバッファ1551にプリフェッチする。
つぎに、図44において、フェッチコントローラ155は、プリフェッチバッファ1551にプリフェッチされた命令RAM151のアドレス0xF000のビット列をフェッチバッファにフェッチする。また、フェッチコントローラ155は、フェッチにより空きになったプリフェッチバッファ1551に、命令RAM151のアドレス0xF010のビット列をプリフェッチバッファ1551にプリフェッチする。
つぎに、図45において、フェッチコントローラ155は、フェッチバッファ1552にフェッチされているアドレス0xF000のビット列が非圧縮命令であるか否かを判断する。具体的には、たとえば、フェッチコントローラ155は、フェッチバッファ1552の先頭4ビット(圧縮/非圧縮判定ビット列)の各々が「0」(非圧縮)か「1」(圧縮)かで判断する。アドレス0xF000のビット列の場合、先頭4ビットのいずれのビットも「0」であるため、アドレス0xF000のビット列は、4個の非圧縮命令のビット列と判定される。この場合、フェッチコントローラ155は、フェッチバッファ1552内の全ビット列を、デコーダ156に転送する。
また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタ1553を更新する。この場合、転送されるビット列は128ビットであるため、プログラムカウンタ1553の値は、「128」となる。フェッチコントローラ155は、更新後のプログラムカウンタの値「128」を、デコーダ156の上段プログラムカウンタ11に転送する。
また、デコーダ156では、フェッチコントローラ155から非圧縮命令群が転送されてくると、非圧縮命令群を4分割する。そして、デコーダ156は、分割された圧縮命令の各々の先頭ビットである保存対象/非対象判別ビットを参照する。この場合、いずれも非圧縮命令も保存対象/非対象判別ビットの値が「1」(保存すべき)であるため、デコーダ156は、非圧縮命令内の命令コードA1〜A4をそれぞれ上段命令バッファ12に保持する。
また、デコーダ156は、命令コードA1〜A4のオペランドパターンA1−BFI〜D1−BFIを上段BFIレジスタ13に保持する。そして、デコーダ156は、非圧縮命令A1〜A4が転送されてきたため、上段命令カウンタ14の各々を初期値である「1」に設定する。また、デコーダ156は、フェッチコントローラ155から転送されてきたプログラムカウンタの値を、上段プログラムカウンタ11の値に設定する。
つぎに、図46において、フェッチコントローラ155は、アドレス0xF010のビット列を、プリフェッチバッファ1551から空きになったフェッチバッファ1552にプリフェッチする。また、フェッチコントローラ155は、命令RAM151のアドレス0xF020のビット列を、フェッチにより空きになったプリフェッチバッファ1551にプリフェッチする。
また、デコーダ156は、命令コードA1〜D1と上段復旧レジスタ1541の値を実行ユニット157に転送する。実行ユニット157は、中段復旧レジスタ1542を、上段復旧レジスタ1541の値に更新する。また、実行ユニット157は、デコーダ156から転送されてきた命令コードA1〜D1を、データレジスタ159やデータRAM152を参照することで実行する。
つぎに、図47において、フェッチコントローラ155は、フェッチバッファ1552にフェッチされているアドレス0xF010のビット列が非圧縮命令であるか否かを判断する。アドレス0xF010のビット列の場合、先頭4ビットのいずれのビットも「1」であるため、アドレス0xF010の先頭4ビットは、圧縮命令列であると判定される。この場合、フェッチコントローラ155は、フェッチバッファ1552内の先頭4ビット(=1111)を、デコーダ156に転送する。
また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタを更新する。この場合、転送されるビット列は先頭4ビットであるため、プログラムカウンタの値は、「132」となる。フェッチコントローラ155は、更新後のプログラムカウンタの値「132」を、デコーダ156の上段プログラムカウンタ11に転送する。
つぎに、図48において、フェッチコントローラ155は、図47での圧縮命令列分のビット転送により4ビット空きが生じたため、フェッチバッファ内の残余ビット列(124ビット)を4ビットシフトし、空き領域(4ビット分)に、プリフェッチバッファ1551の先頭4ビットをフェッチする。
また、デコーダ156では、フェッチコントローラ155から圧縮命令列が転送されてくると、上段命令バッファ12に保持されている命令コードA1〜D1、BFIレジスタに保持されているオペランドパターンA1−BFI〜D1−BFI、および命令カウンタの値「1」を、命令ごとに読み出す。そして、デコーダ156は、オペランド更新部1600により、読み出した命令コードA1〜D1のオペランドを命令コードごとに更新する。これにより、デコーダ156は、元の命令コードA2〜D2に復元する。
また、実行ユニット157は、命令コードA1〜D1と中段復旧レジスタ1542の値をメモリアクセスユニット158に転送する。メモリアクセスユニット158は、下段復旧レジスタ1543を、中段復旧レジスタ1542の値に更新する。また、メモリアクセスユニット158は、転送されてきた命令コードA1〜D1のオペコードにしたがってデータRAM152にアクセスする。
つぎに、図49において、デコーダ156は、復元した命令コードA2〜D2と上段復旧レジスタ1541の値を実行ユニット157に転送する。そして、デコーダ156は、転送後に、上段命令カウンタ14の値をそれぞれ1インクリメントする。実行ユニット157は、中段復旧レジスタ1542を、上段復旧レジスタ1541の値に更新する。したがって、上段復旧レジスタ1541の値と中段復旧レジスタ1542の値は、上段命令カウンタ14の値「2」および中段命令カウンタ24の値「1」のみが異なることとなる。また、実行ユニット157は、デコーダ156から転送されてきた命令コードA2〜D2を、データレジスタ159やデータRAM152を参照することで実行する。
つぎに、図50において、フェッチコントローラ155は、フェッチバッファ1552にフェッチされているビット列が非圧縮命令群であるか否かを判断する。このビット列の場合、先頭4ビットが「1010」であるため、フェッチバッファ1552に保持されているビット列の先頭ビットと3番目が圧縮命令であると判定される。2番目の命令は、先頭4ビットの後続にあるビット列「1 F1」と連結されて非圧縮命令となる。4番目の命令は、先頭4ビットの後続にあるビット列「0 NOP」と連結されて非圧縮命令となる。
また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタ1553を更新する。この場合、転送されるビット列は66ビットであるため、プログラムカウンタ1553の値は、「198」となる。フェッチコントローラ155は、更新後のプログラムカウンタ1553の値「198」を、デコーダ156の上段プログラムカウンタ11に転送する。また、メモリアクセスユニット158において、命令コードA1〜D1が処理されると、コミットステージ外の処理(ライトバック)が行われる。
つぎに、図51において、フェッチコントローラ155は、デコーダ156に転送した66ビット分、先頭方向にシフトする。また、デコーダ156では、1番目と3番目の圧縮命令について、上段命令バッファ12、上段BFIレジスタ13、上段命令カウンタ14の値を用いて、元の命令A3,C3に復元する。また、2番目と4番目の命令については、デコーダ156は、保存対象/非対象判別ビットを参照する。2番目の命令内の保存対象/非対象判別ビットが「1」であるため、デコーダ156は、上段命令バッファ12、上段BFIレジスタ13、上段命令カウンタ14の値を更新する。
また、4番目の命令内の保存対象/非対象判別ビットが「0」であるため、デコーダ156は、4番目の命令コードNOPについては、上段命令バッファ12、上段BFIレジスタ13、上段命令カウンタ14の値を更新しない。
また、実行ユニット157は、命令コードA2〜D2と中段復旧レジスタ1542の値をメモリアクセスユニット158に転送する。メモリアクセスユニット158は、下段復旧レジスタ1543を、中段復旧レジスタ1542の値に更新する。また、メモリアクセスユニット158は、転送されてきた命令コードのオペコードにしたがってデータRAM152にアクセスする。
つぎに、図52において、デコーダ156は、命令コードA3,F,C3,NOPと上段復旧レジスタ1541の値を実行ユニット157に転送する。そして、デコーダ156は、転送後に、上段命令カウンタ14のうち、オペランド更新に用いられた1番目と3番目の命令カウンタの値を1インクリメントする。実行ユニット157は、中段復旧レジスタ1542を、上段復旧レジスタ1541の値に更新する。また、実行ユニット157は、デコーダ156から転送されてきた命令コードA3,F,C3,NOPを、データレジスタ159やデータRAM152を参照することで実行する。
つぎに、図53において、フェッチコントローラ155は、フェッチバッファ1552にフェッチされているビット列が非圧縮命令群であるか否かを判断する。このビット列の場合、先頭4ビットが「1001」であるため、フェッチバッファ1552に保持されているビット列の先頭ビットと4番目が圧縮命令であると判定される。2番目の命令は、先頭4ビットの後続にあるビット列「1 B3」と連結されて非圧縮命令となる。3番目の命令は、先頭4ビットの後続にあるビット列「0 NOP」と連結されて非圧縮命令となる。
また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタ1553を更新する。この場合、転送されるビット列は66ビットであるため、プログラムカウンタ1553の値は、「264」となる。フェッチコントローラ155は、更新後のプログラムカウンタ1553の値「264」を、デコーダ156の上段プログラムカウンタ11に転送する。また、メモリアクセスユニット158において、命令コードA2〜D2が処理されると、コミットステージ外の処理(ライトバック)が行われる。
つぎに、図54において、デコーダ156では、1番目と4番目の圧縮命令について、上段命令バッファ12、上段BFIレジスタ13、上段命令カウンタ14の値を用いて、元の命令A4,D3に復元する。また、2番目と3番目の命令については、デコーダ156は、保存対象/非対象判別ビットを参照する。2番目の命令内の保存対象/非対象判別ビットが「1」であるため、デコーダ156は、上段命令バッファ12、上段BFIレジスタ13、上段命令カウンタ14の値を更新する。
また、3番目の命令内の保存対象/非対象判別ビットが「0」であるため、デコーダ156は、3番目の命令コードNOPについては、上段命令バッファ12、上段BFIレジスタ13、上段命令カウンタ14の値を更新しない。
また、実行ユニット157は、命令コードA3,F,C3,NOPと中段復旧レジスタ1542の値をメモリアクセスユニット158に転送する。メモリアクセスユニット158は、下段復旧レジスタ1543を、中段復旧レジスタ1542の値に更新する。また、メモリアクセスユニット158は、転送されてきた命令コードのオペコードにしたがってデータRAM152にアクセスする。
つぎに、図55において、デコーダ156は、命令コードA3,F,C3,NOPと上段復旧レジスタ1541の値を実行ユニット157に転送する。そして、デコーダ156は、転送後に、上段命令カウンタ14のうち圧縮命令に対応する1番目と4番目の値をそれぞれ1インクリメントする。実行ユニット157は、中段復旧レジスタ1542を、上段復旧レジスタ1541の値に更新する。また、実行ユニット157は、デコーダ156から転送されてきた命令コードA3,F,C3,NOPを、データレジスタ159やデータRAM152を参照することで実行する。
このように、圧縮命令群列svsをパイプライン処理することで、デコーダ156により圧縮命令群列svsが復元される。したがって、プロセッサ102は、圧縮前の命令群列と同じ命令群を並列実行することができる。また、圧縮命令群列svsには圧縮命令が含まれているため、命令RAM151からのフェッチ回数が低減される。すなわち、命令RAM151に対するメモリアクセス回数が低減するため、低消費電力化を図ることができる。
(割り込みからの復旧)
つぎに、上述した図43〜図55の命令実行中に、割り込みが発生した場合の割り込みからの復旧処理について説明する。割り込みが発生した場合、プロセッサ102は、コミットステージ移行の処理(ライトバック、…)を完了させてから割り込み処理を実行する。この場合、プロセッサ102は、コミット前ステージの処理について、下段復旧レジスタ1543の値を、一時的に退避させて割り込み処理を実行させ、割り込み処理が終了すると、退避させた下段復旧レジスタ1543の値を用いて、コミット前ステージの処理を復旧する。以下、図55の処理内容のときに割り込みが発生した場合について図56〜図64を用いて説明する。
図56〜図64は、割り込みからの復旧処理を示す説明図である。プロセッサ102は、インターラプトコントローラ1510により、周辺モジュールやタイマにより割り込みの発生を検出すると、コントローラ153を介して、フェッチコントローラ155、デコーダ156、実行ユニット157、メモリアクセスユニット158に対し、割り込み信号を発行することになる。
まず、図56において、メモリアクセスユニット158は、割り込み信号を受信すると、下段復旧レジスタ1543の値やその他汎用レジスタ(不図示)の値を、データRAM152のスタック領域1520に退避させる。
つぎに、図57において、フェッチコントローラ155は、割り込み信号を受信すると、プリフェッチバッファ1551およびフェッチバッファ1552をクリアして、割り込み処理に備える。同様に、デコーダ156、実行ユニット157、メモリアクセスユニット158は、割り込み信号を受信すると、それぞれ上段復旧レジスタ1541、中段復旧レジスタ1542、および下段復旧レジスタ1543の値をクリアして、割り込み処理に備える。そして、プロセッサ102は、割り込み処理を実行する。
つぎに、図58において、デコーダ156は、インターラプトコントローラ1510およびコントローラ153を介して割り込み終了信号を受信すると、スタック領域1520に退避させた下段命令バッファ32の値(命令コードA1,F,C1,D1)、下段BFIレジスタ33の値(オペランドパターンA1−BFI,F−BFI,C1−BFI,D1−BFI)、下段命令カウンタ34の値「2,1,2,2」を、上段命令バッファ12の値、上段BFIレジスタ13の値、上段命令カウンタ14の値に設定する。また、フェッチコントローラ155は、再度プリフェッチバッファ1551およびフェッチバッファをクリアして、スタック領域1520に退避させた下段プログラムカウンタ31の値「198」を読み込む。
つぎに、図59において、フェッチコントローラ155は、スタック領域1520から読み出した下段プログラムカウンタ31の値「198」を、フェッチバッファのビット幅(128ビット)で割る。この場合、商が「1」、余りが「70」となる。フェッチコントローラ155は、商「1」にフェッチバッファのビット幅(128ビット)を乗算することで、プリフェッチさせるビット位置を特定する。この場合、商「1」×128ビット=128であるため、圧縮命令群列の先頭から128ビット目からのビット列、すなわち、命令RAM151のアドレス0xF010のビット列をプリフェッチバッファ1551にプリフェッチする。そして、フェッチコントローラ155は、プログラムカウンタに、「128」を設定する。
つぎに、図60において、フェッチコントローラ155は、プリフェッチバッファ1551にプリフェッチされたビット列をフェッチバッファ1552にフェッチする。フェッチコントローラ155は、フェッチバッファ1552にフェッチされているビット列が非圧縮命令群であるか否かを判断する。このビット列の場合、先頭4ビットが「1111」であるため、先頭4ビットは、圧縮命令群であると判定される。この場合、フェッチコントローラ155は、フェッチバッファ1552内の先頭4ビット(=1111)を、デコーダ156に転送する。
また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタ1553を更新する。この場合、転送されるビット列は4ビットであるため、プログラムカウンタ1553の値は、「132」となる。この場合、スタック領域1520に退避させた下段プログラムカウンタ31の値「198」と不一致であるため、フェッチコントローラ155は、更新後のプログラムカウンタの値「132」を、デコーダ156の上段プログラムカウンタ11に転送しない。
また、デコーダ156は、フェッチバッファ1552から圧縮命令群が転送されてくるが、プログラムカウンタ1553の値が転送されてこないため、圧縮命令群を破棄する。このように、フェッチコントローラ155のプログラムカウンタ1553の値と、スタック領域1520から読み出した下段プログラムカウンタ31の値とが一致するまで、デコーダ156は、フェッチバッファ1552からのビット列を破棄する。これにより、誤ったビット位置で命令が復元されないことになる。
つぎに、図62において、フェッチコントローラ155は、図61で4ビット転送したため、プリフェッチバッファ1551の先頭4ビットをフェッチする。このあと、フェッチコントローラ155は、フェッチバッファ1552にフェッチされているビット列が非圧縮命令であるか否かを判断する。このビット列の場合、先頭ビットと3番目のビットが「1」であるため、フェッチされているビット列の先頭ビットおよび3番目のビットは、圧縮命令と判定される。
つぎに、図63において、フェッチコントローラ155は、フェッチバッファ1552内の先頭66ビットを、デコーダ156に転送する。また、フェッチコントローラ155は、転送ビット数分、プログラムカウンタ1553を更新する。この場合、転送されるビット列は66ビットであるため、プログラムカウンタ1553の値は、「198」となる。この場合、スタック領域1520に退避させた下段プログラムカウンタ31の値「198」と一致するため、フェッチコントローラ155は、更新後のプログラムカウンタの値「198」を、デコーダ156の上段プログラムカウンタ11に転送する。
つぎに、図64において、デコーダ156は、フェッチバッファ1552からビット列およびプログラムカウンタ1553の値「198」が転送されてきたため、上段復旧レジスタ1541の値により、命令を復元する。これにより、割り込み発生時にメモリアクセスユニット158まで処理されていた命令コードA3,C3が復元される。これ以降の処理は、図51〜図55と同様に実行されることとなる。これにより、正確な復旧位置で命令群を復元することができる。
このように、実施の形態2によれば、圧縮された命令を含む命令列/命令群列を復元しながら実行することができるため、命令RAM151からのフェッチ回数が低減される。命令RAM151からのフェッチ回数は、命令の圧縮率が高くなるほど、すなわち、圧縮命令数が多くなるほど元の命令列/命令群列よりも短くなる。たとえば、実施例3の場合、1回のフェッチで最大32個の圧縮命令を取得することができるため、32×32個の非圧縮命令(1024ビット)を1回のメモリアクセスでフェッチしたことになる。
また、実施例4の場合、1回のプリフェッチで最大32個の圧縮命令群を取得することができるため、32×32個の非圧縮命令群(32768ビット)を1回のメモリアクセスでフェッチしたことになる。したがって、命令RAM151に対するアクセス回数が低減されるため、低消費電力化を図ることができる。
また、コミット前ステージの各ステージにおいて後段ステージに移行する際、プロセッサ102は、復旧レジスタの値についてもパイプライン処理で後段ステージに引き渡している。このため、実行中に割り込みが発生した場合でも、コミット前ステージの最後段のメモリアクセスでの復旧レジスタの値を退避しておくことで、割り込み終了後に退避させた復旧レジスタの値で復旧することができる。このように、実行対象の命令列/命令群列が圧縮されていても、コミットステージに引き渡される前の命令を頭出しして命令フェッチから再実行することで、割り込み前の状態に復旧することができる。
また、実施の形態2によれば、圧縮命令を復元する場合、辞書メモリなどの外部メモリにアクセスせず、プロセッサ102内部で復元するため、余分なメモリアクセスが不要となり、メモリアクセス回数が増加するとことはない。したがって、低消費電力化を図ることができる。また、同一オペコードが連続する場合にオペランドとなるレジスタ番号やメモリアドレスが連続番号としてコーディングされることを利用しているため、プログラマは命令コードの作成の際、同一オペコードが連続する場合にオペランドも規則的に変化するようにしておくことで、命令の高圧縮と実行時の低消費電力化を図ることができる。
また、上述した実施の形態2では、命令コードの復元は、デコーダ156によるレジスタリードステージでおこなう例について説明したが、レジスタリードでの復元は、フェッチステージで行ってもよい。この場合、上段復旧レジスタ154およびオペランド更新部1600は、フェッチコントローラ155に備えられ、レジスタリードステージでおこわなれる上段復旧レジスタ154へのデータ保持および読み出し、オペランド更新部1600によるオペランド更新処理は、フェッチコントローラ155で実行されることとなる。そして、この場合、デコーダ156は、通常のデコード処理やデータレジスタからのリードをおこなうこととなる。
以上説明したように、本実施の形態にかかるプロセッサ102によれば、メモリ内の圧縮された一連の命令を一度でフェッチすることで、メモリアクセス回数の低減化を図ることができるという効果を奏する。また、本実施の形態にかかる圧縮装置、圧縮方法、および圧縮プログラムによれば、プロセッサ102によるメモリアクセス回数の低減化を図るために、命令コード群の圧縮率の向上を図ることができるという効果を奏する。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)オペコードが先行命令と同一でかつ前記先行命令とのオペランド間に連続性がある命令を圧縮したことを示す圧縮情報を含む圧縮命令列が記憶されているメモリにアクセス可能なプロセッサであって、
前記メモリから所定ビット列をフェッチして前記所定ビット列が非圧縮命令であるか否かを判断し、非圧縮命令である場合は、前記所定ビット列である非圧縮命令を転送し、前記非圧縮命令でない場合は、前記所定ビット列の先頭に位置する圧縮情報を転送するフェッチ部と、
前記フェッチ部から前記非圧縮命令が転送されてきた場合は、前記非圧縮命令の命令コードおよびそのオペランドパターンをバッファに保持して、オペコードが同一でかつオペランドが規則的に連続する連続回数を示す命令カウンタの値を初期値に設定する設定処理を実行し、前記圧縮情報が転送されてきた場合は、前記バッファに保持されている命令コードと前記命令カウンタの値と前記オペランドパターンとに基づいて元の命令コードに復元し、前記命令カウンタの値を更新する更新処理を実行するデコード部と、
を備えることを特徴とするプロセッサ。
(付記2)前記デコード部は、
前記更新処理において、前記オペランドパターンに基づいて前記バッファに保持されている命令コードからオペランドを抽出し、抽出したオペランドを前記命令カウンタの値で更新することで元の命令コードに復元することを特徴とする付記1に記載のプロセッサ。
(付記3)前記デコード部からの命令コードを実行する実行部と、
前記実行部による実行結果にしたがって前記メモリにアクセスするメモリアクセス部と、を備え、
前記フェッチ部は、
前記デコード部への転送ビット数によりプログラムカウンタの値を更新して、更新後のプログラムカウンタの値を前記デコード部に転送し、
前記デコード部は、
前記圧縮情報が転送されてきた場合は、前記更新処理による前記命令カウンタの更新前に、前記バッファに保持されている命令コードおよびそのオペランドパターンと前記命令カウンタの値と前記フェッチ部からのプログラムカウンタの値とを、前記実行部内のバッファに複写し、
前記実行部は、
前記デコード部から複写される前に、前記実行部内のバッファに複写された命令コードおよびそのオペランドパターンと命令カウンタの値と前記プログラムカウンタの値を、前記メモリアクセス部内のバッファに複写することを特徴とする付記1または2に記載のプロセッサ。
(付記4)前記メモリアクセス部は、
割り込み処理が発生した場合、前記メモリアクセス部内のバッファに複写された命令コードおよびそのオペランドパターンと命令カウンタの値とプログラムカウンタの値とを退避させ、
前記フェッチ部は、
前記割り込み処理が終了した場合、前記退避させたプログラムカウンタの値に基づいて、前記割り込み発生時に前記メモリアクセス部での処理対象命令に対応するビット列をフェッチして、前記処理対象命令に対応するビット列が非圧縮命令であるか否かを判断し、非圧縮命令である場合は、前記処理対象命令に対応するビット列である非圧縮命令を転送し、前記非圧縮命令でない場合は、前記処理対象命令に対応するビット列の先頭に位置する圧縮情報を転送し、
前記デコード部は、
前記割り込み処理が終了した場合、前記退避させた命令コードおよびそのオペランドパターンと命令カウンタの値とを、前記デコード部内のバッファに複写することを特徴とする付記3に記載のプロセッサ。
(付記5)オペコードが先行命令と同一でかつ前記先行命令とのオペランド間に連続性がある命令を圧縮したことを示す圧縮情報を含む圧縮命令群列が記憶されているメモリにアクセス可能なプロセッサであって、
前記メモリから所定ビット列をフェッチして前記所定ビット列における圧縮情報と非圧縮命令との組み合わせパターンを判断し、非圧縮命令については前記所定ビット列から非圧縮命令を特定して転送し、前記圧縮情報については前記圧縮情報を転送するフェッチ部と、
前記フェッチ部から前記非圧縮命令が転送されてきた場合は、前記非圧縮命令の命令コードおよびそのオペランドパターンをバッファに保持して、オペコードが同一でかつオペランドが規則的に連続する連続回数を示す命令カウンタの値を初期値に設定する設定処理を実行し、前記圧縮情報が転送されてきた場合は、前記バッファに保持されている命令コードと前記命令カウンタの値と前記オペランドパターンとに基づいて元の命令コードに復元し、前記命令カウンタの値を更新する更新処理を実行するデコード部と、
を備えることを特徴とするプロセッサ。
(付記6)命令列のうち対象命令を取得し、
取得された対象命令のオペコードと前記対象命令の先行命令のオペコードが同一であり、かつ、前記対象命令のオペランドと前記先行命令のオペランドとの間に連続性があるか否かを判断し、
同一かつ連続性ありと判断された場合、前記対象命令を圧縮する、
処理をコンピュータに実行させることを特徴とする圧縮プログラム。
(付記7)前記圧縮する処理では、
同一かつ連続性ありと判断された場合、前記対象命令に、前記対象命令が圧縮されていることを示す圧縮情報を付与し、前記対象命令のオペコードおよびオペランドを削除することを特徴とする付記6に記載の圧縮プログラム。
(付記8)前記判断工程によって同一かつ連続性ありでないと判断された場合、前記対象命令に、前記対象命令が圧縮されていないことを示す圧縮情報と、前記対象命令を保存すべき命令であることを示す保存情報と、を設定する処理を、前記コンピュータに実行させることを特徴とする付記6または7に記載の圧縮プログラム。
(付記9)前記判断する処理では、
同一かつ連続性ありでないと判断された場合、前記対象命令のオペコードの種類に基づいて、前記対象命令を保存すべきか否かを判断し、
前記設定する処理では、
保存すべきと判断された場合、前記対象命令に、前記対象命令が圧縮されていないことを示す圧縮情報と、前記対象命令を保存すべき命令であることを示す保存情報と、を設定し、
保存すべきでないと判断された場合、前記対象命令に、前記対象命令が圧縮されていないことを示す圧縮情報と、前記対象命令を保存すべき命令でないことを示す保存情報と、を設定することを特徴とする付記8に記載の圧縮プログラム。
(付記10)命令群列の中の対象命令群から対象命令を取得し、
取得された対象命令のオペコードと前記対象命令群に先行する先行命令群のうち前記対象命令に対応する位置の先行命令のオペコードが同一であり、かつ、前記対象命令のオペランドと前記先行命令のオペランドとの間に連続性があるか否かを判断し、
同一かつ連続性ありと判断された場合、前記対象命令を圧縮する、
処理をコンピュータに実行させることを特徴とする圧縮プログラム。
(付記11)前記圧縮する処理では、
同一かつ連続性ありと判断された場合、前記対象命令に、前記対象命令が圧縮されていることを示す圧縮情報を付与し、前記対象命令のオペコードおよびオペランドを削除することを特徴とする付記10に記載の圧縮プログラム。
(付記12)同一かつ連続性ありでないと判断された場合、前記対象命令に、前記対象命令が圧縮されていないことを示す圧縮情報と、前記対象命令を保存すべき命令であることを示す保存情報と、を設定する処理を前記コンピュータに実行させることを特徴とする付記10または11に記載の圧縮プログラム。
(付記13)前記判断する処理では、
同一かつ連続性ありでないと判断された場合、前記対象命令のオペコードの種類に基づいて、前記対象命令を保存すべきか否かを判断し、
前記設定する処理では、
保存すべきと判断された場合、前記対象命令に、前記対象命令が圧縮されていないことを示す圧縮情報と、前記対象命令を保存すべき命令であることを示す保存情報と、を設定し、
保存すべきでないと判断された場合、前記対象命令に、前記対象命令が圧縮されていないことを示す圧縮情報と、前記対象命令を保存すべき命令でないことを示す保存情報と、を設定することを特徴とする付記12に記載の圧縮プログラム。
(付記14)前記対象命令群の各対象命令から得られた圧縮情報群を保存するとともに、前記対象命令群のうち圧縮されずに前記保存情報が設定された非圧縮の対象命令を、前記圧縮情報群の後続に保存する処理を、前記コンピュータに実行させることを特徴とする付記10〜13のいずれか一つに記載の圧縮プログラム。
(付記15)前記保存する処理では、
前記対象命令群ごとに得られた保存結果群を連結することにより短縮化することを特徴とする付記14に記載の圧縮プログラム。
(付記16)命令列のうち対象命令を取得する取得手段と、
前記取得手段によって取得された対象命令のオペコードと前記対象命令の先行命令のオペコードが同一であり、かつ、前記対象命令のオペランドと前記先行命令のオペランドとの間に連続性があるか否かを判断する判断手段と、
前記判断手段によって同一かつ連続性ありと判断された場合、前記対象命令を圧縮する圧縮手段と、
を備えることを特徴とする圧縮装置。
(付記17)命令群列の中の対象命令群から対象命令を取得する取得手段と、
前記取得手段によって取得された対象命令のオペコードと前記対象命令群に先行する先行命令群のうち前記対象命令に対応する位置の先行命令のオペコードが同一であり、かつ、前記対象命令のオペランドと前記先行命令のオペランドとの間に連続性があるか否かを判断する判断手段と、
前記判断手段によって同一かつ連続性ありと判断された場合、前記対象命令を圧縮する圧縮手段と、
を備えることを特徴とする圧縮装置。
(付記18)コンピュータが、
命令列のうち対象命令を取得し、
取得された対象命令のオペコードと前記対象命令の先行命令のオペコードが同一であり、かつ、前記対象命令のオペランドと前記先行命令のオペランドとの間に連続性があるか否かを判断し、
同一かつ連続性ありと判断された場合、前記対象命令を圧縮する、
処理を実行することを特徴とする圧縮方法。
(付記19)コンピュータが、
命令群列の中の対象命令群から対象命令を取得し、
取得された対象命令のオペコードと前記対象命令群に先行する先行命令群のうち前記対象命令に対応する位置の先行命令のオペコードが同一であり、かつ、前記対象命令のオペランドと前記先行命令のオペランドとの間に連続性があるか否かを判断し、
同一かつ連続性ありと判断された場合、前記対象命令を圧縮する、
処理を実行することを特徴とする圧縮方法。