(57)【要約】【課題】マイクロプロセッサにおいて、サブルーチンの呼び出しに伴うレジスタの退避・復元を高速に実行すると共に、プログラムの規模の増大を抑制する。【解決手段】レジスタファイル２０は、演算処理に用いるデータを格納する１以上のレジスタを備える。退避メモリ３０は、レジスタから退避されたデータを格納する。退避制御部４０は、サブルーチン内でのレジスタへの書き込み命令の実行時に、書き込み先のレジスタに格納されているデータを退避メモリ３０に退避させる。また、退避制御部４０は、サブルーチンからの復帰命令の実行時に、退避メモリ３０に退避されたデータを対応するレジスタに書き戻す。【選択図】図１
2008282105.tif 000002
【特許請求の範囲】
【請求項１】
サブルーチンの呼び出しを含むプログラムを実行可能なマイクロプロセッサにおいて、
演算処理に用いるデータを格納する１以上のレジスタを備えるレジスタファイルと、
前記レジスタから退避されたデータを格納する退避メモリと、
前記サブルーチン内での前記レジスタへの書き込み命令の実行時に、書き込み先のレジスタに格納されているデータを前記退避メモリに退避させると共に、前記サブルーチンからの復帰命令の実行時に、前記退避メモリに退避されたデータを対応するレジスタに書き戻す退避制御部と、
を有することを特徴とするマイクロプロセッサ。
【請求項２】
前記退避制御部は、各レジスタの退避状態を示すマップデータを格納するマップ記憶部を有しており、前記レジスタのデータを退避させる際に前記マップデータを更新し、前記復帰命令の実行時には、前記マップデータに基づいて書き戻すデータを特定することを特徴とする請求項１記載のマイクロプロセッサ。
【請求項３】
前記退避制御部は、前記サブルーチンの呼び出し命令の実行時に、前記マップ記憶部に格納されている前記マップデータを前記退避メモリに退避させてから初期化すると共に、前記復帰命令の実行時に、退避されたデータを前記レジスタに書き戻した後に、退避された前記マップデータを前記マップ記憶部に書き戻すことを特徴とする請求項２記載のマイクロプロセッサ。
【請求項４】
前記退避制御部は、各レジスタを識別番号によって識別しており、前記レジスタのデータを退避させる際には、前記レジスタの識別番号に基づいて前記退避メモリ内のアドレスを生成し、生成したアドレスが示す位置にデータを格納することを特徴とする請求項２記載のマイクロプロセッサ。
【請求項５】
前記退避制御部は、前記レジスタのデータを退避させる際に退避の順序を前記マップデータに記録し、前記復帰命令の実行時には、前記マップデータに記録された順序に応じてデータを前記退避メモリから読み込んで対応するレジスタに書き戻すことを特徴とする請求項２記載のマイクロプロセッサ。
【請求項６】
前記退避制御部は、前記レジスタのデータを退避させる前に前記退避メモリの空き領域の不足を検知すると、前記退避メモリに格納されているデータを前記マイクロプロセッサに接続された外部メモリに移動させて空き領域を確保することを特徴とする請求項１記載のマイクロプロセッサ。
【請求項７】
演算処理に用いるデータを格納する１以上のレジスタを有し、サブルーチンの呼び出しを含むプログラムを実行可能なマイクロプロセッサによるレジスタ退避方法において、
前記サブルーチン内での前記レジスタへの書き込み命令の実行時に、書き込み先のレジスタに格納されているデータを前記マイクロプロセッサが有する退避メモリに退避させ、
前記サブルーチンからの復帰命令の実行時に、前記退避メモリに退避されたデータを対応するレジスタに書き戻す、
ことを特徴とするレジスタ退避方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はマイクロプロセッサおよびレジスタ退避方法に関し、特にサブルーチンの呼び出しを含むプログラムを実行可能なマイクロプロセッサおよびそのようなマイクロプロセッサによるレジスタ退避方法に関する。
【背景技術】
【０００２】
現在、一般的なマイクロプロセッサは、内部に多数のレジスタを備えている。レジスタには、外部メモリから読み込んだデータや演算処理の結果が一時的に格納される。また、外部メモリにアクセスする際に用いる各種アドレスも格納される。レジスタは外部メモリと比べて高速に動作するため、レジスタを活用することで演算処理を高速化できる。特に、プログラムから多目的に使用可能なレジスタは、汎用レジスタと呼ばれる。
【０００３】
ところで、マイクロプロセッサに実行させるプログラムでは、逐次的な命令の実行に加えて、サブルーチンの呼び出しが行われることも多い。サブルーチンは、呼び出し元の命令とはプログラム内で不連続であり、サブルーチンの中でのみ使用される変数（自動変数）も存在する。このため、サブルーチンの呼び出し時には、サブルーチンが使用予定のレジスタに格納されているデータを退避する必要がある。また、サブルーチンからの復帰時には、退避したデータを元のレジスタに戻す必要がある。
【０００４】
このようなレジスタの退避・復元は、一般的には、プログラムが明示的にレジスタと外部メモリとの間でデータを移動させることで実現される。すなわち、プログラムはレジスタの退避時には、レジスタのデータを外部メモリ内のスタック領域に移動させると共に、これに併せてレジスタ内の各種アドレスを更新する。また、プログラムはレジスタの復元時には、スタック領域から元のレジスタにデータを移動させると共に、レジスタ内の各種アドレスを退避前の状態に戻す（例えば、特許文献１，２参照）。
【特許文献１】特開平０３−１９１４２６号公報
【特許文献２】特開昭５９−１３５５５１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかし、従来のレジスタの退避・復元方法では、サブルーチンが使用するレジスタの数に比例して、退避・復元のコストも大きくなるという問題がある。すなわち、プログラムが低速な外部メモリに逐次的にアクセスする必要があるため、退避・復元処理に要する時間が増大する。また、１つのレジスタのデータを移動させるために１つの命令が必要であるため、プログラムの規模が増大する。特に、マイクロプロセッサが備える汎用レジスタが増加し、より多くの汎用レジスタが演算処理に用いられる傾向にある近年では、この問題は顕著となる。
【０００６】
本発明はこのような点に鑑みてなされたものであり、サブルーチンの呼び出しに伴うレジスタの退避・復元を高速に実行すると共に、プログラムの規模の増大を抑制できるマイクロプロセッサおよびそのようなマイクロプロセッサによるレジスタ退避方法を提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明では上記課題を解決するために、図１に示すマイクロプロセッサが提供される。本発明に係るマイクロプロセッサは、サブルーチンの呼び出しを含むプログラムを実行可能なものである。マイクロプロセッサ１は、レジスタファイル２０、退避メモリ３０および退避制御部４０を有する。レジスタファイル２０は、演算処理に用いるデータを格納する１以上のレジスタを備える。退避メモリ３０は、レジスタから退避されたデータを格納する。退避制御部４０は、サブルーチン内でのレジスタへの書き込み命令の実行時に、書き込み先のレジスタに格納されているデータを退避メモリ３０に退避させると共に、サブルーチンからの復帰命令の実行時に、退避メモリ３０に退避されたデータを対応するレジスタに書き戻す。
【０００８】
このようなマイクロプロセッサ１によれば、サブルーチン内でのレジスタへの書き込み命令の実行時に、退避制御部４０により書き込み先のレジスタに格納されているデータが退避メモリ３０に退避される。また、サブルーチンからの復帰命令の実行時に、退避制御部４０により退避メモリ３０に退避されたデータが対応するレジスタに書き戻される。
【０００９】
また、上記課題を解決するために、演算処理に用いるデータを格納する１以上のレジスタを有し、サブルーチンの呼び出しを含むプログラムを実行可能なマイクロプロセッサによるレジスタ退避方法において、サブルーチン内でのレジスタへの書き込み命令の実行時に、書き込み先のレジスタに格納されているデータをマイクロプロセッサが有する退避メモリに退避させ、サブルーチンからの復帰命令の実行時に、退避メモリに退避されたデータを対応するレジスタに書き戻すことを特徴とするレジスタ退避方法が提供される。
【００１０】
このようなレジスタ退避方法によれば、サブルーチン内でのレジスタへの書き込み命令の実行時に、書き込み先のレジスタに格納されているデータが退避メモリに退避される。また、サブルーチンからの復帰命令の実行時に、退避メモリに退避されたデータが対応するレジスタに書き戻される。
【発明の効果】
【００１１】
本発明では、マイクロプロセッサ内に退避メモリを設け、サブルーチン内でのレジスタへの書き込み命令の実行時に自動的にデータを退避メモリに退避させ、サブルーチンからの復帰命令の実行時に自動的に退避メモリのデータをレジスタに書き戻すこととした。これにより、退避・復元処理に要する時間が大きく減少する。また、データを移動するための明示的な命令が不要となり、プログラムの規模が縮小する。
【発明を実施するための最良の形態】
【００１２】
以下、本発明の実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、マイクロプロセッサの概要を示すブロック図である。図１に示すマイクロプロセッサ１は、サブルーチンの呼び出しを含むプログラムを実行可能なものである。マイクロプロセッサ１は、外部メモリ２と接続されている。外部メモリ２は、メインメモリやキャッシュメモリとして機能するメモリであり、ＲＡＭ（Random Access Memory）やフラッシュメモリなどである。マイクロプロセッサ１は、命令実行部１０、レジスタファイル２０、退避メモリ３０および退避制御部４０を有する。
【００１３】
命令実行部１０は、外部メモリ２から命令コードを順次読み込み、デコードする。そして、命令実行部１０は、デコードの結果に応じて命令を実行する。命令としては、外部メモリ２からのデータの読み込み命令（ストア命令）、外部メモリ２へのデータの書き込み命令（セーブ命令）、算術論理演算命令、サブルーチンの呼び出し命令（コール命令）、サブルーチンからの復帰命令（リターン命令）などがある。命令実行部１０は、レジスタファイル２０の汎用レジスタに各種データを格納して利用する。
【００１４】
レジスタファイル２０は、１以上の汎用レジスタを備えている。汎用レジスタは、所定のデータ長のデータを保持することができる。個々の汎用レジスタは、一意な識別番号によって識別される。本実施の形態では、レジスタファイル２０は、３２ビットのデータを格納する汎用レジスタを３２個備えているものとする。また、本実施の形態では、３つの汎用レジスタからの読み出しと１つの汎用レジスタへの書き込みとが同時に実行可能であるとする。
【００１５】
退避メモリ３０には、レジスタファイル２０の汎用レジスタから退避されたデータが格納される。なお、サブルーチンが階層的に呼び出された場合には、各階層における退避データが退避メモリ３０に積み上げられる。
【００１６】
退避制御部４０は、命令実行部１０からデコードされた命令の内容を取得する。ここで、命令がレジスタファイル２０のいずれかの汎用レジスタにデータを書き込むものである場合には、退避制御部４０は、命令の実行と並行して、書き込み先の汎用レジスタのデータを退避メモリ３０に退避させる。また、命令がリターン命令である場合には、退避メモリ３０に退避されているデータを、元の汎用レジスタに復元する。
【００１７】
なお、退避制御部４０は、レジスタの退避状態を示すマップデータを保持しておき、マップデータに基づいてデータの復元を行う。また、サブルーチンが階層的に呼び出されることで退避メモリ３０の記憶領域が不足すると、退避制御部４０は、退避メモリ３０に格納されたデータを外部メモリ２に移動させ、記憶領域を確保する。
【００１８】
図２は、マイクロプロセッサの回路構成例を示す図である。図２に示す回路構成は、命令実行部１０および退避制御部４０を詳細化したものである。命令実行部１０は、命令デコーダ１１、算術論理演算器（ＡＬＵ：Arithmetic and Logical Unit）１２、セレクタ１３ａ〜１３ｄおよび遅延回路１４ａ〜１４ｅを有する。退避制御部４０は、マップレジスタ４１、デコーダ４２、エンコーダ４３、ポインタ４４、加算器４５、シーケンサ４６、チェッカー４７およびセレクタ４８ａ〜４８ｄを有する。なお、図２では、セレクタ１３ａ〜１３ｄおよびセレクタ４８ａ〜４８ｄを制御する回路の記載は省略している。
【００１９】
命令デコーダ１１は、外部メモリ２から読み込み済みの命令コードを、図示しない命令レジスタから取得してデコードする。そして、命令デコーダ１１は、ＡＬＵ１２への指令（ｏｐｃ）、入力データが格納されている汎用レジスタの番号（ｒｓ１，ｒｓ２）および命令の実行結果を書き込む汎用レジスタの番号（ｒｄ）を出力する。ＡＬＵ１２への指令は、遅延回路１４ａに一時的に保持される。実行結果を書き込む汎用レジスタの番号は、遅延回路１４ｂに一時的に保持される。汎用レジスタから読み出したデータは、遅延回路１４ｃ，１４ｄに一時的に保持される。
【００２０】
ＡＬＵ１２は、算術演算および論理演算を実行可能な演算回路である。ＡＬＵ１２は、命令デコーダ１１が出力する指令に従って、レジスタファイル２０の汎用レジスタから読み出されたデータに対して演算を行う。そして、指定された汎用レジスタに演算の結果を書き込む。
【００２１】
マップレジスタ４１は、マップデータを保持している。マップデータは、レジスタファイル２０の汎用レジスタに１対１に対応するフラグの集合である。マップレジスタ４１は、汎用レジスタへの書き込みの命令の実行時、すなわち、データの退避時に、マップデータ中のその汎用レジスタに対応するフラグを“１”に設定する。また、マップレジスタ４１は、コール命令の実行時に、マップデータを退避メモリ３０に退避させ、保持するマップデータを初期化する。その後、リターン命令時の実行時に、退避メモリ３０に退避されたマップデータを取得して保持する。
【００２２】
デコーダ４２は、５ビットで表されるレジスタ番号を、いずれか１桁のみが“１”となる３２ビットのビットパターンにデコードする。例えば、デコーダ４２は、“００１１１”（７）を“００００００００００００００００００００００００１０００００００”にデコードする。デコーダ４２がデコードしたビットパターンを用いて、マップレジスタ４１が保持するマップデータが更新される。
【００２３】
エンコーダ４３は、マップレジスタ４１が保持するマップデータにおいてフラグが“１”に設定されている汎用レジスタの番号を、番号の大きい順に順次出力する。このとき出力されるレジスタ番号は５ビットで表される。すなわち、エンコーダ４３は、デコーダ４２と逆の処理を行う。
【００２４】
ポインタ４４は、退避メモリ３０内の位置を示すアドレスであって、現在実行中のサブルーチンのために確保した記憶領域の先頭を示すアドレスを保持している。ポインタ４４は、コール命令の実行時に、呼び出されるサブルーチンのために確保した記憶領域の先頭を示すアドレスを設定する。その後、リターン命令時の実行時に、呼び出し元のサブルーチンまたはメインルーチンのために確保されている記憶領域の先頭を示すアドレスを設定する。
【００２５】
また、ポインタ４４は、退避メモリ３０と外部メモリ２との間のデータの移動時には、アドレスを順次インクリメントすることで、次にアクセスすべき退避メモリ３０内の位置を示すようにする。その後、データの移動が完了すると、現在実行中のサブルーチンのための記憶領域の先頭を示すアドレスを設定する。
【００２６】
加算器４５は、退避メモリ３０へのアクセスに用いるアドレスを計算するための演算回路である。加算器４５は、コール命令の実行時に、呼び出されるサブルーチンのために確保した記憶領域の先頭を示すアドレスを計算し、ポインタ４４に供給する。
【００２７】
また、加算器４５は、汎用レジスタへの書き込みの命令の実行時に、ポインタ４４が保持するアドレスと書き込み先を示すレジスタ番号とから、退避データを格納すべき位置を示すアドレスを計算し、退避メモリ３０に供給する。また、加算器４５は、リターン命令の実行時に、ポインタ４４が保持するアドレスと復元すべき汎用レジスタの番号とから、退避データが格納されている位置を示すアドレスを計算し、退避メモリ３０に供給する。
【００２８】
シーケンサ４６は、退避メモリ３０と外部メモリ２との間のデータの移動時に、退避メモリ３０の先頭から順次データを移動させるための制御の信号を加算器４５に供給する。
チェッカー４７は、加算器４５から退避メモリ３０へ供給されるアドレスを監視し、退避メモリ３０の空き領域が不足していると判断すると、シーケンサ４６にその旨を通知する。これにより、シーケンサ４６の制御のもと、退避メモリ３０から外部メモリ２にデータが移動される。また、チェッカー４７は、退避メモリ３０が空であると判断すると、シーケンサ４６にその旨を通知する。これにより、シーケンサ４６の制御のもと、外部メモリ２から退避メモリ３０にデータが戻される。
【００２９】
図３は、マップデータのデータ構造例を示す図である。マップデータ４１ａは、マップレジスタ４１によって保持されている。マップデータ４１ａは、３２ビットのビット列である。ビット列の最下位ビットが０番の汎用レジスタに対応し、最上位ビットが３１番の汎用レジスタに対応する。マップデータ４１ａの全てのビットは、初期状態として“０”が設定されている。その後、汎用レジスタへの書き込みの命令が実行される毎に、書き込み先の汎用レジスタに対応するビットが“１”に設定される。
【００３０】
図４は、第１の実施の形態の退避データのデータ構造例を示す図である。図４では、１行が３２ビットのデータを表し、縦の数値は行数を表している。図４に示すようなデータが退避メモリ３０に格納される。
【００３１】
退避メモリ３０では、サブルーチンの呼び出し時に、レジスタファイル２０の全ての汎用レジスタ分の記憶領域が確保される。すなわち、３２ビット×３２個分の記憶領域がサブルーチンの呼び出し毎に確保される。汎用レジスタからの退避時には、その汎用レジスタの番号に対応する位置に退避データが格納される。また、サブルーチンの呼び出し時には、マップレジスタ４１が保持するマップデータも退避メモリ３０に退避される。これにより、階層的なサブルーチンの呼び出しにも対応することができる。
【００３２】
例えば、退避メモリ３０の３１行目まで使用されている状態でサブルーチンの呼び出しが行われると、まず、３２行目に現在のマップデータが格納される。そして、３３行目から６４行目までに新たなサブルーチンのための記憶領域が確保される。このとき、ポインタ４４の値は、確保された記憶領域の先頭である３３行目を指し示している。これにより、０番の汎用レジスタの退避データが３３行目に、３１番の汎用レジスタの退避データが６４行目に格納されることになる。
【００３３】
次に、以上のような構成のマイクロプロセッサにおいて実行される処理の流れについて説明する。なお、以下に述べる処理の流れは、主に図２に示したセレクタ１３ａ〜１３ｄおよびセレクタ４８ａ〜４８ｄを制御することで実現できる。
【００３４】
図５は、命令実行処理の手順を示すフローチャートである。以下、図５に示す処理をステップ番号に沿って説明する。
［ステップＳ１１］命令実行部１０は、外部メモリ２から読み込んだ命令コードをデコードする。そして、命令実行部１０は、デコード結果を退避制御部４０に通知する。
【００３５】
［ステップＳ１２］退避制御部４０は、命令実行部１０が実行しようとする命令がコール命令であるか否か判断する。コール命令である場合には、処理がステップＳ１３に進められる。コール命令でない場合には、処理がステップＳ１４に進められる。
【００３６】
［ステップＳ１３］退避制御部４０は、マップデータを初期化する処理を実行する。初期化処理の詳細は後で説明する。なお、この処理はステップＳ１８と同時に実行することができる。
【００３７】
［ステップＳ１４］退避制御部４０は、命令実行部１０が実行しようとする命令が汎用レジスタへの書き込みを伴う命令であるか否か判断する。書き込みを伴う命令である場合には、処理がステップＳ１５に進められる。書き込みを伴う命令でない場合には、処理がステップＳ１６に進められる。
【００３８】
［ステップＳ１５］退避制御部４０は、書き込み先の汎用レジスタに格納されたデータを退避メモリ３０に退避させる処理を実行する。退避処理の詳細は後で説明する。なお、この処理はステップＳ１８と同時に実行することができる。
【００３９】
［ステップＳ１６］退避制御部４０は、命令実行部１０が実行しようとする命令がリターン命令であるか否か判断する。リターン命令である場合には、処理がステップＳ１７に進められる。リターン命令でない場合には、処理がステップＳ１８に進められる。
【００４０】
［ステップＳ１７］退避制御部４０は、復帰前のサブルーチンにおいて退避メモリ３０に退避されたデータを復元する処理を実行する。復元処理の詳細は後で説明する。なお、この処理はステップＳ１８と同時に実行することができる。
【００４１】
［ステップＳ１８］命令実行部１０は、ステップＳ１１のデコード結果に従って、演算処理を実行する。
［ステップＳ１９］命令実行部１０は、プログラムに含まれる命令を最後まで実行したか否か判断する。最後まで実行した場合には、処理が終了する。最後まで実行していない場合には処理がステップＳ１１に進められる。
【００４２】
このようにして、退避制御部４０は、コール命令、汎用レジスタへの書き込みを伴う命令、リターン命令を命令実行部１０が実行する際に、所定の処理を自動的に実行する。以下、ステップＳ１３の初期化処理、ステップＳ１５の退避処理、ステップＳ１７の復元処理の詳細について説明する。
【００４３】
図６は、第１の実施の形態の初期化処理の手順を示すフローチャートである。以下、図６に示す処理をステップ番号に沿って説明する。
［ステップＳ２１］退避制御部４０は、マップデータおよび次のサブルーチンに対応する退避データを格納するための記憶領域が、退避メモリ３０に不足しているか否か判断する。これは、チェッカー４７からシーケンサ４６に通知が送られているか否かに基づいて判断される。記憶領域が不足している場合には、処理がステップＳ２２に進められる。不足していない場合には処理がステップＳ２４に進められる。
【００４４】
［ステップＳ２２］退避制御部４０は、退避メモリ３０に格納されているデータを先頭から順に外部メモリ２に移動させる。これは、シーケンサ４６による制御のもと、ポインタ４４が保持するアドレスを順次インクリメントし、退避メモリ３０に供給することで実現される。
【００４５】
［ステップＳ２３］退避制御部４０は、ポインタ４４が保持するアドレスを退避メモリ３０の先頭、すなわち、“０”に初期化する。
［ステップＳ２４］退避制御部４０は、マップレジスタ４１が保持するマップデータを、退避メモリ３０に退避させる。
【００４６】
［ステップＳ２５］退避制御部４０は、マップレジスタ４１が保持するマップデータを初期化する。すなわち、マップデータの全てのビットを“０”に設定する。
［ステップＳ２６］退避制御部４０は、ポインタ４４が保持するアドレスを０番の汎用レジスタの退避データを格納すべき位置のアドレスに設定する。
【００４７】
このようにして、退避制御部４０は、コール命令の実行時に、マップデータを退避メモリ３０に退避させて初期化する。また、次のサブルーチンのための記憶領域の先頭にポインタの値を設定する。ここで、退避メモリ３０の空き領域が不足していると、退避制御部４０は、退避メモリ３０のデータを外部メモリ２に移動させ、空き領域を確保する。
【００４８】
図７は、第１の実施の形態の退避処理の手順を示すフローチャートである。以下、図７に示す処理をステップ番号に沿って説明する。
［ステップＳ３１］退避制御部４０は、マップデータ内の書き込み先の汎用レジスタに対応するビットを“１”に設定する。これは、デコーダ４２によって得られる書き込み先の汎用レジスタの番号に対応するビットパターンと、現在のマップデータとの論理和を計算することで実現できる。
【００４９】
［ステップＳ３２］退避制御部４０は、退避データを格納すべき退避メモリ３０内のアドレスを計算する。これは、ポインタ４４が保持するアドレスと書き込み先の汎用レジスタの番号とに基づいて、加算器４５によって計算される。計算されたアドレスは、退避メモリ３０に供給される。
【００５０】
［ステップＳ３３］退避制御部４０は、汎用レジスタに格納されているデータを上書きされる前に読み出し、退避メモリ３０に供給する。退避メモリ３０は、ステップＳ３２で供給されたアドレスで示される位置にこのデータを書き込む。
【００５１】
このようにして、退避制御部４０は、汎用レジスタへの書き込みを伴う命令の実行時に、格納されているデータを読み込んで退避メモリ３０に退避させる。また、退避制御部４０は、退避が行われたことをマップデータに記録する。
【００５２】
図８は、第１の実施の形態の復元処理の手順を示すフローチャートである。以下、図８に示す処理をステップ番号に沿って説明する。
［ステップＳ４１］退避制御部４０は、マップレジスタ４１が保持するマップデータに基づいて、退避が行われた汎用レジスタをレジスタ番号の大きい方から１つ選択する。
【００５３】
［ステップＳ４２］退避制御部４０は、ステップＳ４１で選択した汎用レジスタに対応する退避データが格納されている退避メモリ３０内のアドレスを計算する。これは、ポインタ４４が保持するアドレスと汎用レジスタの番号とに基づいて、加算器４５によって計算される。計算されたアドレスは、退避メモリ３０に供給される。
【００５４】
［ステップＳ４３］退避制御部４０は、ステップＳ４２で計算したアドレスに対応するデータを退避メモリ３０から読み出す。そして、退避制御部４０は、ステップＳ４１で選択した汎用レジスタに読み出したデータを格納する。これは、エンコーダ４３が汎用レジスタのレジスタ番号をレジスタファイル２０に供給することで実現される。
【００５５】
［ステップＳ４４］退避制御部４０は、退避が行われた全ての汎用レジスタをステップＳ４１で選択したか否か判断する。全て選択した場合には、処理がステップＳ４５に進められる。未選択の汎用レジスタがある場合には、処理がステップＳ４１に進められる。
【００５６】
［ステップＳ４５］退避制御部４０は、退避メモリ３０に退避されている直前のマップデータを取得し、マップレジスタ４１に供給する。
［ステップＳ４６］退避制御部４０は、退避メモリ３０が空か否か判断する。これは、チェッカー４７からシーケンサ４６に通知が送られているか否かに基づいて判断される。退避メモリ３０が空である場合には、処理がステップＳ４７に進められる。空でない場合には、処理がステップＳ４９に進められる。
【００５７】
［ステップＳ４７］退避制御部４０は、外部メモリ２に退避メモリ３０から移動させたデータが存在するか否か判断する。存在する場合には、処理がステップＳ４８に進められる。存在しない場合には、処理がステップＳ４９に進められる。
【００５８】
［ステップＳ４８］退避制御部４０は、過去に移動させたデータを外部メモリ２から退避メモリ３０に戻す。これは、シーケンサ４６による制御のもと、ポインタ４４が保持するアドレスを順次インクリメントし、退避メモリ３０に供給することで実現される。
【００５９】
［ステップＳ４９］退避制御部４０は、ポインタ４４が保持するアドレスを０番の汎用レジスタの退避データを格納すべき位置のアドレスに設定する。
このようにして、退避制御部４０は、リターン命令の実行時に、現在のマップデータに基づいて、退避メモリ３０に退避されたデータを汎用レジスタに書き戻す。その後、退避メモリ３０に退避された直前のマップデータも、マップレジスタ４１に書き戻す。ここで、退避メモリ３０が空になり、退避メモリ３０から外部メモリ２に移動させたデータがある場合には、退避制御部４０は、外部メモリ２から退避メモリ３０にデータを戻す。
【００６０】
次に、このようなマイクロプロセッサ１に実行させるプログラムについて説明する。
図９は、プログラムのソースコードの例を示す図である。図９に示すソースコード６０は、プログラムの開発者が作成するものである。ソースコード６０には、引数として入力される１０００個の整数値の平均を求める関数“ａｖｅｒａｇｅ”が記述されている。この関数に含まれる文は、コード範囲６１〜６４の４つの範囲に区分できる。
【００６１】
コード範囲６１には、整数型の変数“ｉ”と“ｓｕｍ”とを宣言する文が記述されている。また、変数“ｓｕｍ”の初期値として“０”を設定する処理が記述されている。コード範囲６２には、１０００個の整数値の合計を計算する処理が記述されている。コード範囲６３には、合計を個数で割ることで平均を計算する処理が記述されている。コード範囲６４には、計算された平均を関数の戻り値として出力する処理が記述されている。
【００６２】
図１０は、プログラムのアセンブリコードの例を示す図である。図１０に示すアセンブリコード７０は、図９のソースコード６０を、マイクロプロセッサ１に対応したコンパイラでコンパイルすることによって得られるものである。アセンブリコード７０には、関数“ａｖｅｒａｇｅ”に対応するサブルーチンが記述されている。アセンブリコード７０は、コード範囲７１〜７６の６つの範囲に区分できる。
【００６３】
コード範囲７１には、サブルーチン内で一時的に使用する汎用レジスタｒ１２，ｒ１３，ｒ１４（レジスタファイル２０の１２番、１３番、１４番の汎用レジスタ）に格納されているデータを外部メモリ２のスタック領域に移動させる処理が記述されている。また、スタック領域のトップを示すスタックポインタの値を更新する処理が記述されている。
【００６４】
ただし、コード範囲７１のコードはコメントアウトされている。すなわち、マイクロプロセッサ１は、実際には、これらの処理を実行しない。マイクロプロセッサ１では、汎用レジスタの退避は自動的に行われ、プログラムによる明示の指示は不要だからである。なお、既存の一般的なマイクロプロセッサに同様の処理を実行させる場合は、これらのコードが必要となる。
【００６５】
コード範囲７２には、汎用レジスタｒ１２，ｒ１３に初期値“０”を設定する処理が記載されている。コード範囲７２は、ソースコード６０のコード範囲６１に対応する。ここで、汎用レジスタｒ１２が変数“ｉ”の値を保持し、汎用レジスタｒ１３が変数“ｓｕｍ”の値を保持する。
【００６６】
コード範囲７３には、外部メモリ２から整数値を読み込み、汎用レジスタｒ１３に加算することを１０００回繰り返す処理が記述されている。コード範囲７３は、ソースコード６０のコード範囲６２に対応する。これにより、汎用レジスタｒ１３に１０００個の整数値の合計が格納される。
【００６７】
コード範囲７４には、１０００個の整数値の合計を１０００で割ることで平均を計算する処理が記述されている。コード範囲７４は、ソースコード６０のコード範囲６３に対応する。
【００６８】
コード範囲７５には、コード範囲７１で退避した汎用レジスタｒ１２，ｒ１３，ｒ１４のデータを、外部メモリ２のスタック領域から取得して書き戻す処理が記述されている。また、スタック領域のトップを示すスタックポインタの値を更新する処理が記述されている。
【００６９】
ただし、コード範囲７１と同様、コード範囲７５のコードはコメントアウトされている。すなわち、マイクロプロセッサ１は、実際には、これらの処理を実行しない。マイクロプロセッサ１では、汎用レジスタの復元は自動的に行われ、プログラムによる明示の指示は不要だからである。なお、既存の一般的なマイクロプロセッサに同様の処理を実行させる場合は、これらのコードが必要となる。
【００７０】
コード範囲７６には、このサブルーチンから復帰するためのリターン命令が記述されている。コード範囲７６は、ソースコード６０のコード範囲６４に対応する。
ここで、アセンブリコード７０で示されるプログラムを命令実行部１０が実行すると、退避制御部４０は、レジスタファイル２０の１２番、１３番、１４番の汎用レジスタのデータを書き込み時に自動的に退避メモリ３０に退避させる。また、退避制御部４０は、リターン命令の実行時に、１２番、１３番、１４番の汎用レジスタのデータを、自動的に退避メモリ３０から書き戻す。
【００７１】
なお、図１０の例では、コード範囲７１，７５をコメントアウトしているが、これらのコードは完全に削除して構わない。これにより、プログラムの規模を圧縮できる。
このようなマイクロプロセッサを用いることで、演算処理と並行して退避・復元処理を実行することができ、処理効率を大きく向上させることができる。また、プログラム中にデータを移動するための明示的な命令を記述する必要がなくなり、プログラムの規模を大きく圧縮できる。
【００７２】
また、退避データとマップデータとを退避メモリに積み上げるため、階層的なサブルーチンの呼び出しにも柔軟に対応することができる。また、退避メモリの空き領域が不足すると、自動的にデータが外部メモリに移動されるため、退避メモリは過度に大きな記憶容量を必要とすることがない。
【００７３】
また、サブルーチンの呼び出し時に、各汎用レジスタに対応する退避メモリ内の退避位置が決定するため、退避・復元の制御が簡潔となり、回路構成が複雑化することを防止できる。
【００７４】
［第２の実施の形態］
次に、第２の実施の形態について説明する。第２の実施の形態は、第１の実施の形態における退避メモリ内の退避データの管理方法を変更したものである。前述の第１の実施の形態との相違点を中心に説明し、同様の事項については説明を省略する。なお、第２の実施の形態のマイクロプロセッサの構成の概要は、図１に示した第１の実施の形態のものと同様であるため、以下、図１で用いた符号と同じ符号を用いて説明する。
【００７５】
図１１は、順序付きマップデータのデータ構造例を示す図である。図１１に示す順序付きマップデータ４１ｂは、退避制御部４０が管理するデータであり、図３に示した第１の実施の形態のマップデータ４１ａに対応する。
【００７６】
順序付きマップデータ４１ｂは、３２個の０以上の整数値の列である。列の最下位の値が０番の汎用レジスタに対応し、最上位の値が３１番の汎用レジスタに対応する。順序付きマップデータ４１ｂの全ての整数値は、初期状態として“０”が設定されている。その後、汎用レジスタへの書き込みの命令が実行される毎に、書き込み先の汎用レジスタに対応する欄に、そのサブルーチン内で退避が行われた順序を示す値が設定される。
【００７７】
例えば、コール命令の実行後、最初に２９番の汎用レジスタが退避され、次に１番の汎用レジスタが退避された場合、２９番に対応する欄に“１”が設定され、１番に対応する欄に“２”が設定される。
【００７８】
図１２は、第２の実施の形態の退避データのデータ構造例を示す図である。図１２に示すデータ構造は、図４に示した第１の実施の形態のデータ構造に対応するものである。すなわち、図１２に示すようなデータが退避メモリ３０に格納される。
【００７９】
サブルーチンの呼び出し時には、退避制御部４０が管理する現在の順序付きマップデータが退避メモリ３０に退避される。そして、ポインタの値が、次にデータを書き込むべき位置、すなわち、空き領域の先頭を指し示す。ここで、ポインタの値が示す位置に退避データが書き込まれると、ポインタの値がインクリメントされる。また、退避したデータの復元時には、後に退避されたデータから順に復元が行われ、ポインタの値が順次デクリメントされる。
【００８０】
第２の実施の形態の命令実行処理の全体的な流れは、図５に示した第１の実施の形態のものと同様である。以下、初期化処理、退避処理、復元処理の詳細について説明する。
図１３は、第２の実施の形態の初期化処理の手順を示すフローチャートである。以下、図１３に示す処理をステップ番号に沿って説明する。
【００８１】
［ステップＳ５１］退避制御部４０は、マップデータおよび次のサブルーチンに対応する退避データを格納するための記憶領域が、退避メモリ３０に不足しているか否か判断する。記憶領域が不足している場合には、処理がステップＳ５２に進められる。不足していない場合には処理がステップＳ５４に進められる。
【００８２】
［ステップＳ５２］退避制御部４０は、退避メモリ３０に格納されているデータを先頭から順に外部メモリ２に移動させる。
［ステップＳ５３］退避制御部４０は、ポインタの値を退避メモリ３０の先頭、すなわち、“０”に初期化する。
【００８３】
［ステップＳ５４］退避制御部４０は、現在の順序付きマップデータを退避メモリ３０に退避させる。
［ステップＳ５５］退避制御部４０は、現在の順序付きマップデータを初期化する。すなわち、順序付きマップデータの全ての欄の整数値を“０”に設定する。
【００８４】
［ステップＳ５６］退避制御部４０は、ポインタの値を退避メモリ３０内の次の書き込み位置、すなわち、空き領域の先頭のアドレスとする。
このようにして、退避制御部４０は、コール命令の実行時に、順序付きマップデータを退避メモリ３０に退避させて初期化する。また、退避メモリ３０の空き領域の先頭にポインタの値を設定する。ここで、退避メモリ３０の空き領域が不足していると、退避制御部４０は、退避メモリ３０のデータを外部メモリ２に移動させ、空き領域を確保する。
【００８５】
図１４は、第２の実施の形態の退避処理の手順を示すフローチャートである。以下、図１４に示す処理をステップ番号に沿って説明する。
［ステップＳ６１］退避制御部４０は、順序付きマップデータ内の書き込み先の汎用レジスタに対応する欄に、退避順序を示す整数値を設定する。
【００８６】
［ステップＳ６２］退避制御部４０は、汎用レジスタに格納されているデータを上書きされる前に読み出し、退避メモリ３０に供給する。退避メモリ３０は、ポインタが指し示す位置に、このデータを書き込む。
【００８７】
［ステップＳ６３］退避制御部４０は、ポインタの値をインクリメントし、ポインタが退避メモリ３０内の空き領域の先頭を指し示すようにする。
このようにして、退避制御部４０は、汎用レジスタへの書き込みを伴う命令の実行時に、格納されているデータを読み込んで退避メモリ３０に退避させる。また、退避制御部４０は、そのサブルーチン内で退避が行われた順序を順序付きマップデータに記録する。
【００８８】
図１５は、第２の実施の形態の復元処理の手順を示すフローチャートである。以下、１５に示す処理をステップ番号に沿って説明する。
［ステップＳ７１］退避制御部４０は、退避順序が遅い順、すなわち、順序付きマップデータの整数値が大きい順に汎用レジスタを１つ選択する。
【００８９】
［ステップＳ７２］退避制御部４０は、ポインタの値をデクリメントし、最後に退避されたデータの格納位置をポインタが指し示すようにする。ポインタの値は、退避メモリ３０に供給される。
【００９０】
［ステップＳ７３］退避制御部４０は、ポインタが指し示す位置のデータを退避メモリ３０から読み出す。そして、退避制御部４０は、ステップＳ７１で選択した汎用レジスタに読み出したデータを格納する。
【００９１】
［ステップＳ７４］退避制御部４０は、退避が行われた全ての汎用レジスタをステップＳ７１で選択したか否か判断する。全て選択した場合には、処理がステップＳ７５に進められる。未選択の汎用レジスタがある場合には、処理がステップＳ７１に進められる。
【００９２】
［ステップＳ７５］退避制御部４０は、退避メモリ３０に退避されている直前の順序付きマップデータを取得し、現在の順序付きマップデータとして保持する。
［ステップＳ７６］退避制御部４０は、退避メモリ３０が空か否か判断する。退避メモリ３０が空である場合には、処理がステップＳ７７に進められる。空でない場合には、処理がステップＳ７９に進められる。
【００９３】
［ステップＳ７７］退避制御部４０は、外部メモリ２に退避メモリ３０から移動させたデータが存在するか否か判断する。存在する場合には、処理がステップＳ７８に進められる。存在しない場合には、処理がステップＳ７９に進められる。
【００９４】
［ステップＳ７８］退避制御部４０は、過去に移動させたデータを外部メモリ２から退避メモリ３０に戻す。
［ステップＳ７９］退避制御部４０は、ポインタの値を退避メモリ３０内の次の書き込み位置、すなわち、空き領域の先頭のアドレスとする。
【００９５】
このようにして、退避制御部４０は、リターン命令の実行時に、現在の順序付きマップデータに基づいて、退避メモリ３０に退避されたデータを汎用レジスタに書き戻す。その後、退避メモリ３０に退避された直前の順序付きマップデータを取得し、現在の順序付きマップレジスタとして保持する。ここで、退避メモリ３０が空になり、退避メモリ３０から外部メモリ２に移動させたデータがある場合には、退避制御部４０は、外部メモリ２から退避メモリ３０にデータを戻す。
【００９６】
このようなマイクロプロセッサを用いることで、演算処理と並行して退避・復元処理を実行することができ、処理効率を大きく向上させることができる。また、プログラム中にデータを移動するための明示的な命令を記述する必要がなくなり、プログラムの規模を大きく圧縮できる。
【００９７】
また、退避データとマップデータとを退避メモリに積み上げるため、階層的なサブルーチンの呼び出しにも柔軟に対応することができる。また、退避メモリの空き領域が不足すると、自動的にデータが外部メモリに移動されるため、退避メモリは過度に大きな記憶容量を必要とすることがない。
【００９８】
また、退避メモリをスタックとして用いて退避データを順次積み上げるため、退避メモリの利用効率が向上し、空き領域が不足する確率を抑制できる。
なお、本実施の形態では、コール命令の実行時に退避メモリの空き領域の不足を検知することとしたが、常時監視するようにしてもよい。また、本実施の形態では、退避メモリと外部メモリとの間のデータの移動をハードウェアで行うこととしたが、ＯＳ（Operating System）上の割り込みを発生させ、ソフトウェアで行うようにしてもよい。
【００９９】
以上説明した実施の形態の主な技術的特徴は、以下の付記の通りである。
（付記１）  サブルーチンの呼び出しを含むプログラムを実行可能なマイクロプロセッサにおいて、
演算処理に用いるデータを格納する１以上のレジスタを備えるレジスタファイルと、
前記レジスタから退避されたデータを格納する退避メモリと、
前記サブルーチン内での前記レジスタへの書き込み命令の実行時に、書き込み先のレジスタに格納されているデータを前記退避メモリに退避させると共に、前記サブルーチンからの復帰命令の実行時に、前記退避メモリに退避されたデータを対応するレジスタに書き戻す退避制御部と、
を有することを特徴とするマイクロプロセッサ。
【０１００】
（付記２）  前記退避制御部は、各レジスタの退避状態を示すマップデータを格納するマップ記憶部を有しており、前記レジスタのデータを退避させる際に前記マップデータを更新し、前記復帰命令の実行時には、前記マップデータに基づいて書き戻すデータを特定することを特徴とする付記１記載のマイクロプロセッサ。
【０１０１】
（付記３）  前記退避制御部は、前記サブルーチンの呼び出し命令の実行時に、前記マップ記憶部に格納されている前記マップデータを前記退避メモリに退避させてから初期化すると共に、前記復帰命令の実行時に、退避されたデータを前記レジスタに書き戻した後に、退避された前記マップデータを前記マップ記憶部に書き戻すことを特徴とする付記２記載のマイクロプロセッサ。
【０１０２】
（付記４）  前記退避制御部は、各レジスタを識別番号によって識別しており、前記レジスタのデータを退避させる際には、前記レジスタの識別番号に基づいて前記退避メモリ内のアドレスを生成し、生成したアドレスが示す位置にデータを格納することを特徴とする付記２記載のマイクロプロセッサ。
【０１０３】
（付記５）  前記退避制御部は、前記レジスタのデータを退避させる際に退避の順序を前記マップデータに記録し、前記復帰命令の実行時には、前記マップデータに記録された順序に応じてデータを前記退避メモリから読み込んで対応するレジスタに書き戻すことを特徴とする付記２記載のマイクロプロセッサ。
【０１０４】
（付記６）  前記退避制御部は、前記レジスタのデータを退避させる前に前記退避メモリの空き領域の不足を検知すると、前記退避メモリに格納されているデータを前記マイクロプロセッサに接続された外部メモリに移動させて空き領域を確保することを特徴とする付記１記載のマイクロプロセッサ。
【０１０５】
（付記７）  演算処理に用いるデータを格納する１以上のレジスタを有し、サブルーチンの呼び出しを含むプログラムを実行可能なマイクロプロセッサによるレジスタ退避方法において、
前記サブルーチン内での前記レジスタへの書き込み命令の実行時に、書き込み先のレジスタに格納されているデータを前記マイクロプロセッサが有する退避メモリに退避させ、
前記サブルーチンからの復帰命令の実行時に、前記退避メモリに退避されたデータを対応するレジスタに書き戻す、
ことを特徴とするレジスタ退避方法。
【０１０６】
（付記８）  前記レジスタのデータを退避させる際に、前記マイクロプロセッサが有するマップ記憶部に格納された、各レジスタの退避状態を示すマップデータを更新し、
前記復帰命令の実行時には、前記マップ記憶部に格納されている前記マップデータに基づいて書き戻すデータを特定する、
ことを特徴とする付記７記載のレジスタ退避方法。
【０１０７】
（付記９）  前記サブルーチンの呼び出し命令の実行時に、前記マップ記憶部に格納されている前記マップデータを前記退避メモリに退避させて初期化し、
前記復帰命令の実行時に、退避されたデータを前記レジスタに書き戻した後に、退避された前記マップデータを前記マップ記憶部に書き戻す、
ことを特徴とする付記８記載のレジスタ退避方法。
【０１０８】
（付記１０）  前記レジスタのデータを退避させる際には、前記レジスタに予め対応付けられた識別番号に基づいて前記退避メモリ内のアドレスを生成し、生成したアドレスが示す位置にデータを格納することを特徴とする付記８記載のレジスタ退避方法。
【０１０９】
（付記１１）  前記レジスタのデータを退避させる際に、退避の順序を前記マップデータに記録し、
前記復帰命令の実行時には、前記マップデータに記録された順序に応じてデータを前記退避メモリから読み込んで対応するレジスタに書き戻す、
ことを特徴とする付記８記載のレジスタ退避方法。
【０１１０】
（付記１２）  前記レジスタのデータを退避させる前に前記退避メモリの空き領域の不足を検知すると、前記退避メモリに格納されているデータを前記マイクロプロセッサに接続された外部メモリに移動させて空き領域を確保することを特徴とする付記７記載のレジスタ退避方法。
【図面の簡単な説明】
【０１１１】
【図１】マイクロプロセッサの概要を示すブロック図である。
【図２】マイクロプロセッサの回路構成例を示す図である。
【図３】マップデータのデータ構造例を示す図である。
【図４】第１の実施の形態の退避データのデータ構造例を示す図である。
【図５】命令実行処理の手順を示すフローチャートである。
【図６】第１の実施の形態の初期化処理の手順を示すフローチャートである。
【図７】第１の実施の形態の退避処理の手順を示すフローチャートである。
【図８】第１の実施の形態の復元処理の手順を示すフローチャートである。
【図９】プログラムのソースコードの例を示す図である。
【図１０】プログラムのアセンブリコードの例を示す図である。
【図１１】順序付きマップデータのデータ構造例を示す図である。
【図１２】第２の実施の形態の退避データのデータ構造例を示す図である。
【図１３】第２の実施の形態の初期化処理の手順を示すフローチャートである。
【図１４】第２の実施の形態の退避処理の手順を示すフローチャートである。
【図１５】第２の実施の形態の復元処理の手順を示すフローチャートである。
【符号の説明】
【０１１２】
１  マイクロプロセッサ
２  外部メモリ
１０  命令実行部
１１  命令デコーダ
１２  算術論理演算器
２０  レジスタファイル
３０  退避メモリ
４０  退避制御部
４１  マップレジスタ
４２  デコーダ
４３  エンコーダ
４４  ポインタ
４５  加算器
４６  シーケンサ
４７  チェッカー
【図１】
2008282105.tif 000003
【図２】
2008282105.tif 000004
【図３】
2008282105.tif 000005
【図４】
2008282105.tif 000006
【図５】
2008282105.tif 000007
【図６】
2008282105.tif 000008
【図７】
2008282105.tif 000009
【図８】
2008282105.tif 000010
【図９】
2008282105.tif 000011
【図１０】
2008282105.tif 000012
【図１１】
2008282105.tif 000013
【図１２】
2008282105.tif 000014
【図１３】
2008282105.tif 000015
【図１４】
2008282105.tif 000016
【図１５】
2008282105.tif 000017