(57)【特許請求の範囲】
【請求項１】
プロセッサが実行した命令の命令アドレスを有するトレースデータをトレースメモリに順次書き込むトレースメモリライト制御手段と、
連続する前記トレースデータの第１、第２の命令アドレスの差分値が負であるか否かを判定する差分検出手段と、
前記差分値が負である第２の命令アドレスをループ候補先頭命令アドレスとして１つ以上保持するループ候補保持手段と、
前記差分値が負である第２の命令アドレスを前記ループ候補先頭命令アドレスと比較し、一致した場合にループ検出し、一致しない場合に、一致しなかった前記第２の命令アドレスを新たなループ候補先頭命令アドレスとして前記ループ候補保持手段に保持する命令アドレス比較手段と、
前記ループ検出した前記第２の命令アドレス以降のトレースデータと、前記トレースメモリ内の前記ループ候補先頭命令アドレス以降のトレースデータとを比較するトレースデータ比較手段とを有し、
前記トレースメモリライト制御手段は、前記トレースデータ比較手段が、前記第２の命令アドレス以降のトレースデータと、前記ループ候補先頭命令アドレス以降のトレースデータとの一致を検出する間は、前記第２の命令アドレス以降のトレースデータを前記トレースメモリに書き込まず、不一致を検出した時に、前記第２の命令アドレス以降のトレースデータ数と前記ループ候補先頭命令アドレスが書き込まれた前記トレースメモリ内のアドレス情報とを含むループ情報データを前記トレースメモリに書き込むことを特徴とするトレース圧縮装置。
【請求項２】
請求項１において、
前記命令アドレス比較手段が、第１の前記ループ情報データに対応する第１のループを検出した場合、
前記トレースデータ比較手段は、前記第１のループの前記ループ候補先頭命令アドレス以降のトレースデータが、当該第１のループが内包する第２のループの第２のループ情報データを有する場合、前記トレースメモリ内に書き込まれた前記第２のループ情報データの前記ループ候補先頭命令アドレス以降のトレースデータを、当該第２のループ情報データのトレースデータ数に達するまで読み出すことによって前記第２のループのトレースデータを復元しながら、前記ループ検出した前記第２の命令アドレス以降のトレースデータと比較することを特徴とするトレース圧縮装置。
【請求項３】
請求項１または２において、
前記ループ候補保持手段は、前記ループ候補先頭命令アドレスを複数保持し、
前記命令アドレス比較手段は、前記差分値が負である第２の命令アドレスを当該複数のループ候補先頭命令アドレスと比較し、一致する前記ループ候補先頭命令アドレスに対応するループを検出することを特徴とするトレース圧縮装置。
【請求項４】
請求項２において、
前記トレースデータ比較手段は、さらに、前記第２のループの前記ループ候補先頭命令アドレス以降のトレースデータが、当該第２のループが内包する第３のループの第３のループ情報データを有する場合、前記トレースメモリ内に書き込まれた前記第３のループ情報データの前記ループ候補先頭命令アドレス以降のトレースデータを、当該第３のループ情報データのトレースデータ数に達するまで読み出すことによって前記第３のループのトレースデータを復元しながら、前記ループ検出した前記第２の命令アドレス以降のトレースデータと比較することを特徴とするトレース圧縮装置。
【請求項５】
プロセッサが実行した命令の命令アドレスを有するトレースデータをトレースメモリに順次書き込むトレースメモリライト制御工程と、
連続する前記トレースデータの第１、第２の命令アドレスの差分値が負であるか否かを判定する差分検出工程と、
前記差分値が負である第２の命令アドレスをループ候補先頭命令アドレスとして１つ以上保持し、前記差分値が負である第２の命令アドレスを前記保持するループ候補先頭命令アドレスと比較し、一致した場合にループ検出し、一致しない場合に、一致しなかった前記第２の命令アドレスを新たなループ候補先頭命令アドレスとして保持するループ検出工程と、
前記ループ検出した前記第２の命令アドレス以降のトレースデータと、前記トレースメモリ内の前記ループ候補先頭命令アドレス以降のトレースデータとを比較するトレースデータ比較工程とをコンピュータに実行させ、
前記トレースメモリライト制御工程では、前記トレースデータ比較工程において、前記第２の命令アドレス以降のトレースデータと、前記ループ候補先頭命令アドレス以降のトレースデータとの一致を検出する間は、前記第２の命令アドレス以降のトレースデータを前記トレースメモリに書き込まず、不一致を検出した時に、前記第２の命令アドレス以降のトレースデータ数と前記ループ候補先頭命令アドレスが書き込まれた前記トレースメモリ内のアドレス情報とを含むループ情報データを前記トレースメモリに書き込むことを特徴とするコンピュータ読み取り可能なトレース圧縮プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、トレース圧縮装置、トレース圧縮プログラムに関する。
【背景技術】
【０００２】
一般的に、プログラムの実行時には、実行する命令のアドレスや命令コード、及びメモリへのアクセスの状況等を示すデータがトレースデータとして取得される。トレースデータは、例えば、メモリに蓄積されプログラム動作の解析やデバッグ作業に用いられる。このトレースデータのデータ量は、近年のプログラムの複雑化や大規模化、及びトレースデータの取得時間の長期化に伴い、膨大化している。これにより、動作解析やデバッグ作業の非効率化やトレースデータを格納するメモリの大容量化が発生し、問題となっている。
【０００３】
そこで、トレースデータのうち、ひとつまたは複数の命令を繰り返し行うループ部分のトレースデータを圧縮することにより、データ量を削減する技術が提案されている（特許文献１）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平０４―２８７２４１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、特許文献１では、１重のループのトレースデータの圧縮は可能であるが、ループ内にさらに別の小さなひとつまたは複数のループを包含する２重以上のループ（ネストループ）部分のトレースデータの圧縮を行うことはできなかった。
【０００６】
そこで、本発明では、ネストループ部分のトレースデータを圧縮可能なトレース圧縮装置、トレース圧縮プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
トレース圧縮装置の第１の側面は、プロセッサが実行した命令の命令アドレスを有するトレースデータをトレースメモリに順次書き込むトレースメモリライト制御手段と、
連続する前記トレースデータの第１、第２の命令アドレスの差分値が負であるか否かを判定する差分検出手段と、
前記差分値が負である第２の命令アドレスをループ候補先頭命令アドレスとして１つ以上保持するループ候補保持手段と、
前記差分値が負である第２の命令アドレスを前記ループ候補先頭命令アドレスと比較し、一致した場合にループ検出し、一致しない場合に、一致しなかった前記第２の命令アドレスを新たなループ候補先頭命令アドレスとして前記ループ候補保持手段に保持する命令アドレス比較手段と、
前記ループ検出した前記第２の命令アドレス以降のトレースデータと、前記トレースメモリ内の前記ループ候補先頭命令アドレス以降のトレースデータとを比較するトレースデータ比較手段とを有し、
前記トレースメモリライト制御手段は、前記トレースデータ比較手段が、前記第２の命令アドレス以降のトレースデータと、前記ループ候補先頭命令アドレス以降のトレースデータとの一致を検出する間は、前記第２の命令アドレス以降のトレースデータを前記トレースメモリに書き込まず、不一致を検出した時に、前記第２の命令アドレス以降のトレースデータ数と前記ループ候補先頭命令アドレスが書き込まれた前記トレースメモリ内のアドレス情報とを含むループ情報データを前記トレースメモリに書き込む。
【発明の効果】
【０００８】
第１の側面によれば、ネストループ部分のトレースデータを圧縮することができる。
【図面の簡単な説明】
【０００９】
【図１】本実施の形態例におけるトレース圧縮システムを表す図である。
【図２】図１のトレース圧縮システムにおけるＩＣＥの構成を表す図である。
【図３】図２のネストループバッファ部を表す図である。
【図４】ネストループを有するプログラムの一例を表す図である。
【図５】図４のソースプログラムを実行時に生成されるトレースの一例を表す図である。
【図６】トレース圧縮装置の主な処理の流れを説明するフローチャート図である。
【図７Ａ】図４のソースプログラム実行時の各値の変移を表す図である。
【図７Ｂ】ループ候補先頭命令アドレスレジスタ［０〜ｎ］とのアドレス不一致によってループ検出状態が終了する場合の各値の変移を表す図である。
【図８】差分検出部とネストループバッファ部の処理を表すフローチャート図である。
【図９】トレースメモリライト制御部の処理を表す第１のフローチャート図である。
【図１０】トレースメモリライト制御部の処理を表す第２のフローチャート図である。
【図１１】トレースメモリリード制御部の処理を表す第１のフローチャート図である。
【図１２】トレースメモリリード制御部の処理を表す第２のフローチャート図である。
【図１３】図４のソースプログラム実行時におけるトレースメモリリード制御部の各レジスタ及びカウンタの変移を表す図である。
【図１４】図４のソースプログラム実行時のトレースメモリＴＭを表す図である。
【図１５】ループ情報生成回路の処理を示すフローチャート図である。
【図１６】３重のネストループを有するプログラムの一例を表す図である。
【図１７】図１６のソースプログラムを実行時の各値の変移を表す図である。
【図１８】図１６のソースプログラムを実行時のトレースメモリＴＭを表す図である。
【図１９】図１６のソースプログラム実行時におけるトレースメモリリード制御部の各レジスタ及びカウンタの変移を表す図である。
【図２０】本実施の形態例におけるトレース圧縮装置を表す図である。
【発明を実施するための形態】
【００１０】
以下、図面にしたがって本発明の実施の形態について説明する。ただし、本発明の技術的範囲はこれらの実施の形態に限定されず、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
【００１１】
図１は、本実施の形態例におけるトレース圧縮システムを表す図である。同図のトレース圧縮システムは、トレースデータ取得対象のユーザシステム３０と、当該ユーザシステム３０のデバッグを行うインサーキットエミュレータ(以下、ＩＣＥ)２０、ＩＣＥ２０の制御を行う制御プログラムを実行するホストＰＣ１０を有する。同図のユーザシステム３０は、マイクロコントローラ（以下、ＭＣＵ）２０１を有し、ＭＣＵ２０１のメモリ（図示せず）に格納された組み込みプログラム（図示せず）を実行する。同図において、ユーザシステム３０とＩＣＥ２０とは各コネクタＣ２、Ｃ３とトレースデータバス３０２を介して接続される。また、ＩＣＥ２０とホストＰＣ１０とはコネクタＣ１とＵＳＢ等の通信ケーブル３０１を介して接続される。
【００１２】
図１のＩＣＥ２０は、ＭＣＵが実行したプログラムの命令アドレスや命令情報を有するトレースデータを取得するトレース機能を有する。ＩＣＥ２０は、ホストＰＣ１０からユーザシステム３０のプログラム実行開始、トレースデータの取得開始等の指示を受けてトレースデータの取得を開始する。ユーザシステム３０から出力されたトレースデータは、順次、トレースデータバスを介してＩＣＥ２０に出力され、ＩＣＥ２０内のメモリ（以下、トレースメモリＴＭ）に格納される。本実施の形態例において、トレースデータは少なくとも命令アドレスを有するが、さらに、実行した命令名やメモリアクセス情報等を有していてもよい。
【００１３】
なお、図１の本実施の形態例におけるトレース圧縮システムは、ＩＣＥ２０とユーザシステム３０の間をトレースデータバス３０２で接続しているが、例えば、制御バス等の各バスが並列に接続されてもよいし、ＩＣＥ２０がＭＣＵ２０１にコードフェッチしてトレースデータを生成してもよい。また、図１の本実施の形態例におけるトレース圧縮システムでは、ＩＣＥ２０とホストＰＣ１０とを別々に構成しているが、ＩＣＥ２０の構成をホストＰＣ１０内に設けてもよい。
【００１４】
図２は、図１のトレース圧縮システムにおけるＩＣＥ２０の構成を表す図である。同図のＩＣＥ２０は、本実施の形態例におけるトレース圧縮装置の一例を表す。同図のＩＣＥ２０は、差分検出部１０、ネストループバッファ部１１、圧縮されたトレースデータが格納されるトレースメモリＴＭ、トレースメモリライト制御部１２、トレースメモリリード制御部１３、ループ情報生成回路ＥＣ６を有する。差分検出部１０及びネストループバッファ部１１は、ループを検出し、トレースメモリライト制御部１２及びトレースメモリリード制御部１３は、検出したループ部分のトレースデータのうち冗長したトレースデータのトレースメモリＴＭへの書き込みを行わない。
【００１５】
図２の差分検出部１０は、命令アドレス設定回路ＥＣ１、命令アドレスレジスタ［０］Ｒ０、命令アドレスレジスタ［１］Ｒ１、減算器ＳＵＢ、命令アドレス比較回路ＥＣ２を有する。差分検出部１０は、トレースデータを順次取得し、直前のトレースデータとの命令アドレスの差分値が負の値となるトレースデータを、以前実行した命令に分岐しているトレースデータとして検出する。そして、差分検出部１０は、当該差分値が負の値となるトレースデータの命令アドレスをループ候補の先頭命令アドレスとして、ネストループバッファ部１１にひとつ以上保持し、再度、同じ命令アドレスで差分値が負の値となった場合、同じ命令アドレスに２回分岐したことから、ループと判定することによってループを検出する。
【００１６】
図３は、図２のネストループバッファ部１１を表す図である。ネストループバッファ部１１は、ループ候補先頭命令アドレスレジスタＲｈａ［ｉ］、トレースアドレスレジスタＲｔａ［ｉ］、ループサイズカウンタＣｌ［ｉ］及び総実行命令数カウンタＣｔ［ｉ］を１セットとして（以下、ループ候補情報［ｉ］）、ネストループの深さに応じて１つ以上（図３ではｎ＋１個）有する。このように、ネストループバッファ部１１は、ループ候補の先頭命令アドレスレジスタＲｈａ［ｉ］を含むループ候補情報［ｉ］を１セット以上保持することができる。
【００１７】
また、ループ候補情報［ｉ］のトレースアドレスレジスタＲｔａ［ｉ］は、トレースメモリＴＭにおけるループ候補先頭命令アドレスに対応するトレースデータが書き込まれたアドレスである。そして、ループ候補情報［ｉ］のループサイズカウンタＣｌ［ｉ］は、ループの１周分のトレースデータ数（以下、ループサイズ）を計測するためのカウンタであり、総実行命令数カウンタＣｔ［ｉ］はループ候補として保持されてからループの終わりまでのトレースデータ数（以下、総実行命令数）を計測するためのカウンタである。
【００１８】
また、トレースメモリライト制御部１２は、トレースメモリライト制御回路ＥＣ３、トレースデータバッファ［０］Ｂｔ０、トレースデータバッファ［１］Ｂｔ１、ライトポインタＰｗを有する。トレースメモリライト制御回路ＥＣ３は、ユーザシステム３０から取得したトレースデータをトレースデータバッファ［０］Ｂｔ０、［１］Ｂｔ１に、順次書き込み、ライトポインタＰｗをインクリメントしながら、トレースデータバッファ［０］Ｂｔ０のデータをトレースメモリＴＭに書き込む。ただし、トレースメモリライト制御回路ＥＣ３は、ループが検出されてから当該ループが終了するまでのトレースデータについては、トレースメモリＴＭへ書き込まない。また、トレースメモリライト制御部１２は、ループが終了した時に、ループ情報生成回路ＥＣ６の生成したループ情報データをトレースメモリＴＭに書き込む。このループ情報データが圧縮データであり、この圧縮データによってトレースメモリＴＭに書き込まれなかったループ部分のトレースデータが復元される。
【００１９】
そして、トレースメモリリード制御部１３は、トレースメモリリード制御回路ＥＣ４、トレースデータ比較回路ＥＣ５、リードポインタＰｒ、トレースデータリードバッファＢｔｒ、リターンアドレスレジスタＲｒａを有する。トレースメモリリード制御部１３は、ループ検出されたループ候補先頭命令アドレスレジスタＲｈａ［ｉ］以降のループ１周分のトレースデータをトレースメモリＴＭから読み出し、取得したトレースデータと順次比較する。トレースメモリリード制御部１３は、トレースデータが一致する間は、ループ検出状態を維持し、トレースデータが一致しなくなった場合、検出中のループが終了したものとみなし、ループ検出状態を終了する。
【００２０】
また、トレースメモリリード制御部１３は、さらに、トレースアドレスバッファＢｔａ［０〜ｎ］、ループ比較終了レジスタＲｌｃ［０〜ｎ］、ループ比較カウンタＣｌｃ［０〜ｎ］、総実行命令数比較終了レジスタＲｔｃ［０〜ｎ］、総実行命令数比較カウンタＣｔｃ［０〜ｎ］を１セットとして、ネストループの深さｎに応じて１つ以上有する。これらの詳細については後述する。
【００２１】
次に、まず、本実施の形態例のトレース圧縮装置におけるトレースの圧縮例について説明する。
【００２２】
図４は、ネストループを有するプログラムの一例を表す図である。同図のソースプログラムＳ１はＣ言語で記述され、ネストループを有するプログラムである。ループとは、同じ命令処理が連続して繰り返し行われる部分を指し、ネストループとは、あるループの中に、さらに別の小さいループを１つ以上内包するループを指す。同図のソースプログラムＳ１では、点線で囲まれた大きいループＢｌｂが、破線で囲まれた小さいループＡｌａを内包する。
【００２３】
具体的に、図４のソースプログラムＳ１には命令ｃ１〜ｃ７が記述されており、命令ｃ３〜ｃ５に対応するループＡｌａは４周、命令ｃ２〜ｃ６に対応するループＢｌｂは３周、繰り返し実行されるように記述されている。このため、ソースプログラムＳ１では、ループＢｌｂが１回実行される度に、ループＡｌａが４回ループする。従って、同図のソースプログラムＳ１では、「ｃ１、ｃ２、ｃ３〜ｃ５［×４］、ｃ６、ｃ２、ｃ３〜ｃ５［×４］、ｃ６、ｃ２、ｃ３〜ｃ５［×４］、ｃ６、ｃ７」の順に命令が実行される。また、各命令ｃ１〜ｃ７は、それぞれトレースデータｔ１〜ｔ７を出力するものとする。
【００２４】
図５は、図４のソースプログラムＳ１を実行した時に生成されるトレースの一例を表す図である。同図では、圧縮処理が行われていない非圧縮のトレースＴ１と、本実施の形態例のトレース圧縮装置によって圧縮された圧縮後のトレースＴ１＠とを表す。
【００２５】
具体的に、非圧縮のトレースＴ１には、図４で前述した命令実行順に沿って各トレースデータｔ１〜ｔ７が書き込まれている。一方、圧縮後のトレースＴ１＠には、ループＡｌａのトレースデータｔａの繰り返し４周分のうち２周分のトレースデータｔａが書き込まれずその代わりにループＡｌａのループ情報データｔａ＠が、点線で囲んだループＢｌｂのトレースデータｔｂの繰り返し３周分のうち１周分のトレースデータｔｂが書き込まれずその代わりにループＢｌｂのループ情報データｔｂ＠が書き込まれている。
【００２６】
このため、（図５のトレースＴ１では、トレースデータｔ３〜ｔ５を１つのトレースデータｔａとして図示しているが、３個のトレースデータとして計算すると）非圧縮のトレースＴ１は４４個のトレースデータを有するのに対し、圧縮後のトレースＴ１＠は２１個のトレースデータを有する。このように、本実施の形態例のトレース圧縮装置によるトレースは、ｎ周繰り返し行われるループの場合、トレースメモリＴＭに対してｎ周のうちｎ−２周分のトレースデータが書き込まれず、当該ループに係るループ情報データが書き込まれることによってそのデータ量が削減される。
【００２７】
図６は、本実施の形態例のトレース圧縮装置の主な処理の流れを説明するフローチャート図である。まず、本実施の形態例のトレース圧縮装置の差分検出部１０は、トレースデータを順次取得し（Ｓ１１）、連続するトレースデータの命令アドレスの差分値、つまり、直前のトレースデータの有する命令アドレスとの差分値を演算する。差分値が正の値である間（Ｓ１２のＮＯ）、トレースメモリライト制御部１２は、通常通り、ライトポインタＰｗをインクリメントしながら取得したトレースデータをトレースメモリＴＭへ書き込む（Ｓ１６）。
【００２８】
一方、差分値が負の値であるトレースデータが検出された場合（Ｓ１２のＹＥＳ）、差分検出部１０は、命令が以前実行した命令に分岐したものとみなし、当該検出したトレースデータの命令アドレスと一致する値が、ネストループバッファ部１１に保持された各ループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］にあるか否かを判定する（Ｓ１３）。初め、ネストループバッファ部１１には、ひとつのループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］も保持されていないため、値の一致するループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］はない。
【００２９】
一致する値がない場合（Ｓ１４のＮＯ）、差分検出部１０は、当該差分値が負の値であるトレースデータの命令アドレスを、ネストループバッファ部１１のループ候補先頭アドレスレジスタ［ｉ］に新たに保持させる（Ｓ１５）。このように、差分値が負の値となった命令アドレスのリストが、ループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］として、ネストループバッファ部１１に保持される。続いて、トレースメモリライト制御部１２は、取得したトレースデータをトレースメモリＴＭへ書き込む（Ｓ１６）。
【００３０】
一方、一致する値がある場合（Ｓ１４のＹＥＳ）、差分検出部１０は、以前実行した命令に２回分岐している、つまり、ループしていると判定し、一致したループ候補先頭命令アドレスレジスタＲｈａ［ｉ］の値を正式にループの先頭アドレスとして検出（ループ検出）する（Ｓ１７）。
【００３１】
図７Ａは、図４のソースプログラムＳ１を実行した場合の命令アドレス、各フラグ及びループ候補情報［０〜ｎ］の値の変移を表す図である。また、図７Ａの上部は、ソースプログラムＳ１を実行した時の命令アドレスの時系列の変移を表す図（以下、命令アドレス変移図）であり、横軸は時間、縦軸は命令アドレスである。命令アドレス変移図において、横軸の時間は左から右に向かって流れ、縦軸の命令アドレスは上から下に大きくなる。また、命令アドレス変移図において、黒四角（■）で表された各命令に対して、その命令アドレスｅ１〜ｅ７と、各命令の実行時に出力されるトレースデータｔ１〜ｔ７が書き込まれるトレースメモリＴＭ上のアドレスａ１〜ａ２１が表示されている。
【００３２】
命令ｃ１〜ｃ７に対応する各命令アドレスｅ１〜ｅ７には、先頭の命令ｃ１に対応する命令アドレスｅ１から、最後の命令ｃ７に対応する命令アドレスｅ７の順に大きい値が割り当てられる。図７Ａのアドレス変移図では、図４で前述した命令順に命令アドレスが変移しており、タイミングｐ１までは、命令ｃ１からｃ５まで順に実行されることから、命令アドレスｅ１からｅ５は順次大きい値に変移する。従って、タイミングｐ１までは、差分検出部１０は負の差分値を検出しない（Ｓ１２のＮＯ）。
【００３３】
そして、タイミングｐ１において、ループＡｌａの最後尾の命令ｃ５の後、ループＡｌａの先頭に分岐し命令ｃ３が再実行されるため、タイミングｐ１における差分値（命令アドレスｅ３−命令アドレスｅ５）は、「命令アドレスｅ３＜命令アドレスｅ５」により、負の値となる（Ｓ１２のＹＥＳ）。また、この時、ネストループバッファ部１１には１つのループ候補情報［０〜ｎ］も保持されていないため、新たに、ネストループバッファ部１１に、ループ候補先頭命令アドレスレジスタＲｈａ［０］として、命令アドレスｅ３が保持される（Ｓ１５）。
【００３４】
そして、図７Ａのタイミングｐ２において、差分検出部１０が、再び、負の差分値を検出する（Ｓ１２のＹＥＳ）。この場合、差分値が負の値となった命令アドレスｅ３と一致する値が、ループ候補先頭命令アドレスレジスタＲｈａ［０］にあるため（Ｓ１４のＹＥＳ）、命令アドレスｅ３がループＡｌａの先頭アドレスとして検出される（Ｓ１７）。
【００３５】
図６のフローチャート図に戻り、ループが検出されると（Ｓ１７）、トレースメモリリード制御部１３は、ループ候補先頭命令アドレスレジスタＲｈａ［０］以降のトレースデータをトレースメモリＴＭから読み出して、ユーザシステム３０から取得したトレースデータと比較する（Ｓ１８）。トレースデータが一致する間（Ｓ１９のＹＥＳ）、トレースメモリライト制御部１２は、取得したトレースデータをトレースメモリＴＭに書き込まない。そして、一致しなくなると（Ｓ１９のＮＯ）検出中のループが終了したものとみなし、トレースメモリライト制御部１２は、検出したループのループ情報データをトレースメモリＴＭに書き込み（Ｓ２１）、トレースデータの書き込みを再開する（Ｓ２２）。上記の処理（Ｓ１２〜Ｓ２２）を、トレースデータを取得している間（Ｓ１１のＹＥＳ）、繰り返し行う。
【００３６】
図７Ａの命令アドレス変移図に戻り、トレースメモリリード制御部１３は、タイミングｐ２におけるループＡｌａのループ検出後、当該ループＡｌａの先頭命令アドレスｅ３以降のトレースデータをトレースメモリＴＭから読み出し、取得したトレースデータと順次比較する（Ｓ１８）。この場合、トレースメモリＴＭから読み出した図７Ａ中の点線内のトレースｔａと順次取得したタイミングｐ２からタイミングｐ４までのトレースデータとが一致するため、トレースデータはトレースメモリＴＭに書き込まれない。そして、タイミングｐ４にて、命令ｃ５の命令アドレスｅ５を有するトレースデータｔ５を取得した時に、トレースデータの不一致が発生し（Ｓ１９のＮＯ）、トレースメモリＴＭに、ループＡｌａのループ情報データが書き込まれ（Ｓ２１）、取得したトレースデータの書き込みが再開される（Ｓ２２）。
【００３７】
これにより、図７Ａの命令アドレス変移図において点線で表した部分のトレースデータがトレースメモリＴＭに書き込まれず圧縮される。このように、以前実行した命令への分岐の検出時に分岐先の命令アドレスをループ候補先頭命令アドレスとして保持し、当該分岐先の命令アドレスに２回分岐した時にループしているものとしてループ検出する。従って、本実施の形態例におけるトレース圧縮装置によると、ループが４周繰り返される場合、ループ検出（２回分岐）以降のトレースデータ、つまり、ループ３周目以降のトレースデータが圧縮される。そして、圧縮されたトレースデータの代わりにループ情報データが書き込まれる。このループ情報データは、少なくとも、ループ先頭命令アドレスを有するトレースデータが書き込まれたトレースメモリＴＭ上のアドレスと、ループ検出以降（上記の例では、タイミングｐ２）トレースメモリＴＭに書き込まれなかったトレースデータ数の情報を有する。これにより、ループ情報データからトレースメモリＴＭに書き込まれなかったトレースデータを復元することができる。
【００３８】
続いて、図６のフローチャート図のより詳細な処理について、図８〜図１２、図１５のフローチャート図、及び、図７Ａ、図７Ｂ、図１３、図１４の具体例に沿って説明する。
【００３９】
［差分検出部１０］
図８は、図２の差分検出部１０とネストループバッファ部１１の処理を表すフローチャート図である。まず、命令アドレス設定回路ＥＣ１は、ユーザシステム３０から出力されたトレースデータを検出すると（Ｓ３１）、１回目のトレースデータか否かを判定する（Ｓ３２）。１回目、即ち、一番初めのトレースデータである場合（Ｓ３２のＹＥＳ）、命令アドレス設定回路ＥＣ１は、取得したトレースデータから命令アドレスを抽出し、命令アドレスレジスタ［１］Ｒ０に格納する（Ｓ３３）。一方、取得したトレースデータが１回目のトレースデータではない場合、つまり２回目以降のトレースデータである場合（Ｓ３２のＮＯ）、命令アドレス設定回路ＥＣ１は、命令アドレスを抽出し、命令アドレスレジスタ［１］Ｒ１が保持する命令アドレスを命令アドレスレジスタ［０］Ｒ０に格納すると共に、新たに抽出した命令アドレスを命令アドレスレジスタ［１］Ｒ１に格納する（Ｓ３４）。
【００４０】
各命令アドレスレジスタ［０］Ｒ０［１］Ｒ１に命令アドレスが格納されると（Ｓ３４）、命令アドレス設定回路ＥＣ１は、演算開始フラグＦｏｓを立てる（Ｓ３５）。以下、命令アドレスレジスタ［０］Ｒ０に格納された値をａ［０］、命令アドレスレジスタ［１］Ｒ１に格納された値をａ［１］と称する。演算開始フラグＦｏｓが立ったことを検出すると、減算器ＳＵＢは、当該フラグをネゲートすると共に、差分値（ａ［１］−ａ［０］）を演算する（Ｓ３６）。
【００４１】
演算した差分値が負の値ではない場合（Ｓ３７のＮＯ）、減算器ＳＵＢは演算終了フラグＦｏｅを立てる（Ｓ３８）。命令アドレス設定回路ＥＣ１は、当該フラグＦｏｅが立ったことを検出すると、当該フラグをネゲートすると共に（Ｓ３９）次のトレースデータを取得する（Ｓ３１）。差分検出部１０は、負の差分値が検出されるまで（Ｓ３７のＹＥＳ）、順次、Ｓ３１〜Ｓ３９の処理を行う。
【００４２】
一方、演算した差分値が負の値の場合（Ｓ３７のＹＥＳ）、減算器ＳＵＢは、マイナス検出フラグＦｍと演算終了フラグＦｏｅとを立てる（Ｓ４０）。命令アドレス設定回路ＥＣ１は、両フラグＦｍ、Ｆｏｅが立ったことを検出すると、当該両フラグをネゲートすると共に（Ｓ４１）アドレス比較要求フラグＦａｒを立てる（Ｓ４２）。そして、命令アドレス比較回路ＥＣ２は、アドレス比較要求フラグＦａｒが立ったことを確認すると、当該フラグをネゲートすると共に、ａ［１］の値とネストループバッファ部１１の保持する各ループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］の値とを比較する（Ｓ４３）。
【００４３】
比較の結果、ａ［１］の値と一致するループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］がない場合（Ｓ４４のＮＯ）、命令アドレス比較回路ＥＣ２は命令アドレス不一致フラグＦａｄを立てる（Ｓ４５）。アドレス不一致フラグＦａｄが立ったことを検出すると、命令アドレス設定回路ＥＣ１は、当該フラグをネゲートすると共に、ａ［１］の値を、ネストループバッファ部１１に、ループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］として、［０］番目から順に保持させる（Ｓ４６）。
【００４４】
また、トレースメモリライト制御部１２の処理にて後述するが、この時、ネストループバッファ部１１に、トレースアドレスレジスタＲｔａ［ｉ］として、ａ［１］のトレースデータが書き込まれるトレースメモリＴＭのアドレスを示すトレースメモリライト制御部１２のライトポインタＰｗの値が、ループ候補先頭命令アドレスレジスタＲｈａ［ｉ］に対応して保持される。
【００４５】
一方、比較の結果、ａ［１］の値と一致するループ候補先頭命令アドレスレジスタＲｈａ［ｉ］があった場合（Ｓ４４のＹＥＳ）、命令アドレス比較回路ＥＣ２は、一致したループ候補先頭命令アドレスレジスタＲｈａ［ｉ］に対応するループ検出フラグＦｌｄ［ｉ］及びトレースデータ比較開始要求フラグＦｃｓを立てる。トレースメモリリード制御回路ＥＣ４は、トレースデータ比較開始要求フラグＦｃｓが立ったことを検出すると、当該フラグをネゲートすると共に（Ｓ４８）、トレースデータの比較を開始する。トレースデータの比較処理については、トレースメモリリード制御部１３の処理として後述する。
【００４６】
差分検出部１０及びネストループバッファ部１１は、このように、同じ命令アドレスに２回分岐した場合に、その分岐命令アドレスをループの先頭命令アドレスとして検出する。このため、２重のネストループ（小さいループと、それを内包する大きいループ）がある場合、大きいループよりも先に小さいループがその先頭命令に２回分岐することによりループ検出される。そこで、本実施の形態例のトレース圧縮装置は、ネストループバッファ部１１に複数のループ候補情報の保持を可能にすることにより、大きいループのループ候補先頭命令アドレスを保持しながら、当該大きいループに内包される小さいループを検出可能にすることによって、ネストしたループを検出することができる。
【００４７】
上記の図８のフローチャート図の処理を、図７Ａの具体例に沿って説明する。図７Ａにおいて、差分検出部１０は、初め、命令ｃ１のトレースデータｔ１を検出すると（Ｓ３１、Ｓ３２のＹＥＳ）、命令アドレスｅ１を抽出して命令アドレスレジスタ［１］Ｒ１に書き込む（Ｓ３３）。そして、次のトレースデータｔ２を検出すると、命令アドレスレジスタ［１］Ｒ１の値ｅ１を命令アドレスレジスタ［０］Ｒ０に書き換え、新たにトレースデータから抽出した命令アドレスｅ２を命令アドレスレジスタ［１］Ｒ１に書き込む。このように順次、トレースデータが検出され（Ｓ３１）、差分値が演算される。そして、図６のフローチャート図に沿って前述したとおり、タイミングｐ１にて負の差分値が検出される（Ｓ３７のＹＥＳ）。
【００４８】
図７Ａの下部の表ｔｂ１は、上部の命令アドレス変移図に対応する各レジスタ、カウンタ及びフラグの変移を表す図である。また、表ｔｂ１のタイミングｐ１において、マイナス検出フラグＦｍが立ち、ａ［１］の値（命令アドレスｅ３）とループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］の値とが比較される（Ｓ４３）。前述した通り、この時、一致する値がないため（Ｓ４４のＮＯ）、表ｔｂ１のタイミングｐ１において、ネストループバッファ部１１に、ループ候補先頭命令アドレスレジスタＲｈａ［０］として命令アドレスｅ３が、トレースアドレスレジスタＲｔａ［０］としてトレースアドレスａ６が保持されている。
【００４９】
続いて、図７Ａのタイミングｐ２において（命令アドレスｅ３）、再び、負の差分値が検出されるが（Ｓ３７のＹＥＳ）、命令アドレスｅ３は、ネストループバッファ部１１に保持されるループ候補先頭命令アドレスレジスタＲｈａ［０］の値と一致するため（Ｓ４４のＹＥＳ）、ループとして検出される。従って、同図の表ｔｂ１のタイミングｐ２において、マイナス検出フラグＦｍと共にループ検出フラグＦｌｄ［０］が立てられている。なお、ループサイズカウンタＣｌ［０〜ｎ］及び総実行命令数カウンタＣｔ［０〜ｎ］については、トレースメモリライト制御部１２の処理にて後述する。
【００５０】
続いて、図８のフローチャート図のＳ４９に戻り、既に、あるループ検出フラグＦｌｄ［ｉ］が立っている状態で、新たにアドレス比較要求フラグＦａｒが立てられる場合について説明する。これは、ループの検出中に、差分値が負となるトレースデータが新たに検出された場合を表す。
【００５１】
この場合（Ｓ４９のＹＥＳ）、命令アドレス比較回路ＥＣ２は、当該アドレス比較要求フラグＦａｒをネゲートし、差分値が負となった命令アドレスａ［１］の値と各ループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］の値とを比較する（Ｓ５０）。値の一致するループ候補先頭命令アドレスレジスタＲｈａ［ｉ］がない場合（Ｓ５１のＮＯ）、分岐先の命令アドレスがループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］に保持されていないこと、即ち、当該分岐先の命令アドレスに初めて分岐したことを表す。従って、命令アドレス比較回路ＥＣ２は、検出中のループが終了したものとみなして、アドレス不一致フラグＦａｄを立ててループ検出フラグＦｌｄ［ｉ］をネゲートする（Ｓ５４）。ループ検出フラグＦｌｄ［ｉ］がネゲート時の処理については、ループ情報生成回路ＥＣ６の処理にて後述する。
【００５２】
一方、値の一致したループ候補先頭命令アドレスレジスタＲｈａ［ｉ］がある場合（Ｓ５１のＹＥＳ）、命令アドレス比較回路ＥＣ２は、さらに、当該値の一致したループ候補先頭命令アドレスレジスタＲｈａ［ｉ］が、検出中のループ検出フラグＦｌｄ［ｉ］に対応するか否か、即ち、検出中のループの先頭命令に再び分岐したのか否かを判定する（Ｓ５２）。一致する場合（Ｓ５２のＹＥＳ）、即ち、検出中のループの先頭命令に再び分岐した場合、命令アドレス比較回路ＥＣ２は、ループ検出フラグＦｌｄ［ｉ］をネゲートせずに、再度、トレースデータ比較開始要求フラグＦｃｓを立てて（Ｓ５３）、トレースデータの比較を継続する。
【００５３】
具体的に、図７Ａのタイミングｐ３（命令アドレスｅ３）では、既にループ検出フラグＦｌｄ［０］が立っている状態で、再び負の差分値が検出されアドレス比較開始要求フラグＦａｒが立てられた場合に該当する（Ｓ４９のＹＥＳ）。この場合、ａ［１］（＝命令アドレスｅ３）は、検出中のループ検出フラグＦｌｄ［０］に対応するループ候補先頭命令アドレスレジスタＲｈａ［０］の値と一致し（Ｓ５０、Ｓ５１のＹＥＳ、Ｓ５２のＹＥＳ）、ループＡｌａの先頭命令ｃ３に再び分岐したことを表す。このため、図７Ａの表ｔｂ１のタイミングｐ３において、ループ検出フラグＦｌｄ［０］はネゲートされず（Ｓ５３）、ループＡｌａのトレースデータの比較が継続される。
【００５４】
図７Ｂは、ループＡｌａのループ検出状態がループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］の各アドレスとの不一致によって終了する場合の命令アドレス、各フラグ及びループ候補情報［０〜ｎ］の値の変移を表す図である。同図のタイミングｐ３において、仮に、命令ｃ５の次に命令ｃｘ（命令アドレスｅｘ）が実行された場合を例示する。この場合も同様に、ループ検出フラグＦｌｄ［０］が立っている状態で、アドレス比較要求フラグＦａｒが立てられる場合に該当する（Ｓ４９のＹＥＳ）。ただし、この場合は、ａ［１］（＝命令アドレスｅｘ）の値と一致するループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］がなく（Ｓ５１のＮＯ）、検出中のループＡｌａの先頭命令ｃ３以外の命令に分岐したことを表す。このため、ループが終了したものと判定され、図７Ｂの表ｔｂ１ｘのタイミングｐ３において、ループＡｌａに対応するループ検出フラグＦｌｄ［０］がネゲートされている（Ｓ５４）。以上が、差分検出部１０の処理である。
【００５５】
続いて、トレースメモリライト制御部１２の処理について説明する。
【００５６】
［トレースメモリライト制御部１２］
図９、図１０は、トレースメモリライト制御部１２の処理を表すフローチャート図である。
【００５７】
図９の上部のフローチャート図は、トレースメモリライト制御部１２のトレースデータの書き込み処理を表すフローチャート図である。ユーザシステム３０から出力されたトレースデータは、差分検出部１０に加えて、トレースメモリライト制御部１２にも送られる。取得したトレースデータが１回目のトレースデータである場合（Ｓ６２のＹＥＳ）、トレースメモリライト制御回路ＥＣ３は、トレースデータバッファ［１］Ｂｔ１に書き込む（Ｓ６３）。そして、トレースメモリライト制御回路ＥＣ３は、次のトレースデータを取得すると（Ｓ６２のＮＯ）、トレースデータバッファ［１］Ｂｔ１のトレースデータをトレースデータバッファ［０］Ｂｔ０に書き換えると共に、新たに取得したトレースデータをトレースデータバッファ［１］Ｂｔ１に書き込む（Ｓ６４）。そして、トレースメモリライト制御回路ＥＣ３は、減算器ＳＵＢの演算終了フラグＦｏｅが立ったことを検出すると（Ｓ６５のＹＥＳ）、トレースデータバッファ［０］Ｂｔ０のデータをトレースメモリＴＭに書き込む（Ｓ６６）。
【００５８】
また、図９の下部のフローチャート図は、トレースメモリライト制御部１２の各フラグに応答した処理を表すフローチャート図である。トレースメモリライト制御回路ＥＣ３は、ループ検出フラグＦｌｄ［ｉ］が検出されない間は、ライトポインタＰｗをインクリメントしながらトレースデータバッファ［０］Ｂｔ０のデータを順次トレースメモリＴＭへ書き込む（Ｓ７１）。トレースメモリライト制御回路ＥＣ３は、ループ検出フラグＦｌｄ［ｉ］が立ったことを検出すると（Ｓ７２のＹＥＳ２）、トレースメモリＴＭへのトレースデータの書き込みを停止する（Ｓ７３）。
【００５９】
また、トレースメモリライト制御回路ＥＣ３は、マイナス検出フラグＦｍが立ったことを検出した場合（Ｓ７２のＹＥＳ１）、ネストループバッファ部１１に新たなループ候補先頭命令アドレスレジスタＲｈａ［ｉ］が保持されたことを確認すると、差分検出部１０にて前述したように、ライトポインタＰｗの値、即ち、トレースデータが書き込まれるトレースメモリＴＭのアドレスを、トレースアドレスレジスタＲｔａ［ｉ］として書き込む（Ｓ７４）。
【００６０】
続いて、図９のフローチャート図の処理を、図７Ａの具体例に基づいて説明する。図９の上部のフローチャート図について、出力された各トレースデータｔ１〜ｔ７がトレースデータバッファ［１］Ｂｔａ１に順次書き込まれると共に（Ｓ６３、Ｓ６４）、図７Ａの表ｔｂ１のように、減算器ＳＵＢによって演算終了フラグＦｏｅが立てられる。トレースメモリライト制御回路ＥＣ３は、演算終了フラグＦｏｅが立ったことを検出する度に（Ｓ６５のＹＥＳ）、トレースデータバッファ［０］Ｂｔａ０に書き込まれた各トレースデータｔ１〜ｔ７をトレースメモリＴＭに書き込む（Ｓ６６）。このようにして、トレースデータｔ１〜ｔ７がトレースメモリＴＭに順次書き込まれる。
【００６１】
また、図９の下部のフローチャート図について、図７Ａの表ｔｂ１のタイミングｐ１において、マイナス検出フラグＦｍが立ち（Ｓ７２のＹＥＳ１）新たなループ候補情報［０］が保持されると、ライトポインタＰｗの値ａ６がトレースアドレスレジスタＲｔａ［０］に書き込まれる（Ｓ７４）。また、図７Ａの表ｔｂ１のタイミングｐ２において、ループ検出フラグＦｌｄ［０］が立ったことが検出されると（Ｓ７２のＹＥＳ２）、トレースメモリＴＭへのトレースデータの書き込みが停止する（Ｓ７３）。このため、図７Ａの上図において、タイミングｐ２から点線部分のトレースデータの書き込みが停止されている。そして、トレースデータの書き込みは、ループ検出フラグＦｌｄ［０］がネゲートされた時に再開される。
【００６２】
図１０の上部のフローチャート図は、ネストループバッファ部１１が保持するループサイズカウンタＣｌ［０〜ｎ］についての処理を表すフローチャート図である。マイナス検出部ラグＦｍが立って（Ｓ８１、Ｓ８２のＹＥＳ）、ネストループバッファ部１１に新たにループ候補情報［ｉ］が保持されると、トレースメモリライト制御回路ＥＣ３は、トレースデータを検出する度に（Ｓ８３のＹＥＳ）、ループサイズカウンタＣｌ［０〜ｎ］をカウントアップする（Ｓ８４）。ただし、トレースメモリライト制御回路ＥＣ３は、ループ検出フラグＦｌｄ［ｉ］が立ったことを確認すると（Ｓ８５のＹＥＳ）、当該ループ検出フラグＦｌｄ［ｉ］に対応するループサイズカウンタＣｌ［ｉ］のカウントアップを停止する（Ｓ８６）。これにより、１回目に以前実行した命令に分岐してループ候補情報［ｉ］として保持されてから、２回目に再分岐してループ検出されるまでのループ１周分のトレースデータ数がループサイズとして、ループサイズカウンタＣｌ［ｉ］に保持される。
【００６３】
また、図１０の下部のフローチャート図は、ネストループバッファ部１１が保持する総実行命令数カウンタＣｔ［０〜ｎ］についての処理を説明するフローチャート図である。マイナス検出部ラグＦｍが立って（Ｓ９１、Ｓ９２のＹＥＳ）、ネストループバッファ部１１に新たにループ候補情報［ｉ］が保持されると、トレースメモリライト制御回路ＥＣ３は、トレースデータを検出する度に（Ｓ９３のＹＥＳ）、総実行命令数カウンタＣｔ［０〜ｎ］をカウントアップする（Ｓ９４）。そして、トレースメモリライト制御回路ＥＣ３は、ループが検出されてループ検出フラグＦｌｄ［ｉ］が検出後（Ｓ９５のＹＥＳ）、ループ検出フラグＦｌｄ［ｉ］がネゲートされると（Ｓ９６のＹＥＳ）、当該ループ検出フラグＦｌｄ［ｉ］に対応する総実行命令数カウンタＣｔ［ｉ］のカウントアップを停止する（Ｓ９７）。これにより、１回目の以前実行した命令に分岐してループ候補情報［ｉ］として保持されてからループが終了するまでのトレースデータ数が総実行命令数として、総実行命令数カウンタＣｔ［ｉ］に保持される。
【００６４】
続いて、図１０のフローチャート図の処理を、図７Ａの具体例に基づいて説明する。図７Ａの表ｔｂ１のタイミングｐ１においてマイナス検出フラグＦｍが立ったことが検出され、ループ候補先頭命令アドレスレジスタＲｈａ［０］として命令アドレスｅ３が保持されると同時に、ループサイズカウンタＣｌ［０］及び総実行命令数カウンタＣｔ［０］のカウントアップが開始されている。各カウンタは、トレースデータを取得する度にカウントアップされるが（Ｓ８４、Ｓ９４）、ループサイズカウンタＣｌ［０］は、タイミングｐ２にてループ検出フラグＦｌｄ［０］が立てられた時に（Ｓ８５のＹＥＳ）、カウントアップが停止している（Ｓ８６）。これにより、ループＡｌａのループサイズ３がループサイズカウンタＣｌ［０］に保持される。
【００６５】
一方、総実行命令数カウンタＣｔ［０］のカウントアップは、図７Ａの表ｔｂ１のタイミングｐ２にてループ検出フラグＦｌｄ［０］が立てられても継続し、タイミングｐ４で当該ループ検出フラグＦｌｄ［０］がネゲートされた時に停止する（Ｓ９５のＹＥＳ、かつ、Ｓ９６のＹＥＳ）。これにより、ループＡｌａの総実行命令数９が総実行命令数カウンタＣｔ［０］に保持される。
【００６６】
続いて、トレースメモリリード制御部１３の処理について説明する。
【００６７】
［トレースメモリリード制御部１３（ネストループなし）］
図１１、図１２は、トレースメモリリード制御部１３の処理を表すフローチャート図である。図１１は、トレースメモリリード制御部１３のトレースデータの読み出し準備処理を説明するフローチャート図である。ユーザシステム３０から出力されたトレースデータは、トレースメモリリード制御部１３にも送られ、トレースデータリードバッファＢｔｒに順次格納される。トレースメモリリード制御回路ＥＣ４は、ループ検出フラグＦｌｄ［０〜ｎ］を確認し（Ｓ１０１）、ループ検出フラグＦｌｄ［ｉ］が立ったことを検出すると（Ｓ１０２のＹＥＳ）、トレースデータの比較を開始する。
【００６８】
まず、トレースメモリリード制御回路ＥＣ４は、ネストループバッファ部１１から、ループ検出フラグＦｌｄ［ｉ］に対応するトレースアドレスレジスタＲｔａ［ｉ］、ループサイズカウンタＣｌ［ｉ］の値を読み出す（Ｓ１０３）。そして、トレースメモリリード制御回路ＥＣ４は、読み出したトレースアドレスレジスタＲｔａ［ｉ］の値をリードポインタＰｒに書き込み（Ｓ１０４）、読み出したループサイズカウンタＣｌ［ｉ］の値を停止している、つまり、非使用のループ比較カウンタＣｌｃ［ｉ］に対応するループ比較終了レジスタＲｌｃ［ｉ］に書き込む（Ｓ１０５）。
【００６９】
そして、トレースメモリリード制御回路ＥＣ４は、ループ検出フラグＦｌｄ［ｉ］がネゲートされない間（Ｓ１０６のＮＯ）、次の図１２のフローチャート図においてトレースデータの比較処理を行う。一方、トレースメモリリード制御回路ＥＣ４は、ループ検出フラグＦｌｄ［ｉ］がネゲートされると（Ｓ１０６のＹＥＳ）、図１２のトレースデータの比較処理を終了する（Ｓ１０７）。
【００７０】
図１２のフローチャート図は、トレースデータの比較処理を説明するフローチャート図である。図１１の処理の後、トレースメモリリード制御回路ＥＣ４は、トレースデータ比較開始要求フラグＦｃｓを確認する（Ｓ１１１）。そして、トレースメモリリード制御回路ＥＣ４は、トレースデータ比較開始要求フラグＦｃｓが立ったことを検出し（Ｓ１１２のＹＥＳ）、さらに、トレースデータを検出すると（Ｓ１１３のＹＥＳ）、リードポインタＰｒの指すトレースメモリＴＭ上の比較対象のデータがループ情報データか否かを判定する（Ｓ１１４）。
【００７１】
ループがネストしている場合、比較対象としてトレースメモリＴＭからループ情報データが読みだされる場合がある（Ｓ１１４のＹＥＳ）。その場合については、「トレースメモリリード制御部１３（ネストループ有り）」にて後述する。ここでは、まず、ネストしてないループのトレースデータとの比較について引き続き述べる。
【００７２】
図１２のフローチャート図において、トレースメモリＴＭから読み出したトレースデータがループ情報データではない場合（Ｓ１１４のＮＯ）、トレースメモリリード制御回路ＥＣ４は、読み出したトレースデータを、検出したトレースデータと共に、トレースデータ比較回路ＥＣ５に送る（Ｓ１１７）。そして、トレースデータ比較回路ＥＣ５は、トレースデータを比較し（Ｓ１１８）、一致する場合はトレースデータ一致フラグＦｔａを（Ｓ１１９のＹＥＳ、Ｓ１２０）、一致しない場合はトレースデータ不一致フラグＦｔｄを立てる（Ｓ１１９のＮＯ、Ｓ１２２）。
【００７３】
トレースデータ一致フラグＦｔａが立った場合（Ｓ１２０）、トレースメモリリード制御回路ＥＣ４は、当該フラグをネゲートし（Ｓ１２１）、トレースデータの検出処理に戻る（Ｓ１１３）。一方、トレースデータ不一致フラグＦｔｄが立った場合（Ｓ１２３）、トレースメモリリード制御回路ＥＣ４は、トレースデータが異なることにより検出中のループが終了したものとみなし、トレースデータ不一致フラグＦｔｄ及びループ検出フラグＦｌｄ［ｉ］をネゲートし（Ｓ１２３）、トレースデータの比較処理を終了する。ループ検出フラグＦｌｄ［ｉ］がネゲートされた場合の処理については、ループ情報生成回路ＥＣ６の処理にて後述する。
【００７４】
また、トレースメモリリード制御回路ＥＣ４は、トレースデータを比較する度に、ループ検出フラグＦｌｄ［ｉ］に対応するループ比較カウンタＣｌｃ［ｉ］をカウントアップし（Ｓ１３１）、リードポインタＰｒの値をインクリメントする（Ｓ１３２）。フローチャート図には示していないが、トレースメモリリード制御回路ＥＣ４は、カウントアップしたループ比較カウンタＣｌｃ［ｉ］とループ比較終了レジスタＲｌｃ［ｉ］の値が一致した場合、トレースデータがループ１周分比較されたとみなし、トレースデータ比較開始要求フラグＦｃｓをネゲートする。ただし、ループ２周目のトレースデータが引き続き比較される場合、トレースデータ比較開始要求フラグＦｃｓが一旦ネゲートされるものの、ループ２周目のトレースデータ検出時に、再び、ループの先頭命令に分岐することによりマイナス検出フラグＦｍ、トレースデータ比較開始要求フラグＦｃｓが立てられ（図８のＳ４７、図１２のＳ１１２のＹＥＳ）、引き続きトレースデータの比較が行われる。
【００７５】
なお、図１２のＳ１３３がＹＥＳの場合以降の処理は、トレースメモリＴＭからループ情報データを読み出した場合（Ｓ１１４のＹＥＳ）に該当するため、「トレースメモリリード制御部１３（ネストループ有り）」部分において後述する。続いて、上記のトレースデータの比較処理を具体例に基づいて説明する。
【００７６】
このように、トレースメモリリード制御部１３は、検出したループのループ候補情報［ｉ］に基づいて、トレースメモリＴＭから、検出中のループに対応するループ候補先頭命令アドレス以降のループ１周分のトレースデータを読み出し、取得したトレースデータと順次比較する。そして、トレースデータが一致している間、当該取得したトレースがトレースメモリＴＭに書き込まれないことにより、トレースデータのデータ量が削減される。
【００７７】
上記の図１１、図１２のトレースメモリリード制御部１３の処理を具体例に沿って説明する。
【００７８】
図１３は、図４のソースプログラムＳ１を実行した場合のトレースメモリリード制御部１３の処理に係る各レジスタ及びカウンタの値の変移を表す図である。なお、図１３の上部の命令アドレス変移図は、図７Ａの上部の命令アドレス変移図と同じ図である。
【００７９】
前述したとおり、図１３のタイミングｐ２において、ループＡｌａが検出される。従って、同図の表ｔｂ２のタイミングｐ２において、ループ検出フラグＦｌｄ［０］が立てられ、ネストループバッファ部１１のトレースアドレスレジスタＲｔａ［０］の値ａ６がリードポインタＰｒに（Ｓ１０３、Ｓ１０４）、ループサイズカウンタＣｌ［０］の値３がループ比較終了レジスタＲｌｃ［０］に保持される（Ｓ１０５）。これにより、比較対象のトレースデータとして、トレースメモリＴＭからリードポインタＰｒの値ａ６の示すトレースデータが読み出される（図１２のＳ１１４）。
【００８０】
図１４は、図４のソースプログラムＳ１を実行時のトレースメモリＴＭを表す図である。同様にして、図１４の命令アドレス変移図は、図７Ａの命令アドレス変移図と同じ図である。同図のトレースメモリＴＭによると、リードポインタＰｒの値ａ６は、トレースデータｔ３を示すため、タイミングｐ２において、新たに取得されるトレースデータｔ３と、トレースメモリＴＭから読み出されたトレースデータｔ３とが比較される（Ｓ１１７、Ｓ１１８）。トレースデータが一致することから、続いて、次に取得したトレースデータｔ４と、インクリメントしたリードポインタＰｒの値ａ７の示すトレースデータｔ４とが比較される。
【００８１】
このように、順次比較すると、ループ比較カウンタＣｌｃ［ｉ］の値３とループ比較終了レジスタＲｌｃ［０］の値３とが一致する。これにより、ループＡｌａの１周分の比較が終わったとみなされ、トレースデータ比較開始要求フラグＦｃｓがネゲートされる。ただし、次のトレースデータｔ３の取得時に、再びトレースデータ比較開始要求フラグＦｃｓが立てられる（図１２のＳ１１２のＹＥＳ）。そして、図１３の表ｔｂ２のタイミングｐ３にて、再び、トレースアドレスレジスタＲｔａ［０］の値ａ６がリードポインタＰｒに書き込まれ、ループ比較カウンタＣｌｃ［ｉ］が０からカウントアップされることにより、２周目のループの比較が再開される。
【００８２】
同様にして、順次比較を行っていくと、図１４のタイミングｐ４にて、取得したトレースデータｔ６と、トレースメモリＴＭのアドレスａ９のトレースデータとが比較される。しかし、この時、トレースメモリＴＭのアドレスａ９にはトレースデータが書き込まれておらず、トレースデータは一致しないため（図１２のＳ１１９のＮＯ）、ループＡｌａのループ検出フラグＦｌｄ［０］がネゲートされる（図１２のＳ１２３）。図１３の表ｔｂ２のタイミングｐ４において、ループ検出フラグＦｌｄ［０］はネゲートされている。
【００８３】
ここで、図１２のフローチャート図において、比較対象のデータがループ情報データである場合（Ｓ１１４のＹＥＳ）の前に、ループ検出フラグＦｌｄ［ｉ］がネゲートされた場合における図２のループ情報データ生成回路ＥＣ６の処理について説明する。
【００８４】
［ループ情報生成回路ＥＣ６］
ループ情報生成回路ＥＣ６は、ループ検出フラグＦｌｄ［ｉ］がネゲートされた時、つまり、ループが終了されたと判定された時に、ループ候補情報［ｉ］に基づいて当該ループのループ情報データを生成する。ループ情報データは、トレースメモリライト制御部１２によってトレースメモリＴＭに書き込まれ、ネストループ部分のトレースデータの比較や、圧縮されたトレースの復元に利用される。
【００８５】
図１５は、ループ情報生成回路ＥＣ６のループ情報データの生成処理を示すフローチャート図である。ループ情報生成回路ＥＣ６は、ループ検出フラグＦｌｄ［０〜ｎ］を監視し（Ｓ１４１）、ループ検出フラグＦｌｄ［ｉ］がネゲートされたことを検知する（Ｓ１４２のＹＥＳ、Ｓ１４３のＹＥＳ）。ループ検出フラグＦｌｄ［ｉ］がネゲートされるケースは２つある。
【００８６】
１つ目は、前述の差分検出部１０の処理において、ネストループバッファ部１１のループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］に、差分値が負の値となったトレースデータの命令アドレスと一致する値が保持されていない場合である（図８のＳ５４、図１５のＳ１４２のＹＥＳ）。２つ目は、前述したトレースメモリリード制御部１３におけるトレースデータの比較処理において、トレースデータの不一致が発生した場合である（図１２のＳ１２３、図１５のＳ１４３のＹＥＳ）。
【００８７】
あるループ検出フラグＦｌｄ［ｉ］のネゲートを検出すると（図１５のＳ１４２のＹＥＳ、Ｓ１４３のＹＥＳ）、命令アドレス比較回路ＥＣ２は対応するループ情報生成要求フラグＦｉｒ［ｉ］を立てる（Ｓ１４４）。そして、ループ情報生成回路ＥＣ６は、ループ情報生成要求フラグＦｉｒ［ｉ］が立っていることを確認すると、当該フラグをネゲートし（Ｓ１４５）、ループ情報生成要求フラグＦｉｒ［ｉ］に対応するループ候補情報［ｉ］のトレースアドレスレジスタＲｔａ［ｉ］、ループサイズカウンタＣｌ［ｉ］、及び、総実行命令数カウンタＣｔ［ｉ］の値を読み出して、ループ情報データを生成する（Ｓ１４６）。そして、ループ情報生成回路ＥＣ６は、生成したループ情報データをトレースデータバッファ［０］Ｂｔ０に書き込み（Ｓ１４７）、トレースメモリライト制御部１２は、トレースデータバッファ［０］Ｂｔ０に格納されたループ情報データをトレースメモリＴＭに書き込む（Ｓ１４８）。
【００８８】
ところで、あるループ検出フラグＦｌｄ［ｉ］がネゲートされた場合、ネストループバッファ部１１に保持された全てのループ候補情報［０〜ｎ］のうちネゲートされた［ｉ〜ｎ］番目のループ候補情報［ｉ〜ｎ］が無効化、即ち、クリアされる。これは、ネゲートされたループ検出フラグＦｌｄ［ｉ］に対応するループ候補先頭命令アドレスが保持された後、ループ終了までの間に新たに保持されたループ候補先頭命令アドレスは、当該ループ検出フラグＦｌｄ［ｉ］に対応するループ内に含まれるとみなされるためである。
【００８９】
以下、図１５のフローチャート図の処理を具体例に基づいて説明する。図１４のトレースメモリＴＭのタイミングｐ２にて、ループＡｌａの検出後タイミングｐ４までは、トレースデータが一致するため、トレースデータは書き込まれず、その代わりにループＡｌａのループ情報データが書き込まれる。ループＡｌａのループ情報データは、ループＡｌａに対応するネストループバッファ部１１のトレースアドレスレジスタＲｔａ［０］の値ａ６をトレースアドレスとして、ループサイズカウンタＣｌ［０］の値３をループサイズとして、総実行命令数カウンタＣｔ［０］の値９を総実行命令数として保持する。
【００９０】
［トレースメモリリード制御部１３（ネストループ有り）］
続いて、図１２のトレースメモリリード制御部１３のフローチャート図に戻り、リードポインタＰｒの指すトレースメモリＴＭ上の比較対象のデータがループ情報データである場合（Ｓ１１４のＹＥＳ）について、説明する。この場合、トレースメモリリード制御回路ＥＣ４は、トレースメモリＴＭから読み出したループ情報データに基づいて、圧縮されたトレースデータを展開（復元）する。
【００９１】
具体的に、本実施の形態例におけるトレースメモリリード制御回路ＥＣ４は、トレースメモリＴＭから、ループ情報データのトレースアドレスからループサイズ分のトレースデータを、トレースデータ数が「ループ情報データの総実行命令数−ループサイズ」分に達するまで読み出すことによってトレースデータを展開する。従って、ループ情報データは、少なくとも、ループ候補先頭命令アドレスのトレースメモリＴＭ上のアドレス（トレースアドレス）と、トレースメモリＴＭに書き込まれなかったトレースデータ数（総実行命令数−ループサイズ）の情報を有する。これにより、トレースメモリリード制御回路ＥＣ４は、ループ情報データに基づいて、圧縮された（書き込まれなかった）トレースデータを展開（復元）することができる。以下、具体的に述べる。
【００９２】
図１２のフローチャート図において、比較対象のデータとしてループ情報データを読み出した場合（Ｓ１１４のＹＥＳ）、トレースメモリリード制御回路ＥＣ４は、リードポインタＰｒが保持するアドレスをインクリメントしてリターンアドレスレジスタＲｒａに退避しておく（Ｓ１１５）。これにより、リターンアドレスレジスタＲｒａには、読み出したループ情報データに基づいたトレースデータの比較終了後、通常の比較に戻った時のトレースアドレス（ループ情報データの次のトレースデータのアドレス）が保持される。続いて、トレースメモリリード制御回路ＥＣ４は、ループ情報データのトレースアドレスをリードポインタＰｒ及びトレースアドレスバッファＢｔａ［ｉ］に、ループサイズを停止中のループ比較カウンタＣｌｃ［ｉ］に対応するループ比較終了レジスタＲｌｃ［ｉ］に、総実行命令数を停止中の総実行命令数比較カウンタＣｔｃ［ｉ］に対応する総実行命令数終了レジスタＲｔｃ［ｉ］に格納する（Ｓ１１６）。
【００９３】
同様にして、リードポインタＰｒの示すトレースデータをトレースメモリＴＭから読み出し、取得したトレースデータと比較しながら、対応するループ比較カウンタＣｌｃ［ｉ］をカウントアップし、リードポインタＰｒの値をインクリメントする。ただし、ループ情報データに基づいて展開されたトレースデータとの比較を行う場合（Ｓ１３３のＹＥＳ）、トレースメモリリード制御回路ＥＣ４は、トレースデータを比較する度に、ループ比較カウンタＣｌｃ［ｉ］に加えて、総実行命令数比較カウンタＣｔｃ［ｉ］の値をカウントアップする（Ｓ１３４）。そして、総実行命令数比較カウンタＣｔｃ［ｉ］の値が、「総実行命令数比較終了レジスタＲｔｃ［ｉ］−ループ比較終了レジスタＲｌｃ［ｉ］」と一致したら（Ｓ１３５のＹＥＳ）、トレースメモリリード制御回路ＥＣ４は、ループ情報データに基づいて展開されたトレースデータ数分の比較が終了したものと判定する。そして、トレースメモリリード制御回路ＥＣ４は、リターンアドレスレジスタＲｒａの値をリードポインタＰｒに戻し（Ｓ１３６）、次のトレースデータを検出する（Ｓ１１３）。
【００９４】
また、トレースメモリリード制御回路ＥＣ４は、ループ比較カウンタＣｌｃ［ｉ］の値がループ比較終了レジスタＲｌｃ［ｉ］の値に達する度に、トレースアドレスバッファＢｔａ［ｉ］に保持されたループ情報データのトレースアドレスの値をリードポインタＰｒに書き込む。
【００９５】
以上のようにして、トレースメモリリード制御部１３は、トレースメモリＴＭからループ情報データを読み出した場合、読みだしたループ情報データに基づいて圧縮されたトレースデータを展開（復元）しながら、取得したトレースデータと比較する。これにより、ネストしたループのトレースデータを比較することができる。上記のネストループしたトレースデータの比較を行う場合について、具体例に沿って説明する。
【００９６】
図７Ａの表ｔｂ１のタイミングｐ５では、ループＢｌｂの先頭の命令ｃ２に分岐して、差分値（命令アドレスｅ２−命令アドレスｅ６）が負の値となり、マイナス検出フラグＦｍが立てられる。この時、ネストループバッファ部１１には１つのループ候補情報［０〜ｎ］も保持されていないため（ループＡｌａのループ候補情報［０］は、ループ検出フラグＦｌｄ［０］ネゲート時にクリアされているため）、表ｔｂ１のタイミングｐ５において、ネストループバッファ部１１は、ループ候補先頭命令アドレスレジスタＲｈａ［０］としてループＢｌｂの先頭命令アドレスｅ２を、トレースアドレスレジスタＲｔａ［０］としてトレースアドレスａ１１を保持する。
【００９７】
引き続き、表ｔｂ１のタイミングｐ６において、ループＡｌａの先頭の命令ｃ３に分岐し、差分値（命令アドレスｅ３−命令アドレスｅ５）が負の値となり、マイナス検出フラグＦｍが立てられる。この時、命令アドレスｅ３は、ネストループバッファ部１１に保持されているループ候補先頭命令アドレスレジスタＲｈａ［０］の値ｅ２とは一致しない。従って、表ｔｂ１のタイミングｐ６において、ネストループバッファ部１１は、新たに、ループＡｌａのループ候補先頭命令アドレスレジスタＲｈａ［１］として先頭命令アドレスｅ３を、トレースアドレスレジスタＲｔａ［１］としてトレースアドレスａ１５を保持する。
【００９８】
続いて、図７Ａの表ｔｂ１のタイミングｐ７において、再び、ループＡｌａの先頭命令ｃ３に分岐し、差分値が負の値となりマイナス検出フラグＦｍが立てられるが、命令アドレスｅ３はループ候補先頭命令アドレスレジスタＲｈａ［１］の値ｅ３と一致することにより、ループ検出フラグＦｌｄ［１］が立てられる。続いて、ループＡｌａのトレースデータと、取得したトレースデータとが順次比較されるが、タイミングｐ８において、トレースデータの不一致が発生してループＡｌａのループ検出フラグＦｌｄ［１］がネゲートされ、ループ情報生成要求フラグＦｉｒ［１］が立てられる。
【００９９】
このように、本実施の形態例のトレース圧縮装置は、複数のループ候補命令アドレスレジスタ［０〜ｎ］を保持することによって、大きいループＢｌｂのループ候補先頭命令アドレスをループ候補情報［０］保持しながら、当該大きいループＢｌｂに内包された小さなループＡｌａを検出することができる。さらに深いネストループの検出についても同様である。
【０１００】
そして、図１４のトレースメモリＴＭのように、ループＡｌａの検出後（タイミングｐ７）トレースデータの不一致によりループが終了するまで（タイミングｐ８）のトレースデータが書き込まれず、ループＡｌａのループ情報データが書き込まれている。当該ループ情報データは、ネストループバッファ部１１のトレースアドレスレジスタＲｔａ［１］の値ａ１５をトレースアドレスとして、ループサイズカウンタＣｌ［１］の値３をループサイズとして、総実行命令数カウンタＣｔ［１］の値９を総実行命令数として保持する。
【０１０１】
続いて、比較対象のデータとして、トレースメモリＴＭからループ情報データが読み出される場合について説明する。図７Ａの表ｔｂ１のタイミングｐ９において、差分値（命令アドレスｅ２−命令アドレスｅ６）が負の値となり、マイナス検出フラグＦｍが立てられるが、命令アドレスｅ２は、ループ候補先頭命令アドレスレジスタＲｈａ［０］の値ｅ２と一致することにより、ループ検出フラグＦｌｄ［０］が立てられる。続いて、ループＢｌｂのトレースデータと、取得したトレースデータとが順次比較されるが、タイミングｐ１０において、トレースメモリリード制御部１３は、トレースメモリＴＭのトレースアドレスａ１８＠からループＡｌａのループ情報データを読み出す（図１２のＳ１１４のＹＥＳ）。図１４のタイミングｐ１０のとおり、比較対象（ｃｍ１）のループＡｌａのループ情報データは、トレースアドレスａ１５、ループサイズ３、総実行命令数９を有する。
【０１０２】
そこで、図１３の表ｔｂ２のタイミングｐ１０において、まず、リターンアドレスレジスタＲｒａに、リードポインタＰｒの値ａ１８をさらにインクリメントした値ａ１９が格納される（Ｓ１１５）。また、表ｔｂ２のＢ１部分のように、リードポインタＰｒ及びトレースアドレスバッファＢｔａ［１］にループ情報データのトレースアドレスａ１５が、ループ比較終了レジスタＲｌｃ［１］にループサイズ３が、総実行命令数比較終了レジスタＲｔｃ［１］に総実行命令数９が書き込まれる（Ｓ１１６）。そして、図１４のトレースメモリＴＭにおいて、トレースアドレスａ１５の示すトレースデータｔ３が、比較対象のトレースデータとしてトレースメモリＴＭから読み出され、比較される。引き続き、リードポインタＰｒがインクリメントされると共に、ループ比較カウンタＣｌｃ［１］及び総実行命令数比較カウンタＣｔｃ［１］がそれぞれカウントアップされる（Ｓ１３１、Ｓ１３４）。
【０１０３】
同様に順次比較を行うと、図１３の表ｔｂ２のタイミングｐ１１において、ループ比較カウンタＣｌｃ［１］の値３とループ比較終了レジスタＲｌｃ［１］の値３とが一致する。そこで、トレースアドレスレジスタＲｔａ［１］の値ａ１５がリードポインタＰｒに書き込み直され、ループ比較カウンタＣｌｃ［１］は０からカウントし直す。これにより、ループ情報データに基づくトレースデータにおいて複数周分ループが繰り返される場合であっても、トレースデータの比較が可能となる。
【０１０４】
そして、順次比較が行われ、図１３のタイミングｐ１２において、総実行命令数比較カウンタＣｔｃ［１］の値６が、「総実行命令数比較終了レジスタＲｔｃ［１］−ループ比較終了カウンタＣｌ［１］（＝９−３）」、即ち、トレースメモリＴＭに書き込まれなかったトレースデータ数に達し（Ｓ１３５のＹＥＳ）、ループＢｌｂのループ情報データに基づくトレースデータの比較が終了する。そして、リターンアドレスレジスタＲｒａに退避された値ａ１９がリードポインタＰｒに格納され（Ｓ１３６）、リードポインタＰｒの値ａ１９の示すトレースデータｔ６がトレースメモリＴＭから読み出され、通常の比較が再開される。
【０１０５】
このように、本実施の形態例におけるトレース圧縮装置は、ループ候補先頭命令アドレスを複数保持可能にすることによって、ネストループを検出することができる。また、トレース圧縮装置は、ループ検出時、ループ候補の先頭命令アドレス以降のトレースデータと、新たに取得したトレースデータとを比較し、一致する間はトレースメモリＴＭに書き込まず、不一致を検出した時に、ループ情報データをトレースメモリＴＭに書き込む。
【０１０６】
また、トレース情報データは、書き込まなかったトレースデータ数とループ候補の先頭命令アドレスのトレースデータが書き込まれた前記トレースメモリ上のアドレス情報とを有する。これにより、トレース圧縮装置は、ループ情報データに基づいて、圧縮されたトレースデータを展開（復元）することができる。復元は前述したとおりである。
【０１０７】
このように、本実施の形態例におけるトレース圧縮装置は、ネストループを検出すると共に、圧縮されたネストループ部分のトレースデータとの比較を可能にすることにより、ネストループしたトレースデータの圧縮を行うことができる。この結果、本実施の形態例におけるトレース圧縮装置によると、ループ部分のトレースデータの数が、非圧縮のトレースでは、ループ情報データの総実行命令数に相当する数だったのに対し、圧縮後のトレースではループ情報データの「ループサイズ＋１（ループ情報データ分）」に相当する数に圧縮され、そのデータ量が抑えられる。
【０１０８】
なお、本実施の形態例におけるトレース圧縮装置は、ループ候補情報［０〜ｎ］、即ち、ループの情報として、ループ候補先頭命令アドレスレジスタＲｈａ［０〜ｎ］、トレースアドレスレジスタＲｔａ［０〜ｎ］、ループサイズカウンタＣｌ［０〜ｎ］及び総実行命令数カウンタＣｔ［０〜ｎ］を有する。しかしながら、この例に限定されるものではなく、トレース圧縮装置は、例えば、ループの情報として、ループ１周分の命令アドレスリストを有していてもよいし、ループ１周分の初めと最後の命令アドレスを有していてもよい。同様にして、トレース圧縮装置は、ループに対応するトレースデータが書き込まれたトレースメモリＴＭ上のアドレスリストを有していてもよい。
【０１０９】
＜第２の実施の形態例＞
第１の実施の形態例では、ネストループが２重のトレースデータの圧縮について述べたが、第２の実施の形態例では、ネストループが３重のトレースデータの圧縮について述べる。３重のネストループを有するトレースデータの圧縮では、トレース情報データに基づいて展開したトレースデータ内に、さらに、別の小さなループのループ情報データを有する。
【０１１０】
図１６は、３重のネストループを有するプログラムの一例を表す図である。同図のソースプログラムＳ２は、図４のソースプログラムＳ１と同様に、Ｃ言語で記述されたプログラムである。同図のソースプログラムＳ２は、破線で囲まれた深さ１のループＺｌｚが点線で囲まれた深さ２のループＹｌｙを内包し、さらに、ループＹｌｙがさらに小さい二重線で囲まれた深さ３のループＸｌｘを内包する。
【０１１１】
具体的に、図１６のソースプログラムＳ２には命令ｃ１１〜ｃ１８が記述されており、命令ｃ１４〜ｃ１５に対応するループＸｌｘ、命令ｃ１３〜ｃ１６に対応するループＹｌｙ、命令ｃ１２〜ｃ１７に対応するループＺｌｚが、それぞれ３周繰り返されるように記述されている。同図のソースプログラムＳ２では、「ｃ１１、ｃ１２（※１）、ｃ１３、ｃ１４〜ｃ１５［×３］、ｃ１６、ｃ１３、ｃ１４〜１５［×３］、ｃ１６、ｃ１３、ｃ１４〜１５［×３］、ｃ１６、ｃ１７（※２）、※１〜※２［×２］、ｃ１８」の順に命令が実行される。また、各命令ｃ１１〜ｃ１８は、それぞれトレースデータｔ１１〜ｔ１８を出力するものとする。
【０１１２】
以下、ネストループが３重の場合のトレースデータの圧縮について、図１７〜図１９の具体例に沿って説明する。
【０１１３】
図１７は、図１６のソースプログラムＳ２を実行した場合の深さ１のループＺｌｚの２〜３周目の命令アドレス及び各情報の変移を表す図である。ただし、同図の左部分ｏｍにおいて、ループＹｌｙの１周目から２周目の途中までの変移が省略されている。また、同図の命令アドレス変移図において、上述したループ情報データに基づいて展開したトレースデータがさらに別のループ情報データを有する場合は、タイミングｐ２７からタイミングｐ２９の区間で発生する。本実施の形態例では、その区間について説明する。
【０１１４】
図１７の表ｔｂ３のタイミングｐ２７において、ネストループバッファ部１１は、ループ候補先頭命令アドレスレジスタＲｈａ［０］としてループＺｌｚの先頭命令アドレスｅ１２を（タイミングｐ２１にて保持）、トレースアドレスレジスタＲｔａ［０］としてａ２３を、ループサイズカウンタＣｌ［０］として２６（ｅ１２、ｅ１３（※３）、ｅ１４〜ｅ１５［×３］、ｅ１６（※４）、※３〜※４［×２］、ｅ１７）を有する。なお、総実行命令数カウンタＣｔ［０］については、タイミングｐ２１からカウントアップが継続している。
【０１１５】
図１８は、図１６のソースプログラムＳ２を実行した場合のトレースメモリＴＭを表す図である。図１８の命令アドレス変移図は、図１７の命令アドレス変移図と同じ図である。図１８のトレースメモリＴＭのタイミングｐ２４においてループＺｌｚが検出されたため、それ以降のトレースデータが書き込まれていない。そして、タイミングｐ２７において、トレースメモリリード制御部１３は、トレースメモリＴＭのトレースアドレスｐ３８＠からループＹｌｙのループ情報データを読み出す。図１８のとおり、比較対象（ｃｍ２）のループＹｌｙのループ情報データは、トレースアドレスａ３１、ループサイズ８、総実行命令数１６を有する。
【０１１６】
図１９は、図１６のソースプログラムＳ２を実行した場合のトレースメモリリード制御部１３の処理に係る各レジスタ及びカウンタの値の変移を表す図である。同図の表ｔｂ４のタイミングｐ２７において、リターンアドレスレジスタＲｒａに、リードポインタＰｒの値をさらにインクリメントした値ａ３９が格納され、Ｂ２部分のように、リードポインタＰｒ及びトレースアドレスバッファＢｔａ［１］にループＹｌｙのループ情報データのトレースアドレスａ３１が、ループ比較終了レジスタＲｌｃ［１］にループサイズ８が、総実行命令数比較終了レジスタＲｔｃ［１］に総実行命令数１６が保持される。
【０１１７】
そして、トレースアドレスａ３１の示すトレースデータがトレースメモリＴＭから読みだされて順次比較されるが、その比較の途中で、トレースメモリリード制御部１３は、さらに、ループＸｌｘのループ情報データを読み出す。図１８のトレースメモリＴＭにおいてループＹｌｙに基づく１周分のトレースデータは、トレース範囲ｔｙの通りである。当該トレース範囲ｔｙのトレースアドレスａ３６＠には、ループＸｌｘのループ情報データが書き込まれている。図１８のとおり、トレースアドレスａ３６＠に書き込まれたループＸｌｘのループ情報データは、トレースアドレスａ３４、ループサイズ２、総実行命令数４を有する。
【０１１８】
従って、トレースメモリリード制御部１３は、ループＹのループ情報データに加え、さらに、ループＸのループ情報データを展開する。具体的に、トレースメモリリード制御部１３は、ループＹのループ情報データに基づく比較が継続中であるため、ループＸのループ情報データをトレースアドレスバッファＢｔａ［２］、ループ比較終了レジスタＲｌｃ［２］、総実行命令数比較終了レジスタＲｔｃ［２］に展開する。
【０１１９】
従って、図１９の表ｔｂ４のタイミングｐ２８において、Ｂ３部分のように、リードポインタＰｒ及びトレースアドレスバッファＢｔａ［２］にループＸｌｘのループ情報データのトレースアドレスａ３４が、ループ比較終了レジスタＲｌｃ［２］にループサイズ２が、総実行命令数比較終了レジスタＲｔｃ［２］に総実行命令数４が保持される。また、リターンアドレスレジスタＲｒａは、ループＸｌｘのループ情報データの次のトレースアドレスａ３７を保持する。
【０１２０】
同様にして順次比較を行い、総実行命令数比較カウンタＣｔｃ［２］の値が「総実行命令数比較終了レジスタＲｔｃ［２］−ループ比較終了レジスタＲｌｃ［２］（＝４−２）」に達すると、トレースメモリリード制御部１３は、ループＸｌｘのループ情報データに基づく比較を終了する。続いて、トレースメモリリード制御部１３は、リターンアドレスレジスタＲｒａに退避したループＸｌｘのループ情報データの次のトレースアドレスａ３７をリードポインタＰｒに書き込み、ループＹｌｙのループ情報データに基づく比較に戻る。
【０１２１】
同様にして順次比較を行い、総実行命令数比較カウンタＣｔｃ［１］の値が「総実行命令数比較終了レジスタＲｔｃ［１］−ループ比較終了レジスタＲｌｃ［１］（＝１６−８）」に達すると、トレースメモリリード制御部１３は、ループＹｌｙのループ情報データに基づく比較を終了する。続いて、トレースメモリリード制御部１３は、リターンアドレスレジスタＲｒａに退避したループＹｌｙのループ情報データの次のトレースアドレスａ３９をリードポインタＰｒに書き込み、通常のトレースデータの比較を行う。
【０１２２】
このように、トレースメモリリード制御回路ＥＣ４は、ループ情報データのネスト階層に応じて、当該ループ情報データから読み出したトレースアドレスをトレースアドレスバッファ［０〜ｎ］に、トレースデータ数をループ比較終了レジスタＲｌｃ［０〜ｎ］及び総実行命令数比較終了レジスタＲｔｃ［０〜ｎ］に保持させる。これにより、トレースメモリリード制御回路ＥＣ４は、ループ情報データに基づいて展開されたトレースデータがさらに別のループ情報データを有するようなネストループ部分の圧縮トレースデータを展開しながら取得したトレースデータとの比較を行うことができる。
【０１２３】
なお、本実施の形態例では、３重のネストループを有する場合のトレースデータの圧縮例について説明したが、任意の深さｍ−１のネストループを有するトレースデータの圧縮にも有効である。この場合、トレースメモリリード制御部１３は、ループ情報データを展開するループ情報バッファをｍセット有する。
【０１２４】
［圧縮されたトレースの復元］
また、本実施の形態例におけるトレース圧縮装置によって圧縮されたトレースは、圧縮前のトレースに復元可能である。例えば、トレースメモリリード制御部１３の処理で前述したように、復元手段は、順次トレースを読み込み、ループ情報データを読み出した場合に、当該ループ情報データに基づいてトレースデータを展開する。また、その時、ループ情報データに基づいて復元したトレースデータがさらにループ情報データを有する場合、同様にして、ループ情報データの各値を例えば階層毎のバッファに保持しながら、ネストループ部分の圧縮トレースデータを復元する。
【０１２５】
なお、以上、本実施の形態例のトレース圧縮装置をハードによって構成する例を述べた。しかし、本実施の形態例のトレース圧縮装置は、トレース圧縮プログラム等のソフトウェアが実行されることによって実現されてもよい。
【０１２６】
図２０は、トレース圧縮プログラムが実行されるコンピュータ７０の構成を表す図である。コンピュータ７０は、一般的なコンピュータであり、ＣＰＵ５１、メモリ５２、入出力インターフェイス５３を備える。また、メモリ５２には、トレース圧縮プログラム６１が格納され、トレース圧縮プログラム６１はＣＰＵ５１と協働することによって、トレース圧縮機能が実現される。なお、圧縮対象のトレースＴＭは予め、コンピュータ７０のメモリ５２に保持されていてもよいし、コンピュータ７０のメモリ５２に格納されたユーザプログラム６２によって生成されてもよい。
【０１２７】
以上の実施の形態をまとめると、次の付記のとおりである。
【０１２８】
（付記１）
プロセッサが実行した命令の命令アドレスを有するトレースデータをトレースメモリに順次書き込むトレースメモリライト制御手段と、
連続する前記トレースデータの第１、第２の命令アドレスの差分値が負であるか否かを判定する差分検出手段と、
前記差分値が負である第２の命令アドレスをループ候補先頭命令アドレスとして１つ以上保持するループ候補保持手段と、
前記差分値が負である第２の命令アドレスを前記ループ候補先頭命令アドレスと比較し、一致した場合にループ検出し、一致しない場合に、一致しなかった前記第２の命令アドレスを新たなループ候補先頭命令アドレスとして前記ループ候補保持手段に保持する命令アドレス比較手段と、
前記ループ検出した前記第２の命令アドレス以降のトレースデータと、前記トレースメモリ内の前記ループ候補先頭命令アドレス以降のトレースデータとを比較するトレースデータ比較手段とを有し、
前記トレースメモリライト制御手段は、前記トレースデータ比較手段が、前記第２の命令アドレス以降のトレースデータと、前記ループ候補先頭命令アドレス以降のトレースデータとの一致を検出する間は、前記第２の命令アドレス以降のトレースデータを前記トレースメモリに書き込まず、不一致を検出した時に、前記第２の命令アドレス以降のトレースデータ数と前記ループ候補先頭命令アドレスが書き込まれた前記トレースメモリ内のアドレス情報とを含むループ情報データを前記トレースメモリに書き込むことを特徴とするトレース圧縮装置。
【０１２９】
（付記２）
付記１において、
前記命令アドレス比較手段が、前記第１のループ情報データに対応する第１のループを検出した場合、
前記トレースデータ比較手段は、前記第１のループの前記ループ候補先頭命令アドレス以降のトレースデータが、当該第１のループが内包する第２のループの第２のループ情報データを有する場合、前記トレースメモリ内に書き込まれた前記第２のループ情報データの前記ループ候補先頭命令アドレス以降のトレースデータを、当該第２のループ情報データのトレースデータ数に達するまで読み出すことによって前記第２のループのトレースデータを復元しながら、前記ループ検出した前記第２の命令アドレス以降のトレースデータと比較することを特徴とするトレース圧縮装置。
【０１３０】
（付記３）
付記１または２において、
前記ループ候補保持手段は、前記ループ候補先頭命令アドレスを複数保持し、
前記命令アドレス比較手段は、前記差分値が負である第２の命令アドレスを当該複数のループ候補先頭命令アドレスと比較し、一致する前記ループ候補先頭命令アドレスに対応するループを検出することを特徴とするトレース圧縮装置。
【０１３１】
（付記４）
付記２において、
前記トレースデータ比較手段は、さらに、前記第２のループの前記ループ候補先頭命令アドレス以降のトレースデータが、当該第２のループが内包する第３のループの第３のループ情報データを有する場合、前記トレースメモリ内に書き込まれた前記第３のループ情報データの前記ループ候補先頭命令アドレス以降のトレースデータを、当該第３のループ情報データのトレースデータ数に達するまで読み出すことによって前記第３のループのトレースデータを復元しながら、前記ループ検出した前記第２の命令アドレス以降のトレースデータと比較することを特徴とするトレース圧縮装置。
【０１３２】
（付記５）
付記１乃至４のいずれかにおいて、
前記前記第２の命令アドレス以降のトレースデータ数は、前記命令アドレス比較手段によってループ検出されてから、前記トレースデータ比較手段によって前記不一致を検出した時までのトレースデータ数であることを特徴とするトレース圧縮装置。
【０１３３】
（付記６）
付記１乃至５のいずれかにおいて、
前記トレースデータは、さらに、前記命令の命令内容、または、前記命令のメモリアクセス情報のいずれかまたは両方を有する命令情報を有し、
前記トレースデータ比較手段は、前記トレースデータの前記命令アドレスに加えて、前記命令情報についても比較することを特徴とするトレース圧縮手段。
【０１３４】
（付記７）
プロセッサが実行した命令の命令アドレスを有するトレースデータをトレースメモリに順次書き込むトレースメモリライト制御工程と、
連続する前記トレースデータの第１、第２の命令アドレスの差分値が負であるか否かを判定する差分検出工程と、
前記差分値が負である第２の命令アドレスをループ候補先頭命令アドレスとして１つ以上保持するループ候補保持工程と、
前記差分値が負である第２の命令アドレスを前記ループ候補先頭命令アドレスと比較し、一致した場合にループ検出し、一致しない場合に、一致しなかった前記第２の命令アドレスを新たなループ候補先頭命令アドレスとして前記ループ候補保持工程に保持する命令アドレス比較工程と、
前記ループ検出した前記第２の命令アドレス以降のトレースデータと、前記トレースメモリ内の前記ループ候補先頭命令アドレス以降のトレースデータとを比較するトレースデータ比較工程とをコンピュータに実行させ、
前記トレースメモリライト制御工程では、前記トレースデータ比較工程において、前記第２の命令アドレス以降のトレースデータと、前記ループ候補先頭命令アドレス以降のトレースデータとの一致を検出する間は、前記第２の命令アドレス以降のトレースデータを前記トレースメモリに書き込まず、不一致を検出した時に、前記第２の命令アドレス以降のトレースデータ数と前記ループ候補先頭命令アドレスが書き込まれた前記トレースメモリ内のアドレス情報とを含むループ情報データを前記トレースメモリに書き込むことを特徴とするコンピュータ読み取り可能なトレース圧縮プログラム。
【０１３５】
（付記８）
付記７において、
前記命令アドレス比較工程が、前記第１のループ情報データに対応する第１のループを検出した場合、
前記トレースデータ比較工程は、前記第１のループの前記ループ候補先頭命令アドレス以降のトレースデータが、当該第１のループが内包する第２のループの第２のループ情報データを有する場合、前記トレースメモリ内に書き込まれた前記第２のループ情報データの前記ループ候補先頭命令アドレス以降のトレースデータを、当該第２のループ情報データのトレースデータ数に達するまで読み出すことによって前記第２のループのトレースデータを復元しながら、前記ループ検出した前記第２の命令アドレス以降のトレースデータと比較することを特徴とするトレース圧縮プログラム。
【０１３６】
（付記９）
付記７または８において、
前記ループ候補保持工程は、前記ループ候補先頭命令アドレスを複数保持し、
前記命令アドレス比較工程は、前記差分値が負である第２の命令アドレスを当該複数のループ候補先頭命令アドレスと比較し、一致する前記ループ候補先頭命令アドレスに対応するループを検出することを特徴とするトレース圧縮プログラム。
【０１３７】
（付記１０）
付記８において、
前記トレースデータ比較工程は、さらに、前記第２のループの前記ループ候補先頭命令アドレス以降のトレースデータが、当該第２のループが内包する第３のループの第３のループ情報データを有する場合、前記トレースメモリ内に書き込まれた前記第３のループ情報データの前記ループ候補先頭命令アドレス以降のトレースデータを、当該第３のループ情報データのトレースデータ数に達するまで読み出すことによって前記第３のループのトレースデータを復元しながら、前記ループ検出した前記第２の命令アドレス以降のトレースデータと比較することを特徴とするトレース圧縮プログラム。
【符号の説明】
【０１３８】
１０：ホストＰＣ、２０：インサーキットエミュレータ、３０：ユーザシステム
【図１】
0005569343.tif 000002
【図２】
0005569343.tif 000003
【図３】
0005569343.tif 000004
【図４】
0005569343.tif 000005
【図５】
0005569343.tif 000006
【図６】
0005569343.tif 000007
【図７Ａ】
0005569343.tif 000008
【図７Ｂ】
0005569343.tif 000009
【図８】
0005569343.tif 000010
【図９】
0005569343.tif 000011
【図１０】
0005569343.tif 000012
【図１１】
0005569343.tif 000013
【図１２】
0005569343.tif 000014
【図１３】
0005569343.tif 000015
【図１４】
0005569343.tif 000016
【図１５】
0005569343.tif 000017
【図１６】
0005569343.tif 000018
【図１７】
0005569343.tif 000019
【図１８】
0005569343.tif 000020
【図１９】
0005569343.tif 000021
【図２０】
0005569343.tif 000022