(57)【要約】【課題】情報処理装置においてスタックメモリの使用効率を高める。【解決手段】情報処理装置２００であって、所定の関数の呼び出しに伴いスタックメモリ２３１へ保証レジスタの内容を圧縮して退避することを示す圧縮情報が機械語プログラム中に有るか否かをデコーダにおいて識別し、圧縮情報が有る場合に保証レジスタの内容を圧縮してスタックメモリ２３１へ退避する圧縮部２４０と、所定の関数の呼び出し終了に伴い保証レジスタへスタックメモリ２３１の内容を伸張して復帰することを示す伸張情報が機械語プログラム中に有るか否かをデコーダにおいて識別し、伸張情報が有る場合に、スタックメモリ２３１の内容を伸張して保証レジスタへ復帰する伸張部２６０とを備える。【選択図】　　図１０
2004062220.tif 000002
【特許請求の範囲】
【請求項１】
演算に用いるデータを保持する１つ以上のレジスタを有し、機械語プログラムに従って処理を行うプロセッサを含む情報処理装置であって、所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避することを示す情報が、前記機械語プログラム中に有るか否かを識別する圧縮識別手段と、
圧縮識別手段による識別結果が肯定的である場合には所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避し、圧縮識別手段による識別結果が否定的である場合には所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮せずに退避する退避手段と
を備えることを特徴とする情報処理装置。
【請求項２】
前記情報処理装置はさらに、
所定の関数の呼び出し終了に伴い前記レジスタへスタックメモリに退避されているデータを伸張して復帰することを示す情報が、前記機械語プログラム中に有るか否かを識別する伸張識別手段と、
伸張識別手段による識別結果が肯定的である場合には所定の関数の呼び出し終了に伴い前記レジスタへ前記スタックメモリに退避されているデータを伸張して復帰し、伸張識別手段による識別結果が否定的である場合には所定の関数の呼び出し終了に伴い前記レジスタへ前記スタックメモリに退避されているデータを伸張せずに復帰する復帰手段とを備えること
を特徴とする請求項１記載の情報処理装置。
【請求項３】
前記退避手段は、
所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避する場合に、所定の関数の呼び出し終了に伴い前記レジスタへスタックメモリに退避されているデータを伸張して復帰することを示す伸張情報と、前記レジスタの内容を圧縮したデータとを対応付けてスタックメモリに退避する伸張情報退避手段を含み、
前記情報処理装置はさらに、
所定の関数の呼び出し終了に伴い前記レジスタへ復帰しようとするデータと対応付けられている伸張情報が、スタックメモリ中に有るか否かを識別する伸張識別手段と、
伸張識別手段による識別結果が肯定的である場合には所定の関数の呼び出し終了に伴い前記レジスタへスタックメモリ中の前記復帰しようとするデータを伸張して復帰し、伸張識別手段による識別結果が否定的である場合には所定の関数の呼び出し終了に伴い前記レジスタへスタックメモリ中の前記復帰しようとするデータを伸張せずに復帰する復帰手段とを備えること
を特徴とする請求項１記載の情報処理装置。
【請求項４】
前記退避手段はさらに、
前記レジスタに格納されている第１データを所定のアルゴリズムに従って、第２データに変換するデータ変換手段と、
前記第２データのデータサイズを、圧縮効率を示すしきい値と比較する比較手段と、
前記第２データのデータサイズがしきい値より小さい場合には前記第２データをスタックメモリへ退避し、前記第２データのデータサイズがしきい値より大きい場合には前記第１データをスタックメモリへ退避する選択退避手段とを含むこと
を特徴とする請求項３記載の情報処理装置。
【請求項５】
前記退避手段は、圧縮識別手段による識別結果が肯定的である場合、前記所定の関数の呼び出し元における呼び出し時にスタックメモリへ前記レジスタの内容を圧縮して退避し、
前記復帰手段は、伸張識別手段による識別結果が肯定的である場合、前記所定の関数の呼び出し元における呼び出し終了時に前記レジスタへスタックメモリに退避されているデータを伸張して復帰すること
を特徴とする請求項２、及び請求項３のいづれか１項に記載の情報処理装置。
【請求項６】
前記退避手段は、圧縮識別手段による識別結果が肯定的である場合、呼び出された前記所定の関数における処理開始時にスタックメモリへ前記レジスタの内容を圧縮して退避し、
前記復帰手段は、伸張識別手段による識別結果が肯定的である場合、呼び出された前記所定の関数における処理終了時に前記レジスタへスタックメモリに退避されているデータを伸張して復帰すること
を特徴とする請求項２、及び請求項３のいづれか１項に記載の情報処理装置。
【請求項７】
演算に用いるデータを保持する１つ以上のレジスタを有し、機械語プログラムに従って処理を行うプロセッサを含む情報処理装置における情報処理方法であって、
所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避することを示す情報が、前記機械語プログラム中に有るか否かを識別する圧縮識別ステップと、
圧縮識別ステップによる識別結果が肯定的である場合には所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避し、圧縮識別ステップによる識別結果が否定的である場合には所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮せずに退避する退避ステップと
を備えることを特徴とする情報処理方法。
【請求項８】
プログラム変換装置であって、
１、又は複数の関数を含む入力プログラムを入手する入手手段と、
所定の関数の呼び出しに伴いスタックメモリへプロセッサ内のレジスタの内容を圧縮して退避するか、圧縮せずにそのまま退避するかを前記入力プログラムにおいて判定する判定手段と、
当該判定手段により圧縮して退避すると判定された場合、スタックメモリへ前記レジスタの内容を圧縮して退避することをプロセッサに示す情報を備える出力プログラムに、前記入力プログラムを変換する変換手段と
を備えることを特徴とするプログラム変換装置。
【請求項９】
前記判定手段は、
前記レジスタの内容を格納したスタックメモリを参照するスタックアクセス関数を検出する検出手段と、
前記スタックアクセス関数、及び前記スタックアクセス関数の呼び出し側の上位に位置する全ての階層の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮せずにそのまま退避すると判定する除外手段とを含むこと
を特徴とする請求項８記載のプログラム変換装置。
【請求項１０】
前記判定手段は、
スタックメモリへ前記レジスタの内容を圧縮して退避することを示す情報が前記所定の関数に事前に付加されている場合、前記所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避すると判定する事前指定判定手段を含むこと
を特徴とする請求項８記載のプログラム変換装置。
【請求項１１】
前記判定手段は、
前記所定の関数が内部にサブルーチンを持つ場合、前記入力プログラムが含む関数群の階層構造を示すネスト情報に基づいて、前記所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避するか、圧縮せずにそのまま退避するかを判定するネスト判定手段を含むこと
を特徴とする請求項８記載のプログラム変換装置。
【請求項１２】
前記変換手段は、
前記所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避することをプロセッサに示す情報を、前記所定の関数の呼び出し元関数に付加する圧縮情報付加手段と、
前記所定の関数の呼び出し終了に伴い前記レジスタへスタックメモリに退避されているデータを伸張し復帰することをプロセッサに示す情報を、前記所定の関数の呼び出し元関数に付加する伸張情報付加手段とを含むこと
を特徴とする請求項８記載のプログラム変換装置。
【請求項１３】
前記変換手段は、
前記所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避することをプロセッサに示す情報を、呼び出される前記所定の関数に付加する圧縮情報付加手段と、
前記所定の関数の呼び出し終了に伴い前記レジスタへスタックメモリに退避されているデータを伸張し復帰することをプロセッサに示す情報を、呼び出される前記所定の関数に付加する伸張情報付加手段とを含むこと
を特徴とする請求項８記載のプログラム変換装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、関数の呼び出しに伴い発生するスタックメモリへのレジスタの内容の退避時にスタックメモリの使用効率を向上させる技術に関する。
【０００２】
【従来の技術】
プログラムを実行するコンピュータは、プログラムのメインルーチンから関数の呼び出しに伴い、現在実行している処理のアドレスや、レジスタなどの資源をスタックメモリに退避し、呼び出された関数からの復帰に伴い、スタックメモリからレジスタを復帰し、退避したアドレスへ処理を戻す。しかしながら、全てのレジスタを退避するとそれだけ退避に要するサイクル数やメモリ容量が大きくなりシステム性能が劣化するので、関数の前後で値を保証する必要のある保証レジスタのみを退避の対象として、退避すべきレジスタの数を削減している。
【０００３】
サイクル数削減という点では、例えばサブルーチンの呼び出し側と呼び出され側とが異なるファイルに配置されていてもパイプラインの乱れを生じることなくサブルーチンを呼び出すプログラム変換装置及びプロセッサが特開平８−３０５５８１号公報に開示されている。
【０００４】
【発明が解決しようとする課題】
しかしながら、近年のプログラムの大規模化に伴い、プロセッサが有するレジスタの本数は増大する傾向にある。従って、保証レジスタ群だけをスタックメモリへ退避するとしてもそのデータ量は大量となり、スタックメモリのオーバーフローを回避するために大容量のスタックメモリを必要とする問題がある。
【０００５】
本発明はかかる問題に鑑み、スタックメモリの使用効率を上げることでスタックメモリのオーバーフローが発生する危険性を抑え、省メモリを実現する情報処理装置、情報処理方法、およびプログラム変換装置を提供することを目的とする。
【０００６】
【課題を解決するための手段】
上記目的を達成するために、本発明に係る情報処理装置は、演算に用いるデータを保持する１つ以上のレジスタを有し、機械語プログラムに従って処理を行うプロセッサを含む情報処理装置であって、所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避することを示す情報が、前記機械語プログラム中に有るか否かを識別する圧縮識別手段と、圧縮識別手段による識別結果が肯定的である場合には所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避し、圧縮識別手段による識別結果が否定的である場合には所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮せずに退避する退避手段とを備えることを特徴とする。
【０００７】
また、本発明に係る情報処理方法は、演算に用いるデータを保持する１つ以上のレジスタを有し、機械語プログラムに従って処理を行うプロセッサを含む情報処理装置における情報処理方法であって、所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避することを示す情報が、前記機械語プログラム中に有るか否かを識別する圧縮識別ステップと、圧縮識別ステップによる識別結果が肯定的である場合には所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避し、圧縮識別ステップによる識別結果が否定的である場合には所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮せずに退避する退避ステップとを備えることを特徴とする。
【０００８】
これによって、関数の呼び出しに伴いスタックメモリへ退避するレジスタの内容を圧縮することができるので、関数の呼び出しの前後でのレジスタの値を保証したうえで、スタックメモリに格納するデータ量を削減することができる。
従って、スタックメモリの使用効率を上げることでスタックメモリのオーバーフローが発生する危険性を抑え、省メモリを実現することができる。
【０００９】
上記目的を達成するために、本発明に係わるプログラム変換装置は、プログラム変換装置であって、１、又は複数の関数を含む入力プログラムを入手する入手手段と、所定の関数の呼び出しに伴いスタックメモリへプロセッサ内のレジスタの内容を圧縮して退避するか、圧縮せずにそのまま退避するかを前記入力プログラムにおいて判定する判定手段と、当該判定手段により圧縮して退避すると判定された場合、スタックメモリへ前記レジスタの内容を圧縮して退避することをプロセッサに示す情報を備える出力プログラムに、前記入力プログラムを変換する変換手段とを備えることを特徴とする。
【００１０】
これによって、呼び出しに伴いスタックメモリへ退避するレジスタの内容を圧縮するのに適した関数を、圧縮対象とすることができる。
従って、スタックメモリの使用効率を上げることができるプログラムを実現することができる。
【００１１】
【発明の実施の形態】
以下、本発明の実施の形態について、図１から図２６を用いて説明する。
＜概要＞
本発明は、関数の呼び出しに伴いスタックメモリに退避する保証レジスタの内容を圧縮することで、スタックメモリの効率的な使用を実現するものである。
【００１２】
以下では、まず、プログラムに従って動作するコンピュータであり、関数の呼び出し、復帰に伴いスタックへ退避、復帰する保証レジスタの内容を圧縮、伸張するかを示す情報を付加された実行ファイル２０を生成するプログラム変換装置１００と関連ファイル群について説明し、続いて、プログラムに従って動作するコンピュータであり、プログラム変換装置１００が生成する実行ファイル２０を実行する情報処理装置２００について説明する。
【００１３】
＜構成＞
図１は、本発明の実施の形態に係わるプログラム変換装置、及び情報処理装置を備えた情報処理システムの構成を示す図である。
図に示す情報処理システムは、ソースファイル群１０を変換し、実行ファイル２０を生成するプログラム変換装置１００と、実行ファイル２０を実行する情報処理装置２００とから構成される。
【００１４】
（ソースファイル）
ソースファイル群１０は、ここではソースファイル１１、及びソースファイル１２の２つのソースファイルから構成される。
図２は、ソースファイル１１、図３はソースファイル１２の一例を模式的に示す図である。
【００１５】
ソースファイル１１、ソースファイル１２は高級言語により記述されたプログラムファイルであり、ソースファイル１１は関数ｍａｉｎに関する記述部１１ａと、関数ｆｕｎｃ＃ａに関する記述部１１ｂと、関数ｆｕｎｃ＃ｂに関する記述部１１ｃと、関数ｆｕｎｃ＃ｄに関する記述部１１ｄと、関数ｆｕｎｃ＃ｅに関する記述部１１ｅと、関数ｆｕｎｃ＃ｆに関する記述部１１ｇとを含み、ソースファイル１２は関数ｆｕｎｃ＃ｃに関する記述部１２ａを含む。ここで記述される関数群は呼び出し、及び復帰により処理を分岐するツリー構造を持つ。
【００１６】
関数ｍａｉｎに関する記述部１１ａは、関数ｆｕｎｃ＃ａを呼び出す命令と、関数ｆｕｎｃ＃ｂを呼び出す命令と、関数ｆｕｎｃ＃ｅを呼び出す命令とを含む。関数ｆｕｎｃ＃ａに関する記述部１１ｂは関数ｆｕｎｃ＃ｃを呼び出す命令を含む。関数ｆｕｎｃ＃ｃに関する記述部１２ａは関数ｆｕｎｃ＃ｆを呼び出す命令を含む。関数ｆｕｎｃ＃ｂに関する記述部１１ｃは関数ｆｕｎｃ＃ｃを呼び出す命令と、関数ｆｕｎｃ＃ｄを呼び出す命令と、前記２つの命令のどちらか一方に条件分岐する判定とを含む。関数ｆｕｎｃ＃ｄに関する記述部１１ｄは、インラインアセンブラ記述された、スタックポインタが指し示すアドレスから４バイト上位のアドレスのメモリ内容をレジスタｒ０に転送するロード命令と、レジスタｒ０の内容と“０ｘｆ０”の論理積をレジスタｒ０に格納する論理積演算命令と、レジスタｒ０の内容をスタックポインタから４バイト上位のアドレスに転送するストア命令を含む。関数ｆｕｎｃ＃ｅに関する記述部１１ｅは、プラグマ＃ＳＴＡＣＫ＃ＣＯＭＰＲＥＳＳの記述部１１ｆを含む。ここでプラグマ＃ＳＴＡＣＫ＃ＣＯＭＰＲＥＳＳとは関数の呼び出し時に保証レジスタからスタックメモリへ退避する退避データを圧縮することを、プログラム変換装置１００に明示するプラグマである。
【００１７】
（プログラム変換装置）
図４は、本発明の実施の形態に係わるプログラム変換装置の構成を示す図である。
プログラム変換装置１００は、コンパイル部１１０、中間コード保持部１２０、選択候補情報保持部１３０、リンク部１４０、及び記憶部１５０から構成される。
【００１８】
コンパイル部１１０はソースファイル群１０を取得し、中間コード、及び選択候補テーブル１３１を作成するコンパイラであり、ソースファイル取得部１１１、翻訳部１１２、スタックアクセス検出部１１３、及びユーザ指定関数抽出部１１４から構成される。
ソースファイル取得部１１１は、記憶部１５０が保持するソースファイル１１、及びソースファイル１２を取得し、翻訳部１１２、スタックアクセス検出部１１３、及びユーザ指定関数抽出部１１４にソースファイル１１、及びソースファイル１２を渡す。
【００１９】
翻訳部１１２は、ソースファイル１１、及びソースファイル１２に記述される各関数を、呼び出し元の関数から処理を分岐するコール命令、関数内の処理を行う機械語命令、及び呼び出し元の関数へ処理を復帰するリターン命令に変換して、ソースファイル１１、及びソースファイル１２から機械語の中間コード群を生成する。翻訳部１１２は、生成した中間コード群を中間コード保持部１２０へ出力する。
【００２０】
スタックアクセス検出部１１３は、ソースファイル１１、及びソースファイル１２に含まれる各関数において各関数内の処理を調査し、各関数の処理開始時のスタックポインタの値より上位のアドレスを参照する記述がある関数を検出する。スタックアクセス検出部１１３は検出した関数の名前と関数評価値を選択候補情報保持部１３０が保持する選択候補テーブル１３１に書き込む。ここで検出された関数の関数評価値は０とされる。
【００２１】
ユーザ指定関数抽出部１１４は、ソースファイル１１、及びソースファイル１２に含まれる関数のうち、スタックアクセス検出部１１３によって選択候補テーブル１３１に書き込まれていない関数においてプラグマ＃ＳＴＡＣＫ＃ＣＯＭＰＲＥＳＳの記述の有無を調査する。ユーザ指定関数抽出部１１４は、ここで調査した関数のうちプラグマ＃ＳＴＡＣＫ＃ＣＯＭＰＲＥＳＳが記述された関数の名前と関数評価値を２として選択候補テーブル１３１に書き込み、また、プラグマ＃ＳＴＡＣＫ＃ＣＯＭＰＲＥＳＳが記述されていない関数の名前と関数評価値を１として選択候補テーブル１３１に書き込む。
【００２２】
中間コード保持部１２０は機械語の中間コード群を保持するメモリ領域である。
選択候補情報保持部１３０は選択候補テーブル１３１を保持するメモリ領域である。
図５は、選択候補情報保持部１３０が保持する選択候補テーブル１３１のデータ構造を示す図である。
【００２３】
選択候補テーブル１３１はソースファイル群１０に含まれる関数の数と同数の選択候補情報から構成される。各選択候補情報は、各関数と１対１に対応し、関数名１３１ａ、及び関数評価値１３１ｂから構成される。関数評価値１３１ｂは、０、１、及び２の何れかの値をとり、スタックアクセス検出部１１３で検出された、関数の処理開始時のスタックポインタが示すアドレスより、上位のアドレスのスタックメモリにアクセスする処理がある関数、つまり、既にいずれかの関数の呼び出しによって保証レジスタの値が格納されているスタックメモリを参照する関数の関数評価値１３１ｂは０、ユーザ指定関数抽出部１１４で検出された、プラグマ＃ＳＴＡＣＫ＃ＣＯＭＰＲＥＳＳが記述された関数の関数評価値１３１ｂは２、上記２種類以外の関数の関数評価値１３１ｂは１となる。
【００２４】
リンク部１４０は中間コード、及び選択候補テーブル１３１から実行ファイル２０を作成するリンカであり、連結部１４１、関数ツリー情報作成部１４２、関数ツリー情報保持部１４３、関数選択部１４４、及び圧縮・伸張ビット付加部１４５から構成される。
連結部１４１は中間コード保持部１２０に保持される中間コード群に実行時の再配置情報などを追加しリンクすることで、実行可能な機械語コードを生成し圧縮・伸張ビット付加部に出力する。
【００２５】
図６は、呼び出し関係にある関数のツリー構造を示す図である。各関数から見て、図の横軸の左方向にある呼び出し元の関数をツリー構造の上位の関数、右方向にある呼び出し先の関数をツリー構造の下位の関数と呼ぶ。また、図に示すようにメインルーチンである関数ｍａｉｎからは、関数ｆｕｎｃ＃ａ、関数ｆｕｎｃ＃ｂ、及び関数ｆｕｎｃ＃ｅの３つのサブルーチンが呼び出され、これら３つのサブルーチンの先頭関数をツリー構造の最上位の関数とする。
【００２６】
関数ツリー情報作成部１４２は中間コード保持部１２０に保持される中間コード群から、自らより下位の関数を持たない最下位の関数を検出し、最下位の関数から見て最上位の関数までの呼び出し関係をツリー構造として抽出する。ここでは、関数ｆｕｎｃ＃ａ、関数ｆｕｎｃ＃ｃ、及び関数ｆｕｎｃ＃ｆが含まれるツリー構造と、関数ｆｕｎｃ＃ｂ、関数ｆｕｎｃ＃ｃ、及び関数ｆｕｎｃ＃ｆが含まれるツリー構造と、関数ｆｕｎｃ＃ｂ、及び関数ｆｕｎｃ＃ｄが含まれるツリー構造と、関数ｆｕｎｃ＃ｅのみのツリー構造とが抽出される。関数ツリー情報作成部１４２は抽出した各ツリー構造についてツリー番号を付し、ツリー構造を構成する各関数の関数評価値１３１ｂの積算値であるツリー評価値を算出する。以上の情報をもとに関数ツリー情報作成部１４２はツリー番号とツリー評価値を関数ツリー情報保持部１４３に書き込み、関数ツリー情報テーブル１４３ａを作成する。
【００２７】
図７は、関数ツリー情報保持部１４３で保持する関数ツリー情報テーブル１４３ａのデータ構造を示す図である。
関数ツリー情報テーブル１４３ａは中間コード中の関数のツリー構造の数と同数のツリー情報から構成される。各ツリー情報は各ツリー構造と１対１で対応し、ツリー番号１４３ｂ、及びツリー評価値１４３ｃから構成される。
【００２８】
ツリー評価値１４３ｃはツリー構造を構成する各関数の関数評価値１３１ｂを互いに乗じた値である。
ここでは、ソースファイル１１、及びソースファイル１２に基づいて作成された関数ツリー情報テーブル１４３ａに、ツリー番号１４３ｂが１、２、３、及び４である４つのツリー情報が含まれる。
【００２９】
関数選択部１４４は、ツリー評価値１４３ｃが０ではないツリー構造、つまりツリー構造を構成する関数の中に、すでにいずれかの関数の呼び出しによって保証レジスタの値が格納されているスタックメモリを参照する関数を含まないツリー構造の最上位の関数、及び関数評価値１３１ｂが２の関数、つまりユーザ指定を受けた関数を圧縮対象として選択する。
【００３０】
圧縮・伸張ビット付加部１４５は、連結部１４１で中間ファイル群をリンクし生成した機械語コードにおいて、関数選択部１４４で選択した関数のコール命令に保証レジスタの圧縮を示す１ビットの圧縮制御ビット、及びリターン命令にスタックの伸張を示す１ビットの伸張制御ビットを付加し実行ファイル２０として記憶部１５０に出力する。
【００３１】
図８は、実行ファイル２０の内容を模式的に示す図である。
実行ファイル２０では、関数ｆｕｎｃ＃ａへ分岐するコール命令３０１と、関数ｆｕｎｃ＃ｅへ分岐するコール命令３０２に圧縮制御ビットが付加され、関数ｆｕｎｃ＃ａから復帰するリターン命令３０３と、関数ｆｕｎｃ＃ｅから復帰するリターン命令３０４に伸張制御ビットが付加されている。
【００３２】
ここで、コール命令は“ＣＡＬＬ　　ｌａｂｅｌ，Ｒｅｇｓ”のようにニーモニックで表され、保証レジスタＲｅｇｓの内容をスタックメモリに退避し、ｌａｂｅｌに処理を分岐する。１ビットの圧縮制御ビットが付加されたコール命令“ＣＡＬＬ　　ｌａｂｅｌ，Ｒｅｇｓ，ｓｔａｃｋ＃ｃｏｍｐｒｅｓｓ”は保証レジスタＲｅｇｓの内容を圧縮してスタックメモリに退避し、処理をｌａｂｅｌに分岐する。
【００３３】
リターン命令は“ＲＥＴ　　Ｒｅｇｓ”のようにニーモニックで表され、スタックメモリの内容を保証レジスタＲｅｇｓに復帰し、スタックメモリに格納されたアドレスに処理を分岐する。１ビットの伸張制御ビットが付加されたリターン命令“ＲＥＴ　　Ｒｅｇｓ，ｓｔａｃｋ＃ｃｏｍｐｒｅｓｓ”はスタックメモリの内容を伸張して保証レジスタＲｅｇｓに復帰し、処理をスタックメモリに格納されたアドレスに分岐する。
【００３４】
尚、本実施の形態においては、コール命令、及びリターン命令において退避、復帰すべき保証レジスタを明示したが、関数への分岐命令であるコール命令、及びリターン命令において保証レジスタの退避、復帰を行わず、ストア命令、及びロード命令によって、分岐する前にレジスタを退避、復帰することも可能である。また、分岐後にコーリー側でレジスタの退避、復帰を行うことも可能である。これらの場合、関数の呼び出しと復帰に伴う保証レジスタの退避、復帰時に保証レジスタの内容を圧縮、伸張することを示す１ビットの情報“ｓｔａｃｋ＃ｃｏｍｐｒｅｓｓ”は、ストア命令、及びロード命令に付加される。
【００３５】
図９は、分岐後にコーリー側で保証レジスタの退避、復帰を行う実行ファイルの内容を模式的に示す図である。
図９では、関数ｆｕｎｃ＃ａの処理開始時に保証レジスタｒ０〜ｒ７の内容をスタックポインタが示すアドレスに転送するストア命令３０５に圧縮制御ビットが付加され、関数ｆｕｎｃ＃ａの処理終了時にスタックポインタが指すメモリの内容を保証レジスタｒ０〜ｒ７に転送するロード命令３０６に伸張制御ビットが付加される。
【００３６】
尚、本実施の形態で退避するレジスタは、保証レジスタであるｒ０〜ｒ７の８個のレジスタであるが、保証レジスタとされるレジスタは８個とは限らず、それ以外の数のレジスタを保証レジスタとしてもよい。
図４に示す記憶部１５０は、メモリであり、ソースファイル群１０、及び上述の構成により生成される実行ファイル２０を保持する。
【００３７】
尚、本実施の形態におけるプログラム変換装置１００は、翻訳部１１２で変換した機械語の中間コード群を中間コード保持部１２０で保持するが、機械語の中間コード群を中間ファイルとして記憶部１５０や、外部の記録媒体に出力する構成としてもよい。
また、本実施の形態におけるプログラム変換装置１００は、ソースファイル群１０を記憶部１５０に保持しているが、ソースファイル群１０を外部の記録媒体から取得する構成としてもよい。
また、本実施の形態におけるプログラム変換装置１００は、実行ファイル２０を記憶部１５０に出力するが、実行ファイル２０を外部の記録媒体へ出力する構成としてもよい。
【００３８】
（情報処理装置）
図１０は、本発明の実施の形態に係わる情報処理装置の構成を示す図である。情報処理装置２００は、命令メモリ２１０、処理部２２０、データメモリ２３０、圧縮部２４０、ＣＳＲ２５０、及び伸張部２６０から構成される。
命令メモリ２１０はプログラム変換装置１００により生成された圧縮・伸張制御ビット付きの実行ファイル２０を格納している。
【００３９】
処理部２２０は実行ファイル２０を実行する中央演算装置である。
図１１は、処理部２２０の内部の構成を示す図である。
処理部２２０は、ＩＦ２２１、ＤＥＣ２２２、制御部２２３、実行部２２４、レジスタ２２５、ＰＣ２２６、及びＳＰ２２７から構成される。
ＩＦ２２１は命令フェッチ部であり、命令メモリ２１０に格納されている実行ファイル２０から機械語命令をフェッチし、ＤＥＣ２２２へ渡す。
【００４０】
ＤＥＣ２２２は命令デコーダであり、機械語命令を解析する。ＤＥＣ２２２は内部に圧縮制御ビット付きコール命令デコード部２２２ａ、伸張制御ビット付きリターン命令デコード部２２２ｂを備え、圧縮制御ビット付きコール命令をデコードした場合は、制御部２２３にレジスタ２２５が保持するデータの圧縮の制御を指示し、伸張制御ビット付きリターン命令をデコードした場合は、制御部２２３にスタックメモリ２３１が保持するデータの伸張の制御を指示する。
【００４１】
尚、本実施の形態においては、コール命令、リターン命令に圧縮・伸張制御ビットが付加されている構成であるが、ストア命令、ロード命令に圧縮・伸張制御ビットが付加されている構成でもよい。この場合、ＤＥＣ２２２は内部に圧縮制御ビット付きコール命令デコード部２２２ａに替えて圧縮制御ビット付きストア命令デコード部２２２ｃを、伸張制御ビット付きリターン命令デコード部２２２ｂに替えて伸張制御ビット付きロード命令デコード部２２２ｄを備える。
【００４２】
図１２は、圧縮・伸張制御ビットが付加されているストア命令、ロード命令をデコードするＤＥＣ２２２の内部の構成を示す図である。
図１１に示す制御部２２３はＤＥＣ２２２で解析された機械語命令に従い、実行部２２４、圧縮部２４０、伸張部２６０を制御する。
コール命令時に保証レジスタ２２５ａのデータを圧縮してスタックメモリ２３１へ退避する場合は、先ずＰＣ２２６が保持するデータを、次に圧縮部２４０が保証レジスタ２２５ａのデータを圧縮したデータを、最後にＣＳＲ２５０が保持するデータをスタックメモリ２３１へ格納し、コール先の関数へ処理を分岐するように制御する。
【００４３】
リターン命令時にスタックメモリ２３１のデータを伸張して保証レジスタ２２５ａへ復帰する場合は、先ずＣＳＲ２５０のデータを、次に伸張部２６０にＣＳＲ２５０が示すサイズの保証レジスタ２２５ａのデータを、最後にＰＣ２２６のデータをスタックメモリ２３１から復帰させ、ＰＣ２２６が示す呼び出し元の関数へ処理を分岐するように制御する。
【００４４】
実行部２２４は制御部２２３の制御により機械語命令を実行する演算器である。
レジスタ２２５は３２ビットの記録装置ｒ０〜ｒ３１の３２個からなり、実行部２２４が演算対象とするデータを保持する。レジスタ２２５の一部、ｒ０〜ｒ７の８個からなる合計２５６ビットは保証レジスタ２２５ａであり、コール命令時にデータをスタックメモリ２３１へ退避し、リターン命令時にスタックメモリ２３１からデータを復帰することで関数の呼び出しの前後で値を保証する。
【００４５】
ＰＣ２２６はプログラムカウンタであり、現在実行している機械語命令が命令メモリ２１０上のどのアドレスかを示す。
ＳＰ２２７はスタックポインタであり、スタックメモリ２３１の未使用領域の先頭アドレスを保持する。
図１０に示すデータメモリ２３０はデータを保持するメモリである。
【００４６】
スタックメモリ２３１は、関数や割込み時の戻りアドレスや、保証レジスタの値の格納に使われるデータメモリ２３０上の領域である。図１３は、スタックメモリ２３１を模式的に示す図である。
ここでは、“０ｘ？？”と表記する事で“？？”の値が１６進数であり、“０ｂ？？”と表記する事で“？？”の値が２進数でありであることを表すこととする。
【００４７】
縦軸に付された値（“０ｘｆｆｆｆ〜０ｘ００００”）はスタックメモリ２３１上のアドレスである。スタックメモリ２３１にデータが格納される場合、データはスタックメモリ２３１の最上位のアドレス“０ｘｆｆｆｆ”から順次アドレスの下位の方向へ格納され、スタックメモリ２３１からデータが取り出される場合、データはスタックメモリ２３１の未使用領域の先頭アドレスの１つ前のアドレスから、順次アドレスの上位の方向へ取り出される。また、スタックメモリ２３１へのデータの格納時には格納されるデータのサイズ分だけＳＰ２２７は保持する値を減らし、スタックメモリ２３１からのデータの取り出し時には取り出されるデータのサイズ分だけＳＰ２２７は保持する値を増やす。これにより、ＳＰ２２７は常にスタックメモリ２３１の未使用領域の先頭アドレスを指し示す。
【００４８】
本実施の形態においては、スタックメモリ２３１は関数の引数、及びＰＣ２２６、保証レジスタ２２５ａ、ＣＳＲ２５０等のデータを格納し、ＦＩＬＯ（先入れ後出し）の動作により関数の呼び出し、復帰に伴う処理の分岐を実現する。
図１４は、保証レジスタ２２５ａのデータを退避したスタックメモリ２３１を模式的に示す図である。
【００４９】
圧縮部２４０は制御部２２３の制御により、スタックメモリ２３１へ退避する保証レジスタ２２５ａのデータの圧縮を行う。
図１５は、圧縮部２４０の内部の構成を示す図である。
圧縮部２４０はデータ圧縮部２４１、及び圧縮制御部２４２から構成される。データ圧縮部２４１は保証レジスタ２２５ａのデータをハフマン符号化する。
【００５０】
図１６は、ハフマン符号対応表を示す図である。
ハフマン符号は出現率の高い値にビット長の短い符号を割り当て、出現率の低い値にビット長の長い符号を割り当てることで、データ圧縮を行う。
図１７は、図１４と同じ保証レジスタ２２５ａのデータを、図１６のハフマン符号対応表を基に圧縮して退避したスタックメモリ２３１を模式的に示す図である。
【００５１】
図１５に示す圧縮制御部２４２は内部に圧縮比較部２４３、しきい値保持部２４４を含み、圧縮比較部２４３において、しきい値保持部２４４が保持するしきい値とデータ圧縮部２４１がハフマン符号化したデータのデータサイズを比較する。比較の結果、データ圧縮部２４１がハフマン符号化したデータのデータサイズがしきい値より小さい場合、ハフマン符号化したデータを退避データとしてスタックメモリ２３１へ格納し、ＣＳＲ２５０においてイネーブルビットを１に設定し退避データのデータサイズを格納する。比較の結果、データ圧縮部２４１がハフマン符号化したデータのデータサイズがしきい値より大きい場合、保証レジスタ２２５ａのデータを退避データとしてスタックメモリ２３１へ格納し、ＣＳＲ２５０においてイネーブルビットを０に設定する。
【００５２】
図１０に示すＣＳＲ２５０は３２ビットの記録装置であり、１ビットのイネーブルビットと、３１ビットのデータフィールドから構成される。
図１８は、ＣＳＲ２５０のビット割付けを示す図である。
横軸に付された値はＣＳＲ上のビット位置を表す。ビット［０］はスタックメモリ２３１に退避するデータが圧縮されたデータであるか否かを示すイネーブルビットであり、圧縮されたデータの場合は１、圧縮されたデータではない場合は０の値をとる。ビット［１］〜［３１］は圧縮されたデータのデータサイズを格納するデータフィールドであり、イネーブルビットが１の場合は圧縮されたデータのデータサイズを、イネーブルビットが０の場合は不定値を格納する。
【００５３】
伸張部２６０は制御部２２３の制御により、保証レジスタ２２５ａへ復帰するスタックメモリ２３１のデータの伸張を行う。
図１９は、伸張部２６０の内部の構成を示す図である。
伸張部２６０は伸張制御部２６１、及びデータ伸張部２６２から構成される。伸張制御部２６１は、ＣＳＲ２５０のイネーブルビットが１の場合は、スタックメモリ２３１に格納されている退避データをデータ伸張部２６２で伸張させて保証レジスタ２２５ａに格納し、ＣＳＲ２５０のイネーブルビットが０の場合は、スタックメモリ２３１に格納されている退避データをそのまま保証レジスタ２２５ａに格納する。
【００５４】
データ伸張部２６２は、スタックメモリ２３１に格納されているハフマン符号化データにハフマン符号化の逆変換を施しデータを伸張する。
図２０は、保証レジスタ２２５ａとスタックメモリ２３１間のデータ退避、復帰に伴うデータの流れを示す図である。
通常のコール命令時、保証レジスタ２２５ａのデータはスタックメモリ２３１へ退避され（データフローＤ１０１）、リターン命令時に、スタックメモリ２３１から保証レジスタ２２５ａへデータが復帰される（データフローＤ１０２）。
【００５５】
圧縮制御ビット付きコール命令時、保証レジスタ２２５ａのデータは圧縮部２４０で圧縮される（データフローＤ１０３）、圧縮したデータのデータサイズがしきい値保持部２４４で保持されるしきい値より大きければ、保証レジスタ２２５ａのデータがそのまま退避データとして、圧縮したデータのデータサイズがしきい値より小さければ、圧縮したデータが退避データとしてスタックメモリ２３１へ格納される（データフローＤ１０４）。このとき、圧縮結果、圧縮データのサイズがＣＳＲ２５０へ設定され（データフローＤ１０５）、ＣＳＲ２５０のデータがスタックメモリ２３１へ格納される（データフローＤ１０６）。
【００５６】
伸張制御ビット付きリターン命令時は、スタックメモリ２３１からＣＳＲ２５０へデータが復帰され（データフローＤ１０６）、ＣＳＲ２５０のデータからスタックメモリ２３１に格納されている退避データが圧縮されているか否かの情報と、退避データのデータサイズが伸張部２６０に取得され（データフローＤ１０７）、ＣＳＲ２５０が示すサイズの退避データが伸張部２６０に取得される（データフローＤ１０８）。退避データが圧縮されている場合は退避データを伸張部２６０で伸張したデータが、圧縮されていない場合は退避データがそのまま保証レジスタ２２５ａへ復帰される（データフローＤ１０９）。
【００５７】
尚、本実施の形態においては、退避データの変換アルゴリズムとして、ハフマン符号を用いているが、ラン・レングス手法等、他の可逆符号方式の圧縮アルゴリズムを用いて退避データを変換してもよい。
＜動作＞
（プログラム変換装置）
ここで、上述のように構成されたプログラム変換装置１００の動作について説明する。
【００５８】
図２１は、プログラム変換装置１００の動作の流れを示す図である。
先ず、コンパイル部１１０においてソースファイル群１０は機械語の中間コード群に変換され（ステップＳ１００１）、次に選択候補テーブル１３１が作成される（ステップＳ１００２）。
続いて、リンク部１４０において中間コード群がリンクされ実行可能な機械語コードが生成され（ステップＳ１００３）、関数選択部１４４において圧縮対象となる関数が選択される（ステップＳ１００４）。最後に、圧縮・伸張ビット付加部が機械語コード中の、圧縮対象の関数のコール命令に圧縮制御ビット、及びリターン命令に伸張制御ビットを付加し実行ファイルとして出力する（ステップＳ１００５）。
【００５９】
次に、プログラム変換装置１００の動作中で選択候補テーブルを作成する動作（ステップＳ１００２）を、図を用いて説明する。
図２２は、コンパイル部１１０において選択候補テーブルを作成する動作の流れを示す図である。
先ず、ある関数を調査対象とし調査を開始する（ステップＳ１１０１）。スタックアクセス検出部１１３が、対象の関数内で関数先頭でのスタックポインタが示すアドレスより上位のアドレスのスタックメモリへのアクセスがあるか否かを判定する（ステップＳ１１０２）。スタックアクセス検出部１１３が、対象の関数内でアクセスがあると判定する場合（ステップＳ１１０２：Ｙｅｓ）、対象の関数の関数評価値１３１ｂに０を設定する（ステップＳ１１０３）。
【００６０】
一方、スタックアクセス検出部１１３が、対象の関数内でアクセスがないと判定する場合（ステップＳ１１０２：Ｎｏ）、ユーザ指定関数抽出部１１４が、対象の関数内にプラグマ＃ＳＴＡＣＫ＃ＣＯＭＰＲＥＳＳが記述されているか否かを判定する（ステップＳ１１０４）。ユーザ指定関数抽出部１１４が、対象の関数内にプラグマ＃ＳＴＡＣＫ＃ＣＯＭＰＲＥＳＳが記述されていると判定する場合（ステップＳ１１０４：Ｙｅｓ）、対象の関数の関数評価値１３１ｂに２を設定し（ステップＳ１１０５）、ユーザ指定関数抽出部１１４が、対象の関数内にプラグマ＃ＳＴＡＣＫ＃ＣＯＭＰＲＥＳＳが記述されていないと判定する場合（ステップＳ１１０４：Ｎｏ）、対象の関数の関数評価値１３１ｂに１を設定する（ステップＳ１１０６）。
【００６１】
上記動作で対象の関数の関数評価値１３１ｂが設定された後、さらに未調査の関数が存在する場合（ステップＳ１１０７：Ｙｅｓ）、未調査の関数を新たな調査対象とし調査を開始する（ステップＳ１１０１）。未調査の関数が存在しない場合（ステップＳ１１０７：Ｎｏ）、選択候補テーブルの作成が終了する。
次に、プログラム変換装置１００の動作中で圧縮対象となる関数を選択する動作（ステップＳ１００４）を、図を用いて説明する。
【００６２】
図２３は、リンク部１４０において圧縮対象となる関数を選択する動作の流れを示す図である。
先ず、ある関数を調査対象とし調査を開始する（ステップＳ１２０１）。関数選択部１４４が、対象の関数の関数評価値１３１ｂに２が設定されているか否かを判定する（ステップＳ１２０２）。関数選択部１４４が、対象の関数の関数評価値１３１ｂに２が設定されていると判定する場合（ステップＳ１２０２：Ｙｅｓ）、対象の関数が圧縮対象となる関数に選択される（ステップＳ１２０７）。
【００６３】
一方、関数選択部１４４が、対象の関数の関数評価値１３１ｂに２が設定されていないと判定する場合（ステップＳ１２０２：Ｎｏ）、対象の関数がツリーの先頭関数となるツリーがあるか否かを判定する（ステップＳ１２０３）、対象の関数がツリーの先頭関数となるツリーがある場合（ステップＳ１２０３：Ｙｅｓ）、対象の関数がツリーの先頭関数となるツリーを調査対象とし（ステップＳ１２０４）、調査対象のツリーのツリー評価値１４３ｃに、０が設定されているか否かを判定する（ステップＳ１２０５）。調査対象のツリーのツリー評価値１４３ｃに０が設定されていない場合（ステップＳ１２０５：Ｎｏ）、対象の関数がツリーの先頭関数となる未調査のツリーが他にあるか否かを判定する（ステップＳ１２０６）。対象の関数がツリーの先頭関数となる未調査のツリーが他にある場合（ステップＳ１２０６：Ｙｅｓ）、未調査のツリーを調査対象とする（ステップＳ１２０４）。対象の関数がツリーの先頭関数となる未調査のツリーが他にない場合（ステップＳ１２０６：Ｎｏ）、対象の関数が圧縮対象となる関数に選択される（ステップＳ１２０７）。
【００６４】
対象の関数がツリーの先頭関数となるツリーがない場合（ステップＳ１２０３：Ｎｏ）、及び調査対象のツリーのツリー評価値１４３ｃに、０が設定されている場合（ステップＳ１２０５：Ｙｅｓ）、または上記動作で対象の関数が圧縮対象となる関数に選択された後、さらに未調査の関数が存在する場合（ステップＳ１２０８：Ｙｅｓ）、未調査の関数を新たな調査対象とし調査を開始する（ステップＳ１２０１）。未調査の関数が存在しない場合（ステップＳ１２０８：Ｎｏ）、圧縮対象となる関数の選択が終了する。
（情報処理装置）
ここで、上述のように構成された情報処理装置２００の動作について説明する。
【００６５】
情報処理装置２００は、処理を複数のステージに分けるパイプラインを採用することにより機械語命令を高速に実行するが、ここでは一つの機械語命令について処理の各ステージを通した動作を説明する。
図２４は、情報処理装置２００の動作の流れを示す図である。
先ず、ＩＦ２２１が、ＰＣ２２６が示す命令メモリ２１０上のアドレスから機械語命令をフェッチする（ステップＳ２００１）。次に、ＤＥＣ２２２が、機械語命令の種類を判定する（ステップＳ２００２）。
【００６６】
ＤＥＣ２２２が、機械語命令をコール命令であると判定する場合（ステップＳ２００２：ＣＡＬＬ）、関数の呼び出しと、それに伴う保証レジスタ２２５ａの退避が実行される（ステップＳ２００３）。
ＤＥＣ２２２が、機械語命令をリターン命令であると判定する場合（ステップＳ２００２：ＲＥＴ）、関数からの復帰と、それに伴う保証レジスタ２２５ａの復帰が実行される（ステップＳ２００４）。
【００６７】
ＤＥＣ２２２が、機械語命令をコール命令、及びリターン命令以外であると判定する場合（ステップＳ２００２：ｅｌｓｅ）、実行部２２４が機械語命令を実行する（ステップＳ２００５）。
以上の動作により、一つの機械語命令の処理が終了する。
次に、情報処理装置２００の動作中で関数の呼び出しと、それに伴い保証レジスタ２２５ａを退避する動作（ステップＳ２００３）を、図を用いて説明する。
【００６８】
図２５は、関数の呼び出しと、それに伴い保証レジスタ２２５ａを退避する動作の流れを示す図である。
先ず、ＤＥＣ２２２が、コール命令に圧縮制御ビットが付加されているか否かを判定する（ステップＳ２１０１）。ＤＥＣ２２２が、コール命令に圧縮制御ビットが付加されていないと判定する場合（ステップＳ２１０１：Ｎｏ）、制御部２２３が、ＰＣ２２６のデータをスタックメモリ２３１に格納し（ステップＳ２１０２）、続いて、制御部２２３が、保証レジスタ２２５ａの２５６ビットのデータをスタックメモリ２３１へ格納する（ステップＳ２１０３）。
【００６９】
一方、ＤＥＣ２２２が、コール命令に圧縮制御ビットが付加されていると判定する場合（ステップＳ２１０１：Ｙｅｓ）、制御部２２３が、ＰＣ２２６のデータをスタックメモリ２３１に格納し（ステップＳ２１０４）、続いて、データ圧縮部２４１が、保証レジスタ２２５ａのデータをハフマン符号化し（ステップＳ２１０５）、圧縮比較部２４３が、ハフマン符号化したデータのサイズがしきい値より小さいか否かを判定する（ステップＳ２１０６）、圧縮比較部２４３が、ハフマン符号化したデータのサイズがしきい値より小さいと判定する場合（ステップＳ２１０６：Ｙｓｅ）、圧縮制御部２４２が、ハフマン符号化したデータをスタックメモリ２３１へ格納し（ステップＳ２１０７）、続いて、圧縮制御部２４２が、ＣＳＲ２５０のイネーブルビットに１を、データフィールドにハフマン符号化したデータのサイズを設定する（ステップＳ２１０８）。
【００７０】
圧縮比較部２４３が、ハフマン符号化したデータのサイズがしきい値より小さくないと判定する場合（ステップＳ２１０６：Ｎｏ）、圧縮制御部２４２が、保証レジスタ２２５ａの２５６ビットのデータをそのままスタックメモリ２３１へ格納し（ステップＳ２１０９）、続いて、圧縮制御部２４２が、ＣＳＲ２５０のイネーブルビットに０を設定する（ステップＳ２１１０）。
【００７１】
ＣＳＲ２５０の設定後、圧縮制御部２４２が、ＣＳＲ２５０のデータをスタックメモリ２３１へ格納する（ステップＳ２１１１）。
最後に、呼び出し先の関数へ処理を分岐する（ステップＳ２１１２）。
次に、情報処理装置２００の動作中で関数からの復帰と、それに伴い保証レジスタ２２５ａを復帰する動作（ステップＳ２１０４）を、図を用いて説明する。
【００７２】
図２６は、関数からの復帰と、それに伴い保証レジスタ２２５ａを復帰する動作の流れを示す図である。
先ず、ＤＥＣ２２２が、リターン命令に伸張制御ビットが付加されているか否かを判定する（ステップＳ２２０１）。ＤＥＣ２２２が、リターン命令に伸張制御ビットが付加されていないと判定する場合（ステップＳ２２０１：Ｎｏ）、制御部２２３が、スタックメモリ２３１から保証レジスタ２２５ａへ２５６ビットの退避データを読み出す（ステップＳ２２０２）。
【００７３】
一方、ＤＥＣ２２２が、リターン命令に伸張制御ビットが付加されていると判定する場合（ステップＳ２２０１：Ｙｅｓ）、伸張制御部２６１が、スタックメモリ２３１からＣＳＲ２５０へ退避データを読み出し（ステップＳ２２０３）、続いて、伸張制御部２６１が、読み出したＣＳＲ２５０のイネーブルビットが１であるか否かを判定する（ステップＳ２２０４）。伸張制御部２６１が、読み出したＣＳＲ２５０のイネーブルビットが１でないと判定する場合（ステップＳ２２０４：Ｎｏ）、伸張制御部２６１が、スタックメモリ２３１から保証レジスタ２２５ａへ２５６ビットの退避データをそのまま読み出す（ステップＳ２２０２）。
【００７４】
伸張制御部２６１が、読み出したＣＳＲ２５０のイネーブルビットが１であると判定する場合（ステップＳ２２０４：Ｙｅｓ）、伸張制御部２６１が、スタックメモリ２３１からＣＳＲ２５０のデータフィールドが示すサイズのハフマン符号化したデータを読み出し（ステップＳ２２０５）、データ伸張部２６２が、ハフマン符号化したデータを逆変換しデータを伸張し（ステップＳ２２０６）、伸張制御部２６１が、保証レジスタ２２５ａへ２５６ビットに伸張されたデータを復帰する（ステップＳ２２０７）。
【００７５】
以上の動作により保証レジスタ２２５ａのデータが復帰した後、制御部２２３が、スタックメモリ２３１からＰＣ２２６へ退避データを読み出し（ステップＳ２２０８）、最後に、ＰＣ２２６が示す呼び出し元の関数へ処理を分岐する（ステップＳ２２０９）。
＜まとめ＞
本発明の実施の形態は、関数の呼び出し時にスタックメモリへ退避する保証レジスタの内容を圧縮しスタックメモリの使用効率を上げることにより、スタックメモリのオーバーフローが発生する危険性を抑え、省メモリを実現するものであり、全ての関数の呼び出し時にスタックメモリへ退避するレジスタの内容を圧縮した場合、スタックメモリの使用効率は上がるが関数の呼び出しのたびに圧縮動作が発生しサイクル数が増加することになるので、スタックメモリに格納される期間が長い関数、例えばツリー構造になった関数群の先頭の関数、及びユーザにより指定された関数を呼び出し時にレジスタ内容を圧縮する対象に選択することでサイクル数の増加を抑えつつスタックメモリの使用効率を上げることを実現している。
【００７６】
【発明の効果】
本発明に係る情報処理装置は、演算に用いるデータを保持する１つ以上のレジスタを有し、機械語プログラムに従って処理を行うプロセッサを含む情報処理装置であって、所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避することを示す情報が、前記機械語プログラム中に有るか否かを識別する圧縮識別手段と、圧縮識別手段による識別結果が肯定的である場合には所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避し、圧縮識別手段による識別結果が否定的である場合には所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮せずに退避する退避手段とを備えることを特徴とする。
【００７７】
これによって、関数の呼び出しに伴いスタックメモリへ退避するレジスタの内容を圧縮することができるので、スタックメモリに格納するデータ量を削減することができる。
従って、スタックメモリの使用効率を上げることでスタックメモリのオーバーフローが発生する危険性を抑え、省メモリを実現することができる。
【００７８】
また、前記情報処理装置はさらに、所定の関数の呼び出し終了に伴い前記レジスタへスタックメモリに退避されているデータを伸張して復帰することを示す情報が、前記機械語プログラム中に有るか否かを識別する伸張識別手段と、伸張識別手段による識別結果が肯定的である場合には所定の関数の呼び出し終了に伴い前記レジスタへ前記スタックメモリに退避されているデータを伸張して復帰し、伸張識別手段による識別結果が否定的である場合には所定の関数の呼び出し終了に伴い前記レジスタへ前記スタックメモリに退避されているデータを伸張せずに復帰する復帰手段とを備えることを特徴とする。
【００７９】
あるいは、前記退避手段は、所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避する場合に、所定の関数の呼び出し終了に伴い前記レジスタへスタックメモリに退避されているデータを伸張して復帰することを示す伸張情報と、前記レジスタの内容を圧縮したデータとを対応付けてスタックメモリに退避する伸張情報退避手段を含み、前記情報処理装置はさらに、所定の関数の呼び出し終了に伴い前記レジスタへ復帰しようとするデータと対応付けられている伸張情報が、スタックメモリ中に有るか否かを識別する伸張識別手段と、伸張識別手段による識別結果が肯定的である場合には所定の関数の呼び出し終了に伴い前記レジスタへスタックメモリ中の前記復帰しようとするデータを伸張して復帰し、伸張識別手段による識別結果が否定的である場合には所定の関数の呼び出し終了に伴い前記レジスタへスタックメモリ中の前記復帰しようとするデータを伸張せずに復帰する復帰手段とを備えることを特徴とする。
【００８０】
これによって、関数の呼び出し終了に伴いレジスタへ復帰するスタックメモリ中の圧縮された内容を伸張することができるので、関数の呼び出しの前後でのレジスタの値を保証したうえで、スタックメモリに格納するデータ量を削減することができる。
従って、スタックメモリの使用効率を上げることでスタックメモリのオーバーフローが発生する危険性を抑え、省メモリを実現することができる。
【００８１】
また、前記退避手段はさらに、前記レジスタに格納されている第１データを所定のアルゴリズムに従って、第２データに変換するデータ変換手段と、前記第２データのデータサイズを、圧縮効率を示すしきい値と比較する比較手段と、前記第２データのデータサイズがしきい値より小さい場合には前記第２データをスタックメモリへ退避し、前記第２データのデータサイズがしきい値より大きい場合には前記第１データをスタックメモリへ退避する選択退避手段とを含むことを特徴とする。
【００８２】
これによって、保証レジスタのデータに圧縮を施し、圧縮効果が有る場合のみスタックメモリに圧縮したデータを退避し、圧縮効果がない場合は保証レジスタのデータをそのままスタックメモリに退避することができる。
従って、保証レジスタの各ビットのデータに相関が少なく、圧縮効率の悪い場合に、ハフマン符号化等のデータ変換によるデータサイズの増大の影響を受けることなくスタックメモリの使用効率を上げることを実現できる。
【００８３】
また、前記退避手段は、圧縮識別手段による識別結果が肯定的である場合、前記所定の関数の呼び出し元における呼び出し時にスタックメモリへ前記レジスタの内容を圧縮して退避し、前記復帰手段は、伸張識別手段による識別結果が肯定的である場合、前記所定の関数の呼び出し元における呼び出し終了時に前記レジスタへスタックメモリに退避されているデータを伸張して復帰することを特徴とする。
【００８４】
これによって、コール命令の動作時に、スタックメモリへ退避する保証レジスタの内容を圧縮し、リターン命令の動作時に、保証レジスタへ復帰するスタックメモリの内容を伸張することができる。
従って、関数への分岐命令がスタックメモリへの保証レジスタの退避を伴う情報処理装置において、関数の前後でのレジスタの値を保証したうえでスタックメモリに格納するデータ量を削減し、スタックメモリの使用効率を上げることができる。
【００８５】
また、前記退避手段は、圧縮識別手段による識別結果が肯定的である場合、呼び出された前記所定の関数における処理開始時にスタックメモリへ前記レジスタの内容を圧縮して退避し、前記復帰手段は、伸張識別手段による識別結果が肯定的である場合、呼び出された前記所定の関数における処理終了時に前記レジスタへスタックメモリに退避されているデータを伸張して復帰することを特徴とする。
【００８６】
これによって、ストア命令による保証レジスタのスタックメモリへの退避時に、保証レジスタの内容を圧縮し、ロード命令によるスタックメモリの保証レジスタへの復帰時に、スタックメモリの内容を伸張することができる。
従って、関数への分岐命令がスタックメモリへの保証レジスタの退避を伴わない情報処理装置において、関数の前後でのレジスタの値を保証したうえでスタックメモリに格納するデータ量を削減し、スタックメモリの使用効率を上げることができる。
【００８７】
また、演算に用いるデータを保持する１つ以上のレジスタを有し、機械語プログラムに従って処理を行うプロセッサを含む情報処理装置における情報処理方法であって、所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避することを示す情報が、前記機械語プログラム中に有るか否かを識別する圧縮識別ステップと、圧縮識別ステップによる識別結果が肯定的である場合には所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避し、圧縮識別ステップによる識別結果が否定的である場合には所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮せずに退避する退避ステップとを備えることを特徴とする。
【００８８】
これによって、関数の呼び出しに伴いスタックメモリへ退避するレジスタの内容を圧縮することができるので、スタックメモリに格納するデータ量を削減することができる。
従って、スタックメモリの使用効率を上げることでスタックメモリのオーバーフローが発生する危険性を抑え、省メモリを実現することができる。
【００８９】
また、プログラム変換装置であって、１、又は複数の関数を含む入力プログラムを入手する入手手段と、所定の関数の呼び出しに伴いスタックメモリへプロセッサ内のレジスタの内容を圧縮して退避するか、圧縮せずにそのまま退避するかを前記入力プログラムにおいて判定する判定手段と、当該判定手段により圧縮して退避すると判定された場合、スタックメモリへ前記レジスタの内容を圧縮して退避することをプロセッサに示す情報を備える出力プログラムに、前記入力プログラムを変換する変換手段とを備えることを特徴とする。
【００９０】
これによって、全ての関数の呼び出しを保証レジスタの圧縮対象とせず、保証レジスタを圧縮する関数を選択的に決定することができる。
従って、全ての関数で保証レジスタを圧縮することによるサイクル数の大幅な増加をさけつつ、スタックメモリの使用効率を上げることを実現することができる。
【００９１】
また、前記判定手段は、前記レジスタの内容を格納したスタックメモリを参照するスタックアクセス関数を検出する検出手段と、前記スタックアクセス関数、及び前記スタックアクセス関数の呼び出し側の上位に位置する全ての階層の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮せずにそのまま退避すると判定する除外手段とを含むことを特徴とする。
【００９２】
これによって、関数の処理開始時のスタックポインタが示すアドレスより上位のアドレスのスタックメモリにアクセスする関数を、ツリー構造の下位に持つ関数を保証レジスタの内容を圧縮する対象から除くことができる。
従って、すでにスタックメモリに格納されているデータを参照する場合に、参照するデータが圧縮されていることを避けることができる。
【００９３】
また、前記判定手段は、スタックメモリへ前記レジスタの内容を圧縮して退避することを示す情報が前記所定の関数に事前に付加されている場合、前記所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避すると判定する事前指定判定手段を含むことを特徴とする。
これによって、変換前のプログラム中で事前に指定された関数を、変換後のプログラムにおいて、保証レジスタの圧縮対象とすることができる。
【００９４】
従って、プログラム時（コンパイル前）に、プログラマ（ユーザ）が所望の関数を指定し、保証レジスタの圧縮対象を静的に決定することができる。
また、前記判定手段は、前記所定の関数が内部にサブルーチンを持つ場合、前記入力プログラムが含む関数群の階層構造を示すネスト情報に基づいて、前記所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避するか、圧縮せずにそのまま退避するかを判定するネスト判定手段を含むことを特徴とする。
【００９５】
これによって、ツリー構造をもつ関数群の任意の関数をコンパイル時に動的に保証レジスタの圧縮対象とすることできる。
従って、一度スタックメモリに退避すると、長期間スタックに留まるツリー構造の上位の関数を、保証レジスタの圧縮対象とすることで、スタックメモリの使用効率を上げることが実現できる。
【００９６】
また、前記変換手段は、前記所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避することをプロセッサに示す情報を、前記所定の関数の呼び出し元関数に付加する圧縮情報付加手段と、前記所定の関数の呼び出し終了に伴い前記レジスタへスタックメモリに退避されているデータを伸張し復帰することをプロセッサに示す情報を、前記所定の関数の呼び出し元関数に付加する伸張情報付加手段とを含むことを特徴とする。
【００９７】
これによって、コール命令の動作時にスタックメモリへ退避する保証レジスタの内容を圧縮し、リターン命令の動作時に保証レジスタへ復帰するスタックメモリの内容を伸張することを示す情報をプログラム中に付加することができる。
従って、関数への分岐命令がスタックメモリへの保証レジスタの退避を伴う情報処理装置において、関数の前後でのレジスタの値を保証したうえでスタックメモリに格納するデータ量を削減し、スタックメモリの使用効率を上げるプログラムを生成することができる。
【００９８】
また、前記変換手段は、前記所定の関数の呼び出しに伴いスタックメモリへ前記レジスタの内容を圧縮して退避することをプロセッサに示す情報を、呼び出される前記所定の関数に付加する圧縮情報付加手段と、前記所定の関数の呼び出し終了に伴い前記レジスタへスタックメモリに退避されているデータを伸張し復帰することをプロセッサに示す情報を、呼び出される前記所定の関数に付加する伸張情報付加手段とを含むことを特徴とする。
【００９９】
これによって、ストア命令による保証レジスタのスタックメモリへの退避時に保証レジスタの内容を圧縮し、ロード命令によるスタックメモリの保証レジスタへの復帰時にスタックメモリの内容を伸張することを示す情報をプログラム中に付加することができる。
従って、関数への分岐命令がスタックメモリへの保証レジスタの退避を伴わない情報処理装置において、関数の前後でのレジスタの値を保証したうえでスタックメモリに格納するデータ量を削減し、スタックメモリの使用効率を上げるプログラムを生成することができる。
【図面の簡単な説明】
【図１】本発明の実施の形態に係わるプログラム変換装置、及び情報処理装置を備えた情報処理システムの構成を示す図である。
【図２】ソースファイル１１の一例を模式的に示す図である。
【図３】ソースファイル１２の一例を模式的に示す図である。
【図４】本発明の実施の形態に係わるプログラム変換装置の構成を示す図である。
【図５】選択候補情報保持部１３０が保持する選択候補テーブル１３１のデータ構造を示す図である。
【図６】呼び出し関係にある関数のツリー構造を示す図である。
【図７】関数ツリー情報保持部１４３で保持する関数ツリー情報テーブル１４３ａのデータ構造を示す図である。
【図８】実行ファイル２０の内容を模式的に示す図である。
【図９】分岐後にコーリー側でレジスタの退避、復帰を行う実行ファイルの内容を模式的に示す図である。
【図１０】本発明の実施の形態に係わる情報処理装置の構成を示す図である。
【図１１】処理部２２０の内部の構成を示す図である。
【図１２】圧縮・伸張制御ビットが付加されているストア命令、ロード命令をデコードするＤＥＣ２２２の内部の構成を示す図である。
【図１３】スタックメモリ２３１を模式的に示す図である。
【図１４】保証レジスタ２２５ａのデータを退避したスタックメモリ２３１を模式的に示す図である。
【図１５】圧縮部２４０の内部の構成を示す図である。
【図１６】ハフマン符号対応表を示す図である。
【図１７】図１４と同じ保証レジスタ２２５ａのデータを、図１６のハフマン符号対応表を基に圧縮して退避したスタックメモリ２３１を模式的に示す図である。
【図１８】ＣＳＲ２５０のビット割付けを示す図である。
【図１９】伸張部２６０の内部の構成を示す図である。
【図２０】保証レジスタ２２５ａとスタックメモリ２３１間のデータ退避、復帰に伴うデータの流れを示す図である。
【図２１】プログラム変換装置１００の動作の流れを示す図である。
【図２２】コンパイル部１１０において選択候補テーブルを作成する動作の流れを示す図である。
【図２３】リンク部１４０において圧縮対象となる関数を選択する動作の流れを示す図である。
【図２４】情報処理装置２００の動作の流れを示す図である。
【図２５】関数の呼び出しと、それに伴い保証レジスタ２２５ａを退避する動作の流れを示す図である。
【図２６】関数からの復帰と、それに伴い保証レジスタ２２５ａを復帰する動作の流れを示す図である。
【符号の説明】
１０　　ソースファイル群
１１　　ソースファイル
１１ａ　関数ｍａｉｎに関する記述部
１１ｂ　関数ｆｕｎｃ＃ａに関する記述部
１１ｃ　関数ｆｕｎｃ＃ｂに関する記述部
１１ｄ　関数ｆｕｎｃ＃ｄに関する記述部
１１ｅ　関数ｆｕｎｃ＃ｅに関する記述部
１１ｆ　プラグマ＃ＳＴＡＣＫ＃ＣＯＭＰＲＥＳＳの記述部
１１ｇ　関数ｆｕｎｃ＃ｆに関する記述部
１２　　ソースファイル
１２ａ　関数ｆｕｎｃ＃ｃに関する記述部
２０　　実行ファイル
１００　　プログラム変換装置
１１０　　コンパイル部
１１１　　ソースファイル取得部
１１２　　翻訳部
１１３　　スタックアクセス検出部
１１４　　ユーザ指定関数抽出部
１２０　　中間コード保持部
１３０　　選択候補情報保持部
１３１　　選択候補テーブル
１３１ａ　関数名
１３１ｂ　関数評価値
１４０　　リンク部
１４１　　連結部
１４２　　関数ツリー情報作成部
１４３　　関数ツリー情報保持部
１４３ａ　関数ツリー情報テーブル
１４３ｂ　ツリー番号
１４３ｃ　ツリー評価値
１４４　　関数選択部
１４５　　圧縮・伸張ビット付加部
１５０　　記憶部
２００　　情報処理装置
２１０　　命令メモリ
２２０　　処理部
２２１　　ＩＦ
２２２　　ＤＥＣ
２２２ａ　圧縮制御ビット付きコール命令デコード部
２２２ｂ　伸張制御ビット付きリターン命令デコード部
２２２ｃ　圧縮制御ビット付きストア命令デコード部
２２２ｄ　伸張制御ビット付きロード命令デコード部
２２３　　制御部
２２４　　実行部
２２５　　レジスタ
２２５ａ　保証レジスタ
２２６　　ＰＣ
２２７　　ＳＰ
２３０　　データメモリ
２３１　　スタックメモリ
２４０　　圧縮部
２４１　　データ圧縮部
２４２　　圧縮制御部
２４３　　圧縮比較部
２４４　　しきい値保持部
２５０　　ＣＳＲ
２６０　　伸張部
２６１　　伸張制御部
２６２　　データ伸張部
３０１　　関数ｆｕｎｃ＃ａへ分岐するコール命令
３０２　　関数ｆｕｎｃ＃ｅへ分岐するコール命令
３０３　　関数ｆｕｎｃ＃ａから復帰するリターン命令
３０４　　関数ｆｕｎｃ＃ｅから復帰するリターン命令
３０５　　関数ｆｕｎｃ＃ａの処理開始時におけるストア命令
３０６　　関数ｆｕｎｃ＃ａの処理終了時におけるロード命令
【図１】
2004062220.tif 000003
【図２】
2004062220.tif 000004
【図３】
2004062220.tif 000005
【図４】
2004062220.tif 000006
【図５】
2004062220.tif 000007
【図６】
2004062220.tif 000008
【図７】
2004062220.tif 000009
【図８】
2004062220.tif 000010
【図９】
2004062220.tif 000011
【図１０】
2004062220.tif 000012
【図１１】
2004062220.tif 000013
【図１２】
2004062220.tif 000014
【図１３】
2004062220.tif 000015
【図１４】
2004062220.tif 000016
【図１５】
2004062220.tif 000017
【図１６】
2004062220.tif 000018
【図１７】
2004062220.tif 000019
【図１８】
2004062220.tif 000020
【図１９】
2004062220.tif 000021
【図２０】
2004062220.tif 000022
【図２１】
2004062220.tif 000023
【図２２】
2004062220.tif 000024
【図２３】
2004062220.tif 000025
【図２４】
2004062220.tif 000026
【図２５】
2004062220.tif 000027
【図２６】
2004062220.tif 000028