(57)【特許請求の範囲】
【請求項１】
メモリからコードをフェッチするフェッチ部と、フェッチされたコード中の命令を解読する解読部と、解読された命令を実行する実行部と、第１バッファと、第２バッファとを有し、プログラムループの直前に配置された登録命令とプログラムループの末尾に配置されたループ命令とを用いて、高速にループ処理を実行するプロセッサであって、
前記解読部は、
解読中の命令を指すポインタとして、解読中の命令のアドレスに一定のシフト値を加算した値を保持する解読命令カウンタを備え、
前記実行部は、
前記解読部により前記登録命令が解読された場合に、前記フェッチ部によりフェッチされたプログラムループ先頭のコードを前記第１バッファに、前記解読命令カウンタに保持されているポインタを前記第２バッファに登録する登録手段と、
前記解読部により前記ループ命令が解読されかつ分岐が成立する場合に、前記第２バッファに登録されたポインタによって指される命令を前記フェッチ部にフェッチさせ、前記第１バッファに登録されたコードを前記解読部に解読させる高速分岐手段と、
絶対アドレス指定を伴う分岐命令が前記解読部により解読された場合、当該絶対アドレスをフェッチ命令カウンタに転送し、当該絶対アドレスに前記シフト値を加えた値を解読命令カウンタに転送する分岐手段とを備え、
前記シフト値は、前記登録命令が解読された場合に、前記登録手段が前記第２バッファに登録するポインタが、前記第１バッファに登録するコードに後続するコードのアドレスを指すように定められている
ことを特徴とするプロセッサ。
【請求項２】
前記一定のシフト値は、第１バッファの記憶領域サイズに等しい
ことを特徴とする請求項１記載のプロセッサ。
【請求項３】
前記解読命令カウンタは、初期化時には、スタートアドレスと前記シフト値との和を保持する
ことを特徴とする請求項２記載のプロセッサ。
【請求項４】
前記フェッチ部は、フェッチアドレスを前記シフト値と同数ずつ更新するインクリメンタを有し、前記解読命令カウンタは、前記フェッチアドレスがスタートアドレスに初期化されたとき、前記インクリメンタから出力を前記ポインタとして保持する
ことを特徴とする請求項３記載のプロセッサ。
【請求項５】
前記分岐手段は、さらに、相対アドレス指定を伴う分岐命令が解読部により解読された場合、当該相対アドレスと解読命令カウンタに保持されたポインタとを加算した値を解読命令カウンタに転送し、その加算値から前記シフト値を減算した値をフェッチ命令カウンタに転送する
ことを特徴とする請求項１記載のプロセッサ。
【請求項６】
前記フェッチ命令カウンタは、フェッチアドレスを保持するレジスタと、レジスタの値をインクリメントする加算器とを含み、前記分岐手段は、絶対アドレス指定を伴う分岐命令が解読部により解読された場合に、前記絶対アドレスに前記シフト値を加えた値の計算を、前記フェッチ命令カウンタ内の加算器に実行させ、その加算結果を解読命令カウンタに転送する
ことを特徴とする請求項１記載のプロセッサ。
【請求項７】
フェッチステージにおいてコードをフェッチするフェッチ部と、フェッチされた命令を解読ステージにおいて解読する解読部と、解読された命令を実行ステージにおいて実行する実行部とを有し、少なくとも３ステージからなるパイプライン処理を行い、プログラムループの直前に配置された登録命令と、プログラムループの末尾に配置されたループ命令とを用いて、高速にループ処理を実行するプロセッサであって、
前記フェッチ部は、
フェッチアドレスをカウントするフェッチ命令カウンタと、フェッチされたコードを保持するフェッチ命令バッファとを有し、
前記解読部は、
フェッチされたコード中の命令であって解読中の命令を保持する解読命令レジスタと、
解読中の命令を指すポインタを保持するものであって、前記ポインタは、解読命令レジスタに保持されている命令のアドレスと一定のシフト値との和である解読命令カウンタとを有し、
前記実行部は、
コードを保持する領域を有する第１バッファと、アドレスを保持する領域を有する第２バッファと、解読部において前記登録命令が解読された場合に、フェッチ命令バッファに保持されているコードを第１バッファに、解読命令カウンタに保持されているポインタを第２バッファに登録する登録手段と、
前記ループ命令が解読されかつ分岐が成立する場合に、第２バッファに登録されたポインタをフェッチ命令カウンタに、第１バッファからプログラムループ先頭のコードを解読命令レジスタに転送する高速分岐手段と、
絶対アドレス指定を伴う分岐命令が解読部により解読された場合、当該絶対アドレスをフェッチ命令カウンタに転送し、当該絶対アドレスに前記シフト値を加えた値を解読命令カウンタに転送する分岐手段とを有し、
前記第１バッファに登録されたコードは、前記プログラムループの先頭のコードを含み、前記シフト値は、第１バッファのサイズに等しく、第２バッファに登録されたポインタは、第１バッファに格納されたコードに後続するコードのアドレスを指すことを特徴とするプロセッサ。
【請求項８】
前記解読命令カウンタは、初期化時には、初期値と前記シフト値との和を保持する
ことを特徴とする請求項７記載のプロセッサ。
【請求項９】
前記フェッチ部は、フェッチアドレスを前記シフト値と同数ずつ更新するインクリメンタを有し、前記解読命令カウンタは、前記フェッチアドレスがスタートアドレスに初期化されたとき、前記インクリメンタから出力を前記ポインタとして保持する
ことを特徴とする請求項８記載のプロセッサ。
【請求項１０】
前記プログラムループは、可変語長の命令から構成され前記プロセッサは、さらに、フェッチ命令バッファに保持されたコードと、第１バッファに保持されたコードの中から、解読命令バッファのサイズ分のコードを選択し、解読命令バッファに出力する選択手段と、第１バッファのコードに続けてフェッチ命令バッファのコードを選択するように選択手段を制御する選択制御部とを有し、前記高速分岐手段は、前記ループ命令が解読されかつ分岐が成立する場合に、選択制御部を起動し、前記選択手段は、選択制御部が起動されていない場合は、フェッチ命令バッファのコードを選択する
ことを特徴とする請求項８記載のプロセッサ。
【請求項１１】
前記分岐手段は、さらに、相対アドレス指定を伴う分岐命令が解読部により解読された場合、当該相対アドレスと解読命令カウンタに保持されたポインタとを加算した値を解読命令カウンタに転送し、その加算値から前記シフト値を減算した値をフェッチ命令カウンタに転送する
ことを特徴とする請求項７記載のプロセッサ。
【請求項１２】
前記フェッチ命令カウンタは、フェッチアドレスを保持するアドレスレジスタと、アドレスレジスタのフェッチアドレスを所定数だけインクリメントする第１加算器とを有し、前記解読命令カウンタは、前記ポインタを保持するポインタレジスタと、解読された命令語長だけポインタレジスタのポインタをインクリメントする第２加算器とを有し、前記分岐手段は、相対アドレス指定を伴う分岐命令が解読された場合に、前記第２レジスタに保持されたポインタと前記シフト値の負数とを第２加算器に加算させ、その加算結果と当該相対アドレスとの和を分岐先アドレスとして前記第１レジスタに格納し、さらに、前記シフト値を前記所定数として、第１レジスタの分岐先アドレスと当該所定数とを第１加算器に加算させ、その加算結果をポインタレジスタに格納する
ことを特徴とする請求項１１記載のプロセッサ。
【請求項１３】
前記フェッチ命令カウンタは、フェッチアドレスを保持するレジスタと、レジスタの値をインクリメントする加算器とを含み、
前記分岐手段は、絶対アドレス指定を伴う分岐命令が解読部により解読された場合に、前記絶対アドレスに前記シフト値を加えた値の計算を、前記フェッチ命令カウンタ内の加算器に実行させ、その加算結果を解読命令カウンタに転送する
ことを特徴とする請求項７記載のプロセッサ。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、パイプライン処理によって機械語命令列を実行するプロセッサに関し、特に分岐処理を高速に実行するプロセッサに関する。
【０００２】
【従来の技術】
ＣＰＵ(以下プロセッサと呼ぶ)での処理の高速化の基本技術の一つにパイプライン処理がある。パイプライン処理は1個の命令の処理過程を複数の小さな処理単位(パイプラインステージ)に分割し、各ステージの処理を並列に行なうことにより処理速度を向上させる技術である。ところが、ループ処理等において分岐命令を実行した場合には、パイプラインストール(乱れ)が生じ、パイプライン処理の実効性能が理想性能を下回ることになる。この現象を分岐ハザードと呼ぶ。
【０００３】
以下は分岐ハザードが発生するプログラムの具体例である。；以下にコメントを記す。
(命令１) mov 0,i；0をiに転送する
L:；分岐先を示すラベル
(命令２) add a,b,c；aとbの和をcに格納する
(命令３) mul a,b,d；aをbの積をdに格納する
(命令４) add i,1,i；iに1を加算する
(命令５) cmp i,3；iと3を比較する
(命令６) bcc L      ；比較結果がi<3であった場合はLへ分岐する
上記のプログラムは、命令２から命令５までの処理が３回繰り返されるループ処理を記述している。このプログラムでは命令６（bcc）を実行した次のサイクルで新たに命令２をフェッチし、さらに次のサイクルで命令２をデコードし、その次のサイクルで命令２を実行することになる。その結果、命令６から命令２を実行するまでに２サイクルの分岐ハザードが生じてしまう。
【０００４】
このような分岐ハザードを回避する技術として、特開平8-314719号に開示されたプロセッサがある。
このプロセッサでは、ループ処理の開始直前に、ループ処理先頭のプログラムコードをバッファに登録する。さらに、ループ処理においてループ末尾の命令からループ先頭に分岐した時点で、バッファからループ処理先頭のプログラムコードを取出して解読及び実行するように構成されている。これによれば、ループ処理の末尾から先頭に分岐した時点で、ループ処理先頭のプログラムコードをメモリから新たにフェッチする必要がなくなるので、分岐ハザードを回避することに成功している。
【０００５】
【発明が解決しようとする課題】
しかしながら、上記の従来のプロセッサによれば、分岐ハザードを回避するための特別な回路を必要としているので、回路規模が大きいという問題があった。
具体的には、第１に、上記プロセッサは、ループ処理開始直前に、ループ処理先頭のプログラムコードをバッファに登録するのと同時に、当該プログラムコードに後続するアドレスを新たなフェッチアドレスとして計算を行なうために専用の加算器を必要としていた。加算器により算出されたフェッチアドレスは、アドレス用バッファに格納される。
【０００６】
第２に、上記プロセッサは、ループ処理の末尾から先頭に分岐した時点で、アドレス用バッファからフェッチアドレスが取出されると同時に、フェッチアドレスから解読中の命令アドレスを算出するために専用の減算器を必要としていた。
このように、上記従来のプロセッサでは、専用の加算器と減算器とを必要としていたので、ハードウェア規模を増大させていた。
【０００７】
本発明の目的は、分岐ハザードの低減を少ない回路規模で実現したパイプラインプロセッサを提供することを目的とする。
【０００８】
【課題を解決するための手段】
上記課題を解決するため本発明のプロセッサは、メモリからコードをフェッチするフェッチ部と、フェッチされたコード中の命令を解読する解読部と、解読された命令を実行する実行部とを有し、プログラムループの直前に配置された登録命令と、プログラムループの末尾に配置されたループ命令とを用いて、高速にループ処理を実行するプロセッサであって、
前記解読部は、解読中の命令を指すポインタとして、解読中の命令のアドレスに一定のシフト値を加算した値を保持及び更新する解読命令カウンタを備え、
前記実行部は、解読部により前記登録命令が解読された場合に、フェッチ部によりプリフェッチされたプログラムループ先頭のコードを第１バッファに、解読命令カウンタに保持されているポインタを第２バッファに登録する登録手段と、解読部により前記ループ命令が解読されかつ分岐が成立する場合に、第２バッファに登録されたポインタをフェッチアドレスとして前記フェッチ部にフェッチさせ、第１バッファに登録されたコードを解読部に解読させる高速分岐手段とを備え、
前記シフト値は、第２バッファに格納されたポインタが、第１バッファに格納されたコードに後続するコードのアドレスを指すように定められている。
【０００９】
ここで、前記一定のシフト値は、第１バッファの記憶領域サイズに等しい構成としてよい。
ここで、前記解読命令カウンタは、初期化時には、スタートアドレスと前記シフト値とを和を保持するようにしてもよい。
【００１０】
【発明の実施の形態】
＜第１の実施形態＞
以下、本発明の実施例について図面を用いて詳細に説明する。
図１は、本発明の実施例によるプロセッサの構成を示すブロック図である。なお、図１には、プロセッサの他に、プロセッサの処理対象となる命令列（プログラム）を記憶する外部メモリ１１も同時に示している。
【００１１】
プロセッサ１３は、外部メモリ１１から命令をフェッチし、それを逐一解読して実行し、特に、分岐先情報登録命令（以下、登録命令と呼ぶ）と高速ループ命令との組みで指定されるループ処理を少ないハードウェア規模で高速に処理するように構成されている。
ここで、登録命令とは、プログラム中のループ処理の先頭命令の直前の配置され、ループ処理の先頭にあたる１つ以上の命令（又は命令コード）をプロセッサ内部に登録する命令である。また、高速ループ命令は、ループ処理の末尾に配置され、プロセッサ内部に登録された命令を用いて、条件を満たす場合にループ処理の先頭命令に分岐することを指示する命令である。登録命令、高速ループ命令は、それぞれニーモニック形式で”setlb”、”lcc”と表記する。
【００１２】
そのため、プロセッサ１３は、命令フェッチ部１４、命令解読部１５、命令実行部１６、分岐先情報記憶部１７を有する。これらの各部は、図示されていないクロック発生器からのクロック信号に同期して動作している。命令フェッチ部１４、命令解読部１５、命令実行部１６は、命令パイプラインを構成しており、クロック信号に同期して並列に動作する。
【００１３】
命令フェッチ部１４は、外部メモリ１１から命令をフェッチしフェッチ命令バッファ１４２に蓄積し、蓄積した命令を命令解読部１５に送る。命令フェッチ部１４はさらに、フェッチ命令カウンタ（以下ＦＩＣと略す）１４１、フェッチ命令バッファ（以下ＦＩＢと略す）１４２、選択部１４３を有する。
ＦＩＣ１４１は、フェッチすべき命令のアドレスを保持する。このアドレスは外部メモリ１１に送られ、１回のフェッチを完了するとインクリメントされ、次にフェッチすべきアドレスに更新される。ただし、上記の高速ループ命令の実行ステージでは命令解読部１５からの制御信号に従って、分岐先情報記憶部１７から送られてくるフェッチアドレスに更新される。
【００１４】
ＦＩＢ１４２は、ＦＩＦＯ（First In First Out）メモリからなり、外部メモリ１１からフェッチされた命令列を記憶する。
選択部１４３は、上記の高速ループ命令が実行された場合のみ分岐先情報記憶部１７に登録された分岐先命令を選択し、それ以外の場合はＦＩＢ１４２にフェッチされた命令を選択し、命令解読部１５に出力する。
【００１５】
命令解読部１５は、命令フェッチ部１４から送られてきた命令を解読し、命令フェッチ部１４、命令解読部１５、命令実行部１６、分岐先情報記憶部１７の動作を制御するための制御信号を解読結果として出力する。このため命令解読部１５は、解読命令カウンタ（以下ＤＩＣと略す）１５１、解読命令バッファ（以下ＤＩＢと略す）１５２及び命令デコーダ１５３を有する。
【００１６】
ＤＩＣ１５１は、現在解読中の命令のアドレスに一定のシフト値（本実施例では４）を加算した値を保持及び更新する。このためＤＩＣ１５１は、起動時などのリセット時には初期値（スタートアドレス）にシフト値４を加算した値に初期化される。このＤＩＣ１５１は、通常は命令の解読を完了すると、その命令のコードサイズ分をインクリメントする。その結果、次に解読すべきアドレスに４を加算した値に更新される。ただし、上記高速ループ命令の実行ステージでは、命令解読部１５からの制御信号に従って、分岐先情報記憶部１７から送られてくるアドレスに更新される。なお上記シフト値は、分岐先命令記憶部１７１の記憶サイズ（バイト数）と同じ数値である。もし、その記憶サイズが８バイトであれば、ＤＩＣ１５１は、現在解読中の命令のアドレスに８をシフト値として加算した値を保持することになる。
【００１７】
ＤＩＢ１５２は、レジスタからなり、ＦＩＢ１４２から送られ、解読対象の命令を１つ記憶する。
命令デコーダ１５３は、ＤＩＢ１５２に記憶されている命令を解読し、その解読結果によって命令フェッチ部１４、命令解読部１５、命令実行部１６、分岐先情報記憶部１７を制御する各種制御信号を出力する。解読した命令がＤＩＣ１５１のアドレスを利用する場合には、命令デコーダ１５３は、命令の種類に応じて上記４という値を調整（加算又は減算）するように命令実行部１６を制御する。ただし高速ループ命令の場合、このような調整を必要としない。
【００１８】
命令実行部１６は、算術演算回路(ＡＬＵ)やシフタなどからなり、命令解読部１５から送られてきた制御信号に従って、プロセッサ１３の命令で指定された演算や各部を制御したり、プロセッサ１３に接続された図示されていない制御信号の入出力を行なったりする。
分岐先情報記憶部１７は、命令解読部１５が分岐先情報登録命令を解読した場合に分岐先情報を記憶する。このため分岐先情報記憶部１７は分岐先命令記憶部１７１（以下ＢＩＲと略す）、分岐先フェッチアドレス記憶部（以下ＢＡＲ）１７２からなる。
【００１９】
ＢＩＲ１７１は、レジスタからなり、命令解読部１５が分岐先情報登録命令を解読した場合、次のサイクルでＦＩＢ１４２から４バイト分の命令列を読み出し、それを記憶する。これにより、ループ処理の命令列の先頭４バイトがＢＩＲ１７１に登録されたことになる。ＢＩＲ１７１はループ命令バッファとも呼ぶ。
ＢＡＲ１７２はレジスタからなり、命令解読部１５が分岐先情報登録命令を解読した場合、次のサイクルでＤＩＣ１５１からアドレスを読み出し、それを記憶する。このアドレスは、解読中の命令のアドレスにＢＩＲ１７１の記憶サイズ（バイト数）を加算した値なので、ＢＩＲ１７１の記憶内容に後続する命令列のアドレスを意味している。言い換えれば、ＢＡＲ１７２の記憶内容は、高速ループ命令による分岐後に命令フェッチ部１４がどこからフェッチすればよいかを示すポインタである。ＢＡＲ１７２は、ループアドレスバッファとも呼ぶ
＜解読命令カウンタの詳細構成＞
図２は、ＤＩＣ１５１の具体的な構成例を示す。同図のように、ＤＩＣ１５１は、加算器３１、レジスタ３２、セレクタ３３、３４からなる。
【００２０】
リセットなどによる初期化時には、加算器３１は、リセットされたレジスタ３２の値（スタートアドレス）と、一定数”４”とを加算する。レジスタ３２は、その加算値を保持することにより初期化される。
通常、加算器３１は、命令解読部１５による命令解読後に、その命令語長（バイト数）と、現在のレジスタ３２の値とを加算する。レジスタ３２は、その加算値を保持することにより、（（次の解読命令のアドレス）＋４）に更新される。
【００２１】
また分岐命令（高速ループ命令を含む）が実行される場合には、レジスタ３２は、セレクタ３３を介して入力される分岐先アドレスに更新される。
＜登録命令、高速ループ命令の処理内容＞
図３は、登録命令、高速ループ命令等の処理内容を示すフローチャートである。
【００２２】
同図では、ループ処理の直前に配置される登録命令と、ループ処理の末尾に配置される高速ループ命令と、その他の命令に分けてその処理内容を示している。
同図において、命令デコーダ１５３による解読結果が登録命令（setlb）を示す場合には（ステップ３１）、プロセッサ１３は、ＦＩＢ１４２の先頭から４バイト分の命令コードをＢＩＲ１７１へ転送し（ステップ３２）、ＤＩＣ１５１に保持されているアドレスをＢＡＲ１７２に転送し（ステップ３３）、実行ステージサイクルが終了すると次の命令の実行を開始する。これにより、ＢＩＲ１７１にはループ処理先頭の４バイト分の命令コードが保持され、ＢＡＲ１７２にはループ処理先頭の４バイトに後続する命令のアドレスが保持される。
【００２３】
また、命令デコーダ１５３による解読結果が高速ループ命令（lcc）を示す場合には（ステップ３１）、プロセッサ１３は、条件に応じて分岐する場合は（ステップ３５）、ＢＩＲ１７１からＤＩＢ１５２にループ処理先頭の命令を転送し（ステップ３７）、ＢＡＲ１７２からＤＩＣ１５１及びＦＩＣ１４１にアドレスを転送する。これにより、ＦＩＣ１４１には、ループ処理先頭の４バイトに後続する命令のアドレスがフェッチアドレスとして保持され、ＤＩＣ１５１には解読中の命令のアドレスに４を加えたアドレスが保持される。この場合、命令フェッチ部１４は分岐先であるループ処理先頭の命令を新たにフェッチする必要がないので、分岐ハザードが生じない。しかも、ＦＩＣ１４１は、特別な計算を必要とせず転送のみで、ループ処理先頭の４バイトに後続する命令のアドレスを得ることができる。
＜選択部１４３、分岐先命令記憶部１７１の詳細構成＞
図４は、選択部１４３および分岐先命令記憶部１７１の詳細な構成を示すブロック図である。
【００２４】
同図では、選択部１４３及びＢＩＲ１７１に加えてＦＩＢ１４２も図示している。また、プログラム中の命令は可変語長（８ビットの整数倍）であるものとする。
ＦＩＢ１４２は、フェッチされた命令コードを８ビット単位でシフトするキュー（１６段程度が望ましい）として構成される。ＦＩＢ１４２は、解読ステージの各サイクル毎にＤＩＢ１５２に対して選択部１４３を介してキュー先頭の４バイトを出力し、その４バイトを解読した命令解読部１５から命令語長（当該４バイトの先頭からのバイト数）が与えられると、キュー先頭の命令語長分の命令コードをシフトすることにより削除する。その結果、通常、キューの先頭バイトは１つの命令の先頭バイトに一致する（高速ループ命令による分岐直後は必ずしも一致しない）。
【００２５】
ＢＩＲ１７１は、キュー１７１ａと選択制御部１７１ｂとからなる。
キュー１７１ａは、８ビット単位にリング状にシフトするキュー（４段）として構成され、上記登録命令の実行時にＦＩＢ１４２の先頭４バイトを格納し、上記高速ループ命令の実行時に保持している４バイトを選択部１４３を介してＤＩＢ１５２に出力し、その４バイトを解読した命令解読部１５から命令語長（当該４バイトの先頭からのバイト数）が選択制御部１７１ｂを介して与えられると、先頭の命令語長分の命令コードをリング状にシフトする。このシフト動作は、合計４バイト分がシフトされるまで繰り返された後停止し、上記登録命令により格納された元の状態に戻る。この状態で、再度高速ループ命令による分岐がなさた場合、上記と同様に動作する。
【００２６】
選択制御部１７１ｂは、高速ループ命令による分岐直後に、ＦＩＣ１４１の命令コードの代わりにキュー１７１ａに格納されている４バイト分の命令コードを出力するよう選択部１４３を制御する。詳しくは、高速ループ命令による分岐直後の解読ステージにおいて、４バイト全部を選択部１４３を介して出力し、命令解読部１５から通知される命令語長に応じてキュー１７１ａをシフトさせ、シフト後のキュー１７１ａの命令コードの有効バイト数をカウントする。さらに、次の解読ステージにおいて、有効バイト数に応じて選択部１４３を制御する。
【００２７】
選択部１４３は、セレクタ１４３ａ〜１４３ｄからなり、高速ループ命令に実行直後に、キュー１７１ａに保持されている命令コードと、それに後続するＦＩＢ１４２に保持されている命令コードとを合せて４バイトになるよう選択する。
図５にセレクタ１４３ａ〜１４３ｄそれぞれの選択論理を示す。この選択論理によれば、セレクタ１４３ａ〜１４３ｄは、選択制御部１７１ｂから指示される有効バイト数に応じて、キュー１７１ａの有効な命令コードとそれに後続するＦＩＢ１４２の命令コードとを連結した４バイト分の命令コードを出力する。なお、図５では、８ビット５入力１出力（５to１）のセレクタ４つを使用しているが、２to１、３to１、４to１、５to１の４つセレクタで構成してもよい。
＜分岐命令の処理＞
ＤＩＣ１５１は、上記のように現在解読中の命令アドレスに一定数”４”を加算した値を保持するので、ＤＩＣ１５１の値を読み出し又は書き込む命令については、一定数”４”を加減算により調整する必要がある。この調整は、高速ループ命令以外の命令であって、アドレス指定を伴う命令において必要となる。
【００２８】
図６は、アドレス指定を伴う命令のオペレーション内容を示す図である。同図では、絶対アドレス指定を伴う代表的な命令とて、単純分岐命令（branch abs_adrs）、サブルーチンコール命令（call abs_adrs）、サブルーチンからのリターン命令（ret）を、相対アドレス指定を伴う代表的な命令として単純分岐命令（branch rel_adrs）記してある。図中の abs_adrは、３２ビットの絶対アドレスを、rel_adrsは８又は１６ビットの相対アドレスを示す。
【００２９】
単純分岐命令（branch abs_adrs）の場合、命令実行部１６は、絶対アドレス（abs_adr）をＦＩＣ１４１に格納し（オペレーション６０１）、絶対アドレス（abs_adr）に一定数４を加算し、その加算値をＤＩＣ１５１に格納する（６０２）。これにより、指定された絶対アドレスの命令からフェッチ・解読・実行を開始する。このように、絶対アドレスで分岐先が指定される分岐命令に対しては、当該絶対アドレスに４を加算した値をＤＩＣ１５１に設定するよう制御する。
【００３０】
サブルーチンコール命令の場合、命令実行部１６は、絶対アドレス（abs_adr）をＦＩＣ１４１に格納し（６０３）、ＤＩＣ１５１に命令語長を加算した後ＤＩＣ１５１の値から４を減算し、その減算値をスタックにプッシュし（６０４）、さらに絶対アドレス（abs_adr）に一定数４を加算した値をＤＩＣ１５１に格納する（６０５）。ここで、減算値は、サブルーチンコール命令の実行時に解読中だった命令つまり、サブルーチンコール命令の次の命令のアドレスを指す。このように、サブルーチンコール命令に対しては、ＤＩＣ１５１のアドレスから４を減算した値を図外のスタックに退避するよう制御する。
【００３１】
リターン命令の場合、命令実行部１６は、スタックからサブルーチンコール命令の次の命令のアドレスをポップし（６０６）、そのアドレスをＦＩＣ１４１に格納し、さらにそのアドレスに４を加算し、加算値をＤＩＣ１５１に格納する（６０７）。このように、リターン命令に対しては、図外のスタックに退避された当該値に４を加算した値を復帰するよう制御する。
【００３２】
また、相対アドレス指定を伴う単純分岐命令（branch rel_adrs）の場合、命令実行部１６は、命令で指定された相対アドレス（abs_adr）と、ＤＩＣ１５１の値とを加算し（６０８）、その加算結果をＤＩＣ１５１に、さらに、その加算結果に”−４”を加算して加算結果をＦＩＣ１４１に格納する（６０９）。このように、相対アドレスで分岐先が指定される分岐命令に対しては、ＤＩＣ１５１の値から４を減算した値をＤＩＣ１５１に設定するよう制御する。ただし、高速ループ命令では、このような減算を要しない。
【００３３】
上記のように、絶対アドレス指定の分岐命令に対しては、ＤＩＣ１５１の更新は絶対アドレスに＋４しておけばよく、ＦＩＣ１４１の更新はそのまま絶対アドレスを用いればよい。
また、相対アドレス指定の分岐命令に対しては、ＤＩＣ１５１の更新は、単に（ＤＩＣ１５１）＋（相対アドレス）を加算するだけでよく、＋４する必要がなく、ＦＩＣ１４１の更新は、（ＤＩＣ１５１）＋（相対アドレス）−４とする必要がある。
【００３４】
なお、上記の何れの場合も、一定数４の加減算は、命令実行部１６内部のＡＬＵ(Arithmetic Logical Unit)により実行される。また、高速ループ命令以外ののアドレス指定を伴う命令については、命令実行部１６は、上記と同様にアドレス計算を行なうことになる。
＜動作説明＞
以上のように構成された本実施形態におけるプロセッサについて、その動作を以下のプログラム例を用いて説明する。
【００３５】
図７は、以下のプログラム例を実行した場合のパイプラインの状態を示す図である。
0003971509.tif 000002
このプログラム例では、左から命令アドレス、命令、コメントを示している。
命令アドレスは３２ビットアドレス中の下位１６ビットのみを１６進数で、命令はニーモニック形式で、コメントは；以下に命令内容の簡単な説明を記している。
【００３６】
このプログラムでは、登録命令（setlb）の次の命令（add a,b,c）から高速ループ命令（lcc L）までの処理は、３回繰り返されるループ処理になっている。
図７では、横軸をサイクル単位の時間軸とし、縦軸のＩＦ（ステージ）欄は、ＦＩＢ１４２に保持されている先頭命令を示している。ただし、サイクル８、９、１３、１４ではＢＩＲ１７１に保持されている先頭命令を示している。ＤＥＣ（ステージ）欄は、ＤＩＢ１５２に保持されている解読中の命令を示す。ＥＸ（ステージ）欄は、命令実行部１６において実行中の命令を示している。
【００３７】
同図において、分岐先登録命令（setlb）が解読されると（サイクル３）、解読ステージ（サイクル３）において、ＦＩＢ１４２からＢＩＲ１７１に４バイト分の命令コード（add命令とmul命令）が転送され、さらに実行ステージ（サイクル４）においてＤＩＣ１５１からＢＡＲ１７２に（解読中の命令アドレス）＋４というアドレスが転送される。このとき、ＢＡＲ１７２には、1007（1003＋4）つまり、(add i,1,i)のアドレスが格納される。
【００３８】
この後、高速ループ命令（lcc）が解読されると（サイクル８）、その実行ステージ（サイクル９）において、ＢＩＲ１７１からＤＩＢ１５２に４バイト分の命令コードが転送され、ＢＡＲ１７２からＦＩＣ１４１にアドレスが転送される。これにより、ＦＩＣ１４１には、ＢＩＲ１７１の４バイト分に命令コードに後続する命令のアドレスが格納される。
【００３９】
また、サイクル１３における高速ループ命令についても同様である。
このように、本プロセッサでは、ＤＩＣ１５１は、常に解読中の命令のアドレスに４を加算したアドレスを保持しているため、登録命令（setlb）の実行に際して、分岐先のフェッチアドレスを求めるのに４を加算する加算器を不要にしている。
【００４０】
また、高速ループ命令（lcc）による分岐に際して、ＦＩＣ１４１とＤＩＣ１５１はいずれもＢＡＲ１７２からの同じアドレスが転送されるので、ＦＩＣ１４１とＤＩＣ１５１とに対して個別にアドレス計算を行なう必要がないので、ここでも加算器（減算器）を不要にしている。
＜第２の実施形態＞
図８は、本発明の第２の実施形態におけるプロセッサの構成を示すブロック図である。
【００４１】
同図の構成は、図１と比べてＦＩＣ（フェッチ命令カウンタ）１４１の代わりにＦＩＣ２４１を、ＤＩＣ１５１の代わりにＤＩＣ２５１を備える点が異なっている。この差異により、同図の構成は、アドレス指定を伴う命令を実行した場合に、図１の構成では命令実行部１６によってＤＩＣ１５１に保持されるべきアドレスを算出していたのに対して、命令実行部１６ではなく命令フェッチ部２４においてＤＩＣ１５１に保持されるべきアドレスを計算するように構成されている。これ以外は第１の実施形態と同じなので、以下異なる点を中心に説明する。
＜フェッチ命令カウンタ２４１の詳細構成＞
図９は、フェッチ命令カウンタ２４１及び解読命令カウンタ２５１の詳細な構成を示すブロック図である。
【００４２】
フェッチ命令カウンタ２４１は、加算器９１、ラッチ９２、セレクタ９３から構成される。
加算器９１、ラッチ９２、セレクタ９３からなるループ回路は、４ずつカウントアップするカウンタを構成している。命令フェッチ部２４は、ＦＩＢ１４２に４バイト以上の空きが存在する場合に、４バイト分の命令コードのフェッチを行い、ＦＩＣ１４１をカウントアップする。
【００４３】
セレクタ９３は、通常（分岐しない場合）は、加算器９１の加算結果を選択し、高速ループ命令以外の分岐命令が実行された場合は実行部１６から供給される分岐先アドレスを、高速ループ命令が実行された場合にはＢＡＲ１７２から供給されるフェッチアドレスを選択し、加算器９１に出力する。ラッチ９２の出力は、フェッチアドレスとして外部メモリ１１に供給される。
＜解読命令カウンタ２５１の詳細構成＞
図９において、ＤＩＣ２５１は、加算器１０１、ラッチ１０２、セレクタ１０３、セレクタ１０４から構成される。
【００４４】
加算器１０１、セレクタ１０３、ラッチ１０２からなるループ回路は、解読ステージ毎に、解読された命令語長ずつカウントアップするカウンタを構成している。
加算器１０１は、解読ステージの後半で、ラッチ１０２の内容に解読された命令語長を加算し、ＤＩＣ２５１を参照する命令（高速分岐命令以外の分岐命令など）の実行時には、ラッチ１０２の内容に”−４”を加算した値を出力する。
ラッチ１０２は、解読中の命令アドレスとシフト値”４”との和を保持する。また、ラッチ１０２は、初期化時には、ＦＩＣ２４１から与えられる（スタートアドレス＋４）を保持する。
【００４５】
セレクタ１０３は、通常は命令解読部２５から与えられる命令語長を選択し、相対アドレス指定を伴う命令やサブルーチンコール命令の実行時には、シフト値の調整用の”−４”を選択する。
セレクタ１０４は、通常は加算器１０１の加算結果を選択し、高速分岐命令の実行に際してＢＡＲ１７２の出力を選択し、他の分岐命令の実行に際してＦＩＣ２４１からの出力（加算器９１からの（分岐先アドレス＋４））を選択する。
＜分岐先アドレスの計算＞
図１０は、アドレス指定を伴う命令のオペレーション内容を示す図である。同図では、図６と同様に単純分岐命令（branch abs_adrs）、サブルーチンコール命令（call abs_adrs）、サブルーチンからのリターン命令（ret）を、単純分岐命令（branch rel_adrs）記してある。なお、図１０中の破線より上のオペレーションは解読ステージにおいて、破線より下のオペレーションは実行ステージにおいて実行されることを意味する。
【００４６】
単純分岐命令（branch abs_adrs）の場合、命令実行部１６が、絶対アドレス（abs_adr）をＦＩＣ２４１に格納し（オペレーション１００１）、さらに命令フェッチ部２４内の加算器９１がＦＩＣ２４１に一定数４を加算し、その加算値をＤＩＣ２５１に格納する（１００２）。このように、絶対アドレスで分岐先が指定される分岐命令に対しては、命令フェッチ部２４内の加算器９１を利用してシフト値”４”を加算しするように構成されている。
【００４７】
サブルーチンコール命令の場合、命令実行部１６は絶対アドレス（abs_adr）をＦＩＣ２４１に格納し（１００３）、加算器１０１は、ＤＩＣ２５１に命令語長を加算（１００４）した後ＤＩＣ２５１の値から４を減算し、命令実行部１６がその減算値をスタックにプッシュし（１００５）、さらに加算器９１においてＦＩＣ２４１に一定数４を加算した値をＤＩＣ２５１に格納する（１００６）。このように、スタックにプッシュする戻り先アドレスの計算におけるシフト値”４”の調整は、ＤＩＣ２５１内の加算器１０１を利用し、ＤＩＣ２５１の更新におけるシフト値の調整は、ＦＩＣ２４１内の加算器９１を利用している。
【００４８】
リターン命令の場合、命令実行部１６は、スタックからサブルーチンコール命令の次の命令のアドレスをポップし（１００７）、そのアドレスをＦＩＣ２４１に格納し、さらにそのアドレスに４を加算し、加算値をＤＩＣ２５１に格納する（１００８）。このように、リターン命令に対しては、シフト値”４”の調整は、ＦＩＣ２４１内の加算器９１を利用している。
【００４９】
また、相対アドレス指定を伴う単純分岐命令（branch rel_adrs）の場合、命令実行部１６は、加算器１０１によりＤＩＣ２５１に”−４”加算された値と、命令で指定された相対アドレス（abs_adr）とを加算し、その加算結果をＦＩＣ２４１に格納し（１００９）、さらに、加算器９１によりＦＩＣ２４１に”４”加算された値をＤＩＣ２５１格納する（１０１０）。このように、相対アドレスで分岐先が指定される分岐命令に対するシフト値の調整は、ＤＩＣ２５１内の加算器１０１と、ＦＩＣ２４１内の加算器９１とを利用している。
【００５０】
上記のように、本実施例のプロセッサは、図１０における１００２、１００６、１００８、１０１０のオペレーションは、ＦＩＣ２４１内の加算器９１を利用してシフト値”４”の加算を行い、１００５、１００９のオペレーションはＤＩＣ２５１内の加算器１０１を利用してシフト値”４”の減算を行っている。
＜分岐タイミング＞
図１１は、相対分岐命令（branch rel_adrs）の動作タイミングを示すタイムチャートである。
【００５１】
同図においてサイクルＴ１、Ｔ２はそれぞれ上記相対分岐命令（branch rel_adrs）の命令解読ステージ、命令実行ステージに相当する。また、サイクルＴ３、Ｔ４は、それぞれ分岐先命令の命令フェッチステージ、命令解読ステージに相当する。
サイクルＴ１において、加算器１０１は（ＤＩＣ２５１−４）を計算し、さらに、サイクルＴ２において命令実行部１６はその計算結果に相対アドレス（rel_adrs）を加算することにより分岐先アドレス（ＢＡ）を算出する。
【００５２】
サイクルＴ３において、ＦＩＣ２４１には分岐先アドレス（ＢＡ）が外部メモリ１１に出力され、分岐先の命令コード（３２ビット分）がフェッチされる。サイクルＴ３の後半で加算器９１は（ＦＩＣ２４１＋４）を計算する。
サイクルＴ４において、加算器９１の計算結果がＤＩＣ２５１及びＦＩＣ２４１に格納される。
【００５３】
なお、上記各実施形態におけるプロセッサは、処理単位を３２ビットとして説明したが、本発明を適用するには、１６ビットでも６４ビットでもよい。また、ＢＩＲ１７１のサイズを４バイト（３２ビット）としたが、このサイズは、高速ループ命令による分岐後にそのサイズ分の命令コードを解読し終えるまでに、少なくとも１命令をフェッチするだけのサイクルを保証できればよい。
【００５４】
また、上記各実施形態では、プログラムが可変語長命令から構成されることを前提としたが、固定語長のプログラムであってもよい。その場合、ＤＩＣ１５１、選択部１４３はより簡単な構成にすることができる。
また、図４に示したＢＩＲ１７１の構成ではキュー１７１ａ（リングバッファ）を用いているが、ＢＩＲ１７１に格納された４バイト分の命令コードのうち、任意のバイトを先頭として出力する構成としてもよい。この場合のキュー１７１ａの他の構成例を図１２に示す。同図では、図４のＢＩＲ１７１においてキュー１７１ａの代わりに４バイトのレジスタ１２０とセレクタ１２１ａ〜１２１ｄとを備える構成としている。セレクタ１２１ａ〜１２１ｄの選択論理を図１３に示す。図１２、１３に示すように、レジスタ１２０に４バイトの命令コード（Ａ、Ｂ、Ｃ、Ｄ）が格納されている場合、有効バイト数が４であれば、セレクタ１２１ａ〜１２１ｄは、Ａ、Ｂ、Ｃ、Ｄと配列された３２ビットを出力する。この３２ビットは、図４に示したセレクタ１４３ａ〜１４３ｄを介してＤＩＢ１５２に格納される。
【００５５】
また例えば、有効バイト数が３であれば、セレクタ１２１ａ〜１２１ｄは、ＢＣＤＡと配列された３２ビットを出力する。この出力は、図４に示したセレクタ１４３ａ〜１４３ｄによって有効バイト（３バイトＢＣＤ）のみが選択される。このとき、セレクタ１４３ａ〜１４３ｄは、この３バイト（ＢＣＤ）を上位側とし、ＦＩＢ１４２から１バイトを下位側とした４バイトを出力する。また、有効バイト数が２、１の場合も同様である。
【００５６】
図１２の構成は、図４と比べてシフト動作の代わりに選択動作をすることになるので、より高速な動作が可能である。
【００５７】
【発明の効果】
本発明のプロセッサは、メモリからコードをフェッチするフェッチ部と、フェッチされたコード中の命令を解読する解読部と、解読された命令を実行する実行部とを有し、プログラムループの直前に配置された登録命令と、プログラムループの末尾に配置されたループ命令とを用いて、高速にループ処理を実行するプロセッサであって、
前記解読部は、解読中の命令を指すポインタとして、解読中の命令のアドレスに一定のシフト値を加算した値を保持及び更新する解読命令カウンタを備え、
前記実行部は、解読部により前記登録命令が解読された場合に、フェッチ部によりプリフェッチされたプログラムループ先頭のコードを第１バッファに、解読命令カウンタに保持されているポインタを第２バッファに登録する登録手段と、解読部により前記ループ命令が解読されかつ分岐が成立する場合に、第２バッファに登録されたポインタをフェッチアドレスとして前記フェッチ部にフェッチさせ、第１バッファに登録されたコードを解読部に解読させる高速分岐手段とを備え、
前記シフト値は、第２バッファに格納されたポインタが、第１バッファに格納されたコードに後続するコードのアドレスを指すように定められている。
【００５８】
ここで、前記一定のシフト値は、第１バッファの記憶領域サイズに等しい構成としてよい。
ここで、前記解読命令カウンタは、初期化時には、スタートアドレスと前記シフト値とを和を保持するようにしてもよい。
この構成によれば、解読命令カウンタに実際に解読中の命令のアドレスに所定の値を加算したポインタを格納することによって、従来必要だった分岐情報登録命令実行時のアドレス加算と、ループ命令実行時のアドレス減算の処理が不要になり、これらの処理に必要な加算器および減算器も不要になり、その結果ハードウェア規模を削減できるという効果がある。分岐情報登録命令及びループ命令実行時にアドレス計算が不要であるため、これらの実質的な処理時間を短縮することができる。
【００５９】
ここで、前記実行部は、さらに、絶対アドレス指定を伴う分岐命令が解読部により解読された場合、当該絶対アドレスをフェッチ命令カウンタに転送し、当該絶対アドレスに前記シフト値を加えた値を解読命令カウンタに転送する分岐手段を備える構成としてもよい。
また、前記分岐手段は、さらに、相対アドレス指定を伴う分岐命令が解読部により解読された場合、当該相対アドレスと解読命令カウンタに保持されたポインタとを加算した値を解読命令カウンタに転送し、その加算値から前記シフト値を減算した値をフェッチ命令カウンタに転送するように構成してもよい。
【００６０】
この構成によれば、解読命令カウンタに保持されたポインタを用いて、絶対アドレスまたは相対アドレス指定を伴う分岐命令を実行する。
ここで前記フェッチ命令カウンタは、フェッチアドレスを保持するレジスタと、レジスタの値をインクリメントする加算器とを含み、前記分岐手段は、絶対アドレス指定を伴う分岐命令が解読部により解読された場合に、前記絶対アドレスに前記シフト値を加えた値の計算を、前記フェッチ命令カウンタ内の加算器に実行させ、その加算結果を解読命令カウンタに転送するようにしてもよい。
【００６１】
この構成によれば、絶対アドレス指定を伴う分岐命令に対して、解読命令カウンタに格納すべきポインタの算出を、実行部の資源を占有しないで、フェッチ命令カウンタ内の加算器を用いて行なうことができる。
【図面の簡単な説明】
【図１】本発明の第１の実施形態におけるプロセッサの構成を示すブロック図である。
【図２】解読命令カウンタの詳細な構成を示す図である。
【図３】命令実行ステージにおける処理内容を示すフローチャートである。
【図４】選択部１４３および分岐先命令記憶部１７１の詳細な構成を示すブロック図である。
【図５】選択部１４３の選択制御論理を示す図である。
【図６】アドレスを伴う命令のオペレーション内容を示す図である。
【図７】プロセッサによってループ処理を実行した場合のパイプラインの状態を示す図である。
【図８】本発明の第２の実施形態におけるプロセッサの構成を示すブロック図である。
【図９】フェッチ命令カウンタ２４１及び解読命令カウンタ２５１の詳細な構成を示すブロック図である。
【図１０】アドレス指定を伴う命令のオペレーション内容を示す図である。
【図１１】相対分岐命令（branch rel_adrs）の動作タイミングを示すタイムチャートである。
【図１２】図４のキューの他の構成例を示す。
【図１３】図１２におけるセレクタの選択論理を示す。
【符号の説明】
１１    外部メモリ
１３    プロセッサ
１４    命令フェッチ部
１５    命令解読部
１６    命令実行部
１７    分岐先情報記憶部
２４    命令フェッチ部
２５    命令解読部
３１    加算器
３２    レジスタ
３３    セレクタ
９１    加算器
９２    ラッチ
９３    セレクタ
１０１    加算器
１０２    ラッチ
１０３    セレクタ
１０４    セレクタ
１２０    レジスタ
１２１ａ〜１２１ｄ  セレクタ
１４１    フェッチ命令カウンタ
１４２    フェッチ命令バッファ
１４３    選択部
１４３ａ〜１４３ｄ  セレクタ
１５１    解読命令カウンタ
１５２    解読命令バッファ
１５３    命令デコーダ
１７１    分岐先命令記憶部
１７１ａ  キュー
１７１ｂ  選択制御部
１７２    分岐先フェッチアドレス記憶部
【図１】
0003971509.tif 000003
【図２】
0003971509.tif 000004
【図３】
0003971509.tif 000005
【図４】
0003971509.tif 000006
【図５】
0003971509.tif 000007
【図６】
0003971509.tif 000008
【図７】
0003971509.tif 000009
【図８】
0003971509.tif 000010
【図９】
0003971509.tif 000011
【図１０】
0003971509.tif 000012
【図１１】
0003971509.tif 000013
【図１２】
0003971509.tif 000014
【図１３】
0003971509.tif 000015