(57)【特許請求の範囲】
【請求項１】
命令をデコードする命令デコーダと、前記命令デコーダの出力に従って命令を実行する命令実行部とを備えた遅延命令を有するマイクロプロセッサにおいて、前記命令実行部におけるプログラムカウンタ値を制御するＰＣ制御部は、遅延分岐命令の分岐先を示す値および遅延分岐命令で指定された遅延量に応じたプログラムカウンタ値を保持する遅延分岐命令保持手段を備えたことを特徴とする遅延命令を有するマイクロプロセッサ。
【請求項２】
命令をデコードする命令デコーダと、前記命令デコーダの出力に従って命令を実行する命令実行部とを備えた遅延命令を有するマイクロプロセッサにおいて、前記命令実行部における演算ユニットは、遅延演算命令による演算内容および遅延演算命令による演算の実行開始を示す値を保持する遅延命令保持手段を備え、前記遅延命令保持手段は、演算の実行開始を示す前記値として、遅延演算命令で指定された遅延量に応じたプログラムカウンタ値を保持することを特徴とする遅延命令を有するマイクロプロセッサ。
【請求項３】
演算ユニットは、複数の遅延命令保持手段を有する請求項２記載の遅延命令を有するマイクロプロセッサ。
【請求項４】
命令実行部は、複数演算を同時に実行する請求項１から請求項３のうちのいずれか１項記載の遅延命令を有するマイクロプロセッサ。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は、実行時期を遅らせて実行される遅延命令を有するマイクロプロセッサに関するものである。
【０００２】
【従来の技術】
図２０は従来のパイプライン制御方式によるマイクロプロセッサの処理シーケンスを示すシーケンス図である。図において、３００は分岐命令、３０１はパイプラインにおける命令フェッチステージ、３０２はパイプラインにおけるデコードステージ、３０３はパイプラインにおける命令実行ステージ、３０４はパイプラインにおけるライトバックステージ、３０５は第１の遅延スロットにおける命令、３０６は第２の遅延スロットにおける命令、３０７は分岐先で実行される命令を示す。
なお、以下、単に「分岐命令」と表現された場合には、それは、プログラムカウンタ（ＰＣ）値にオペランドで示されるオフセット値が加算された値であるアドレスに分岐する命令と、オペランドで示されるアドレスに間接的にまたは直接に分岐する命令とを含む。分岐命令とジャンプ命令とが、併記された場合には、それらは、それぞれ、プログラムカウンタ値にオペランドで示されるオフセット値が加算された値であるアドレスに分岐する分岐命令、オペランドで示されるアドレスに間接的にまたは直接に分岐するジャンプ命令を意味する。また、以下、分岐命令およびジャンプ命令は、サブルーチンコール命令を含むものとして説明を進める。
【０００３】
次に動作について説明する。
分岐命令が実行されると、図２０に示されたパイプライン制御を行うマイクロプロセッサは、分岐先アドレスを３番目のステージである命令実行ステージ３０３で得ることができる。その時点では、第１の遅延スロットにおける命令３０５および第２の遅延スロットにおける命令３０６は、既にデコードステージ３０２または命令フェッチステージ３０１にある。マイクロプロセッサは、それらの命令を無効なものとして扱わなくてはならず、パイプラインの無駄が生ずる。
【０００４】
パイプラインの無駄を防止するために、「コンピュータアーキテクチャ：量的アプローチ（Ｃｏｍｐｕｔｅｒ  Ａｒｃｈｉｔｅｃｔｕｒｅ：Ａ  Ｑｕａｎｔｉｔａｔｉｖｅ  Ａｐｐｒｏａｃｈ），Ｍｏｒｇａｎ  Ｋａｕｆｍａｎｎ社，１９９０年」等の文献で種々の手法が提案されている。例えば、命令のスケジューリング、または命令のスケジューリングと遅延分岐命令（ディレイド分岐命令）との組み合わせによって、パイプラインの無駄を低減することができる。
【０００５】
例えば、特開平６−１３１１８０号公報や特開平６−２７４３５２号公報に、ディレイド分岐命令に関する技術が記載されている。一般にディレイド分岐命令における遅延量はマイクロプロセッサのアーキテクチャに応じた固定的な値であるが、特開平６−１３１１８０号公報には任意の遅延スロット数を指定できる命令が開示されている。指定された遅延スロット数はデクリメントカウンタに設定される。デクリメントカウンタの値は動作クロック信号の入力に従って減り、値が「１」になると分岐先命令のフェッチが開始される。
【０００６】
図２１は２演算を同時に行うマイクロプロセッサにおける命令デコーダおよび命令実行部の部分の一般的な構成を示すブロック図である。図において、３４１は算術論理演算を実行するＡＬＵ、３４２は乗算を実行する乗算器、３４３はＰＣ値を計算するＰＣ制御部、３４４はアドレス計算を行うメモリ制御部、３４５はシフト演算を実行するシフタ、３４６は１サイクルで２命令を転送できるバス、３４７は命令をデコードして命令実行部に制御信号１１，１２を与えるデコーダ、３４８は汎用レジスタである。
【０００７】
図２２はプログラムの一例を示す説明図である。図において、ＡＤＤ，ＳＲＡ，ＳＵＢ，ＭＵＬおよびＪＭＰは、それぞれ、加算命令、シフト命令、減算命令、乗算命令およびジャンプ命令を示す。加算命令、シフト命令、減算命令、乗算命令およびジャンプ命令は、ぞれぞれ、命令実行部におけるＡＬＵ３４１、シフタ３４５、ＡＬＵ３４１、乗算器３４２およびＰＣ制御部３４３において扱われる。また、例えば、（ｒ３，ｒ０，６）は、汎用レジスタ３４８中のｒ０レジスタの値と即値「６」とを対象とした演算結果を汎用レジスタ３４８中のｒ３レジスタに設定することを示す。
【０００８】
図２０に示されたマイクロプロセッサは２演算命令を扱えるので、命令実行部におけるリソースが競合しない限り、図２２に示されたプログラムを２演算命令による各命令に変換したものを扱える。例えば、図２３に示されるように変換された各命令を実行できる。図２３において、各行は２演算命令の１命令に対応する。すなわち、各行は同時実行される２演算を示す。ＳＲＡとＳＵＢとは、リソースの競合はないがレジスタ依存の関係にあるので、同時に実行することはできない。よって、２行目にＮＯＰが置かれている。このような命令のスケジューリングは、プログラマまたはコンパイラによってなされる。
【０００９】
【発明が解決しようとする課題】
従来の遅延命令を有するマイクロプロセッサは以上のように構成されているので、以下のような課題があった。
（１）遅延量が固定的にしか指定できないディレイド分岐命令を有するマイクロプロセッサでは、効果的な命令のスケジューリングができない。例えば、図２３における５行目のＪＭＰを削除して２行目のＮＯＰの位置に遅延量「２」のディレイドジャンプ命令を置くことは効果的である。そのようにすれば、図２３の４行目の命令のフェッチ後に直ちにジャンプ先アドレスＴＧＴの命令のフェッチが開始され、パイプラインの無駄が生じないからである。遅延量「２」しか指定できないマイクロプロセッサでは、そのようなディレイド分岐命令を置いた命令群を実行できる。しかし、例えば遅延量「３」しか指定できないマイクロプロセッサを使用する場合には、プログラマまたはコンパイラは、そのようなスケジューリングを行うことはできない。
（２）指定された遅延量に応じた値をデクリメントカウンタに設定するマイクロプロセッサでは、命令遅延中に割り込みや新たな分岐が生じた場合に矛盾なく処理を進めるための構成が複雑になる。例えば、デクリメントカウンタの値は動作クロックに従ってカウントダウンされるので、何等の考慮も払わないと、設定された遅延量と実際の遅延量との間で、割り込み処理等で費やされた動作クロック数分の狂いが生ずる。
（３）ディレイド命令は分岐命令に限られているので、効果的な命令のスケジューリングができない。
【００１０】
この発明は上記のような課題を解決するためになされたもので、処理の矛盾を生じさせることなく任意の遅延量を指定できるディレイド命令を扱えて効果的な命令のスケジューリングができる環境をプログラマに提供でき、その結果、プログラムをより高速に実行しうるマイクロプロセッサを得ることを目的とする。
【００１１】
【課題を解決するための手段】
請求項１記載の発明に係る遅延命令を有するマイクロプロセッサは、ＰＣ値を制御するＰＣ制御部が、ディレイド分岐命令の分岐先アドレスを示す値およびディレイド分岐命令で指定された遅延量に応じたプログラムカウンタ値を保持する遅延分岐命令保持手段を有するものである。
【００１２】
請求項２記載の発明に係る遅延命令を有するマイクロプロセッサは、各演算ユニットが、ディレイド演算命令の内容およびディレイド演算命令の固定のまたは可変の遅延量に応じた値を保持する遅延命令保持手段を有するものである。ここで、ディレイド演算命令の内容とは、ディレイド演算命令のデコード結果であって、いかなる演算を行うかを示す情報である。
なお、特に断らない限り、ディレイド分岐命令は、ディレイド演算命令に含まれないものとする。
また、各演算ユニットが、ディレイド演算命令で指定された遅延量に応じたＰＣ値を保持する遅延命令保持手段を有するものである。
【００１３】
請求項３記載の発明に係る遅延命令を有するマイクロプロセッサは、各演算ユニットに、複数の遅延命令保持手段が設けられているものである。
【００１４】
請求項４記載の発明に係る遅延命令を有するマイクロプロセッサは、上記の各構成を有するとともに、命令実行部が複数演算を同時に実行するものである。
【００１５】
【発明の実施の形態】
以下、この発明の実施の一形態を説明する。
実施の形態１．
図１はこの発明の実施の形態１によるマイクロプロセッサの構成を示すブロック図である。このマイクロプロセッサは、３２ビットの内部データバスを有する３２ビットマイクロプロセッサである。図において、２は命令ＲＡＭ６から６４ビット幅のＩＤバスを介して入力した命令コードをデコードする処理を行う命令デコードユニット（命令デコーダ）、３はアドレス計算を行うメモリユニット（命令実行部）、４は論理演算やシフト演算を行う整数演算ユニット（命令実行部）、５は３２ビット×６４ワードの汎用レジスタ、７はデータが格納されるデータＲＡＭである。
【００１６】
命令デコードユニット２において、８，９はそれぞれ命令コードをデコードするデコーダ、１０はプロセッサの状態を示すプロセッサ状態語（Processor Status Word 、以下、プロセッサ状態語をＰＳＷと呼ぶ）である。命令デコードユニット２は、さらに、デコーダ８のデコード結果とＰＳＷ１０の内容にもとづいて制御信号１１を作成し、それをメモリユニット３に与える。また、命令デコードユニット２は、デコーダ９のデコード結果とＰＳＷ１０の内容にもとづいて制御信号１２を作成し、それを整数演算ユニット４に与える。
【００１７】
メモリユニット３において、１３はジャンプや分岐を含まない命令を実行するとＰＣ値に８を加えて次に実行する命令に対するＰＣ値を算出するとともに、ジャンプや分岐を含む命令の実行時に分岐変位をＰＣ値に加算したり、演算で指定されたアドレッシングモードに応じた計算を行ってジャンプ先の命令に対するＰＣ値を計算するＰＣ制御部である。また、ＰＣ制御部１３は、計算したＰＣ値を３２ビット幅のＩＡバスを介して命令ＲＡＭ６に送り、命令ＲＡＭ６から命令コードを出力させる。１４はオペランドとなるデータのアクセスを制御するメモリ制御部である。メモリ制御部１４は、３２ビット幅のＤＡバスを介してアドレスデータをデータＲＡＭ７に転送し命令実行に必要なデータを６４ビット幅のＤＤバスを介してアクセスする。１５は汎用レジスタ５から３２ビット幅のＳ１バス、Ｓ２バス、Ｓ３バスを介して転送された最大３ワードのデータを用いて算術論理演算を行い演算結果を３２ビット幅のＤ１バスを介して汎用レジスタ５に転送するＡＬＵ、１６は汎用レジスタ５からＳ１バス、Ｓ２バス、Ｓ３バスを介して転送されたデータを用いてシフト演算を行い演算結果をＤ１バスを介して汎用レジスタ５に転送するシフタである。
【００１８】
メモリユニット３に対して、Ｓ１バス、Ｓ２バス、Ｓ３バス、Ｓ４バスを介して、３２ビット長のデータを一時に４ワード転送することが可能である。従って、例えば、第１のレジスタの内容と第２のレジスタの内容との和でアドレッシングされるメモリの領域に第３のレジスタの内容をストアするとともに、第３のレジスタの内容をストアしたアドレスに所定値を加算して得られる値でアドレッシングされるメモリの領域に第４のレジスタの内容をストアする２ワードストア命令を実現することができる。また、メモリユニット３は、Ｄ１バスおよびＤ２バスを介して、メモリユニット３内での２ワードの演算結果またはデータＲＡＭ７から転送された２ワードのデータを汎用レジスタ５に転送することができる。
【００１９】
整数演算ユニット４において、１７は汎用レジスタ５から３２ビット幅のＳ４バス、Ｓ５バス、Ｓ６バスを介して転送された最大３ワードのデータを用いて乗算を行い演算結果を３２ビット幅のＤ２バス、Ｄ３バスを介して汎用レジスタ５に転送する乗算器、１８は乗算の結果を累積加算または累積減算して保持するアキュムレータである。アキュムレータとして、６４ビットのものが２本ある。１９は汎用レジスタ５からＳ４バス、Ｓ５バス、Ｓ６バスを介して転送された最大３ワードのデータを用いて算術論理演算を行い演算結果をＤ２バス、Ｄ３バスを介して汎用レジスタ５に転送するＡＬＵ、２０は汎用レジスタ５からＳ４バス、Ｓ５バス、Ｓ６バスを介して転送されたデータを用いてシフト演算を行い演算結果をＤ２バス、Ｄ３バスを介して汎用レジスタ５に転送するシフタである。
【００２０】
このマイクロプロセッサでは、汎用レジスタ５から、最大６種類のレジスタ値を読み出すことが可能であって、読み出されたデータは、それぞれ、Ｓ１バス、Ｓ２バス、Ｓ３バス、Ｓ４バス、Ｓ５バス、Ｓ６バスに出力される。また、汎用レジスタ５には、Ｄ１バス、Ｄ２バス、Ｄ３バスを介して最大３種類のレジスタ値を同時に書き込むことが可能である。
【００２１】
図２はこのマイクロプロセッサの命令フォーマットを示す説明図である。命令フォーマットとして、図２（ａ）に示すような１つの命令コードで２つの演算（operation ）を指示する２演算命令のフォーマット１０１と、図２（ｂ）に示すような１つの命令コードで１つの演算を指示する１演算命令のフォーマット１０２とがある。２演算命令のフォーマット１０１には、フィールド１０３およびフィールド１０４からなるフォーマットフィールドと、２つの演算フィールド１０６，１０７と、各演算フィールド１０６，１０７に付属する各実行条件フィールド１０５とがある。１演算命令のフォーマット１０２には、フィールド１０３およびフィールド１０４からなるフォーマットフィールドと、演算フィールドと、演算フィールドに付属する実行条件フィールド１０５とがある。演算フィールドは、フィールド１０８，１０９，１１０からなる。
【００２２】
フォーマットフィールドは、以下のような意味を示す。
コード：フォーマット            実行の順番
operation_０    operation_１
ＦＭ＝００：２命令              第１            第１
０１：２命令              第１            第２
１０：２命令              第２            第１
１１：１命令              第１            ……
ここで、ＦＭは、フィールド１０３およびフィールド１０４からなる２ビットの値である。
【００２３】
ＦＭ＝００の場合、この命令は２演算命令であることを示す。そして、演算フィールド１０６で指示されたoperation_０の演算と演算フィールド１０７で指示されたoperation_１の演算とが、デコード直後のクロックサイクルで並列に実行される。operation_０の演算はメモリユニット３で実行され、operation_１の演算は整数演算ユニット４で実行される。ＦＭ＝０１の場合、この命令は２演算命令であることを示す。そして、operation_０の演算が、デコード直後のクロックサイクルで実行され、operation_１の演算が、operation_０の演算に対して、１クロックサイクル遅れて実行される。ＦＭ＝１０の場合、この命令は２演算命令であることを示す。そして、operation_１の演算が、デコード直後のクロックサイクルで実行され、operation_０の演算が、operation_１の演算に対して、１クロックサイクル遅れて実行される。ＦＭ＝１１の場合、この命令は１演算命令であることを示す。そして、フィールド１０８，１０９，１１０からなる演算フィールドで指示された１つの演算がデコード直後のクロックサイクルで実行される。
【００２４】
実行条件フィールド１０５は、以下のような意味を持つ。
コード：  実行条件
ＣＣ＝０００：  常時
００１：  Ｆ０＝真    かつ  Ｆ１＝無視
０１０：  Ｆ０＝偽    かつ  Ｆ１＝無視
０１１：  Ｆ０＝無視  かつ  Ｆ１＝真
１００：  Ｆ０＝無視  かつ  Ｆ１＝偽
１０１：  Ｆ０＝真    かつ  Ｆ１＝真
１１０：  Ｆ０＝真    かつ  Ｆ１＝偽
１１１：  予約済
【００２５】
実行条件フィールド１０５は、マイクロプロセッサの実行コントロールフラグＦ０，Ｆ１の値に応じて、演算フィールド１０６，１０７のoperation_０の演算やoperation_１の演算、およびフィールド１０８，１０９，１１０からなる演算フィールドの演算が有効であるか無効であるか定める。実行コントロールフラグＦ０，Ｆ１については後で説明する。演算が有効であるとは、演算結果がレジスタ、メモリおよびフラグに反映され、その演算による動作の結果が残ることを意味する。演算が無効であるとは、演算結果がレジスタ、メモリおよびフラグに反映されず、あたかも無効演算（ＮＯＰ）が実行されたかのような動作の結果が残ることを意味する。
【００２６】
実行条件フィールド１０５の値ＣＣ＝０００のときには、実行コントロールフラグＦ０，Ｆ１の値にかかわらず常に演算は有効である。ＣＣ＝００１のときには、実行コントロールフラグＦ０＝真のときにのみ演算は有効である。実行コントロールフラグＦ１の状態はいずれでもよい。ＣＣ＝０１０のときには、実行コントロールフラグＦ０＝偽のときにのみ演算は有効である。実行コントロールフラグＦ１の状態はいずれでもよい。ＣＣ＝０１１のときには、実行コントロールフラグＦ１＝真のときにのみ演算は有効である。実行コントロールフラグＦ０の状態はいずれでもよい。ＣＣ＝１００のときには、実行コントロールフラグＦ１＝偽のときにのみ演算は有効である。実行コントロールフラグＦ０の状態はいずれでもよい。ＣＣ＝１０１のときには、実行コントロールフラグＦ０＝真かつＦ１＝真のときにのみ演算は有効である。ＣＣ＝１１０のときには、実行コントロールフラグＦ０＝真かつＦ１＝偽のときにのみ演算は有効である。ＣＣ＝１１１のときの動作は未定義であり、ユーザは、ＣＣ＝１１１となる命令を用いることはできない。
【００２７】
図３は演算フィールドの詳細な内容を示す説明図である。
フォーマット１１１〜１１７は、それぞれ２８ビットで表現される短型の演算フィールド１０６または演算フィールド１０７によるものである。フォーマット１１８は、フィールド１０８，１０９，１１０で構成される長型の演算フィールドによるものである。
【００２８】
フォーマット１１１（Ｓｈｏｒｔ＿Ｍ）は、演算内容を指定するフィールド１２０、レジスタ番号を指定する２つのフィールド１２１，１２２、レジスタ番号または６ビット長の即値を指定するフィールド１２３、およびフィールド１２３がレジスタ番号を示すのか即値を示すのかを指定するフィールド１２４で構成される。図３に示すように、フィールド１２４の値Ｘが「００」、「０１」または「１１」であるときにはフィールド１２３がレジスタ番号を示していることを示し、「１０」であるときには即値を示していることを示す。
このフォーマット１１１は、レジスタ間接アドレッシングのメモリアクセス演算に用いられる。
【００２９】
フォーマット１１２（Ｓｈｏｒｔ＿Ａ）は、演算内容を指定するフィールド１２０、レジスタ番号を指定する２つのフィールド１２１，１２２、レジスタ番号または６ビット長の即値を指定するフィールド１２３、およびフィールド１２３がレジスタ番号を示すのか即値を示すのかを指定するフィールド１２５で構成される。図３に示すように、フィールド１２５の値Ｘ’が「０」であるときにはフィールド１２３がレジスタ番号を示していることを示し、「１」であるときには即値を示していることを示す。
このフォーマット１１２は、算術演算、論理演算、シフト演算およびビット演算に用いられる。
【００３０】
フォーマット１１３（Ｓｈｏｒｔ＿Ｂ１）は、演算内容を指定するフィールド１２０およびレジスタ番号を指定するフィールド１２６で構成される。このフォーマット１１３は、レジスタ指定によるジャンプ命令および分岐命令に用いられる。
フォーマット１１４（Ｓｈｏｒｔ＿Ｂ２）は、演算内容を指定するフィールド１２０および１８ビット長のディスプレイスメントのフィールド１２７で構成される。このフォーマット１１４は、ジャンプ命令および分岐命令に用いられる。
【００３１】
フォーマット１１５（Ｓｈｏｒｔ＿Ｂ３）は、演算内容を指定するフィールド１２０、レジスタ番号を指定するフィールド１２１、レジスタ番号または１２ビット長の即値を指定するフィールド１２８、フィールド１２８がレジスタ番号を示すのか即値を示すのかを指定するフィールド１２９、およびゼロ判定にもとづいてフィールド１２１にもとづく条件ジャンプまたは条件分岐を行うか否か指定するフィールド１３０で構成される。
このフォーマット１１５は、条件ジャンプ命令および条件分岐命令に使用される。
【００３２】
フォーマット１１６（Ｓｈｏｒｔ＿Ｄ１）は、演算内容を指定するフィールド１２０、レジスタ番号を指定するフィールド１２１、レジスタ番号または１２ビット長の即値を指定するフィールド１２８、フィールド１２８がレジスタ番号を示すのか即値を示すのかを指定するフィールド１２９で構成される。
このフォーマット１１６は、条件ジャンプ命令、条件分岐命令およびリピート命令に使用される。
フォーマット１１７（Ｓｈｏｒｔ＿Ｄ２）は、演算内容を指定するフィールド１２０、レジスタ番号または１２ビット長の即値を指定するフィールド１２８、フィールド１２８がレジスタ番号を示すのか即値を示すのかを指定するフィールド１２９、遅延命令（ディレイド命令）に関するフィールド１３１で構成される。
このフォーマット１１７は、ディレイドジャンプ命令、ディレイド分岐命令およびリピート命令に使用される。
【００３３】
フォーマット１１８（Ｌｏｎｇ）は、演算内容を指定するフィールド１２０、レジスタ番号を指定する２つのフィールド１２１，１２２、３２ビット長の即値を指定するフィールド１３２で構成される。
このフォーマット１１８は、複雑な算術演算、大きな即値を用いる算術演算、大きなディスプレイスメント付きレジスタ間接アドレッシングのメモリアクセス演算、大きな変位の分岐演算および絶対番地へのジャンプ命令などに使用される。
【００３４】
図４はマイクロプロセッサのレジスタ構成を示す説明図である。
このマイクロプロセッサは、図４（ａ）に示すような６４本の３２ビット長の汎用レジスタ５、図４（ｂ）に示すような１２本の制御レジスタ１５０、および図４（ｃ）に示すような２本のアキュムレータ１８を持つ。Ｒ０の汎用レジスタ１４０の内容は常に０であり、そこへの書き込みは無視される。Ｒ６２の汎用レジスタは、サブルーチンからの戻り先アドレスが設定されるリンクレジスタである。Ｒ６３の汎用レジスタは、スタックポインタであり、ＰＳＷ１０のＳＭフィールドの値に応じてユーザスタックポインタ（ＳＰＵ）または割り込みスタックポインタ（ＳＰＩ）として動作する。制御レジスタ１５０には、プログラムカウンタ１５１、ＰＳＷ１０、および各種の専用レジスタが含まれる。
図３に示すフォーマット１１２による演算では、６４本の汎用レジスタ５のそれぞれを上位１６ビットと下位１６ビットとに分けてアクセスできる。また、２本のアキュムレータ１８を、上位３２ビットと下位３２ビットとに分けて別々にアクセスできる。
【００３５】
図５はＰＳＷ１０の詳細内容を示す説明図である。
ＰＳＷ１０の上位１６ビットには、スタックポインタを切り替えるためのＳＭフィールド１７１、セルフデバッグトラップ（ＳＤＢＴ）の検出を示すＥＡフィールド１７２、ＳＤＢＴの許可を指定するＤＢフィールド１７３、割り込み許可を指定するＩＥフィールド１７４、リピート動作の許可を指定するＲＰフィールド１７５、モジュロアドレッシングの許可を指定するＭＤフィールド１７６がある。下位１６ビットはフラグフィールド１８０である。フラグフィールド１８０には８個のフラグがあり、その中のＦ０フラグ１８１およびＦ１フラグ１８２は演算の有効／無効を指定する。各フラグの値は比較演算や算術演算の結果に応じて変化する。また、フラグ初期化演算で初期化したり、フラグ値書き込み演算で任意の値をフラグフィールド１８０に書き込むことによって変化する。フラグフィールド１８０の内容は、フラグ値読み出し演算によって読み出される。
【００３６】
各フラグは、以下のような意味を有する。
ＳＭ＝０    ：スタックモード０→ＳＰＩを使用
ＳＭ＝１    ：スタックモード１→ＳＰＵを使用
ＥＡ＝０    ：ＳＤＢＴを未検出
ＥＡ＝１    ：ＳＤＢＴを検出
ＤＢ＝０    ：ＳＤＢＴを非許可
ＤＢ＝１    ：ＳＤＢＴを許可
ＩＥ＝０    ：割り込み非許可
ＩＥ＝１    ：割り込み許可
ＲＰ＝０    ：リピートブロック無効
ＲＰ＝１    ：リピートブロック有効
ＭＤ＝０    ：モジュロアドレッシング無効
ＭＤ＝１    ：モジュロアドレッシング有効
Ｆ０        ：汎用フラグ（実行コントロールフラグ）
Ｆ１        ：汎用フラグ（実行コントロールフラグ）
Ｆ２        ：汎用フラグ
Ｆ３        ：汎用フラグ
Ｆ４（Ｓ）  ：飽和演算フラグ
Ｆ５（Ｖ）  ：オーバーフローフラグ
Ｆ６（ＶＡ）：累積オーバーフローフラグ
Ｆ７（Ｃ）  ：キャリー／ボローフラグ
【００３７】
以下、このマイクロプロセッサの命令一覧を示す。
Ａ．マイクロプロセッサ機能に関する命令
Ａ−１．ロード／ストア命令
ＬＤＢ        ：Load one byte to a register with sign extension
［１バイトロード（符号拡張あり）］
ＬＤＢＵ      ：Load one byte to a register with zero extension
［１バイトロード（ゼロ拡張あり）］
ＬＤＨ        ：Load one half-word to a register with sign extension
［１ハーフワードロード（符号拡張あり）］
ＬＤＨＨ      ：Load one half-word to a register high
［１ハーフワードロード（レジスタ上位へ）］
ＬＤＨＵ      ：Load one half-word to a register with zero extension
［１ハーフワードロード（ゼロ拡張あり）］
ＬＤＷ        ：Load one word to a register
［１ワードロード］
ＬＤ２Ｗ      ：Load two words to registers
［２ワードロード］
ＬＤ４ＢＨ    ：Load four bytes to four half-words in two registers
with sign extension
［４バイトロード（２レジスタへ，符号拡張あり）］
ＬＤ４ＢＨＵ  ：Load four bytes to four half-words in two registers
with zero extension
［４バイトロード（２レジスタへ，ゼロ拡張あり）］
ＬＤ２Ｈ      ：Load two half-words to two words in two registers
with sign extension
［２ハーフワードロード（２レジスタへ，符号拡張あり）］
ＳＴＢ        ：Store one byte from a register
［１バイトストア］
ＳＴＨ        ：Store one half-word from a register
［１ハーフワードストア］
ＳＴＨＨ      ：Store one half-word from a register high
［１ハーフワードストア（レジスタ上位から）］
ＳＴＷ        ：Store one word from a register
［１ワードストア］
ＳＴ２Ｗ      ：Store two words from registers
［２ワードストア］
ＳＴ４ＨＢ    ：Store four bytes from four half-words
from two registrers
［４バイトストア（２レジスタの４ハーフワードから）］
ＳＴ２Ｈ      ：Store two half-words from two registrers
［２ハーフワードストア（２レジスタから）］
ＭＯＤＤＥＣ  ：Decrement a register value by a 5-bits immediate value
［即値５ビットのデクリメント］
ＭＯＤＩＮＣ  ：Increment a register value by a 5-bits immediate value
［即値５ビットのインクリメント］
【００３８】
Ａ−２．転送命令
ＭＶＦＳＹＳ  ：Move a control register to a general purpose register
［制御レジスタから汎用レジスタへ］
ＭＶＴＳＹＳ  ：Move a general purpose register to a control register
［汎用レジスタから制御レジスタへ］
ＭＶＦＡＣＣ  ：Move a word from an accumulator
［アキュムレータからの１ワード転送］
ＭＶＴＡＣＣ  ：Move two general purpose registers to an accumulator
［２汎用レジスタ内容のアキュムレータへの転送］
【００３９】
Ａ−３．比較命令
ＣＭＰｃｃ    ：Compare ［比較］
ｃｃ＝ＥＱ（等しい），ＮＥ（不等），ＧＴ（より大），
ＧＥ（以上），ＬＴ（未満），ＬＥ（以下），
ＰＳ（ともに正），ＮＧ（ともに負）
ＣＭＰＵｃｃ  ：Compare unsigned［比較（符号なし）］
ｃｃ＝ＧＴ，ＧＥ，ＬＴ，ＬＥ
【００４０】
Ａ−４．最大値／最小値命令
reserved［予約済］
【００４１】
Ａ−５．算術演算命令
ＡＢＳ        ：Absolute［絶対値をとる］
ＡＤＤ        ：Add ［加算］
ＡＤＤＣ      ：Add with carry［加算（キャリー付き）］
ＡＤＤＨｐｐｐ：Add half-word ［ハーフワード加算］
ｐｐｐ＝ＬＬＬ（レジスタ下位，レジスタ下位，レジスタ下
位），ＬＬＨ（レジスタ下位，レジスタ下位，レジ
スタ上位），ＬＨＬ，ＬＨＨ，ＨＬＬ，ＨＬＨ，Ｈ
ＨＬ，ＨＨＨ
ＡＤＤＳ      ：Add register Rb with the sign of the third operand
［レジスタＲｂに符号を付ける］
ＡＤＤＳ２Ｈ  ：Add sign to two half-words
［２ハーフワードに符号を付ける］
ＡＤＤ２Ｈ    ：Add two pairs of half-words
［２ハーフワード同士の加算］
ＡＶＧ        ：Average with rounding towards positive infinity
［平均をとる］
ＡＶＧ２Ｈ    ：Average two pairs of half-words rounding
towards positive infinity
［２ハーフワードそれぞれの平均をとる］
ＪＯＩＮｐｐ  ：Join two half-words ［２ハーフワードの結合］
ｐｐ＝ＬＬ，ＬＨ，ＨＬ，ＨＨ
ＳＵＢ        ：Subtract［減算］
ＳＵＢＢ      ：Subtract with borrow［ボロー付き減算］
ＳＵＢＨｐｐｐ：Subtract half-word［ハーフワードの減算］
ｐｐｐ＝ＬＬＬ，ＬＬＨ，ＬＨＬ，ＬＨＨ，ＨＬＬ，
ＨＬＨ，ＨＨＬ，ＨＨＨ
ＳＵＢ２Ｈ    ：Subtract two pairs of half-words
［２つのハーフワードの減算］
【００４２】
Ａ−６．論理演算命令
ＡＮＤ        ：logical AND ［論理積］
ＯＲ          ：logical OR  ［論理和］
ＮＯＴ        ：logical NOT ［反転］
ＸＯＲ        ：logical exclusive OR［排他的論理和］
ＡＮＤＦＧ    ：logical AND flags ［フラグの論理積］
ＯＲＦＧ      ：logical OR flags［フラグの論理和］
ＮＯＴＦＧ    ：logical NOT a flag［フラグの反転］
ＸＯＲＦＧ    ：logical exclusive OR flags［フラグの排他的論理和］
【００４３】
Ａ−７．シフト演算命令
ＳＲＡ        ：Shift right arithmetic［算術右シフト］
ＳＲＡ２Ｈ    ：Shift right arithmetic two half-words
［２つのハーフワードの算術右シフト］
ＳＲＣ        ：Shift right concatenated registers
［レジスタ連鎖右シフト］
ＳＲＬ        ：Shift right logical ［論理右シフト］
ＳＲＬ２Ｈ    ：Shift right logical two half-words
［２つのハーフワードの論理右シフト］
ＲＯＴ        ：Rotate right［右回転］
ＲＯＴ２Ｈ    ：Rotate right two half-words
［２つのハーフワードの右回転］
【００４４】
Ａ−８．ビット操作命令
ＢＣＬＲ      ：Clear a bit ［ビットクリア］
ＢＮＯＴ      ：Invert a bit［ビット反転］
ＢＳＥＴ      ：Set a bit ［ビットセット］
ＢＴＳＴ      ：Test a bit［ビットテスト］
【００４５】
Ａ−９．分岐命令
ＢＲＡ        ：Branch［分岐］
ＢＲＡＴＺＲ  ：Branch if zero［ゼロなら分岐］
ＢＲＡＴＮＺ  ：Branch if not zero［ゼロでないなら分岐］
ＢＳＲ        ：Branch to subroutine［サブルーチンへ分岐］
ＢＳＲＴＺＲ  ：Branch to subroutine if zero
［ゼロならサブルーチンへ分岐］
ＢＳＲＴＮＺ  ：Branch to subroutine if not zero
［ゼロでないならサブルーチンへ分岐］
ＪＭＰ        ：Jump［無条件ジャンプ］
ＪＭＰＴＺＲ  ：Jump if zero［ゼロならジャンプ］
ＪＭＰＴＮＺ  ：Jump if not zero［ゼロでないならジャンプ］
ＪＳＲ        ：Jump to subroutine［サブルーチンへジャンプ］
ＪＳＲＴＺＲ  ：Jump to subroutine if zero
［ゼロならサブルーチンへジャンプ］
ＪＳＲＴＮＺ  ：Jump to subroutine if not zero
［ゼロでないならサブルーチンへジャンプ］
ＮＯＰ        ：No Operation［無操作］
［ディレイド分岐，ジャンプ命令］
ＤＢＲＡ      ：Delayed branch［ディレイド分岐］
ＤＢＲＡＩ    ：Delayed branch immediate［ディレイド分岐（即値）］
ＤＢＳＲ      ：Delayed branch to subroutine
［ディレイドサブルーチン分岐］
ＤＢＳＲＩ    ：Delayed branch immediate to subroutine
［ディレイドサブルーチン分岐（即値）］
ＤＪＭＰ      ：Delayed jump［ディレイドジャンプ］
ＤＪＭＰＩ    ：Delayed jump immediate［ディレイドジャンプ（即値）］
ＤＪＳＲ      ：Delayed jump to subroutine
［ディレイドサブルーチンジャンプ］
ＤＪＳＲＩ    ：Delayed jump immediate to subroutine
［ディレイドサブルーチンジャンプ（即値）］
【００４６】
Ａ−１０．ＯＳ関連命令
ＴＲＡＰ      ：Trap［トラップ］
ＲＥＩＴ      ：Return from exception, interrupts and traps
［例外、割り込み、トラップからのリターン］
【００４７】
Ｂ．ＤＳＰ機能に関する命令
Ｂ−１．算術操作命令
ＭＵＬ        ：Multiply［乗算］
ＭＵＬＸ      ：Multiply with extended precision［倍精度乗算］
ＭＵＬＸＳ    ：Multiply and shift to the right by one
with extended precision
［倍精度乗算および１ビット右シフト］
ＭＵＬＸ２Ｈ  ：Multiply two pairs of half-words
with extended precision
［２ハーフワードずつの倍精度乗算］
ＭＵＬＨＸｐｐ：Multiply two half-words with extended precision
ｐｐ＝ＬＬ，ＬＨ，ＨＬ，ＨＨ
［２ハーフワードの倍精度乗算］
ＭＵＬ２Ｈ    ：Multiply two pairs of half-words
［２ハーフワードずつの乗算］
ＭＡＣａ      ：Multiply and add［積和演算］
ａ（アキュムレータ指定）＝０，１
ＭＡＣＳａ    ：Multiply, shift to the right by one and add
ａ＝０，１
［１ビット右シフト付き積和演算］
ＭＳＵＢａ    ：Multiply and subtract ［積和（減算）演算］
ａ＝０，１
ＭＳＵＢＳａ  ：Multiply, shift to the right by one and subtract
ａ＝０，１
［１ビット右シフト付き積和（減算）演算］
【００４８】
Ｂ−２．リピート命令
ＲＥＰＥＡＴ  ：Repeat a block of instructions
［命令ブロックの繰り返し］
ＲＥＰＥＡＴＩ：Repeat a block of instructions immediate
［命令ブロックの繰り返し（即値指定）］
【００４９】
図６はマイクロプロセッサの並列２命令実行時のパイプライン動作を示す説明図である。この動作は、命令のフォーマットフィールドの値ＦＭ＝００のときに実行される。パイプライン１９０，１９５は、命令フェッチステージ１９１、デコード／アドレス演算ステージ１９２、実行／メモリアクセスステージ１９３およびライトバックステージ１９４で構成される。並列２命令実行時には、メモリユニット３での実行と整数演算ユニット４での実行とが並列に行われる。
図７はマイクロプロセッサのシーケンシャル命令実行時のパイプライン動作を示す説明図である。この動作は、命令のフォーマットフィールドの値ＦＭ＝０１，１０，１１のときに実行される。パイプライン２００は、命令フェッチステージ、デコード／アドレス演算ステージ、実行／メモリアクセスステージ、およびライトバックステージで構成されるが、この場合には、メモリユニット３での実行と整数演算ユニット４での実行とのうちのいずれかが、一時に実行される。
なお、図６および図７に示されたパイプライン動作では、２番目のステージであるデコード／アドレス演算ステージ１９２において分岐先アドレスが得られる。
【００５０】
図８はこの発明の実施の形態１によるマイクロプロセッサの構成を示すブロック図である。図において、３６６は分岐命令のデコード値を保持するためのレジスタ１３Ａと分岐命令が実行されるべき時期に対応したＰＣ値を保持するレジスタ１３Ｂとを含む遅延分岐命令レジスタ（遅延分岐命令保持手段）である。分岐命令が実行されるべき時期に対応したＰＣ値とは、マイクロプロセッサのＰＣの値がその値になるとディレイド分岐命令を実行することになる値である。なお、既に定義したように、単に「分岐命令」と表現した場合には、厳密な意味での分岐命令とジャンプ命令との双方の概念を含む。
【００５１】
図９はディレイド分岐命令の基本的なフォーマット３２０を示す説明図である。基本的には、ディレイド分岐命令のフォーマット３２０は、オペコード３２１、遅延量を指定するフィールド３２２および分岐先アドレスを指定するためのオフセットまたはアドレスが指定されるフィールド３２３を持つ。ディレイド分岐命令は、例えば、図３に示すフォーマット１１６（Ｓｈｏｒｔ＿Ｄ１）、フォーマット１１７（Ｓｈｏｒｔ＿Ｄ２）またはフォーマット１１８（Ｌｏｎｇ）で実現される。フォーマット１１６（Ｓｈｏｒｔ＿Ｄ１）は、遅延量としてレジスタ設定値が用いられる場合に使用される。フォーマット１１７（Ｓｈｏｒｔ＿Ｄ２）は、遅延量として即値が用いられる場合に使用される。フォーマット１１８（Ｌｏｎｇ）は、分岐先アドレスを３２ビット即値で指定する場合に使用される。各フォーマットにおいて、オペコードはフィールド１２０で指定される。また、フィールド１２９は、フィールド１２８がレジスタ番号を示すのか即値を示すのかを指定するために使用される。フィールド１２１は、ＤＢＲＡ，ＤＢＳＲ，ＤＪＭＰ，ＤＪＳＲの各命令において遅延量がレジスタで指定されるときのレジスタ指定領域として使用され、フィールド１３１は、遅延量を指定する即値の領域として使用される。
【００５２】
図１０は幾つかのディレイド分岐命令の例を示す説明図である。命令３２４は、遅延量を即値で指定するとともに分岐のオフセットを即値で指定する命令である。命令３２５は、遅延量をレジスタで指定するとともに分岐のオフセットを即値で指定する命令である。命令３２６は、遅延量を即値で指定するとともに分岐のオフセットをレジスタで指定する命令である。命令３２７は、遅延量をレジスタで指定するとともに分岐のオフセットをレジスタで指定する命令である。
【００５３】
図１１はディレイド分岐命令３３０、ディレイドジャンプ命令３３２およびディレイドサブルーチンコール命令３３１，３３３が、同一フォーマットでどのように実現されるのかを示すための説明図である。
【００５４】
次に動作について説明する。
命令がディレイド分岐命令であったことを命令デコードユニット２のデコーダ８が認識すると、命令デコードユニット２は、そのことを示す制御信号１１をメモリユニット３に出力する。メモリユニット３において、ＰＣ制御部１３は、制御信号１１によって入力した命令デコード結果をレジスタ１３Ａに格納する。従って、レジスタ１３Ａには、ディレイド分岐命令による分岐先を示す情報等が格納される。また、ＰＣ制御部１３は、分岐命令が実行されるべき時期に応じたＰＣ値をレジスタ１３Ｂに格納する。
【００５５】
ＰＣ制御部１３は、マイクロプロセッサにおける実際のＰＣ値がレジスタ１３Ｂに格納されている値と一致したことを検知したら、レジスタ１３Ａに格納されている分岐先情報にもとづいて分岐命令を実行する。すなわち、レジスタ１３Ａに格納されている分岐先情報が示す値をＰＣに設定する。この結果、レジスタ１３Ｂに格納されている値に応じた数の命令がフェッチされたら、次のサイクルで、分岐先にある命令がフェッチされる。
【００５６】
図１２はディレイド分岐命令を含むプログラムの一例を示す説明図である。図１２における２行目のＤＢＲＡ命令は、遅延量「３」を指定するとともに分岐先としてＴＧＴ１を指定する命令である。命令デコードユニット２において、ＤＢＲＡ命令がデコードされると、ＰＣ制御部１３は、分岐先を示すＴＧＴ１に応じた情報をレジスタ１３Ａに格納する。また、遅延量「３」に応じたＰＣ値、すなわち、そのときのＰＣの値に３×８を加算した値をレジスタ１３Ｂに格納する。ＤＢＲＡ命令の下に記述されている３命令は無条件に処理されるが、３番目の遅延スロットにある命令をフェッチするとき、マイクロプロセッサのＰＣの値はレジスタ１３Ｂに格納されているＰＣ値に一致する。そこで、ＰＣ制御部１３は、ＤＢＲＡ命令による分岐処理を実行する。すなわち、レジスタ１３Ｂに格納されているＰＣ値をマイクロプロセッサにおけるＰＣに設定する処理を行う。
【００５７】
図１３はディレイド分岐命令を含むプログラムの他の例を示す説明図である。ここでは、サブルーチンコール命令であるＤＪＳＲ命令が用いられている。また、遅延量は、汎用レジスタ５におけるｒ４レジスタに設定されている値が用いられる。この場合も、ＰＣ制御部１３は、分岐先を示すＴＧＴ１に応じた情報をレジスタ１３Ａに格納する。また、ＰＣ制御部１３は、ｒ４レジスタに設定されている値に応じたＰＣ値をレジスタ１３Ｂに格納する。ｒ４レジスタに設定されている値が「４」であったとすると、ＤＪＳＲ命令の下に記述されている４命令は無条件に処理されるが、４番目の遅延スロットの命令をフェッチするときに、マイクロプロセッサのＰＣの値はレジスタ１３Ｂに格納されているＰＣ値に一致する。そこで、ＰＣ制御部１３は、ＤＪＳＲ命令によるサブルーチンジャンプを実行する。具体的には、ＰＣに、レジスタ１３Ｂに格納されているＰＣ値を設定する。
【００５８】
以上のように、この実施の形態１によれば、マイクロプロセッサは、ディレイド分岐命令で指定された遅延量に応じたＰＣ値を保持するように構成されているので、ディレイド分岐命令のデコード時点から実行時点までの間に割り込み等のＰＣ値を変化させる事象が生じたとしても、確実に分岐命令が実行される。例えば、図１２に示された例において、遅延スロットの命令の実行時に割り込みが生ずるとマイクロプロセッサのＰＣの値は変化するとともに、割り込み処理において幾つかのサイクルが消費される。従来のマイクロプロセッサにおける処理のようにディレイド分岐命令の実行時期をカウンタ値として保持していると、割り込み処理において費やされたサイクル数分だけ実行時期がずれてしまう。しかし、この実施の形態によれば、そのようなことはない。
また、レジスタ１３Ａ，１３Ｂをアクセスする命令を備えれば、遅延スロットの命令実行時に起きた割り込みにともないコンテクストスイッチが必要になった場合、レジスタ１３Ａに保持された分岐先情報とレジスタ１３Ｂに保持された分岐発生ＰＣ値とをデータＲＡＭ７に退避し、異なるコンテクストを実行後、再び割り込まれたコンテクストに復帰したときにこれらの値を復帰して遅延分岐を実行することも可能になる。
【００５９】
実施の形態２．
図１４はこの発明の実施の形態２によるマイクロプロセッサにおける命令デコード部分および命令実行部分を示すブロック図である。図において、３６１は算術論理演算を実行するＡＬＵ（演算ユニット）、３６３は乗算を実行する乗算器（演算ユニット）、３６５はＰＣ値を計算するＰＣ制御部、３６７はアドレス計算を行うメモリ制御部（演算ユニット）、３６９はシフト演算を実行するシフタ（演算ユニット）、３７１は１サイクルで２命令（２演算指令を含む命令）を転送できるバス、３７２は命令をデコードして命令実行部に制御信号１１，１２を与える命令デコーダ、３７３は汎用レジスタである。
【００６０】
ＡＬＵ３６１において、３６２はディレイド算術論理演算命令のデコード結果を格納するレジスタ３６２Ａと遅延量に応じた値を格納するレジスタ３６２Ｂとを有する遅延命令レジスタ（遅延命令保持手段）である。乗算器３６３において、３６４はディレイド乗算命令のデコード結果を格納するレジスタ３６４Ａと遅延量に応じた値を格納するレジスタ３６４Ｂとを有する遅延命令レジスタ（遅延命令保持手段）である。ＰＣ制御部３６５において、３６６はディレイド分岐命令のデコード結果を格納するレジスタ３６６Ａと遅延量に応じた値を格納するレジスタ３６６Ｂとを有する遅延命令レジスタ（遅延分岐命令保持手段）である。メモリ制御部３６７において、３６８はディレイドメモリアクセス命令のデコード結果を格納するレジスタ３６８Ａと遅延量に応じた値を格納するレジスタ３６８Ｂとを有する遅延命令レジスタ（遅延命令保持手段）である。シフタ３６９において、３７０はディレイドシフト命令のデコード結果を格納するレジスタ３７０Ａと遅延量に応じた値を格納するレジスタ３７０Ｂとを有する遅延命令レジスタ（遅延命令保持手段）である。
【００６１】
次に動作について説明する。
図１５は各行の２演算を同時に実行する命令配置の一例を示す説明図である。この配置は、図２２に示されたプログラムをスケジューリングした結果である。図２１に示された一般的な２演算を同時に扱うマイクロプロセッサでは、図２２に示されたプログラムを実行するために、図２３に示されたように５サイクルを要していた。ＳＲＡ命令とＳＵＢ命令とはｒ３レジスタ依存の関係にあって同時に実行できないからである。ところが、この実施の形態によるマイクロプロセッサはディレイド分岐命令を扱えるので、図１５に示されたように、図２３における２行目のＮＯＰを遅延量「２」のＤＪＭＰ命令で置き換えることができる。
【００６２】
図１５に示されたような命令配置による各命令を順次入力すると、第１サイクルでは、マイクロプロセッサにおいて、ＡＬＵ３６１とシフタ３６９とが、１行目のＡＤＤ演算とＳＲＡ演算とをそれぞれ実行する。第２サイクルでは、シフタ３６９とＰＣ制御部３６５とがＳＲＡ演算とＤＪＭＰ演算とを扱う。シフタ３６９はＳＲＡ演算を直ちに実行するが、ＰＣ制御部３６５は、実施の形態１の場合と同様に、ＤＪＭＰ演算のデコード結果である分岐先ＴＧＴに関する情報をレジスタ３６６Ａに格納し、遅延量「２」に応じたＰＣ値をレジスタ３６６Ｂに格納する。第３サイクルでは、ＡＬＵ３６１と乗算器３６３とが、３行目のＳＵＢ演算とＭＵＬ演算とをそれぞれ実行する。第４サイクルでは、ＡＬＵ３６１と乗算器３６３とが、４行目のＡＤＤ演算とＭＵＬ演算とをそれぞれ実行する。４行目の命令がフェッチされるとき、マイクロプロセッサのＰＣ（図１４において図示せず）の値はレジスタ３６６Ｂに格納されているＰＣ値に一致している。そこで、ＰＣ制御部３６５は、ＤＪＭＰ演算で指定されたジャンプ命令を実行する。具体的には、ＰＣに、レジスタ３６６Ｂに格納されているＰＣ値を設定する。
【００６３】
このように、遅延量を任意に指定できる分岐命令処理する機構を備えていれば、命令のスケジューリングをより有効に実行することができる。すなわち、プログラマまたはコンパイラは、プログラムサイズをより小さくするような命令のスケジューリングを行える。その結果、ある処理を実行するのに要する時間は短縮される。しかも、ＰＣ制御部３６５は、分岐命令実行時期をＰＣ値として保持するので、ディレイド分岐命令は矛盾なく実行される。
【００６４】
この実施の形態によるマイクロプロセッサは、ディレイド分岐命令以外のディレイド演算命令を扱うこともできる。図１６は、プログラムの一例を示す説明図である。図２１に示された一般的な２演算を同時に扱うマイクロプロセッサでは、図１６における１行目のＡＤＤ演算と２行目のＡＤＤ演算を同時実行することはできない。１つのＡＬＵ３４１しか持っていないからである。従って、図１６における１行目の命令と２行目の命令とを同時実行するように命令のスケジューリングを行うことはできなかった。
【００６５】
ところが、この実施の形態によるマイクロプロセッサは、図１６に示すプログラムの各命令を図１７に示すようにスケジューリングした各命令を実行できる。図１７に示されたような命令配置による各命令を順次入力すると、このマイクロプロセッサにおいて、第１サイクルでは、ＡＬＵ３６１は、ＡＤＤ演算を実行するとともにＤＡＤＤ（ディレイドＡＤＤ）演算も扱う。すなわち、ＤＡＤＤのデコード結果をレジスタ３６２Ａに格納するとともに、遅延値「１」に応じた値をレジスタ３６２Ｂに格納する。第２サイクルでは、シフタ３６９と乗算器３６３とは、ＳＲＡ演算とＭＵＬ演算とをそれぞれ実行する。２行目の命令がフェッチされるときに、ＰＣの値はレジスタ３６２Ｂ内の遅延値「１」に応じた値に一致する。そこで、ＡＬＵ３６１は、レジスタ３６２ＡからＤＡＤＤで指定された演算指令内容を取り出し、その演算を実行する。
【００６６】
なお、レジスタ３６２Ｂに格納される遅延値に応じた値は、動作クロックに応じて値が変化するカウンタ値であってもよいが、ＰＣ値であってもよい。遅延値に応じた値としてＰＣ値を保持した場合には、デコード時と実行時との間で割り込み等が生じてもそれに対する対処が容易になる。
【００６７】
ここでは、ディレイド演算命令を扱う演算ユニットとしてＡＬＵ３６１を例にとったが、乗算器３６３、メモリ制御部３６７およびシフタ３６９も、ＡＬＵ３６１の処理と同様の処理によってディレイド演算命令を扱うことができる。また、遅延値「１」の場合を例に説明したが、もちろん、任意の値を指定できる。任意の値を指定可能なので、命令のスケジューリングの自由度をより向上させることができる。
なお、固定的な値を指定するディレイド演算命令しか処理しないマイクロプロセッサであっても、任意の遅延値を指定できるディレイド演算命令を処理するマイクロプロセッサに比べると効果は低減するものの、命令のスケジューリングの自由度を向上させる効果が期待できる。
【００６８】
以上のように、ディレイド演算命令を扱う機構を有する場合には、プログラムの実行に要するサイクル数をさらに少なくでき、その結果、プログラム実行時間を短縮できる。例えば、図１６に示されたプログラムがあった場合に、図２１に示された一般的な２演算を同時に扱うマイクロプロセッサでは、２つのＡＤＤ命令を同時実行できないので、命令のスケジューリングを行ってもプログラム実行に３サイクルを要する。このマイクロプロセッサは、図１７に示された例からわかるように、２サイクルでプログラムを実行できる。また、ループ内でディレイド命令を記述できるような場合に、このマイクロプロセッサによれば、さらに処理を高速化できる。
【００６９】
ディレイド命令は、２演算同時実行できるマイクロプロセッサにおいて、特に有効である。図１５および図１７に示された例からわかるように、演算を並列実行する場合のＮＯＰ挿入箇所を削減できるからである。
なお、ここでは、２演算同時実行のマイクロプロセッサについて説明したが、リソースであるＡＬＵ３６１等の演算ユニットを複数個備え、同時実行演算数をさらに多くしたマイクロプロセッサに、この実施の形態によるディレイド演算命令処理機構を設けてもよい。そのようなマイクロプロセッサにおいても、実行サイクル数の削減および処理の高速化が期待できる。
【００７０】
図１８はこの実施の形態２によるマイクロプロセッサにおけるＰＳＷの一例を示す説明図である。このＰＳＷ３８０，３９０は図５に示されたものと同様のものであるが、この場合には、ＲＰフィールド３８１がＰＣ制御部３６５の遅延命令レジスタ３６６の動作を有効にするかどうか決めるビットとして用いられる。また、例えば、Ｅ４フィールド３８２、Ｅ３フィールド３８３、Ｅ２フィールド３８４およびＥ１フィールド３８５は、それぞれ、ＡＬＵ３６１の遅延命令レジスタ３６２、乗算器３６３の遅延命令レジスタ３６４、メモリ制御部３６７の遅延命令レジスタ３６８およびシフタ３６９の遅延命令レジスタ３７０の動作を有効にするかどうか決めるビットとして用いられる。各ビットが無効状態にセットされた場合には、対応する演算ユニットにおけるディレイド命令処理は禁止される。このようなＰＳＷ３８０，３９０を用意することによって、ディレイド命令処理の柔軟性を増すことができる。
【００７１】
実施の形態３．
図１９はこの発明の実施の形態３によるマイクロプロセッサにおける命令デコード部分および命令実行部分を示すブロック図である。図において、４６１は算術論理演算を実行するＡＬＵ（演算ユニット）、４６３は乗算を実行する乗算器（演算ユニット）、４６５はＰＣ値を計算するＰＣ制御部、４６７はアドレス計算を行うメモリ制御部（演算ユニット）、４６９はシフト演算を実行するシフタ（演算ユニット）、３７１は１サイクルで２命令を転送できるバス、３７２は命令をデコードして命令実行部に制御信号１１，１２を与える命令デコーダ、３７３は汎用レジスタである。
【００７２】
このマイクロプロセッサにおいて、ＡＬＵ４６１は、２つの遅延命令レジスタ３６２を有する。乗算器４６３は、２つの遅延命令レジスタ３６４を有する。ＰＣ制御部４６５は、２つの遅延命令レジスタ３６６を有する。メモリ制御部４６７は、２つの遅延命令レジスタ３６８を有する。そして、シフタ４６９は、２つの遅延命令レジスタ３７０を有する。
【００７３】
次に動作について説明する。
各演算ユニットおよびＰＣ制御部４６５において、命令のデコード結果と遅延量とからなる１セットはキュー管理される。例えば、ＡＬＵ４６１において、一方の遅延命令レジスタ３６２のレジスタ３６２Ａにディレイド算術演算命令のデコード結果が格納されレジスタ３６２Ｂにそれに対応する遅延量に応じた値が設定されている場合に、さらに、命令デコーダ３７２から新たなディレイド算術演算命令のデコード結果が送られてきたとする。すると、新たなデコード結果および遅延量に応じた値は、他方の遅延命令レジスタ３６２に格納される。そして、一方のレジスタ３６２Ｂに格納されている遅延量に応じた値とマイクロプロセッサのＰＣの値とが一致したときに、一方のレジスタ３６２Ａに格納されているデコード結果に応じた演算が実行される。その後、他方のレジスタ３６２Ｂに格納されている遅延量に応じた値とマイクロプロセッサのＰＣの値とが一致したときに、他方のレジスタ３６２Ａに格納されているデコード結果に応じた演算が実行される。
【００７４】
そのような構成によれば、あるディレイド命令の実行時期に到達していない時点でも、別の同種類のディレイド命令を扱うことができる。例えば、あるディレイドＡＤＤ命令の実行時期に到達していない時点でも、ＡＬＵ４６１は、新たなディレイドＡＤＤ命令を受け入れることができる。従って、命令のスケジューリングの自由度をさらに上げることができ、プログラムサイズの減少すなわち命令メモリの容量削減を図ることができる。また、より高速にプログラムを実行することができる。
なお、ここでは各演算ユニットにおいて２つの遅延命令レジスタが設けられている例を示したが、設置数をさらに多くしてもよい。
【００７５】
【発明の効果】
以上のように、請求項１記載の発明によれば、遅延命令を有するマイクロプロセッサを、ディレイド分岐命令で指定された遅延量に応じたプログラムカウンタ値を保持するように構成したので、ディレイド分岐命令のデコード時点から実行時点までの間に割り込み等のＰＣの値を変化させる事象が生じたとしても確実に分岐命令が実行される効果がある。
【００７６】
請求項２記載の発明によれば、遅延命令を有するマイクロプロセッサを、各演算ユニットがディレイド演算命令の固定のまたは可変の遅延量に応じた値を保持するように構成したので、命令スケジューリングの自由度を向上させることができる。
また、遅延命令を有するマイクロプロセッサを、各演算ユニットがディレイド演算命令で指定された遅延量に応じたＰＣ値を保持するように構成したので、プログラムの実行に要するサイクル数をより少なくできるとともに、ディレイド演算命令のデコード時点から実行時点までの間に割り込み等のＰＣの値を変化させる事象が生じたとしても確実に演算が実行される効果がある。
【００７７】
請求項３記載の発明によれば、遅延命令を有するマイクロプロセッサを、各演算ユニットに複数の遅延命令保持手段が設けられるように構成したので、命令のスケジューリングの自由度を上げることができる効果がある。
【００７８】
請求項４記載の発明によれば、遅延命令を有するマイクロプロセッサを、命令実行部が複数演算を同時に実行するように構成したので、命令のスケジューリングの自由度をさらに上げることができ、その結果、プログラムの実行に要するサイクル数をさらに少なくできる効果がある。
【図面の簡単な説明】
【図１】  この発明の実施の形態１によるマイクロプロセッサの構成を示すブロック図である。
【図２】  マイクロプロセッサの命令フォーマットを示す説明図である。
【図３】  演算フィールドの詳細な内容を示す説明図である。
【図４】  マイクロプロセッサのレジスタ構成を示す説明図である。
【図５】  ＰＳＷの詳細内容を示す説明図である。
【図６】  マイクロプロセッサの並列２命令実行時のパイプライン動作を示す説明図である。
【図７】  マイクロプロセッサのシーケンシャル命令実行時のパイプライン動作を示す説明図である。
【図８】  この発明の実施の形態１によるマイクロプロセッサの構成を示すブロック図である。
【図９】  ディレイド分岐命令の基本的なフォーマットを示す説明図である。
【図１０】  幾つかのディレイド分岐命令の例を示す説明図である。
【図１１】  ディレイド分岐命令、ディレイドジャンプ命令およびディレイドサブルーチンコール命令が、同一フォーマットでどのように実現されるのかを示すための説明図である。
【図１２】  ディレイド分岐命令を含むプログラムの一例を示す説明図である。
【図１３】  ディレイド分岐命令を含むプログラムの他の例を示す説明図である。
【図１４】  この発明の実施の形態２によるマイクロプロセッサにおける命令デコード部分および命令実行部分を示すブロック図である。
【図１５】  ２演算を同時に実行する命令配置の一例を示す説明図である。
【図１６】  プログラムの一例を示す説明図である。
【図１７】  図１６に示された各命令にもとづく２演算を同時に実行する命令配置を示す説明図である。
【図１８】  この発明の実施の形態２によるマイクロプロセッサにおけるＰＳＷの一例を示す説明図である。
【図１９】  この発明の実施の形態３によるマイクロプロセッサにおける命令デコード部分および命令実行部分を示すブロック図である。
【図２０】  従来のパイプライン制御方式によるマイクロプロセッサの処理シーケンスを示すシーケンス図である。
【図２１】  ２演算を同時に行うマイクロプロセッサにおける命令デコーダおよび命令実行部の部分の一般的な構成を示すブロック図である。
【図２２】  プログラムの一例を示す説明図である。
【図２３】  命令のスケジューリングの一例を示す説明図である。
【符号の説明】
２  命令デコードユニット（命令デコーダ）、３  メモリユニット（命令実行部）、４  整数演算ユニット（命令実行部）、１３，３６５，４６５  ＰＣ制御部、３６１，４６１  ＡＬＵ（演算ユニット）、３６２，３６４，３６８，３７０  遅延命令レジスタ（遅延命令保持手段）、３６３，４６３  乗算器（演算ユニット）、３６６  遅延分岐命令レジスタ（遅延分岐命令保持手段）、３６７，４６７  メモリ制御部（演算ユニット）、３６９，４６９  シフタ（演算ユニット）。
【図１】
0003745039.tif 000002
【図２】
0003745039.tif 000003
【図３】
0003745039.tif 000004
【図４】
0003745039.tif 000005
【図５】
0003745039.tif 000006
【図６】
0003745039.tif 000007
【図７】
0003745039.tif 000008
【図８】
0003745039.tif 000009
【図９】
0003745039.tif 000010
【図１０】
0003745039.tif 000011
【図１１】
0003745039.tif 000012
【図１２】
0003745039.tif 000013
【図１３】
0003745039.tif 000014
【図１４】
0003745039.tif 000015
【図１５】
0003745039.tif 000016
【図１６】
0003745039.tif 000017
【図１７】
0003745039.tif 000018
【図１８】
0003745039.tif 000019
【図１９】
0003745039.tif 000020
【図２０】
0003745039.tif 000021
【図２１】
0003745039.tif 000022
【図２２】
0003745039.tif 000023
【図２３】
0003745039.tif 000024