(57)【特許請求の範囲】
【請求項１】
データキャッシュを介して書き込みを行うモードであるか、命令キャッシュを介して書き込みを行うモードであるかを表すフラグを備え、
当該フラグが命令キャッシュを介して書き込みを行うモードであることを示している場合は、命令キャッシュを介して書き込みを行う
ことを特徴とするプロセッサ 。
【請求項２】
命令セットの中に、前記フラグを操作する命令を有することを特徴とする請求項１に記載のプロセッサ 。
【請求項３】
命令セットの中に、命令キャッシュを介してメモリへの書き込みを行うことを指示する命令を有する
ことを特徴とするプロセッサ 。
【請求項４】
命令キャッシュを介した書き込みが指示された場合、命令キャッシュとデータキャッシュの両方に書き込みを行う
ことを特徴とする請求項１乃至請求項３のいずれか一項に記載のプロセッサ 。
【請求項５】
請求項１乃至請求項４のいずれか一項に記載のプロセッサを使った動的コンパイルの方法であって、
動的に生成した命令をメモリへ書き込む場合、命令キャッシュを介して書き込むようにする
ことを特徴とする動的コンパイルの方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プロセッサに関し、特に、実行時に動的に機械語命令プログラムを生成して実行を行う仮想マシンインタプリタ等を実行するのに適したマイクロプロセッサに関する。
【０００２】
【従来の技術】
従来のマイクロプロセッサでは、主記憶（メインメモリ）とＣＰＵとの間に、高速な中間記憶装置として、キャッシュを設けることが多い。このキャッシュは、その構成上、データキャッシュと命令キャッシュを分離した非統合型キャッシュと、データキャッシュと命令キャッシュを統合した統合型キャッシュとに分類することができる。前者の非統合型キャッシュは、後者の統合型キャッシュと比較して、データキャッシュと命令キャッシュのそれぞれに、独立に高いデータ供給バンド幅を与えることができるので、一般に高い性能を得ることができる。このため、ハイエンドのマイクロプロセッサでは、非統合型のキャッシュが利用されることが多い。
【０００３】
一方、このようなマイクロプロセッサで実行されるプログラムを記述するプログラミング言語として、Ｊａｖａ（Ｊａｖａは、米国 Sun Microsystems, Inc.の商標）やＳｍａｌｌｔａｌｋといったものが知られている。これらのプログラミング言語で記述されたプログラムは、バイトコードと呼ばれる仮想的な計算機の命令に一旦変換され、バイトコードは、通常、仮想マシンインタプリタと呼ばれるソフトウェアによって実行される。
【０００４】
しかし、このような仮想マシンインタプリタによる実行は、仮想マシン命令の解釈実行などのオーバヘッドが大きい。従って、ＪａｖａやＳｍａｌｌｔａｌｋで記述されたプログラムは、ＣやＦＯＲＴＲＡＮといった従来のコンパイラ型言語で記述された場合に比べて、一般に、その実行速度は低速になる。これに対して、例えば、L.P. Deutsch と A.M. Chiffmanによる ”Efficient Implementation of the Smalltalk-80 System”（In Proceedings of the 11th Annual ACM Symposium on Principles of Programming Languages pp.297-302, 1984）に示されているように、実行対象の仮想マシン命令列に対して、それと等価な処理を行う機械語命令を実行時に生成し、生成した機械語命令を直接実行することでインタプリタ実行の高速化を行う手法が用いられる。このような手法は、機械語命令を実行時に動的に生成することから動的コンパイル、または実行を行おうとした時点でコンパイルを行うことからＪＩＴ（ジャストインタイム：Just-In-Time）コンパイルと呼ばれ、Ｊａｖａ仮想マシンの高速化などに利用されている。
【０００５】
【発明が解決しようとする課題】
このような実行時に命令を動的に生成するＪＩＴコンパイル技術は、仮想マシンインタプリタなどの高速化には有効であるが、非統合型のキャッシュ機構を採用したマイクロプロセッサで利用することを考えた場合、実行時に生成された命令を、実行時に主記憶へ書き込むことが必要になることから、次のような問題が生じることになる。
【０００６】
動的に生成された命令の主記憶への書き込みは、プロセッサから見た場合、通常のデータの書き込みと変わらないので、非統合型キャッシュを採用したプロセッサでは、データキャッシュを介して行われることになる。このため、生成された命令をデータキャッシュを介してメモリへ書き込んだ直後に、書き込んだ当該命令を実行しようとしても、命令キャッシュとデータキャッシュの整合性が保たれていないので、そのまま実行することができない。すなわち、命令キャッシュの更新が行われていないために、そのままでは予期しない命令を実行してしまう可能性がある。そこで、ほとんどのマイクロプロセッサでは、指定したデータキャッシュ上のデータを主記憶に書き戻したり、命令キャッシュ上のキャッシュブロックを無効化するための命令を備えている。そして、主記憶へ書き込んだ命令を実行する前に、このような命令を使って、書き込んだアドレスに対応する命令キャッシュ上のデータを破棄（無効化）するとともに、ライトバック（write-back）型のキャッシュであれば、変更が主記憶に反映されるように、書き込んだアドレスに対応するデータキャッシュ上のデータを主記憶に書き戻す。
【０００７】
つまり、動的な命令の生成・実行処理は、以下のような流れで行われる。
【０００８】
１．書き込み対象アドレス（以下、アドレスＡという）に対応するデータキャッシュのキャッシュブロックへの、動的に生成された機械語命令の書き込み
２. アドレスＡに対応する命令キャッシュのキャッシュブロックの破棄
３. アドレスＡに対応するデータキャッシュのキャッシュブロックの主記憶への書き戻し（ライトバック型のキャッシュの場合）
４. 主記憶のアドレスＡから命令キャッシュの対応するキャッシュブロックへの読み出し
５．命令キャッシュからの命令の読み出し及び実行
以上述べたように、非統合型キャッシュを採用したマイクロプロセッサにおいて、実行時に動的に命令を生成し、当該生成された命令を実行しようとすると、動的に生成された命令は、データキャッシュに書き込まれた後、主記憶へ書き出され、その後、命令キャッシュへ読み出す必要があるため、主記憶への書き込みや読み出しを伴うことになり、このことは、実行速度の低下要因となりうる。
【０００９】
特に、プロセッサ内での命令レベル並列度や動作周波数が向上し、主記憶参照に要する時間で、多数の命令を処理可能なハイエンドマイクロプロセッサでは、主記憶参照に要するオーバヘッドにより動的な命令生成処理を行うプログラムの動作性能が低下してしまうといった問題が深刻化するおそれがある。
【００１０】
なお、ＣやＦＯＲＴＲＡＮといった従来の静的なコンパイラ型言語では、機械語命令への変換がプログラム実行前にあらかじめ行われ、実行時に動的に命令を生成することがないため、分離型のキャッシュ構成であっても、大きな問題とはならなかった。
本発明の目的は、仮想マシンインタプリタにおけるＪＩＴコンパイルのような、実行時に動的に機械語命令の生成を行う処理において、動的な命令生成時の主記憶参照によって生じる性能低下を低く押えることができるプロセッサを提供することにある。
【００１１】
【課題を解決するための手段】
本発明に係るプロセッサは、命令セットの中に、所定のメモリ領域毎に、当該領域が、データキャッシュを介して書き込みを行う領域か、命令キャッシュを介して書き込みを行う領域かを指定することができる命令を有することを特徴とする。この場合、前記命令によって命令キャッシュを介して書き込みを行う領域として指定されたメモリ領域に対して、書き込みが指示された場合は、命令キャッシュを介して書き込みを行う。
【００１２】
また、本発明に係る第２のプロセッサは、データキャッシュを介して書き込みを行うモードか、命令キャッシュを介して書き込みを行うモードであるかを表すフラグを備え、当該フラグが命令キャッシュを介して書き込みを行うモードであることを示している場合は、命令キャッシュを介して書き込みを行うことを特徴とする。この場合、命令セットの中に、前記フラグを操作する命令を有することが好ましい。
【００１３】
また、本発明に係る第３のプロセッサは、命令セットの中に、命令キャッシュを介してメモリへの書き込みを行うことを指示する命令を有することを特徴とする。
【００１４】
なお、上記第１から第３のプロセッサにおいて、命令キャッシュを介した書き込みが指示された場合、命令キャッシュとデータキャッシュの両方に書き込みを行うようにしてもよい。このようにすれば、データキャッシュに命令キャッシュの更新データのコピーが存在することになるので、命令キャッシュからメモリへの直接的な書き戻し経路を設けることなく、命令キャッシュにおいてキャッシュ溢れが生じた場合の更新データの主記憶への書き戻しが可能になる。
【００１５】
更に、本発明に係る動的コンパイルの方法は、前述の第１から第３のプロセッサを使った動的コンパイルの方法であって、動的に生成した命令をメモリへ書き込む場合、命令キャッシュを介して書き込むようにすることを特徴とする。
【００１６】
本発明によるプロセッサでは、命令キャッシュを介してメモリへの書き込みを行うことができるので、動的コンパイルによって、動的に生成した命令をメモリへ書き込む場合、命令キャッシュを介して書き込むことができ、主記憶参照の必要性が減り、仮想マシンインタプリタにおけるＪＩＴコンパイルのような、実行時に動的に機械語命令の生成を行う処理において、動的な命令生成時の主記憶参照によって生じる性能低下を低く押えることができる
【００１７】
【発明の実施の形態】
以下、本発明の実施の形態について、図面を参照しつつ、詳細に説明する。
【００１８】
図９は、本発明を実施する計算機システムの例を示す図である。仮想マシンインタプリタにおけるＪＩＴコンパイラなど実行時に命令生成処理を行うソフトウェアは、ディスク装置２０４から主記憶２０３に読み出され、プロセッサ２０１によって実行される。このソフトウェアにより生成される機械語命令は、高速な中間記憶装置であるキャッシュ２０２を介して主記憶２０３とプロセッサ２０１の間で読み書きされる。なお、ここでは、簡単のためメモリ階層をキャッシュと主記憶の２階層としているが、本発明は、複数のキャッシュ階層を持つマイクロプロセッサに対して適用することも可能である。
【００１９】
図１は、本発明による非統合型キャッシュを採用したマイクロプロセッサの動作概要を説明する図である。本発明と対比するため、まず、非統合型キャッシュを採用した従来のマイクロプロセッサの動作について同図を使って説明する。非統合型キャッシュを採用した従来のマイクロプロセッサでは、ＣＰＵ１０１が実行する命令は、主記憶１０４から命令キャッシュ１０２へ読み出され、ＣＰＵ１０１へと受け渡される。このようにしてフェッチされた命令は、メモリユニット１０７を介して、命令デコーダ１０８に渡される。更に、当該命令は、命令デコーダ１０８でデコードされて、当該デコード結果に基づいて、ＡＬＵ１０５やレジスタ１０６が制御されて、命令の実行が行われる。頻繁に実行される命令は、高速な中間記憶装置である命令キャッシュ１０２に保存されることにより、低速な主記憶１０４を参照する必要がなくなるため、高速な実行を行うことが可能になる。
【００２０】
図１において、破線は、従来のマイクロプロセッサにおいて、動的命令生成処理での動的に生成された命令の流れを表す。また、実線は本発明における動的に生成された命令の流れを表している。なお、ここでの説明では、簡単のため、まず、キャッシュブロックの競合や容量不足による溢れが生じない場合について説明し、キャッシュブロックの溢れが発生する場合については後述する。
【００２１】
同図の破線で示すように、従来の動的命令生成処理においては、ＡＬＵ１０５によって実行時に動的に生成された命令は、レジスタ１０６に格納された後、メモリユニット１０７を介して、データキャッシュ１０３へ書き込まれる。データキャッシュ１０３がライトバック方式を採用している場合、この状態では、実行すべき命令がデータキャッシュ１０３上にのみ存在するので、当該命令が書き込まれたキャッシュブロックを主記憶１０４へ書き戻す。また、命令キャッシュ１０２上に当該書き込みを行ったアドレスに対応するキャッシュブロックが存在する可能性があるので、存在する場合には命令キャッシュ１０２上の当該ブロックを無効化する。これによって、動的に生成された命令の書き込みを行ったアドレスに対応するキャッシュブロックは、命令キャッシュ１０２上に存在しなくなるので、生成された命令を実行しようとした時点で、主記憶１０４から命令キャッシュ１０２上に命令が読み出され、メモリユニット１０７を介して命令デコーダ１０８へと受け渡され、デコード結果に従って、ＣＰＵ１０１での命令実行が行われる。
【００２２】
これに対して、本発明における動的命令生成処理での生成命令の流れでは、ＡＬＵ１０５が動的に生成した命令は、レジスタ１０６に格納された後、メモリユニット１０７を介して、命令キャッシュ１０２に直接書き込まれる。そして、生成された命令を実行する場合には、命令キャッシュ１０２上に生成された命令が存在するため、メモリユニット１０７は、命令キャッシュ１０２から実行すべき命令を読み出し、読み出した命令を命令デコーダ１０８へ渡す。
【００２３】
以上説明したように、従来のマイクロプロセッサでは、キャッシュ容量の余裕の有無に関わらず、データキャッシュ１０３に書き込んだ命令を一度高速なキャッシュメモリから低速な主記憶１０４へ書き込んで、再度命令キャッシュ１０２を介してＣＰＵ１０１へ読み出さねばならなかった。これに対して、本発明によるマイクロプロセッサでは、主記憶１０４を介することなく直接命令キャッシュ１０２上に書き込んだ命令を実行することができるので、動的に生成された命令の実行を高速化することができる。
【００２４】
以上の説明では、キャッシュブロックの競合や容量不足によるキャッシュブロックの追い出しを考慮していなかった。実際には、キャッシュ容量は限られており、キャッシュブロックの競合は生じるため、追い出し時の処理を考慮する必要がある。そこで、以下ではキャッシュ追い出し時の処理を考慮した命令書き込み処理について説明する。
【００２５】
キャッシュへの書き込み処理において、競合等によりキャッシュブロックを追い出す場合の処理は、キャッシュがライトスルー（write-through）方式を採用しているか、ライトバック方式を採用しているかによってその処理が異なる。
【００２６】
ライトスルー方式の場合には、キャッシュへの書き込みと同時に主記憶への書き込みも行われているため、追い出し対象のキャッシュブロックを単に無効化するだけで良い。すなわち、本発明による命令キャッシュをライトスルー方式のキャッシュとして構成した場合は、命令キャッシュと主記憶の両方に、書き込み対象の命令が書き込まれるので、主記憶上に最新のデータが保存されていることになり、キャッシュブロックの追い出し時にはキャッシュブロックの内容を破棄すれば良い。
【００２７】
一方、ライトバック方式の場合には、最新のデータはキャッシュ上のみに存在するので、更新データを含むキャッシュブロックの追い出し時には主記憶へのデータの書き戻し処理を行う必要がある。従来のプロセッサでは、ＣＰＵからキャッシュへのデータの書き込みはデータキャッシュに対してのみ行われていたため、キャッシュから主記憶へのデータの書き戻し処理はデータキャッシュだけでしか行われていなかった。本発明によるプロセッサでは、命令キャッシュに対する書き込みも行うので、ライトバック方式を採用した場合、命令キャッシュからの主記憶へのデータの書き戻し処理を考慮する必要がある。このような命令キャッシュからの主記憶へのデータの書き戻し処理には、命令キャッシュから直接主記憶への書き込みを可能とする方式と、従来通り主記憶への書き込みはデータキャッシュのみから行うようにする方式とが考えられる。以下では、各方式についてその実現例を示す。
【００２８】
図２は、命令キャッシュから主記憶へキャッシュブロックを書き込み可能なようにアーキテクチャを拡張した場合の、動的に生成された命令の流れを表している。図２において、ＡＬＵ１０５によって動的に生成され、レジスタ１０６に格納された命令は、メモリユニット１０７を介して命令キャッシュ１０２に書き込まれる。ここで、書き込み対象となるキャッシュブロック３０１に書き込みアドレスとは異なるアドレスに対応する命令が既に保持されている場合、そのキャッシュブロックを利用可能とする必要があるが、当該キャッシュブロック３０１の更新状態によってその処理が異なる。キャッシュブロック３０１が書き込みが行われていない状態（クリーン：clean）であれば、主記憶１０４上の内容と命令キャッシュ１０２上の内容は一致しているので、主記憶１０４への書き戻しは行わず、命令キャッシュ１０２上のキャッシュブロック３０１のデータを破棄する。一方、キャッシュブロック３０１が書き込みが行われた状態（ダーティ：dirty）であれば、命令キャッシュ１０２上のみに最新の命令が存在するので、まず、キャッシュブロック３０１を対応する主記憶上の領域３０２へ書き戻す。
【００２９】
命令キャッシュ１０２上の元のデータの破棄または書き戻しが終了すると、動的に生成された命令の書き込み対象アドレスに対応した主記憶１０４上のデータブロック３０３をキャッシュブロック３０１へ読み込んで、メモリユニット１０７から受け渡された書き込み対象命令の書き込みを行う。これらの動作は、通常のライトバック型データキャッシュの動作と同様である。
【００３０】
図３は、図２に示した命令キャッシュから主記憶へのキャッシュブロックの書き戻し機構を追加した場合の主記憶への書き込み処理の流れを示す図である。同図に示すように、処理を開始すると（Ｓ４０１）、まず、書き込みが命令キャッシュを介した書き込みか否かを判別する（Ｓ４０２）。あるデータ書き込み命令がデータキャッシュを介した書き込みか、命令キャッシュを介した書き込みかを指定・判断する方法については、後述する。
【００３１】
判別の結果、当該書き込みがデータキャッシュを介したものであれば（Ｓ４０２：ＮＯ）、従来と同じデータキャッシュを介した書き込み処理を行い（Ｓ４０３）、処理を終了する（Ｓ４０８）。一方、命令キャッシュを介した書き込みであれば（Ｓ４０２：ＹＥＳ）、書き込み対象アドレスに対応するキャッシュブロックが命令キャッシュ上に存在するか否かを調べる（Ｓ４０４）。その結果、書き込み対象アドレスに対応するキャッシュブロックが命令キャッシュ上に存在しない場合は（Ｓ４０４：ＮＯ）、続けて、データキャッシュに書き込み対象アドレスに対応するキャッシュブロックが存在するか否かを調べ、そのようなキャッシュブロックが存在し、データキャッシュの当該キャッシュブロックがダーティ状態であれば当該ブロックを主記憶に書き出し（Ｓ４０５）、書き込み対象のアドレスに対応したブロックを命令キャッシュに読み出す（Ｓ４０６）。これにより、命令キャッシュ上に書き込み対象アドレスのキャッシュブロックが確保されるので、命令キャッシュの当該ブロックに動的に生成された命令を書き込み（Ｓ４０７）、処理を終える（Ｓ４０８）。一方、書き込み対象アドレスに対応するキャッシュブロックが命令キャッシュ上に存在する場合は（Ｓ４０４：ＹＥＳ）、命令キャッシュ上に書き込み対象アドレスのキャッシュブロックが既に確保されているので、そのまま、命令キャッシュに命令を書き込み（Ｓ４０７）、処理を終える（Ｓ４０８）。
【００３２】
なお、命令書き込み対象アドレスに対応するキャッシュブロックがデータキャッシュ上に存在する場合は、命令キャッシュとの整合性を保つため、該当するデータキャッシュのデータブロックを破棄（無効化）するか、又は、命令キャッシュとともに、データキャッシュにも命令を書き込むようにすればよい。
【００３３】
図４は、命令キャッシュ１０２から主記憶１０４へ直接書き込みを行う機構を有しない場合の、動的に生成された命令の流れを表している。この場合、命令キャッシュから主記憶への直接的な書き戻し経路を設ける必要がないので、図２に示したものに比べて、従来のマイクロプロセッサに対するハードウェア的な変更量が少なくてすむ。
【００３４】
図４に示すように、ＡＬＵ１０５によって動的に生成され、レジスタ１０６に格納された命令は、メモリユニット１０７を介して命令キャッシュ１０２と、データキャッシュ１０３に書き込まれる。すなわち、データキャッシュ１０３上にも当該命令のコピーを持つこととする。
【００３５】
このようにデータキャッシュ１０３上にも当該命令（に対応するキャッシュブロック）のコピーを持つのは、本実施形態では、命令キャッシュ１０２から主記憶１０４へのキャッシュブロックの書き戻しパスが存在しないため、命令キャッシュ１０２に対して動的に生成された命令の書き込みを行う際に、キャッシュ溢れが生じ、主記憶への書き戻しが必要になった場合、当該書き戻しをできるようにするためである。
【００３６】
命令キャッシュ１０２への書き込みを行う際、キャッシュ溢れが生じ、主記憶への書き戻しが必要になった場合は、書き戻し対象となった命令キャッシュ上のブロック５０１を破棄するとともに、対応するデータキャッシュ１０３上のブロック５０２の更新状況を調べて、ダーティであれば、対応する主記憶１０４上の領域５０４に書き戻す。次に、書き込み対象アドレスに対応するブロック５０３を主記憶１０４から読み出し、命令キャッシュ１０２とデータキャッシュ１０３の両方に読み込む。そして、書き込み対象の命令を命令キャッシュ１０２上のブロック５０１と、データキャッシュ１０３上のブロック５０２へ書き込む。
【００３７】
なお、命令キャッシュ１０２上のデータに対応して、データキャッシュ１０３上に確保されているキャッシュブロックは、データキャッシュへのデータの書き込みによる競合によって主記憶へ書き戻されることがあるが、その場合には、命令キャッシュ１０２上のキャッシュブロックの内容と主記憶１０４上のデータは一致しているので、特別な操作を行う必要はない。
【００３８】
図５は、図４に示した命令キャッシュから主記憶へのキャッシュブロックの書き戻し機構を追加しない場合の主記憶への書き込み処理の流れを示す図である。同図に示すように、主記憶への書き込みを行う場合（Ｓ６０１）、まず、命令キャッシュを介した書き込みか否かのチェックを行う（Ｓ６０２）。書き込みが命令キャッシュを介した書き込みか否かの指定・判定方法については後述する。
【００３９】
チェックの結果、書き込みが、命令キャッシュを介した書き込みでなければ（Ｓ６０２：ＮＯ）、通常のデータキャッシュを介した書き込み処理を行い（Ｓ６０３）、書き込み処理を終了する（Ｓ６１０）。
【００４０】
一方、命令キャッシュを介した書き込みであれば（Ｓ６０２：ＹＥＳ）、まず、データキャッシュに書き込み対象アドレスに対応するブロックが存在するか否かを調べる（Ｓ６０４）。その結果、対応するブロックがデータキャッシュに存在しなければ（Ｓ６０４：ＮＯ）、データキャッシュに当該ブロックを読み出す（Ｓ６０５）。更に、命令キャッシュに書き込み対象アドレスに対応するブロックが存在するか否かを調べる（Ｓ６０６）。
【００４１】
その結果、命令キャッシュに当該ブロックが存在しなければ（Ｓ６０６：ＮＯ）、続けて、データキャッシュの当該ブロックがダーティであるか否かを調べて、ダーティであれば主記憶に当該ブロックを書き戻す（Ｓ６０７）。次に、書き込み対象アドレスに対応するブロックを主記憶から命令キャッシュへ読み出す（Ｓ６０８）。これにより、主記憶、データキャッシュ、命令キャッシュの内容が一致するので、データキャッシュと命令キャッシュに書き込み対象の命令を書き込み（Ｓ６０９）、処理を終了する（Ｓ６１０）。
【００４２】
一方、命令キャッシュに当該ブロックが存在すれば（Ｓ６０６：ＹＥＳ）、データキャッシュと命令キャッシュの両方にブロックが存在することになるので、データキャッシュと命令キャッシュに書き込み対象の命令を書き込み（Ｓ６０９）、処理を終了する（Ｓ６１０）。
【００４３】
なお、上述した処理フローでは、データキャッシュに書き込み対象アドレスに対応するブロックが存在しなければ、主記憶からデータキャッシュへの読み出しを行っているが（Ｓ６０５）、命令キャッシュとデータキャッシュの間でデータの転送が可能であれば、命令キャッシュに対応するデータが存在する場合は、主記憶との間の転送は省略することができる。同様に、書き込み対象アドレスに対応するブロックを主記憶から命令キャッシュへ読み出しているが（Ｓ６０８）、命令キャッシュとデータキャッシュの間でデータの転送が可能で、データキャッシュに対応するデータが存在する場合は、主記憶との間の転送は省略し、命令キャッシュからコピーするように最適化することができる。
【００４４】
次に、あるデータ書き込みがデータキャッシュを介した書き込みか、命令キャッシュを介した書き込みかを指定・判別する方法について説明する。このような方法として、例えば、以下の（ａ）〜（ｃ）に示すようなものが考えられる。
【００４５】
（ａ）ページなど所定のメモリ領域毎に、命令キャッシュ及びデータキャッシュのいずれを介して書き込みを行う領域かを指定できるようにし、書き込み対象のアドレスによって判別する方法。
【００４６】
（ｂ）ＣＰＵに内部フラグを設け、フラグの設定によって、命令キャッシュ及びデータキャッシュのいずれを介して書き込みを行うモードであるかを指定・判別する方法。
【００４７】
（ｃ）データ書き込み命令として、命令キャッシュを介したものと、データキャッシュを介したものとを分けて用意し、これらの命令を使い分けることで、指定・判別する方法。
【００４８】
まず、上述した（ａ）の方法に対応するものとして、マイクロプロセッサの命令セットのなかに、メモリ領域毎に、データキャッシュを介して書き込みが行われる領域か、命令キャッシュを介して書き込みが行われる領域かを指定するための命令（例えば、「set-dwrite」及び「set-iwrite」）を設けた場合について説明する。プロセッサは、メモリに対する書き込みを実行する際、書き込み対象アドレスがいずれの領域に該当するのか調べて、その結果に応じて、命令キャッシュまたはデータキャッシュを介した書き込みを行う。
【００４９】
命令「set-dwrite」は、そのオペランドによって指定されるアドレス領域（例えば、オペランドで指定されるアドレスから１ページ分）は、データキャッシュを介して書き込みが行われるべき領域であることを指定する命令であり、当該命令実行後は、指定されたアドレス領域に対する書き込みはデータキャッシュを介して行われるようになる。同様に、命令「set-iwrite」は、オペランドによって指定されたアドレス領域は、命令キャッシュを介して書き込みが行われるべき領域であることを指定する命令であり、当該命令実行後は、指定されたアドレス領域に対する書き込みは命令キャッシュを介して行われる。
【００５０】
図６は、命令「set-dwrite」及び「set-iwrite」を設けた場合のハードウェア構成例を示す図である。これらの命令は、命令フェッチ・デコードユニット１００１によりメモリからの読み出され、デコードされて、実行制御が行われる。命令「set-dwrite」又は命令「set-iwrite」が実行されると、命令キャッシュを介した書き込みかデータキャッシュを介した書き込みかを示すビットとともに、オペランドで指定されたアドレスが、方向テーブル１００２に記憶される。
【００５１】
そして、メモリへの書き込みを行う命令、例えば、ストア命令が実行され、データのストアを行う場合には、まず、ストア命令で指定されたアドレッシング・モードに従って、レジスタ１００３の値とストア命令中で指定された即値（immediate）のいずれかをマルチプレクサ１００４によって選択し、加算器１００５で、レジスタ１００３の値と演算して、データを格納する実効アドレスを生成する。そして、生成されたアドレスが、方向テーブル１００２に存在するか否かを比較器１００６により確認し、同時にそのアドレスに対して指定された書き込み対象キャッシュが命令キャッシュであるか否かを比較器１００７で調べる。その結果、方向テーブル１００２にストア・アドレスが存在し、かつ書き込み対象キャッシュが命令キャッシュであると指定されていた場合は、デマルチプレクサ１００８及びデマルチプレクサ１００９によって、書き込みアドレス、書き込みデータの供給先として、命令キャッシュ１０１１を選択し、書き込みを行う。一方、方向テーブル１００２にストア・アドレスが存在しないか、又は、書き込み対象キャッシュが命令キャッシュであると指定されていない場合は、デマルチプレクサ１００８及びデマルチプレクサ１００９によって、書き込みアドレス、書き込みデータの供給先として、データキャッシュ１０１０を選択し、書き込みを行う。なお、比較器１００６が比較対象とするビット数は、指定される領域の大きさによって、定まる。
【００５２】
次に、上述した（ｂ）の方法に対応するものとして、マイクロプロセッサの内部に、メモリに対する書き込みを、データキャッシュを介して行うモードであるか、命令キャッシュを介して行うモードであるかを表すフラグを設けるとともに、命令セットのなかにフラグ設定命令（例えば、「set-iwrite-flag」及び「reset-iwrite-flag」）を設けた場合について説明する。命令「set-iwrite-flag」及び「reset-iwrite-flag」は、ＣＰＵに設けられた内部フラグ（iwrite-flag）を制御（セット／リセット）するための命令であり、ＣＰＵは、このフラグの設定値に従って、命令キャッシュを介してデータの書き込みを行うか、データキャッシュを介してデータの書き込みを行うかを決定する。
【００５３】
ここで、命令「set-iwrite-flag」は、命令キャッシュを介して書き込みが行われるように、内部フラグをセットする命令であり、当該命令実行後の書き込み命令はすべて命令キャッシュを介して行われる。これに対して、命令「reset-iwrite-flag」は、データキャッシュを介して書き込みが行われるように、内部フラグをリセットする命令であり、当該命令実行後の書き込みはすべてデータキャッシュを介して行われる。
【００５４】
図７は、内部フラグ並びに命令「set-iwrite-flag」及び「reset-iwrite-flag」を設けた場合のハードウェア構成例を示す図である。命令「set-iwrite-flag」及び「reset-iwrite-flag」は、命令フェッチ・デコードユニット１１０１により、メモリから読み出され、デコードされ、実行制御が行われる。命令「set-dwrite-flag」又は「set-iwrite-flag」が実行されると、現在の書き込みモードを表すフラグが内部フラグ（iwrite-flag）１１０２に記憶される。
【００５５】
そして、ストア命令等によりデータの書き込みを行う場合には、図６の場合と同様にして実効アドレスを、レジスタ１１０３、マルチプレクサ１１０４、加算器１１０５によって生成する。そして、デマルチプレクサ１１０６、１１０７では、フラグ１１０２の値に従ってアドレスおよびデータの供給先を選択し、データキャッシュ１１０９または命令キャッシュ１１０８へ書き込みを行う。
【００５６】
最後に、上述した（ｃ）の方法に対応するものとして、命令コードによって命令キャッシュを介してデータの書き込みを行うか、データキャッシュを介してデータの書き込みを行うかを指定・決定する場合について説明する。すなわち、マイクロプロセッサの命令セットのなかに、データ書き込み命令として、通常の、データキャッシュを介してデータの書き込みを行う命令（例えば、「write」）の他に、命令キャッシュを介してデータの書き込みを行う命令（例えば、「iwrite」）を用意し、ソフトウェア等は、これら２種の命令を適宜選択して使用することにより、主記憶への書き込みの際に介するキャッシュの選択を行う。
【００５７】
命令「iwrite」が実行されると、オペランドで指定された実効アドレスに対して、オペランドで指定したレジスタ等に格納されたデータ（命令）を、命令キャッシュを介して書き込む。
【００５８】
図８は、命令「iwrite」を設けた場合のハードウェア構成例を示す図である。命令「iwrite」は、命令フェッチ・デコードユニット１２０１により主記憶や命令キャッシュからの読み出され、デコードされ、実行制御が行われる。命令キャッシュを対象としたストア命令「iwrite」により、データのストアを行う場合には、まず、前述したのと同様にして、レジスタ１２０３、マルチプレクサ１２０４、加算器１２０５でアドレスを生成する。デマルチプレクサ１２０６、１２０７では、命令フェッチ・デコードユニット１２０１からの、当該命令が命令キャッシュを対象としたストア命令であることを表す出力信号１２０２によりデータの書き込み先として、命令キャッシュ１２０８を選択し、書き込みを行う。
【００５９】
同様にデータキャッシュを対象としたストア命令「write」によりデータのストアを行う場合には、デマルチプレクサ１２０６、１２０７では命令フェッチ・デコードユニット１２０１からの出力信号１２０２によりアドレスおよびデータの供給先として、データキャッシュを選択し、データキャッシュ１２０９への書き込みを行う。
【００６０】
以上説明したような、命令キャッシュへの書き込みをソフトウェア的に制御できる機構をマイクロプロセッサに設けることにより、主記憶とキャッシュ間（又は、上位キャッシュと下位キャッシュ間）の不要なデータの転送を減少させ、動的な命令生成を行うプログラムの性能を向上させることが可能となる。
【００６１】
最後に、上述したような本発明によるマイクロプロセッサ上で実行される動的コンパイラについて説明する。本発明によるマイクロプロセッサでは、命令キャッシュへの書き込みをソフトウェア的に制御できるので、動的コンパイラは、プログラム実行時に動的に生成した命令を主記憶に格納する際、上述したいずれかの方法を使って、命令キャッシュを介して書き込むようにする。これ以外の動作は、従来の動的コンパイラの動作と同様でよい。このようにすれば、動的に生成した命令を主記憶に格納する場合の主記憶参照の必要性が減り、プログラムの高速実行が可能になる。
【００６２】
【発明の効果】
以上、詳細に説明したように、本発明によれば、実行時に動的に機械語命令の生成を行うプログラムにおいて、生成した機械語命令を直接命令キャッシュへ書き込むことが可能となる。これにより、実行時に動的に機械語命令の生成を行うプログラムの実行の高速化が図れる。
【図面の簡単な説明】
【図１】  本発明による非統合型キャッシュのマイクロプロセッサの動作概要を説明する図である。
【図２】  命令キャッシュから主記憶への書き込みパスを設けたマイクロプロセッサにおける、動的に生成された命令の流れを示す図である。
【図３】  命令キャッシュから主記憶への書き込みパスを設けたマイクロプロセッサにおける、書き込み処理の流れを示す図である。
【図４】  命令キャッシュから主記憶への書き込みパスを有しないマイクロプロセッサにおける、動的に生成された命令の流れを示す図である。
【図５】  命令キャッシュから主記憶への書き込みパスを有しないマイクロプロセッサにおける、書き込み処理の流れを示す図である。
【図６】  所定のメモリ領域毎に、書き込み対象キャッシュを指定できる命令を設けたマイクロプロセッサのハードウェア構成例を示す図である。
【図７】  命令キャッシュを介して書き込むモードか、データキャッシュを介して書き込むモードかを指定する内部フラグを設けたマイクロプロセッサのハードウェア構成例を示す図である。
【図８】  命令キャッシュを介して書き込みを行う命令を設けたマイクロプロセッサのハードウェア構成例を示す図である。
【図９】  本発明が適用される計算機システムの例を示す図である。
【符号の説明】
１０１  ＣＰＵ
１０２  命令キャッシュ
１０３  データキャッシュ
１０４  主記憶
１０５  ＡＬＵ
１０６  レジスタ
１０７  メモリユニット
１０８  命令デコーダ
【図１】
0003693503.tif 000002
【図２】
0003693503.tif 000003
【図３】
0003693503.tif 000004
【図４】
0003693503.tif 000005
【図５】
0003693503.tif 000006
【図６】
0003693503.tif 000007
【図７】
0003693503.tif 000008
【図８】
0003693503.tif 000009
【図９】
0003693503.tif 000010