(57)【要約】【課題】プロセッサにおいて、手続き呼び出し時の処理を効率化し、処理速度を向上させる。【解決手段】２つの汎用レジスタ２２１ａおよび２２１ｂの領域によってなるレジスタセットを設け、汎用レジスタ２２１ａを通常状態として読み書きが行われる（Ａ）の状態から、手続き呼び出しを行う直前に、退避許可情報に“１”をセットした（Ｂ）の状態に移行する。この状態では、汎用レジスタ２２１ａの書き込みが禁止され、この後の手続きの処理による書き込みが発生した時点で、（Ｃ）のように書き込み先が汎用レジスタ２２１ｂに移行される。この状態では汎用レジスタ２２１ａの読み書きが禁止されて退避状態とされ、汎用レジスタ２２１ｂが通常状態とされて手続きの処理による読み書きが行われる。【選択図】　　　　図３
2004030224.tif 000002
【特許請求の範囲】
【請求項１】
読み込んだ命令に従いレジスタを使用して動作するプロセッサにおいて、
２つのレジスタ領域よりなるレジスタセットと、
前記レジスタ領域に対する書き込み発生時に前記レジスタ領域に記憶されているデータを退避するか否かを示す退避許可情報を保持する退避許可情報保持手段と、
手続きを呼び出して実行する手続き処理手段と、
前記手続きの呼び出し以前に前記レジスタ領域のデータ退避を許可するように前記退避許可情報を設定する退避許可情報設定手段と、
前記レジスタ領域に対する書き込みが発生すると、対応する前記退避許可情報に基づいて前記レジスタ領域の書き込みおよび読み出しを禁止して退避状態とするとともに、同じ前記レジスタセット内の他方の前記レジスタ領域に対して書き込みを行うレジスタ退避手段と、
を有することを特徴とするプロセッサ。
【請求項２】
前記レジスタ退避手段は、前記退避状態となった前記レジスタ領域について前記退避許可情報設定手段により再びデータ退避が許可された場合に、前記退避状態となった前記レジスタ領域に記憶されたデータをスタックにプッシュした後、前記レジスタ領域に新たな書き込みを行うことを特徴とする請求項１記載のプロセッサ。
【請求項３】
前記レジスタセットに対して前記レジスタ退避手段による退避動作が行われたことを示す退避情報を保持する退避情報保持手段をさらに有することを特徴とする請求項２記載のプロセッサ。
【請求項４】
前記退避情報に基づいて前記退避動作が行われたレジスタに対するデータの復帰動作を行うレジスタ復帰手段をさらに有することを特徴とする請求項３記載のプロセッサ。
【請求項５】
前記レジスタセットが複数設けられた場合、前記退避情報保持手段は、前記複数のレジスタセットのうちの１つ以上を１ビットに対して割り当てたビット列として前記退避情報を保持する退避情報レジスタによってなることを特徴とする請求項３記載のプロセッサ。
【請求項６】
前記レジスタ退避手段は、前記退避状態となった前記レジスタ領域について前記退避許可情報設定手段により再び前記データ退避が許可された場合に、前記退避状態となった前記レジスタ領域のデータをスタックにプッシュした後、前記退避情報レジスタの前記ビット列を前記スタックにさらにプッシュすることを特徴とする請求項５記載のプロセッサ。
【請求項７】
前記スタックに格納された前記退避情報レジスタの前記ビット列に基づいて、前記スタックから対応する前記レジスタセットに対してデータをポップすることにより、前記退避動作が行われた前記レジスタセットに対するデータの復帰動作を行うレジスタ復帰手段をさらに有することを特徴とする請求項６記載のプロセッサ。
【請求項８】
前記手続きが呼び出された時に前記手続きに対する引数が各レジスタに格納されているか否かを、１ビットを１つのレジスタに対応させたビット列として表した引数レジスタリストと、
前記引数レジスタリスト中の特定ビットから一定方向にビットを進めたときにデータが格納されたことを示すビットが現れる順番により、前記引数を受け取るレジスタを指定する引数レジスタ指定手段と、
をさらに有することを特徴とする請求項１記載のプロセッサ。
【請求項９】
前記手続きの実行後に前記手続きから返される戻り値が各レジスタに格納されているか否かを、１ビットを１つのレジスタに対応させたビット列として表した戻り値レジスタリストと、
前記戻り値レジスタリスト中の特定ビットから一定方向にビットを進めたときにデータが格納されたことを示すビットが現れる順番により、前記戻り値を受け取るレジスタを指定する戻り値レジスタ指定手段と、
をさらに有することを特徴とする請求項１記載のプロセッサ。
【請求項１０】
読み込んだ命令に従いレジスタを使用して動作するプロセッサにおいて、
２つのレジスタ領域よりなるレジスタセットと、
前記レジスタ領域に対する書き込み発生時に前記レジスタ領域に記憶されているデータを退避するか否かを示す退避許可情報を保持する退避許可情報保持手段と、
前記レジスタ領域に対する書き込みが発生すると、対応する前記退避許可情報に基づいて前記レジスタ領域の書き込みおよび読み出しを禁止して退避状態とするとともに、同じ前記レジスタセット内の他方の前記レジスタ領域に対して書き込みを行うレジスタ退避手段と、
を有することを特徴とするプロセッサ。
【請求項１１】
前記レジスタ退避手段は、前記退避状態となった前記レジスタ領域について前記退避許可情報設定手段により再びデータ退避が許可された場合に、前記退避状態となった前記レジスタ領域に記憶されたデータをスタックにプッシュした後、前記レジスタ領域に新たな書き込みを行うことを特徴とする請求項１０記載のプロセッサ。
【請求項１２】
読み込んだ命令に従いレジスタを使用して動作するプロセッサにおいて、
複数のレジスタのそれぞれに対してデータが格納されているか否かを、１ビットを１つのレジスタに対応させたビット列として表したレジスタリストと、
前記レジスタリスト中の特定ビットから一定方向にビットを進めたときにデータが格納されたことを示すビットが現れる順番により、格納されたデータを受け取るレジスタを指定するレジスタ指定手段と、
を有することを特徴とするプロセッサ。
【請求項１３】
プロセッサの動作中にレジスタに記憶されたデータを退避させるレジスタ退避方法において、
２つのレジスタ領域よりなるレジスタセットを設け、
前記レジスタ領域に対する書き込み発生時に前記レジスタ領域に記憶されているデータを退避するか否かを示す退避許可情報を保持し、
前記レジスタ領域に対する書き込みが発生すると、対応する前記退避許可情報に基づいて前記レジスタ領域の書き込みおよび読み出しを禁止して退避状態とするとともに、同じ前記レジスタセット内の他方の前記レジスタ領域に対して書き込みを行う、
ことを特徴とするレジスタ退避方法。
【請求項１４】
前記退避状態となった前記レジスタ領域について前記退避許可情報により再びデータ退避が許可された場合に、前記退避状態となった前記レジスタ領域に記憶されたデータをスタックにプッシュした後、前記レジスタ領域に新たな書き込みを行うことを特徴とする請求項１３記載のレジスタ退避方法。
【請求項１５】
プロセッサの動作中にデータの受け取り対象のレジスタを指定するレジスタ指定方法において、
複数のレジスタのそれぞれに対してデータが格納されているか否かを、１ビットを１つのレジスタに対応させたビット列として表したレジスタリストを設定し、
前記レジスタリスト中の特定ビットから一定方向にビットを進めたときにデータが格納されたことを示すビットが現れる順番により、格納されたデータを受け取るレジスタを指定する、
ことを特徴とするレジスタ指定方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、読み込んだ命令に従いレジスタを使用して動作するプロセッサと、このようなプロセッサにおけるレジスタ退避方法およびレジスタ指定方法に関する。
【０００２】
【従来の技術】
現在、コンピュータや携帯端末はもとより、あらゆる電子機器においてマイクロプロセッサが用いられている。マイクロプロセッサは通常、演算処理に用いるデータやこのデータが格納されているアドレスの保持等に汎用的に使用される汎用レジスタと呼ばれるレジスタ領域を具備している。また、マイクロプロセッサを動作させる場合には、プログラムの長さを短くする等、効率のよい処理を行うために、プログラム中で関数やサブルーチン等の手続きを指定して呼び出し、実行させることが一般的に行われている。
【０００３】
例えば、あるプログラムの実行中に手続き呼び出しを行った際には、この手続きを処理する間、呼び出し時点で呼び出し側が汎用レジスタに保持しているデータやアドレス等を後に使用可能とするために、汎用レジスタの内容をメモリ内のスタック領域に退避させておく必要がある。
【０００４】
図７は、従来のプロセッサにおける手続き呼び出し時のレジスタの退避および復帰の処理例を示すフローチャートである。
ステップＳ７０１において、まず手続きの呼び出し側で使用しているレジスタの値を、スタックに退避させる。通常、手続き呼び出し時に退避させるレジスタはあらかじめ決められている。ステップＳ７０２において、手続きの呼び出しを行う。ステップＳ７０３において、被呼び出し側、すなわち呼び出された手続き側で保持しておくレジスタの値を、必要に応じてスタックに退避させる。ステップＳ７０４において、呼び出された手続きの処理を実行する。
【０００５】
ステップＳ７０５において、手続きの処理が終了すると、被呼び出し側で退避しておいた値を、スタックから対応するレジスタに復帰させる。ステップＳ７０６において、手続きの処理から呼び出し側の処理へ復帰する処理を行う。ステップＳ７０７において、呼び出し側で退避しておいた値を、スタックから汎用レジスタに復帰させる。
【０００６】
また、手続き呼び出しが行われた場合には、呼び出し側の処理と呼び出された手続きとの間で引数や戻り値が正しく受け渡される必要がある。図８は、従来のプロセッサにおける手続き呼び出し時の引数および戻り値の引き渡し処理について示す図である。
【０００７】
図８では、手続き呼び出しが行われた際の演算結果や引数、戻り値に対して割り当てられるレジスタのアドレスを“ｒ０”“ｒ１”“ｒ２”……と表している。
【０００８】
ステップＳ８０１において、手続きの呼び出し側の処理による演算結果が、例えばアドレス“ｒ３”“ｒ５”“ｒ８”のレジスタに格納される。しかし、被呼び出し側で引数を受け取るためのレジスタは通常あらかじめ決められており、ここではこれらのレジスタとしてアドレス“ｒ０”“ｒ１”“ｒ２”が指定されているとする。このため、ステップＳ８０２において、被呼び出し側に引数を渡すために、アドレス“ｒ３”“ｒ５”“ｒ８”上の値を、被呼び出し側で指定されているアドレス“ｒ０”“ｒ１”“ｒ２”のレジスタにコピーする。
【０００９】
ステップＳ８０３において、被呼び出し側は指定したアドレス“ｒ０”“ｒ１”“ｒ２”のレジスタにアクセスして引数を受け取り、この引数を用いて手続きを実行する。
【００１０】
その後、ステップＳ８０４において、手続きの処理によって呼び出し側に戻す演算結果が例えばアドレス“ｒ３”に格納される。しかし、呼び出し側で戻り値を受け取るためのレジスタもあらかじめ決められており、ここでは例えばアドレス“ｒ０”と決められているとする。このため、ステップＳ８０５において、アドレス“ｒ３”上の値を呼び出し側で指定されているアドレス“ｒ０”のレジスタにコピーする。この後、呼び出し側の復帰後に、ステップＳ８０６において、指定したアドレス“ｒ０”にアクセスして戻り値を受け取る。これにより、呼び出し側では手続き実行による演算結果を受け取ることが可能となる。
【００１１】
【発明が解決しようとする課題】
上記のように、従来のプロセッサでは、手続き呼び出し時におけるレジスタの使用方法があらかじめ決められており、この使用方法に従って動作が行われていた。しかし、このようなレジスタの固定的な使用方法により、処理手順に無駄が生じて処理速度の低下を招くことがあった。
【００１２】
例えば、図７で説明した例のように、従来のプロセッサでは、手続き呼び出しが発生すると、決められたレジスタに保持された値がスタックに退避される。しかしこのとき、被呼び出し側で実際に使用するか否かにかかわらず、あらかじめ決められたレジスタの退避が行われるため、退避により使用可能となったすべてのレジスタが、被呼び出し側の処理の中で必ず使用されるとは限らない。従って、必要のないレジスタの退避が行われて、余分な処理時間が発生することが問題となっていた。
【００１３】
また、図８の例で説明したように、手続き呼び出し時において引数や戻り値を格納するためのレジスタの位置が固定的に割り当てられているため、これらのレジスタが演算結果が得られたレジスタと異なる場合には、ステップＳ８０２およびＳ８０５の処理のようにコピーを行う必要があり、処理時間が長くなる原因となっていた。
【００１４】
本発明はこのような課題に鑑みてなされたものであり、手続き呼び出し時の処理を効率化し、処理速度を向上させることが可能なプロセッサを提供することを目的とする。
【００１５】
【課題を解決するための手段】
本発明では上記課題を解決するために、読み込んだ命令に従いレジスタを使用して動作するプロセッサにおいて、２つのレジスタ領域よりなるレジスタセットと、前記レジスタ領域に対する書き込み発生時に前記レジスタ領域に記憶されているデータを退避するか否かを示す退避許可情報を保持する退避許可情報保持手段と、手続きを呼び出して実行する手続き処理手段と、前記手続きの呼び出し以前に前記レジスタ領域のデータ退避を許可するように前記退避許可情報を設定する退避許可情報設定手段と、前記レジスタ領域に対する書き込みが発生すると、対応する前記退避許可情報に基づいて前記レジスタ領域の書き込みおよび読み出しを禁止して退避状態とするとともに、同じ前記レジスタセット内の他方の前記レジスタ領域に対して書き込みを行うレジスタ退避手段とを有することを特徴とするプロセッサが提供される。
【００１６】
このようなプロセッサでは、退避許可情報により記憶データの退避の許可・不許可が管理されるレジスタ領域を２つ具備するレジスタセットが設けられる。退避許可情報は、各レジスタ領域に対する書き込み発生時に記憶データを退避するか否かを示す情報であり、退避許可情報保持手段により保持される。退避許可情報設定手段は、手続きの呼び出し以前のタイミングで、このレジスタ領域のデータ退避を許可するように退避許可情報を設定する。レジスタ退避手段は、レジスタ領域に対する書き込みが発生すると、対応する退避許可情報に基づいてレジスタ領域の書き込みおよび読み出しを禁止して退避状態とするとともに、同じレジスタセット内の他方のレジスタ領域に対して書き込みを行うことで、退避動作を実行する。これにより、手続きを呼び出す段階ではレジスタ領域のデータ退避が許可されるのみで、実際のデータ退避は呼び出された手続きの処理によるレジスタ領域への書き込みが発生する段階まで行われない。
【００１７】
また、レジスタ退避手段は、例えば、退避状態となったレジスタ領域について退避許可情報設定手段により再びデータ退避が許可された場合に、退避状態となったレジスタ領域に記憶されたデータをスタックにプッシュした後、このレジスタ領域に新たな書き込みを行う。
【００１８】
【発明の実施の形態】
以下、本発明の実施の形態を図面を参照して説明する。
図１は、本発明の実施の形態であるプロセッサの構成例を示す図である。
【００１９】
図１に示すプロセッサ１は、命令の取得と命令の発行とを行う制御部１０と、命令に従って演算を実行するデータパス部２０と、外部からのデータ等の読み込みや、演算結果の外部への出力を行うための外部バスＩ／Ｆ（インタフェース）３０によって構成される。また、このプロセッサ１の外部には、外部バスＩ／Ｆ３０からアドレスバス４１およびデータバス４２を介してメモリ２が接続されている。
【００２０】
制御部１０は、命令デコーダ１１とアドレス生成器１２によって構成される。命令デコーダ１１は、外部バスインタフェース３０を介して読み込んだ命令に対するデコード処理を行い、命令実行のための内部の制御信号を生成する。アドレス生成器１２は、命令デコーダ１１からの要求に応じて命令の読み出しアドレスを生成し、外部バスＩ／Ｆ３０を通じてメモリ２に出力する。
【００２１】
データパス部２０は、演算器２１と汎用レジスタ部２２によって構成される。演算器２１は、例えば加算や乗算等の複数の種類の演算が可能で、命令デコーダ１１からの制御信号に従って、汎用レジスタ部２２から読み出したデータに対して各種演算を行う。汎用レジスタ部２２は、演算器２１による演算中や終了後の演算結果を適宜格納する。
【００２２】
外部バスＩ／Ｆ３０は、プロセッサ１の内部の信号を外部のバス信号に変換し、外部（ここではメモリ２）とのデータの読み書きを行う。外部のメモリ２は、命令２ａとデータ２ｂとを格納しており、外部バスＩ／Ｆ３０がアドレスバス４１を介して要求するアドレスの命令２ａまたはデータ２ｂを、データバス４２を介して供給する。なお、図示しないが、メモリ２の内部にはスタックとして使用される領域が確保されている。
【００２３】
以上の構成を有するプロセッサ１における命令実行の流れを説明する。
まず、制御部１０のアドレス生成器１２が、命令を取得するためのアドレスを生成し、外部バスＩ／Ｆ３０を通じてメモリ２に出力する。メモリ２からは、このアドレスに従って命令が読み出され、読み出された命令は外部バスＩ／Ｆ３０を通じて命令デコーダ１１に供給される。
【００２４】
命令デコーダ１１は、読み込んだ命令をデコードして内部の制御信号を生成し、データパス部２０の演算器２１に供給して演算動作を制御する。演算器２１は、供給された制御信号に基づいて、汎用レジスタ部２２から指定されたアドレスに格納された演算データを読み出し、読み出した演算データに対する各種の演算を行う。そして、演算結果を汎用レジスタ部２２の指定されたアドレスに書き戻す。
【００２５】
なお、このプロセッサ１では、“ＬＯＡＤ”命令や“ＳＴＯＲＥ”命令が読み込まれることにより、汎用レジスタ部２２とメモリ２との間で外部バスＩ／Ｆ３０を通じてデータがやり取りされる。
【００２６】
次に、上記のプロセッサ１において手続き呼び出しが行われた際の処理について説明する。
図２は、手続き呼び出し時における汎用レジスタ部２２内のレジスタ構成を概念的に示す図である。
【００２７】
手続き呼び出しが行われる場合、汎用レジスタ部２２内には、図２に示すようなレジスタ領域が設定される。すなわち、汎用レジスタ部２２には、演算中のデータ等を格納する２つずつの汎用レジスタ２２１ａおよび２２１ｂを具備する複数のレジスタセット２２１と、各レジスタセット２２１に対する退避許可情報および退避情報がそれぞれ格納される退避許可レジスタ２２２および退避情報レジスタ２２３の各レジスタ領域が設定される。さらに、引数および戻り値を格納する複数の汎用レジスタ２２４と、各汎用レジスタ２２４におけるデータの有無を示すレジスタリスト２２５の各レジスタ領域が設定される。
【００２８】
レジスタセット２２１内の汎用レジスタ２２１ａおよび２２１ｂは、手続き呼び出しの発生時に各レジスタ内のデータの退避が行われるように決められたレジスタであり、各汎用レジスタ２２１ａおよび２２１ｂは、書き込みおよび読み出しの許可・不許可が、退避許可レジスタ２２２および退避情報レジスタ２２３の保持する値に基づいて制御されるようになっている。
【００２９】
退避許可レジスタ２２２および退避情報レジスタ２２３は、各レジスタセット２２１に対する退避許可情報および退避情報を保持する。退避許可情報は、各レジスタセット２２１内で汎用レジスタ２２１ａおよび２２１ｂのどちらに対して、データ書き込み時の退避動作を許可されているかを示す情報である。退避情報は、各レジスタセット２２１内の各汎用レジスタ２２１ａおよび２２１ｂにおいてデータの退避動作が行われるたびに更新される情報である。
【００３０】
退避許可情報および退避情報は、例えばそれぞれ１ビットのフラグデータとして表され、退避許可レジスタ２２２および退避情報レジスタ２２３は、このような退避許可情報および退避情報を、ともに各レジスタセット２２１に対して１ビット分が割り当てられたビット列として保持する。すなわち、退避許可レジスタ２２２および退避情報レジスタ２２３の各ビットは、各レジスタセット２２１のアドレスに関連付けられて設定される。
【００３１】
また、汎用レジスタ２２４は、メインプログラムによる処理や、このメインプログラムによって呼び出された関数やサブルーチン等の手続きの処理において、引数や戻り値となる値が格納されるレジスタである。レジスタリスト２２５は、各汎用レジスタ２２４内にデータが格納されているか否かを示すフラグデータを、各汎用レジスタ２２４に対して１ビット分が割り当てられたビット列として保持している。
【００３２】
なお、図２では、各レジスタセット２２１内におけるデータ退避用の汎用レジスタ２２１ａおよび２２１ｂと、引数および戻り値の格納用の汎用レジスタ２２４とが分離されているが、レジスタセット２２１内の汎用レジスタ２１１ａおよび２２１ｂが引数および戻り値の格納用の汎用レジスタ２２４として機能できるようにしてもよい。
【００３３】
次に、上記のレジスタセット２２１と退避許可レジスタ２２２および退避情報レジスタ２２３を用いた手続き呼び出し時の処理について説明する。
図３は、レジスタセット２２１内の各汎用レジスタ２２１ａおよび２２１ｂの状態遷移を説明するための図である。
【００３４】
図３では、例として１つのレジスタセット２２１内の各汎用レジスタ２２１ａおよび２２１ｂにおけるアクセス状態と、これらのレジスタに対応する退避許可レジスタ２２２および退避情報レジスタ２２３内の退避許可情報および退避情報の推移の例について示している。
【００３５】
手続き呼び出しが行われる場合、それ以前にレジスタに格納していたデータのうち、手続きの実行終了後に使用されるデータを退避させておく必要がある。本発明では、手続き呼び出しが発生した時点ではレジスタの退避は行わず、その後に呼び出された手続き内の処理によりレジスタに対する書き込みが実際に行われる段階で、レジスタの退避動作を行うことで、必要のない退避動作を実行しないようにする。
【００３６】
図３（Ａ）の状態は、退避許可情報および退避情報はともに“０”である状態である。このときレジスタセット２２１では、一方の例えば汎用レジスタ２２１ａが書き込み・読み出しの双方が可能な状態（この状態を通常状態と呼称する）で、他方の汎用レジスタ２２１ｂが書き込み・読み出しをともに禁止した退避状態となっている。ここで、汎用レジスタ２２１ａは、例えば手続きの呼び出し側であるメインプログラムの処理で使用されていたレジスタ領域であり、手続きの呼び出しに先立って、この汎用レジスタ２２１ａの領域に対応する退避領域として、汎用レジスタ２２１ｂが確保される。
【００３７】
この状態から図３（Ｂ）のように、退避許可情報に“１”をセットして、通常状態であった汎用レジスタ２２１ａに対する退避動作を許可する。このとき、汎用レジスタ２２１ａは、書き込みが禁止されて読み出しのみが許可された状態となるとともに、この後に汎用レジスタ２２１ａに対する書き込みが発生した時点で退避動作に移行可能な状態となる。
【００３８】
手続き呼び出しに際して、この図３（Ｂ）の状態への移行は、例えば手続きが呼び出される直前に行われる。このタイミングは、従来ではレジスタ内のデータについてスタックへの退避動作が行われていたが、本発明ではこの段階では実際の退避動作を行わず、この後に手続きが呼び出されても、この手続きの処理の中での元のデータの読み出しについては許可されている。また、この状態は次にデータの書き込みが発生するまで維持される。
【００３９】
次に、図３（Ｂ）の状態から新たな書き込みが発生すると、書き込みが禁止されていた汎用レジスタ２２１ａに対して退避動作が行われて、図３（Ｃ）の状態に移行する。ここでは、汎用レジスタ２２１ａが書き込み・読み出しが禁止されるとともに、汎用レジスタ２２１ｂが通常状態に変わる。これにより、汎用レジスタ２２１ａが退避状態となり、新たな書き込みが汎用レジスタ２２１ｂに対して行われる。また、退避情報に“１”がセットされて、汎用レジスタ２２１ａについて退避動作が行われたことが表される。
【００４０】
この例では、汎用レジスタ２２１ａへの書き込み発生時において、退避許可情報が“１”となった場合にのみこの汎用レジスタ２２１ａの退避動作が行われる。従って、手続き呼び出しの際に、まず退避許可情報により書き込み発生時の退避動作を許可しておき、手続きの処理により書き込みが発生した時点で実際の退避動作を行わせることができるので、必要なレジスタのみ退避動作が行われ、処理効率が高まる。
【００４１】
なお、手続きからの復帰時における退避データの復帰動作は、以上の逆の手順で行えばよい。このとき、退避情報によってどのレジスタセット２２１内において退避動作が行われたかを知ることができるので、退避動作が行われたレジスタセット２２１内において退避データの復帰動作が行われる。
【００４２】
図４は、以上のプロセッサ１における手続き呼び出しおよび復帰の際のデータ退避および復帰の処理手順を示すフローチャートである。
図４では、メインプログラムの処理から関数やサブルーチン等の手続きが最初に呼び出され、その後メインプログラムの処理に復帰するまでの処理手順について示している。
【００４３】
ステップＳ４０１において、各レジスタセット２２１、退避許可レジスタ２２２および退避情報レジスタ２２３のレジスタ領域を確保する処理を行う。この処理では、手続きの呼び出し側で格納値を保存しておく必要のあるレジスタをレジスタセット２２１内の汎用レジスタ２２１ａとして設定し、さらに各汎用レジスタ２２１ａに対する退避領域となるレジスタを汎用レジスタ２２１ｂとして設定する。また、この汎用レジスタ２２１ｂと、退避許可レジスタ２２２および退避情報レジスタ２２３として確保したレジスタ領域のうち、それ以前に格納されていた値を保存しておく必要があるものについては、これらの値をスタックに退避させる。
【００４４】
ステップＳ４０２において、退避情報レジスタ２２３内の退避情報をすべて“０”にクリアし、初期設定を行う。この後、ステップＳ４０３において、呼び出し側すなわちメインプログラム側で、格納されているデータの保存が必要なレジスタセット２２１に対応する退避許可情報に“１”を設定する。このステップＳ４０３の処理は、次のステップＳ４０４の手続き呼び出しの直前に行われることが望ましい。
【００４５】
ステップＳ４０４において、手続きの呼び出しを行う。ステップＳ４０５において、呼び出した手続きを実行する。この手続きによる処理の中で、退避許可情報がセットされたレジスタセット２２１に対して書き込みが発生した場合には、これらのレジスタセット２２１に対して上記の図３で示したような退避動作と、これに伴う退避情報レジスタ２２３内の対応する退避情報の更新が行われる。これにより、手続きの呼び出し後、実際に書き込みが発生したレジスタセット２２１においてのみ退避動作が行われるため、処理効率が高められる。
【００４６】
ステップＳ４０６において、この後のステップＳ４０７での手続き復帰処理に先立って、レジスタセット２２１における退避データの復帰動作を行う。このとき、各レジスタセット２２１では退避情報が参照され、この退避情報がセットされていたレジスタセット２２１でのみ復帰動作が行われる。レジスタセット２２１の退避動作は必要なものだけに行われていたため、必要最小限の復帰動作が行われる。
【００４７】
ステップＳ４０７において、呼び出された手続きから元のプログラムへの復帰処理を行う。ステップＳ４０８において、ステップＳ４０１で確保したレジスタ領域の復帰処理を行う。具体的には、これらのレジスタ領域の確保時にスタックに退避しておいたデータを、スタックからプッシュして元のレジスタに格納する処理等が行われる。
【００４８】
ところで、呼び出された手続きの処理の中で、さらに手続きの呼び出しが行われる場合がある。この場合は、すでに退避動作が行われた汎用レジスタ２２１ａに格納された値をすべてスタックに退避させた後、この汎用レジスタ２２１ａに対して新たなデータの書き込みを行う。
【００４９】
例えば、図３（Ｃ）の段階で再び手続き呼び出しが行われ、このレジスタセット２２１内の汎用レジスタ２２１ｂに格納されたデータの保存が必要となったときは、すでに退避状態となっていた汎用レジスタ２２１ａに格納されたデータを、スタックにプッシュした後、退避許可情報を“０”にセットして、汎用レジスタ２２１ｂに対する書き込みを禁止する。この後、新たに呼び出された手続きが実行されて、上記のレジスタセット２２１に対して書き込みが発生すると、汎用レジスタ２２１ｂが退避状態とされ、退避情報が更新される。また、汎用レジスタ２２１ａが通常状態とされてデータの読み書きが行われる。この後、手続きから復帰する場合には、スタックに退避してあったデータが元の汎用レジスタ２２１ｂに格納される。
【００５０】
この処理の中で、汎用レジスタ２２１ａに格納されていたデータをスタックにプッシュする時点において、プッシュ動作が行われるレジスタセット２２１ではすべて退避情報が“１”にセットされていることから、退避情報レジスタ２２３の保持するビット列では、プッシュ動作を行う必要のあるレジスタの位置がすべて示されている。従ってこの時点では、退避情報レジスタ２２３の情報に基づいて、必要なレジスタセット２２１におけるスタック退避動作をまとめて行うことができる。
【００５１】
また、必要なスタック退避動作が終わった直後に、さらにこのときの退避情報レジスタ２２３の保持するビット列をスタックにプッシュしておく。これにより、手続きの処理から復帰する際に、まずスタックから退避情報レジスタ２２３のビット列がポップされて、データの格納先のレジスタセット２２１が指定され、さらにスタックから退避データをポップして、これらの退避データを指定されたレジスタセット２２１に格納することが可能となる。
【００５２】
このような退避情報レジスタ２２３の利用方法により、各レジスタセット２２１からスタックへプッシュした退避データについて、復帰時のそれらのポップ先のアドレスや、ポップすべき順番等の情報をプログラム側で管理する必要がなくなり、退避動作時および復帰動作時における処理効率を高め、処理を高速化することが可能となる。
【００５３】
なお、以上の例では、退避許可レジスタ２２２および退避情報レジスタ２２３の各ビット列において、１ビットに対して１つのレジスタセット２２１が割り当てられていたが、１ビットに対して複数のレジスタセット２２１を割り当ててもよい。
【００５４】
以上の手続き呼び出し時のレジスタ退避および復帰の処理では、呼び出された手続きによって書き込みが行われる時点で、そのレジスタセット２２１において退避動作が行われる。このため、被呼び出し側で実際に書き込み領域として使用されるレジスタセット２２１でのみ退避動作が行われ、必要のない無駄な退避動作が行われない。従って、レジスタ退避および復帰時の処理効率が高められ、処理を高速化することができる。
【００５５】
また、各レジスタセット２２１は２つの汎用レジスタ２２１ａおよび２２１ｂの領域を有しており、１度目の退避動作では一方の汎用レジスタ２１１ａが書き込み・読み出しが不能な退避状態とされるだけで、スタックへの退避が行われない。このため、スタックへのプッシュおよびポップの動作回数が低減されて、処理時間が短縮化される。
【００５６】
さらに、レジスタセット２２１内のデータがスタックにプッシュされる場合には、退避情報レジスタ２２３のビット列が利用されることにより、各レジスタセット２２１からスタックへプッシュした退避データのポップ先のアドレスや、ポップすべき順番等の情報をプログラム側で管理する必要がなくなり、退避動作時および復帰動作時における処理時間を短縮することができる。
【００５７】
次に、上記の図２で示した汎用レジスタ２２４およびレジスタリスト２２５を用いた手続き呼び出し時の処理について説明する。
手続きの呼び出し時や復帰時には、上記の説明のようにデータの退避や復帰の処理が行われるとともに、呼び出し側と被呼び出し側の間で引数や戻り値の受け渡しが行われる。上述したように、各汎用レジスタ２２４は、手続きの呼び出し側と被呼び出し側との間で受け渡される引数や戻り値が格納されるレジスタである。また、レジスタリスト２２５は、各汎用レジスタ２２４においてデータが格納されているか否かについて、１ビットの１つの汎用レジスタ２２４を割り当てたビット列として管理している。
【００５８】
従来、引数や戻り値を受け渡す場合は、これらを受け取るためのレジスタが受け取り側で指定されていたために、これらのレジスタに演算結果等をコピーする必要が生じる場合が多かった。本発明では、複数の汎用レジスタ２２４の中で引き渡し側がデータを格納する場所を固定せず、引き渡し側が設定したレジスタリスト２２５の値を受け取り側が参照して必要なデータの指定を可能とすることにより、データのコピーの発生回数を抑制して処理速度を向上させる。
【００５９】
図５は、レジスタリスト２２５を用いたデータの指定方法を説明するための図である。
図５では、例として、レジスタリスト２２５が１６ビットのビット列を保持する場合を示している。この場合、１６個の汎用レジスタ２２４が設けられていることになる。
【００６０】
図５（Ａ）では、レジスタリスト２２５のビット列において、３桁目、４桁目、１０桁目および１４桁目に“１”が設定されている。これは、データの引き渡し側で演算結果が３番目、４番目、１０番目および１４番目に対応する汎用レジスタ２２４に格納されたことを示す。
【００６１】
データの受け取り側は、このようなレジスタリスト２２５のビット列を引き渡し側から受け取るとともに、レジスタリスト２２５中の任意のレジスタを指定するための数値であるレジスタ指定情報を設定する。このレジスタ指定情報は、レジスタリスト２２５のビット列の中の特定のビットから一定方向にビットを進めたときに、データが格納されているビットが何番目に現れるかを指定する情報であり、これにより指定されたビットに対応する汎用レジスタ２２４を指定し、格納されたデータを受け取ることができる。
【００６２】
ここで、例えばレジスタリスト２２５のビット列の最下位ビットからの順番でレジスタを指定するものとすると、図５（Ｂ）のようにレジスタ指定情報として“２”が設定された場合、ビット列の最下位ビットから２番目に“１”が現れるのは４桁目となる。従って、データの受け取り側は、４桁目に対応する汎用レジスタ２２４を指定することにより必要なデータを受け取ることができる。
【００６３】
図６は、手続き呼び出しおよび復帰時における引数および戻り値のレジスタ指定処理の具体例を示す図である。
図６において、引数および戻り値を格納するための汎用レジスタ２２４のアドレスを、レジスタリスト２２５のビット列の下位から順に“ｒ０”“ｒ１”“ｒ２”……と表している。また、レジスタリスト２２５のビット列を１６進数として表している。
【００６４】
ステップＳ６０１において、呼び出し側のプログラムの処理により、被呼び出し側に引数として引き渡す演算結果が例えばアドレス“ｒ３”“ｒ５”“ｒ８”の各汎用レジスタ２２４に格納される。
【００６５】
ステップＳ６０２において、引数を格納した汎用レジスタ２２４に応じて３桁目、５桁目、８桁目のビットを立てたレジスタリスト２２５のビット列（０ｘ０１２４）が作成される。なお、以上のステップＳ６０１およびＳ６０２の処理は、図４のフローチャート中のステップＳ４０１の直前に行われる。
【００６６】
ステップＳ６０３において、レジスタリスト２２５のビット列が呼び出し側から被呼び出し側に渡され、被呼び出し側がこのビット列を受け取る。また、レジスタ指定情報を設定する。ここではレジスタ指定情報として“１”“２”“３”が設定されている。
【００６７】
ステップＳ６０４において、手続きによる処理に応じてレジスタリスト２２５のビット列を参照してレジスタ指定情報を順次適用し、該当するアドレス“ｒ３”“ｒ５”“ｒ８”に格納された引数を受け取り、演算を行う。
【００６８】
また、ステップＳ６０５において、手続きによる処理により呼び出し側に戻り値として引き渡す演算結果が例えばアドレス“ｒ３”の汎用レジスタ２２４に格納される。なお、以上のステップＳ６０３〜Ｓ６０５の処理は、図４のフローチャート中のステップＳ４０５内の処理として行われる。
【００６９】
ステップＳ６０６において、戻り値を格納した汎用レジスタ２２４に応じて３桁目のビットを立てたレジスタリスト２２５のビット列（０ｘ０００４）が作成される。なお、このステップＳ６０６の処理は、図４のフローチャート中のステップＳ４０６の直前に行われる。
【００７０】
ステップＳ６０７において、レジスタリスト２２５のビット列が被呼び出し側から呼び出し側に渡され、呼び出し側はこのビット列を参照するとともに、レジスタ指定情報を設定する。ここではレジスタ指定情報として“１”が設定されている。
【００７１】
ステップＳ６０８において、手続きによる処理に応じてレジスタリスト２２５のビット列を参照してレジスタ指定情報を適用し、該当するアドレス“ｒ３”に格納された戻り値を受け取って、演算を行う。なお、以上のステップＳ６０７およびＳ６０８の処理は、図４のフローチャート中のステップＳ４０８の後に行われる。
【００７２】
なお、以上の処理例では、引数と戻り値を格納する汎用レジスタ２２４の領域を同一としたが、これらが別々に設けられてもよい。
以上の処理によれば、引数や戻り値の引き渡し側は、これらの値を固定的に指定されたレジスタに格納する必要がなくなる。このため、レジスタの使用における柔軟性が増すとともに、データのコピーの発生回数が低減され、処理時間が短縮される。
【００７３】
従って、このようなレジスタの指定処理と、上述したデータ退避および復帰の処理を併用することにより、手続き呼び出しおよび復帰時における処理効率を高め、処理速度を向上させることができる。
【００７４】
なお、以上の実施の形態例で示したようなレジスタセットと退避許可レジスタ、退避情報レジスタを用いたレジスタ退避および復帰処理は、手続き呼び出しを行う場合に限らず、レジスタに格納されたデータを退避する必要が生じるあらゆる処理において適用することが可能である。同様に、上記のようなレジスタリストを使用したレジスタ指定処理も、手続き呼び出しを行う場合に限らず、データの受け渡しが生じるあらゆる処理において適用することが可能である。
【００７５】
【発明の効果】
以上説明したように、本発明のプロセッサでは、退避許可情報設定手段により、手続きの呼び出し以前のタイミングでレジスタ領域のデータ退避を許可するように退避許可情報が設定され、レジスタ領域に対する書き込みが発生すると、レジスタ退避手段により、対応する退避許可情報に基づいてレジスタ領域の書き込みおよび読み出しを禁止して退避状態とするとともに、同じレジスタセット内の他方のレジスタ領域に対して書き込みを行う退避動作が実行される。従って、実際のデータ退避は呼び出された手続きの処理によるレジスタ領域への書き込みが発生する段階まで行われず、必要のないデータ退避が行われないので、手続き呼び出しおよび復帰時の処理効率が高まり、処理時間が短縮される。
【図面の簡単な説明】
【図１】本発明の実施の形態であるプロセッサの構成例を示す図である。
【図２】手続き呼び出し時のための汎用レジスタ部内のレジスタ構成を概念的に示す図である。
【図３】レジスタセット内の各汎用レジスタの状態遷移を説明するための図である。
【図４】本発明のプロセッサにおける手続き呼び出しおよび復帰の際のデータ退避および復帰の処理手順を示すフローチャートである。
【図５】レジスタリストを用いたデータの指定方法を説明するための図である。
【図６】手続き呼び出しおよび復帰時における引数および戻り値のレジスタ指定処理の具体例を示す図である。
【図７】従来のプロセッサにおける手続き呼び出し時のレジスタの退避および復帰の処理例を示すフローチャートである。
【図８】従来のプロセッサにおける手続き呼び出し時の引数および戻り値のレジスタ割り当ての様子を示す図である。
【符号の説明】
１……プロセッサ、２……メモリ、１０……制御部、１１……命令デコーダ、１２……アドレス生成器、２０……データパス部、２１……演算器、２２……汎用レジスタ部、３０……外部バスＩ／Ｆ、４１……アドレスバス、４２……データバス、２ａ……命令、２ｂ……データ、２２１……レジスタセット、２２１ａ、２２１ｂ……汎用レジスタ、２２２……退避許可レジスタ、２２３……退避情報レジスタ、２２４……汎用レジスタ、２２５……レジスタリスト
【図１】
2004030224.tif 000003
【図２】
2004030224.tif 000004
【図３】
2004030224.tif 000005
【図４】
2004030224.tif 000006
【図５】
2004030224.tif 000007
【図６】
2004030224.tif 000008
【図７】
2004030224.tif 000009
【図８】
2004030224.tif 000010