(57)【要約】【目的】 分岐と少なくとも１つの分岐でない処理単位とからなる命令を実行する場合に該命令の分岐先が命令ミスアライメントであっても命令不在によるパイプラインインタロックが発生せず、従って命令の実行時間が伸張せず処理性能が劣化しないプロセッサを提供することを目的とする。【構成】 命令読出し部６０は、読出しアドレスに基づいて命令の読出しを行う。命令解読部３０は、読み出された命令が分岐と少なくとも１つの分岐でない処理単位とからなる場合には、分岐でない処理単位のいずれよりも先行して分岐の処理単位の処理の指示を発行する。これにより、分岐先の命令ミスアライメントによるパイプラインインタロックが発生せず、従って命令の実行時間が伸張せず処理性能が劣化しないという効果がある。【選択図】　　　　図１
2004094973.tif 000002
【特許請求の範囲】
【請求項１】
　命令の先読みを行うプロセッサであって、
　先読みすべき命令のアドレスを保持するフェッチアドレス保持手段と、
　フェッチアドレス保持手段のアドレスを書き換えることを内容とする分岐の処
理単位と、その他の処理単位とを含む分岐命令の実行に関する制御処理に対して
、まず分岐の処理単位の実行を制御し、続いてその他の処理単位の実行を制御す
る制御手段と
　を備え、前記分岐の処理単位とその他の処理単位とは同じパイプラインステー
ジで実行されることを特徴とするプロセッサ。
【請求項２】
　前記制御処理は、サブルーチンコール命令の実行制御を含み、
　前記制御手段は、前記分岐の処理単位の制御において、サブルーチンコール命令のオペランドに基づいて得られる分岐先アドレスをフェッチアドレス保持手段に書き込み、その他の処理単位において、戻り先アドレスを退避すべき領域のアドレス計算および戻り先アドレスの退避を制御する
　ことを特徴とする請求項１記載のプロセッサ。
【請求項３】
　前記制御処理は、割り込み処理ルーチンへの移行制御を含み、
　前記制御手段は、前記分岐の処理単位の制御において、所定の割込み処理ルーチンの開始アドレスをフェッチアドレス保持手段に書き込み、その他の処理単位において戻り先アドレスを退避すべきの領域のアドレス計算および戻り先アドレスの退避を制御する
　ことを特徴とする請求項２記載のプロセッサ。
【請求項４】
　 前記制御処理は、サブルーチンからの復帰を指示するリターン命令と、割り込み処理ルーチンからの復帰を指示するリターン命令とを含み、
　前記制御手段は、前記分岐の処理単位の制御において戻り先アドレスをフェッチアドレス保持手段に書き込む
　ことを特徴とする請求項１ないし３記載の何れかのプロセッサ。
【請求項５】
　前記制御手段は、
　前記制御処理の動作を実現する複数のマイクロ命令を記憶する制御記憶部と、
　前記各処理単位に対応するマイクロ命令を制御記憶から順次読み出して、マイクロ命令が指示する制御信号をプロセッサ内部に発行するマイクロ命令発行部とを備え、
　前記マイクロ命令発行部は、
　サブルーチンコール命令に対しては、当該命令中に指定されたアドレスをフェッチアドレス保持手段に格納することを指示するマイクロ命令と、戻り先アドレスを退避すべき領域のアドレスの計算を指示するマイクロ命令と、戻り先アドレスを退避することを指示するマイクロ命令とをこの順序で発行し、
　割り込み処理ルーチンへの移行制御に対しては、所定の割り込み処理開始アドレスをフェッチアドレス保持手段に格納することを指示するマイクロ命令と、戻り先アドレスを退避すべき領域のアドレスの計算を指示するマイクロ命令と、戻り先アドレスを退避することを指示するマイクロ命令とをこの順序で発行する
　ことを特徴とする請求項３記載のプロセッサ。
【請求項６】
　 前記制御手段は、
　サブルーチンコール命令をプリデコードし、当該命令の分岐先アドレスの算出を行うアドレス計算部と、
　前記制御処理を実現する複数のマイクロ命令を記憶する制御記憶部と、
　前記各処理単位に対応するマイクロ命令を制御記憶から順次読み出して、マイクロ命令をプロセッサ内部に発行するマイクロ命令発行部とを備え、
　前記マイクロ命令発行部は、
　サブルーチンコール命令に対して、前記アドレス計算部で得られるアドレスを前記フェッチアドレス保持手段に格納すると共に、メモリに格納すべきデータを保持するストアバッファに戻り先アドレスを保持することを指示するマイクロ命令と、前記退避領域を指すスタックポインタの更新、およびオペランドアドレスを保持すべきオペランドアドレスバッファに更新されたスタックポインタの内容を格納することを指示するマイクロ命令と、ストアバッファの内容をオペランドアドレスバッファが指す退避領域に格納することを指示するマイクロ命令とをこの順序で発行し、
　割り込み処理ルーチンへの移行制御に対しては、所定の割込み処理の開始アドレスを前記フェッチアドレス保持手段に格納すると共にストアバッファに戻り先アドレスを保持することを指示するマイクロ命令と、スタックポインタの更新、及びオペランドアドレスバッファに更新されたスタックポインタの内容を格納することを指示するマイクロ命令と、ストアバッファの内容をオペランドアドレスバッファが指す退避領域に格納することを指示するマイクロ命令とをこの順序で発行する
　ことを特徴とする請求項３記載のプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
　本発明は情報処理装置のCPUとして用いられ、命令読み出しステージ、命令解読ステージ、命令実行ステージの少なくとも３段からなるパイプライン制御方式を採用したプロセッサに関する。
【背景技術】
【０００２】
　近年の電子技術の発展により、マイクロプロセッサ等の情報処理装置が普及し、あらゆる分野で用いられている。
　従来のプロセッサは、命令の種類が豊富なことを特徴とするCISCプロセッサ（Complex Instruction Set Computer）と、命令の種類を限定して高速さを特徴とするRISCプロセッサ（Reduced Instruction Set Computer）とに大別できる。例えば、TRONやMC68040などは前者であり、SPARCやMIPSなどは後者である。
【０００３】
　どちらのタイプのプロセッサにおいても、パイプライン構造をとることにより命令の見かけ上の実行時間の短縮が図られている。パイプラインとは、命令の処理ステージを少なくとも読出し、解読、実行のステージに分け、複数の命令について異なるステージを並列に実行する処理方法である。CISCプロセッサは、RISCプロセッサと異なり可変長命令形式をとるものが多い。可変長命令形式は、命令の種類によって命令の語長が異なり、一般的に固定長命令形式に比べてプログラムの大きさを小さくすることができる。
【０００４】
　その反面、命令の配置が、命令読出しにおけるワード（１６ビット）境界あるいはダブルワード（３２ビット）境界に対して固定的ではなくなるため、多くの命令が境界をまたいで配置されることになる。そのため、命令の先読みを行っていても解読すべき命令が末尾まで読出されていない場合があり、その場合パイプラインによる並列処理を一時的に停止する必要が生じる。
【０００５】
　このパイプラインの一時停止をパイプラインインタロック、またその原因になる命令が境界をまたいで配置される状態を命令ミスアライメントと呼ぶ。
　また、従来のプロセッサとしては、例えば、特開平5-197546号（発明の名称：「マイクロコンピュータ及び除算回路」）公報に示されているものがある。この従来のプロセッサは、公報２７ページ８８段落に記載されるように、JSR（Jump SubRoutine：サブルーチンコール／プロシージャコール）命令ではプログラムカウンタPCの内容を退避した後に分岐の処理を行っている。
【０００６】
　この従来のプロセッサは、命令読出しステージ、解読・アドレス計算ステージ、演算実行ステージの３段からなるパイプライン構造をとり、命令読出しステージで読出され命令を格納する４バイトの命令バッファと、命令の動作を細分化した処理単位を実現するマイクロ命令を記憶する制御記憶とを有する。
　命令読出しステージでは、読出しアドレスが偶数番地ならば１マシンサイクルで２バイトが、奇数番地ならば１バイトが読出され、命令バッファに格納される。
【０００７】
　解読・アドレス計算ステージでは、命令バッファの底（先頭の命令）の命令に対応するマイクロ命令が制御記憶から読出され、マイクロ命令が指示する制御信号が出力される。解読・アドレス計算ステージで解読される命令が複数のマイクロ命令からなる場合には、１マシンサイクル毎に１つのマイクロ命令を指示する御信号が出力される。
　演算実行ステージでは、制御記憶から出力された１処理単位の指示を１マシンサイクルで実行する。
【０００８】
　図５は、上記従来のプロセッサの動作タイミングを示す図である。同図は、パイプラインの各ステージで処理する命令と、命令バッファの内容と、制御記憶から出力される処理単位毎の出力内容とをマシンサイクルと呼ばれるタイミング毎に示している。図中に例示しているプログラムは下記の通りである。
　命令１：　100番地　ADD D0,D1
（D0レジスタの値とD1レジスタの値を加算して結果をD1レジスタに格納する１バイトの命令で、１処理単位のマイクロ命令からなる。）
　命令２：　101番地　JSR @(disp16,PC)
（プログラムカウンタの値に16ビットの偏位を加えた番地にあるサブルーチンに分岐する３バイトの命令で、３処理単位のマイクロ命令からなる。分岐先は201番地とする。）
　命令３：　201番地　MOV @(disp8,A0),D0
（A0レジスタの値に８ビットの偏位を加えた番地にあるデータをD0レジスタにロードする２バイトの命令で、１処理単位のマイクロ命令からなる。）
　上記のプログラム例では、３バイト長のJSR命令（命令２）と、３バイト長のMOV命令（命令３）とが奇数番地から配置されており、ミスアライメントになっている。
【０００９】
　図９は、上記命令２（JSR @(disp16,PC)）の３つの処理単位が実行するオペレーションの内容を示す説明図である。同図のようにJSR命令はスタックポインタ減算、戻り先ストア、分岐実行の処理単位からなる。SPはスタックポインタ、PCはプログラムカウンタ、disp16は１６ビットのアドレス偏位を示す。それぞれの処理単位のオペレーションは、図５ではタイミングｔ４、ｔ５、ｔ６において実行される。
【００１０】
　従来のプロセッサの動作を同図を用いて説明する。
　（タイミングｔ１）
　命令読出しステージで100番地から２バイトの命令コードを読出す。
　（タイミングｔ２）
　タイミングｔ１で読出された100番地と101番地の命令コードを命令バッファに格納するとともに、命令バッファの底から100番地の命令１を取り出して解読・アドレス計算ステージで解読する。命令１は１バイトなので命令の末尾までが命令バッファに存在することになる。命令読出しステージでは２だけ増分した読出しアドレスを計算して102番地から２バイトの命令コードを読出す。
【００１１】
　（タイミングｔ３）
　解読・アドレス計算ステージから命令１に関する加算の指示が出力され、演算実行ステージでこれを実行する。命令１に関する処理単位は唯一で、この実行により命令１の実行が完了する。前のタイミングで読出された102番地と103番地の命令コードを命令バッファに格納するとともに、命令バッファの底から101番地の命令２を取り出して解読・アドレス計算ステージで解読および分岐先のアドレス計算を行う。命令２は３バイトであるが命令の末尾までが命令バッファに存在している。命令読出しステージは命令バッファに２バイト以上の空きがないため命令読出しを行わない。
【００１２】
　（タイミングｔ４）
　解読・アドレス計算ステージから命令２に関する第１の処理単位であるスタックポインタデクリメントの指示が出力され、演算実行ステージでこれを実行する。命令２は３つの処理単位から構成される。命令読出しステージでは２だけ増分した読出しアドレスを計算して104番地から２バイトの命令コードを読出す。
【００１３】
　（タイミングｔ５）
　解読・アドレス計算ステージから命令２に関する第２の処理単位であるスタックへの戻り先番地のストアの指示が出力され、演算実行ステージでこれを実行する。前のタイミングで読出された104番地と105番地の命令コードを命令バッファに格納する。命令読出しステージでは２だけ増分した読出しアドレスを計算して106番地から２バイトの命令コードを読出す。
【００１４】
　（タイミングｔ６）
　解読・アドレス計算ステージから命令２に関する第３の処理単位である分岐の指示が出力され、演算実行ステージでこれを実行する。この分岐の指示により命令バッファにある全ての命令をフラッシュするともに、命令読出しステージでは解読・アドレス計算ステージで先に計算された分岐先アドレスを受け取り、201番地から１バイトの命令コードを読出す。受け取ったアドレスが奇数番地なので１バイトのみの読出しになる。命令２はこの実行により完了する。
【００１５】
　（タイミングｔ７）
　前のタイミングで読出された201番地の命令コードを命令バッファに格納するとともに、命令バッファの底から201番地の命令３を取り出して解読・アドレス計算ステージで解読しようとするが命令３は２バイトなので命令の末尾までが命令バッファに存在しないため解読できない。そのため解読・アドレス計算ステージにおける動作を停止させる（パイプラインインタロック）。命令読出しステージでは前の読出しアドレスが奇数なので１だけ増分した読出しアドレスを計算して202番地から２バイトの命令コードを読出す。
【００１６】
　（タイミングｔ８）
　前のタイミングで解読・アドレス計算ステージにおける動作が停止されているため、このタイミングでは演算実行ステージにおける動作を停止させる（パイプラインインタロック）。前のタイミングで読出された202番地と203番地の命令コードを命令バッファに格納するとともに、命令バッファの底から201番地の命令３を取り出して解読・アドレス計算ステージで解読およびロードのアドレス計算を行う。命令３は２バイトなのでこのタイミングで初めて命令の末尾までが命令バッファに存在することになる。命令読出しステージは命令バッファに２バイト以上の空きがないため命令読出しを行わない。
【００１７】
　（タイミングｔ９）
　解読・アドレス計算ステージから命令３に関するロードの指示が出力され、演算実行ステージでこれを実行する。命令３に関する処理単位は唯一で、この実行により命令３の実行が完了する。命令読出しステージでは２だけ増分した読出しアドレスを計算して204番地から２バイトの命令コードを読出す。
【発明の開示】
【発明が解決しようとする課題】
【００１８】
　しかしながら上記従来のプロセッサによれば、可変長命令形式おいて複数の処理単位（マイクロ命令）からなる分岐命令がミスアライメントされている場合には、分岐するための処理単位が最後のマシンサイクルで実行されるので、パイプラインインタロックが発生し、全体の命令実行時間が伸張して処理性能が劣化するという問題点を有している。
　図５を用いてより具体的に説明すると、タイミングｔ７において命令バッファの底から命令３を取り出して解読しようとするが２バイトの命令３の末尾の１バイトが命令バッファに存在しないため解読できないという状態が起こる。これは、２バイトの命令３が奇数番地に配置されていることと、直前のタイミングｔ６において分岐先の命令読出しが行われていることとに起因する。さらに、タイミングｔ４やｔ５では実行されずにフラッシュされることが明確な命令の先読出しが行われており、これらの命令読出しに伴い無駄な浪費電力が発生しているという問題もある。
【００１９】
　かかる課題に鑑み本発明は、分岐と少なくとも１つの分岐でない処理単位とからなる命令を実行する場合に該命令の分岐先が命令ミスアライメントであっても命令不在によるパイプラインインタロックが発生せず、従って命令の実行時間が伸張せず処理性能が劣化しないプロセッサを提供することを目的とする。
【課題を解決するための手段】
【００２０】
　上記の課題を解決するため本発明の請求項１記載のプロセッサは、命令の先読みを行うプロセッサであって、
　先読みすべき命令のアドレスを保持するフェッチアドレス保持手段と、
　フェッチアドレス保持手段のアドレスを書き換えることを内容とする分岐の処理単位と、その他の処理単位とを含む分岐命令の実行に関する制御処理に対して、まず分岐の処理単位の実行を制御し、続いてその他の処理単位の実行を制御する制御手段とを備え、前記分岐の処理単位とその他の処理単位とは同じパイプラインステージで実行される。
【００２１】
　請求項２記載のプロセッサは、請求項１記載のプロセッサにおいて、
　前記制御処理は、サブルーチンコール命令の実行制御を含み、
　前記制御手段は、前記分岐の処理単位の制御において、サブルーチンコール命令のオペランドに基づいて得られる分岐先アドレスをフェッチアドレス保持手段に書き込み、その他の処理単位において、戻り先アドレスを退避すべき領域のアドレス計算および戻り先アドレスの退避を制御するように構成されている。
【００２２】
　請求項３記載のプロセッサは、請求項２記載のプロセッサにおいて、
　前記制御処理は、割り込み処理ルーチンへの移行制御を含み、
　前記制御手段は、前記分岐の処理単位の制御において、所定の割込み処理ルーチンの開始アドレスをフェッチアドレス保持手段に書き込み、その他の処理単位において戻り先アドレスを退避すべきの領域のアドレス計算および戻り先アドレスの退避を制御するように構成されている。
【００２３】
　請求項４記載のプロセッサは、請求項１ないし３記載の何れかのプロセッサにおいて、前記制御処理は、サブルーチンからの復帰を指示するリターン命令と、割り込み処理ルーチンからの復帰を指示するリターン命令とを含み、
　前記制御手段は、前記分岐の処理単位の制御において戻り先アドレスをフェッチアドレス保持手段に書き込むように構成されている。
【００２４】
　請求項５記載のプロセッサは、請求項３記載のプロセッサにおいて、前記制御手段は、
　前記制御処理の動作を実現する複数のマイクロ命令を記憶する制御記憶部と、
　前記各処理単位に対応するマイクロ命令を制御記憶から順次読み出して、マイクロ命令が指示する制御信号をプロセッサ内部に発行するマイクロ命令発行部とを備え、
　前記マイクロ命令発行部は、
　サブルーチンコール命令に対しては、当該命令中に指定されたアドレスをフェッチアドレス保持手段に格納することを指示するマイクロ命令と、戻り先アドレスを退避すべき領域のアドレスの計算を指示するマイクロ命令と、戻り先アドレスを退避することを指示するマイクロ命令とをこの順序で発行し、
　割り込み処理ルーチンへの移行制御に対しては、所定の割り込み処理開始アドレスをフェッチアドレス保持手段に格納することを指示するマイクロ命令と、戻り先アドレスを退避すべき領域のアドレスの計算を指示するマイクロ命令と、戻り先アドレスを退避することを指示するマイクロ命令とをこの順序で発行する。
【００２５】
　請求項６記載のプロセッサは、請求項３記載のプロセッサにおいて、前記制御手段は、
　サブルーチンコール命令をプリデコードし、当該命令の分岐先アドレスの算出を行うアドレス計算部と、
　前記制御処理を実現する複数のマイクロ命令を記憶する制御記憶部と、
　前記各処理単位に対応するマイクロ命令を制御記憶から順次読み出して、マイクロ命令をプロセッサ内部に発行するマイクロ命令発行部とを備え、
　前記マイクロ命令発行部は、
　サブルーチンコール命令に対して、前記アドレス計算部で得られるアドレスを前記フェッチアドレス保持手段に格納すると共に、メモリに格納すべきデータを保持するストアバッファに戻り先アドレスを保持することを指示するマイクロ命令と、前記退避領域を指すスタックポインタの更新、およびオペランドアドレスを保持すべきオペランドアドレスバッファに更新されたスタックポインタの内容を格納することを指示するマイクロ命令と、ストアバッファの内容をオペランドアドレスバッファが指す退避領域に格納することを指示するマイクロ命令とをこの順序で発行し、
　割り込み処理ルーチンへの移行制御に対しては、所定の割込み処理の開始アドレスを前記フェッチアドレス保持手段に格納すると共にストアバッファに戻り先アドレスを保持することを指示するマイクロ命令と、スタックポインタの更新、及びオペランドアドレスバッファに更新されたスタックポインタの内容を格納することを指示するマイクロ命令と、ストアバッファの内容をオペランドアドレスバッファが指す退避領域に格納することを指示するマイクロ命令とをこの順序で発行する。
【発明の効果】
【００２６】
　本発明の請求項１のプロセッサによれば、分岐先命令が解読可能になるタイミングでは少なくとも２回の命令読出しが行われているため、分岐先が命令ミスアライメントであっても命令不在によるパイプラインインタロックは発生しないので、命令の実行時間が伸張せず処理性能が劣化しないという効果がある。
　請求項２のプロセッサによれば、特にサブルーチンコール命令に対して請求項１と同じ効果がある。
【００２７】
　請求項３のプロセッサによれば、特に割り込み処理ルーチンへの移行制御に対しても請求項２と同じ効果がある。
　請求項４のプロセッサによれば、請求項１ないし３何れかの効果に加えて、サブルーチンからの復帰を指示するリターン命令と、割り込み処理ルーチンからの復帰を指示するリターン命令に対して、請求項１ないし３何れかと同じ効果がある。
【００２８】
　請求項５のプロセッサによれば、請求項３の効果に加えて、マイクロプログラムよる制御によって特にサブルーチンコール命令、割り込み処理ルーチンへの移行制御に対して命令の実行時間が伸張せず処理性能が劣化しないという効果がある。
　請求項６のプロセッサによれば、請求項３の効果に加えて、マイクロプログラムよる制御とは独立にアドレス計算の制御をすることよって特にサブルーチンコール命令および割り込み処理ルーチンへの移行制御に対して命令の実行時間が伸張せず処理性能が劣化しないという効果がある。
【発明を実施するための最良の形態】
【００２９】
　請求項１記載のプロセッサは命令の先読みを行うプロセッサであって、
　先読みすべき命令のアドレスを保持するフェッチアドレス保持手段と、
　フェッチアドレス保持手段のアドレスを書き換えることを内容とする分岐の処理単位と、その他の処理単位とを含む分岐命令の実行に関する制御処理に対して、まず分岐の処理単位の実行を制御し、続いてその他の処理単位の実行を制御する制御手段とを備える。これにより、分岐先が命令ミスアライメントであっても命令不在によるパイプラインインタロックは発生しないようになる。
【００３０】
　請求項２記載のプロセッサにおいて、請求項１記載のプロセッサの前記制御処理は、サブルーチンコール命令の実行制御を含み、
　前記制御手段は、前記分岐の処理単位の制御において、サブルーチンコール命令のオペランドに基づいて得られる分岐先アドレスをフェッチアドレス保持手段に書き込み、その他の処理単位において、戻り先アドレスを退避すべき領域のアドレス計算および戻り先アドレスの退避を制御する。
【００３１】
　請求項３記載のプロセッサにおいて、請求項２記載のプロセッサの前記制御処理は、割り込み処理ルーチンへの移行制御を含み、
　前記制御手段は、前記分岐の処理単位の制御において、所定の割込み処理ルーチンの開始アドレスをフェッチアドレス保持手段に書き込み、その他の処理単位において戻り先アドレスを退避すべきの領域のアドレス計算および戻り先アドレスの退避を制御する。
【００３２】
　請求項４記載のプロセッサでは、請求項１ないし３記載のプロセッサの前記制御処理は、サブルーチンからの復帰を指示するリターン命令と、割り込み処理ルーチンからの復帰を指示するリターン命令とを含み、
　前記制御手段は、前記分岐の処理単位の制御において戻り先アドレスをフェッチアドレス保持手段に書き込む。
【００３３】
　請求項５記載のプロセッサにおいて、請求項３記載のプロセッサの前記制御手段は、
　前記制御処理の動作を実現する複数のマイクロ命令を記憶する制御記憶部と、
　前記各処理単位に対応するマイクロ命令を制御記憶から順次読み出して、マイクロ命令が指示する制御信号をプロセッサ内部に発行するマイクロ命令発行部とを備え、
　前記マイクロ命令発行部は、
　サブルーチンコール命令に対しては、当該命令中に指定されたアドレスをフェッチアドレス保持手段に格納することを指示するマイクロ命令と、戻り先アドレスを退避すべき領域のアドレスの計算を指示するマイクロ命令と、戻り先アドレスを退避することを指示するマイクロ命令とをこの順序で発行し、
　割り込み処理ルーチンへの移行制御に対しては、所定の割り込み処理開始アドレスをフェッチアドレス保持手段に格納することを指示するマイクロ命令と、戻り先アドレスを退避すべき領域のアドレスの計算を指示するマイクロ命令と、戻り先アドレスを退避することを指示するマイクロ命令とをこの順序で発行する。
【００３４】
　請求項６記載のプロセッサにおいて、請求項３記載のプロセッサの前記制御手段は、
　サブルーチンコール命令をプリデコードし、当該命令の分岐先アドレスの算出を行うアドレス計算部と、
　前記制御処理を実現する複数のマイクロ命令を記憶する制御記憶部と、
　前記各処理単位に対応するマイクロ命令を制御記憶から順次読み出して、マイクロ命令をプロセッサ内部に発行するマイクロ命令発行部とを備え、
　前記マイクロ命令発行部は、
　サブルーチンコール命令に対して、前記アドレス計算部で得られるアドレスを前記フェッチアドレス保持手段に格納すると共に、メモリに格納すべきデータを保持するストアバッファに戻り先アドレスを保持することを指示するマイクロ命令と、前記退避領域を指すスタックポインタの更新、およびオペランドアドレスを保持すべきオペランドアドレスバッファに更新されたスタックポインタの内容を格納することを指示するマイクロ命令と、ストアバッファの内容をオペランドアドレスバッファが指す退避領域に格納することを指示するマイクロ命令とをこの順序で発行し、
　割り込み処理ルーチンへの移行制御に対しては、所定の割込み処理の開始アドレスを前記フェッチアドレス保持手段に格納すると共にストアバッファに戻り先アドレスを保持することを指示するマイクロ命令と、スタックポインタの更新、及びオペランドアドレスバッファに更新されたスタックポインタの内容を格納することを指示するマイクロ命令と、ストアバッファの内容をオペランドアドレスバッファが指す退避領域に格納することを指示するマイクロ命令とをこの順序で発行する。
【実施例】
【００３５】
　図１は本発明の実施例におけるプロセッサの概略構成を示すブロック図である。同図に示すように、プロセッサ１０は、命令バッファ３２と制御記憶３３を有する解読部３０、レジスタ部４０、演算実行部５０、命令読出し部６０、バスインタフェース部７０を備え、命令読出し部６０、解読部３０、演算実行部５０でのそれぞれの処理をパイプラインとして同時に実行する。
【００３６】
　入出力バス７１１は、プロセッサ１０と外界との間でデータのやり取りを行う入出力バスであり、プログラムやデータを格納する外部メモリ（図外）等に接続される。
　バスインタフェース部７０は、入出力バス７１１の制御を行う。
　命令読出し部６０は、バスインタフェース部７０を介して外部メモリから命令を読出す。その際命令読出し部６０は、分岐命令実行などにより読出しアドレスが不連続になる場合にのみ解読部３０または演算実行部５０からアドレスを受け取り、読出しアドレスが連続する場合には内部に持つインクリメント回路により読出しアドレスを計算して命令を読み出す。読出す命令は、読出しアドレスが偶数番地ならば１マシンサイクルで２バイト、奇数番地ならば１バイトを読み出して、４バイトの命令バッファ３２に格納する。
【００３７】
　解読部３０は、命令読出し部６０から受け取った命令を解読して、命令の実行を制御する。命令がメモリアクセスを伴う場合にはそのオペランドアドレスの計算を、分岐を伴う場合にはその分岐先アドレスの計算を演算実行部５０に行わせる。解読部３０は、内部に制御記憶３３を持ち、解読した命令が１つの処理単位からなる場合は１つの処理の指示を発行し、複数の処理単位からなる場合は１マシンサイクルに１つの処理単位ずつ順次処理の指示を発行する。
【００３８】
　レジスタブロック４０は、命令のオペランドで指定される複数のレジスタを有する。
　演算実行部５０は、内部に算術論理演算を行う演算器を持ち、１マシンサイクルで制御記憶３３から出力された１処理単位の指示を実行する。
　図２（ａ）は、制御記憶３３の構成を示す説明図である。制御記憶３３は、全ての機械語命令に対応する処理単位（マイクロ命令）を格納しており、同図（ａ）は、その一部を示している。
【００３９】
　２１１は、命令１（加算命令）が解読された場合に参照され発行されるマイクロ命令の内容を格納する記憶領域で、加算の指示を表す。命令１では１マシンサイクルで制御記憶領域２１１の内容のみが発行される。
　２２１〜２２３は、命令２（JSR命令）が解読された場合に参照され発行されるマイクロ命令を格納する制御記憶領域で、それぞれ分岐、スタックポインタのデクリメント、スタックへの戻り先番地のストアを実現する処理単位を表す。命令２では３マシンサイクルかけて制御記憶領域２２１〜２２３の内容が順次発行される。
【００４０】
　２３１は、命令３（MOV命令）が解読された場合に参照され発行される処理の内容を格納する制御記憶領域で、ロードの指示を表す。命令３では１マシンサイクルで制御記憶領域２３１の内容のみが発行される。
　図３は、図１に示したプロセッサのさらに詳細な構成を表すブロック図である。
　同図において、プロセッサ１０は、命令解読部３０、レジスタ部４０、演算実行部５０、命令読出し部６０、バスインタフェース部７０を有し、バス（以下ABUSと略す）２０、第１データバス（B1BUSと略す）２１、第２データバス（B2BUSと略す）２２、命令アドレスバス（NIADDRと略す）７０１、命令バス（IBUSと略す）７０２、オペランドアドレスバス（OADDRと略す）７０３、ストアデータバス（STBUSと略す）７０４、ロードデータバス（LDBUSと略す）７０５により図示するように接続されている。
【００４１】
　命令解読部３０は、先読みした命令の格納および解読を行ないマイコン全体を制御するため、割込み制御部３１、命令バッファ（IBと略す）３２、制御記憶３３、セレクタ３４、命令レジスタ３５、ステータスレジスタ３６、プリデコーダ３７、マイクロ命令レジスタ３８とから構成されている。
　割込み制御部３１は割込み受付時のマイコンの動作シーケンスを制御する。
【００４２】
　命令バッファ３２は、命令の実行に先だって命令読出し部６０によって先行的にメモリから読み出された命令を蓄える。本実施例では、４バイト分の命令を蓄える容量を持つ。
　セレクタ３４は、命令バッファ３２から入力される命令と、命令バスから入力される命令との何れか一方を選択する。
　命令レジスタ３５は、セレクタ３４から出力する命令を保持する。
【００４３】
　ステータスレジスタ３６は、命令の解読に必要な各種のステータスフラグを保持する。
　制御記憶３３は、ステータスレジスタ３６の内容を参照して、命令レジスタ３５の命令を解読する。本実施例では、プログラマブルロジックアレイ（PLA）を用いてマイクロプログラムによる制御論理が実装され、命令レジスタ３５の命令を実現するマイクロ命令を順に出力する。
【００４４】
　プリデコーダ３７は、命令レジスタ３５の内容とステータスレジスタ３６の内容とを入力し、主として１サイクルで動作するロード命令及び条件分岐命令を実行するための制御信号を出力する。この動作は、命令実行ステージに先立って命令解読ステージにおいて行われる。特に、サブルーチンコール命令、割込み処理要求命令等の分岐命令に対しては、命令中で指定された分岐先アドレスをPCB６４およびIAB７２に格納する制御を行う。分岐先アドレスへのディスプレースメント（偏位）で指定される場合には、演算実行部５０に分岐先アドレスの計算を実行させて、その計算結果をPCB６４およびIAB７２に格納する。
【００４５】
　マイクロ命令レジスタ３８は、制御記憶３３の解読結果である制御指示を保持する。
　レジスタ部４０は、データやアドレスを保持するため、データレジスタ群４１、アドレスレジスタ群４２、セレクタ４３を備えて構成されている。データレジスタ群４１は、主としてデータを保持する１６ビット長の４本のレジスタDR3〜DR0を有する。アドレスレジスタ群４２は、主としてアドレスを保持する１６ビット長の４本のレジスタAR3〜AR0を有する。このうちAR3はスタックポインタとして機能する。
【００４６】
　セレクタ４３は、ABUS２０とLDBUS７０５とから選択的にデータレジスタ群４１及びアドレスレジスタ群４２に出力する。
　演算実行部５０は、アドレスの計算やデータ演算するため、演算器５１、プログラムステータスワード５２、オペランドアドレスレジスタ５３、セレクタ５４、セレクタ５５、テンポラリーレジスタ５６、セレクタ５７、セレクタ５８、シフタ５９を備えて構成されている。
【００４７】
　演算器５１は、１６ビットのデータ演算及びアドレス計算を行う。
　プログラムステータスワード５２は、演算結果のフラグ等を保持する１６ビットのレジスタである。
　オペランドアドレスレジスタ５３は、メモリをアクセスするアドレスを格納する。
　セレクタ５４、５５は、演算器５１に入力すべきオペランドを選択する。
【００４８】
　テンポラリーレジスタ５６は、演算器５１の出力を一時的に保持する。
　セレクタ５７は、テンポラリーレジスタ５６、オペランドアドレスレジスタ５３の何れかを選択してオペランドアドレスバッファ７４に出力する。
　セレクタ５８は、ABUS２０とシフタ５９との何れかを選択する。
　シフタ５９は、セレクタ５８の出力を受けて演算器５１とともにシフト動作をする。
【００４９】
　命令読出し部６０は、命令の読み出し位置を制御するため、第１プリフェッチカウンタ（PFCと略す）６１、第２プリフェッチカウンタ（PFCPと略す）６２、セレクタ６３、プログラムカウンタバッファ（PCBと略す）６４、インクリメンタ（INCと略す）６５、セレクタ６６から構成されている。
　PCB６４は、セレクタ６６から出力される命令の読み出しアドレスを保持する。
【００５０】
　INC６５は、PCB６４の内容を＋１あるいは＋２インクリメントして、命令の先読みアドレスとしてPFC６１、セレクタ６６を介してIAB７２に出力する。
　PFC６１は、INC６５によりインクリメントされたアドレスを保持する。
　PFCP６２は、PFC６１の１つ前のアドレスを保持する。
　セレクタ６３は、PFC６１とPFCP６２とのいずれかを選択してABUS２０及びB1BUS２１に出力する。
【００５１】
　セレクタ６６は、連続アドレスの命令が読み出される場合にはPFC６１の出力を選択し、分岐する場合には、テンポラリーレジスタ５６又はオペランドアドレスレジスタ５３からのアドレスを選択して出力する。
　バスインタフェース部７０は、外部メモリ（図外）から命令やデータを読み出す際のバスの接続を制御し、インタフェース部７１、命令アドレスバッファ７２、命令バッファ７３、オペランドアドレスバッファ７４、ストアバッファ７５、ロードバッファ７６、バススイッチ７７、RAM７８、ROM７９から構成されている。
【００５２】
　インタフェース部７１は、CPU６のバスと外部との接続を制御する。
　命令アドレスバッファ（IABと略す）７２、命令バッファ７３、オペランドアドレスバッファ７４、ストアバッファ７５、ロードバッファ７６は、それぞれ命令アドレス、命令、オペランドアドレス、ストアデータ、ロードデータを保持するためのバッファである。
　バススイッチ７７は、バス７０６〜７０９を接断する。
【００５３】
　RAM７８、ROM７９は、それぞれデータ、命令を格納する。本実施例では外部メモリを前提とするので、RAM７８、ROM７９は無視してよい。
　図２（ｂ）は、上記、プリデコーダ３７、制御記憶３３、マイクロ命令レジスタ３８による機械語命令JSR @(disp16,PC)を実現する処理単位の詳細なオペレーションを示す説明図である。図２（ａ）にも示したように、JSR @(disp16,PC)命令は、分岐、スタックポインタ減算、戻り先ストアの３つの処理単位からなる。
【００５４】
　分岐は、プリデコーダ３７による制御動作（PFCP又はPFC+disp16+0又は1 → PCB,IAB）と、制御記憶３３及びマイクロ命令レジスタ３８による制御動作（PFCP又はPFC+0又は1 → STB）とにより実現される。前者のプリデコーダ３７の制御により分岐先アドレス（PFCP又はPFC+disp16又は0/1）が計算され、計算結果がPCB６４及びIAB７２に書き込まれる。分岐先アドレスは、PFC６１とPFCP６２のどちらかと１６ビットディスプレースメントと０または１とを加算することにより得られる。PFC６１とPFCP６２との選択および０と１の選択は、命令バッファ３２の残量に応じて選択される。この計算結果がPCB６４及びIAB７２に書き込まれる結果、分岐先アドレスから命令が順次フェッチされることになる。また、後者の制御動作により、戻り先アドレスがストアバッファ７５に保持される。これは、戻り先のストアに対する前準備であり、戻り先アドレスが保存される。この制御は、制御記憶領域２２１のマイクロ命令が指定する制御信号がマイクロ命令レジスタ３８から発行されることにより実現される。
【００５５】
　スタックポインタ減算の処理単位は、スタックポインタの値をスタック（退避領域）の未使用領域に変更する処理（AR3-4 → AR3,OAB）である。本実施例ではアドレススレジスタAR3がスタックポインタであるので、AR3が４減算される。同時に戻り先ストアの前準備として減算結果がOAB７４にも格納される。この制御は、制御記憶領域２２２のスタックポインタ減算のマイクロ命令により実現される。
【００５６】
　戻り先ストアの処理単位は、スタックポインタが指すスタックの未使用領域に、戻り先アドレスを退避させる処理である。この時点では既に、減算されたスタックポインタの値がOAB７４に、戻り先アドレスがSTB７５に格納されているので、STB７５の内容をOAB７４が指すメモリ領域に格納する制御が行われる。この制御は、制御記憶領域２２３の戻り先ストアのマイクロ命令により実現される。
【００５７】
　以上のように構成された本実施例のプロセッサについて、以下その動作を説明する。従来技術との違いを明確にするために、従来技術の説明で用いた同一のプログラム例に用いて説明する。例示プログラムを以下に示す。
　命令１：　100番地　ADD D0,D1
（D0レジスタの値とD1レジスタの値を加算して結果をD1レジスタに格納する１バイトの命令で、１処理単位のマイクロ命令からなる。）
　命令２：　101番地　JSR @(disp16,PC)
（プログラムカウンタの値に16ビットの偏位を加えた番地にあるサブルーチンに分岐する３バイトの命令で、３処理単位のマイクロ命令からなる。分岐先は201番地とする。）
　命令３：　201番地　MOV @(disp8,A0),D0
（A0レジスタの値に８ビットの偏位を加えた番地にあるデータをD0レジスタにロードする２バイトの命令で、１処理単位のマイクロ命令からなる。）
　図７は、同実施例におけるプロセッサの動作タイミング図を示すものである。同図は、命令読出し部６０、解読部３０、演算実行部５０で処理する命令と命令バッファ３２の内容と制御記憶３３の出力内容とをマシンサイクルと呼ばれるタイミング毎に示している。時間が経過する順にタイミング毎に説明する。
【００５８】
　（タイミングｔ１）
　命令読出し部６０が100番地から２バイトの命令コードを読出す。この読出しアドレスは図示しない分岐その他の理由によりこのタイミングで解読部３０または演算実行部５０から受け取るものとする。また命令バッファ３２も空であるとする。
　（タイミングｔ２）
　前のタイミングで読出された100番地と101番地の命令コードを命令バッファ３２に格納するとともに、命令バッファ３２の底から100番地の命令１を取り出して解読部３０で解読する。命令１は１バイトなので命令の末尾までが命令バッファ３２に存在することになる。命令読出し部６０では２だけ増分した読出しアドレスを計算して102番地から２バイトの命令コードを読出す。
【００５９】
　（タイミングｔ３）
　解読部３０の制御記憶領域２１１から命令１に関する加算の指示が出力され、演算実行部５０でこれを実行する。この実行により命令１の実行が完了する。前のタイミングで読出された102番地と103番地の命令コードを命令バッファ３２に格納するとともに、命令バッファ３２の底から101番地の命令２を取り出して解読部３０で解読および分岐先のアドレス計算を行う。命令２は３バイトであるが命令の末尾までが命令バッファ３２に存在している。命令読出し部６０は命令バッファ３２に２バイト以上の空きがないため命令読出しを行わない。
【００６０】
　（タイミングｔ４）
　解読部３０の制御記憶領域２２１から命令２に関する第１の処理単位である分岐の指示が出力され、図４に示したように演算実行部５０でこれを実行する。この分岐の指示により命令バッファ３２にある全ての命令をフラッシュするともに、命令読出し部６０では解読部３０で前のタイミングで計算された分岐先アドレスを受け取り、201番地から１バイトの命令コードを読出す。受け取ったアドレスが奇数番地なので１バイトのみの読出しになる。
【００６１】
　（タイミングｔ５）
　解読部３０の制御記憶領域２２２から命令２に関する第２の処理単位であるスタックポインタデクリメントの指示が出力され、図５に示したように演算実行部５０でこれを実行する。前のタイミングで読出された201番地の命令コードを命令バッファ３２に格納する。命令読出し部６０では前の読出しアドレスが奇数なので１だけ増分した読出しアドレスを計算して202番地から２バイトの命令コードを読出す。
【００６２】
　（タイミングｔ６）
　解読部３０の制御記憶領域２２３から命令２に関する第３の処理単位であるスタックへの戻り先番地のストアの指示が出力され、図６に示したように演算実行部５０でこれを実行する。前のタイミングで読出された202番地と203番地の命令コードを命令バッファ３２に格納する。命令読出し部６０は命令バッファ３２に２バイト以上の空きがないため命令読出しを行わない。命令２はこの実行により完了する。
【００６３】
　（タイミングｔ７）
　命令バッファ３２の底から201番地の命令３を取り出して解読部３０で解読およびロードのアドレス計算を行う。命令３は２バイトであるがこのタイミングで既に命令の末尾までが命令バッファ３２に存在しており、パイプラインインタロックは発生しない。命令読出し部６０は命令バッファ３２に２バイト以上の空きがないため命令読出しを行わない。
【００６４】
　（タイミングｔ８）
　解読部３０の制御記憶領域２３１から命令３に関するロードの指示が出力され、演算実行部５０でこれを実行する。この実行により命令３の実行が完了する。命令読出し部６０では２だけ増分した読出しアドレスを計算して204番地から２バイトの命令コードを読出す。
【００６５】
　以上のように本実施例によれば、サブルーチンへの分岐命令を実行する場合、解読部３０の制御記憶３３から他の指示に先行してまず分岐の指示が出力されるため、演算実行部５０におけるスタックポインタデクリメントやスタックへの戻り先番地のストアの実行と並行に命令読出し部６０において２回の分岐先の命令読出しを行うことができ、分岐先の命令がミスアライメントであっても分岐先命令を解読する時点で命令バッファ３２に３バイトの分岐先の命令が格納されていることになり、命令バッファ３２における命令不在によるパイプラインインタロックを回避することができる。
【００６６】
　なお本実施例では、サブルーチンへの分岐命令の場合をあげているが、分岐の処理単位と少なくとも１つの分岐でない処理単位とからなる命令であれば何でも適応できる。例えば、割込み処理ルーチンへの分岐処理においては、スタックポインタのデクリメントとスタックへの戻り先番地およびステータスワードのストアとに先行して分岐の指示を発行するように制御記憶３３を構成すればよいし、サブルーチンからのリターン命令あるいは割込み処理ルーチンからのリターン命令においては、スタックからの戻り先番地およびステータスワードのロードとスタックポインタインクリメントとに先行して分岐の指示を発行するように制御記憶３３を構成すればよい。
【００６７】
　また実施例では、命令バッファ３２の容量を４バイトとしたが、５バイトまたはそれ以上でもよい。その場合、サブルーチンへの分岐命令の分岐先命令を解読する時点で命令バッファ３２に少なくとも５バイトの分岐先命令が格納されていることになりより効果的である。または命令バッファ３２の容量を３バイトとしてもよい。
　さらに実施例では、命令読出し部６０での１マシンサイクルで読出される命令を最大２バイトとしたが、これを４バイトまたはそれ以上としてもよい。１マシンサイクルで読出される命令語長を大きくするほど読出しアドレスの境界をまたぐ命令ミスアライメントの確率は低下するが、語長をいくら大きくしても命令ミスアライメントは皆無にはならない。
【産業上の利用可能性】
【００６８】
本発明は、命令の分岐先が命令ミスアライメントであっても命令不在によるパイプラインインタロックの発生を好適に防止できる技術に関し、CISCプロセッサ、RISCプロセッサを問わず、パイプライン構造をとるプロセッサにおいて好適に利用できる。
【図面の簡単な説明】
【００６９】
【図１】本発明の実施例におけるプロセッサの概略構成を示すブロック図である。
【図２】（ａ）同実施例における制御記憶３３の構成図である。　　　　　　（ｂ）同実施例における制御記憶３３のオペレーションを示す図である。
【図３】同実施例におけるプロセッサの詳細な構成を示すブロック図である。
【図４】同実施例におけるプロセッサの動作タイミング図である。
【図５】従来技術におけるプロセッサの動作タイミング図である。
【図６】従来技術における制御記憶の構成図である。
【符号の説明】
【００７０】
　　１０ プロセッサ
　　１１ 入出力バス
　　１２ バスインタフェース回路
　　１３ 命令読出し回路
　　１４ 解読・アドレス計算回路
　　１５ 演算実行回路
　　１３１ 命令バッファ
　　１４１ 制御記憶
　　２１１〜２３１ 制御記憶領域
【図１】
2004094973.tif 000003
【図２】
2004094973.tif 000004
【図３】
2004094973.tif 000005
【図４】
2004094973.tif 000006
【図５】
2004094973.tif 000007
【図６】
2004094973.tif 000008