(57)【特許請求の範囲】
【請求項１】
少なくとも２つのデータメモリに関係するデータ転送を同時に行うといった並列転送が可能であり、かつ命令実行工程が少なくとも２以上に細分化されているパイプライン型プロセッサ、に対するアセンブリーソースプログラムをオブジェクトプログラムに変換するアセンブラにおいて、
アセンブリーソースプログラム中の各並列転送命令毎に、並列転送命令において使用されているアドレスレジスタに入るであろうリージョンを互いに異なるアドレス空間のリージョンと判別とし、その判別結果を仮データ配置情報として生成する第１手段、
アセンブリーソースプログラムに基づいて、命令実行工程が互いに異なるが同一サイクルにおいて実行される２以上の命令であって、アドレスレジスタによって指定されるデータメモリへの書き込みを行う転送命令と、アドレスレジスタによって指定されるデータメモリからのデータ読み出しを行う転送命令とを含む命令群を抽出する第２手段、および
第２手段によって抽出された各命令群毎に、第１手段によって生成された仮データ配置情報に基づいて、同じデータメモリに対するデータの読み出しとデータの書き込みとが同時に行われる可能性があるか否かを判定し、同じデータメモリに対するデータの読み出しとデータの書き込みとが同時に行われる可能性がある場合にはその旨をデータハザード情報として記憶する手段、
を備えているアセンブラ。
【請求項２】
少なくとも２つのデータメモリに関係するデータ転送を同時に行うといった並列転送が可能であり、かつ命令実行工程が少なくとも２以上に細分化されているパイプライン型プロセッサ、に対するアセンブリーソースプログラムをオブジェクトプログラムに変換するアセンブラにおいて、
アセンブリーソースプログラム中の各並列転送命令毎に、並列転送命令において使用されているアドレスレジスタに入るであろうリージョンを互いに異なるアドレス空間のリージョンと判別とし、その判別結果を仮データ配置情報として生成する第１手段、
アセンブリーソースプログラムに基づいて、命令実行工程が互いに異なるが同一サイクルにおいて実行される２以上の命令であって、任意の第１のアドレスレジスタによって指定されるデータメモリへの書き込みを行う転送命令と、第１のアドレスレジスタとは異なる第２のアドレスレジスタによって指定されるデータメモリからのデータ読み出しを行う転送命令とを含む命令群を抽出する第２手段、および
第２手段によって抽出された各命令群毎に、第１手段によって生成された仮データ配置情報に基づいて、同じデータメモリに対するデータの読み出しとデータの書き込みとが同時に行われる可能性があるか否かを判定し、同じデータメモリに対するデータの読み出しとデータの書き込みとが同時に行われる可能性がある場合にはその旨をデータハザード情報として記憶する手段、
を備えているアセンブラ。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は、アセンブラに関する。
【０００２】
【従来の技術】
図１０は、従来のアセンブラの構成を示している。
アセンブラは、アセンブラソースファイル２１１内のアセンブリソースプログラムに基づいて、オブジェクトプログラムからなるオブジェクトファイル２１２を生成するとともにエラー情報からなるリストファイル（エラーファイル）２１３を生成する。
【０００３】
アセンブラは、ラベル管理部２０２を有するアセンブラソース解析部２０１、オブジェクトコード生成部２０３、ハザード検出部２０４およびリストファイル生成部２０５を備えている。
【０００４】
ラベル管理部２０２には、アセンブリー言語で用いられるラベルが管理されている。アセンブラソース解析部２０１は、アセンブリソースプログラムを解析する。オブジェクトコード生成部２０３は、オブジェクトコード（機械語）を生成する。ハザード検出部２０４は、コードハザードおよびデータバス競合に基づくデータハザードを検出する。リストファイル生成部２０５は、エラー情報からなるリストファイルを生成する。コードハザードの種類およびその内容ならびにデータハザードの種類およびその内容については、「発明の実施の形態」の欄において詳述する。
【０００５】
図１１は、アセンブラの全体的な動作手順を示している。
【０００６】
まず、アセンブラソースファイル２１１のオープン処理を行う（ステップ１０１）。また、オブジェクトファイル２１２およびリストファイル２１３の新規オープン処理を行う（ステップ１０２）。
【０００７】
次に、アセンブラソースファイル２１１内のアセンブリソースプログラムのデータ定義部からデータラベル情報を取得する（ステップ１０３）。また、アセンブラソースファイル２１１内のアセンブリソースプログラムのコード部からコードラベル情報を取得する（ステップ１０４）。
【０００８】
そして、取得したデータラベル情報およびコードラベル情報に基づいて、アセンブリソースプログラムのコード解析を行って、オブジェクトファイル２１２を生成する（ステップ１０５）。
【０００９】
次に、コードハザードおよびデータバス競合に基づくデータハザードを検出するためのハザード検出処理を行ってハザード情報を作成する（ステップ１０６）。
【００１０】
次に、ハザード情報に基づいて、リストファイル２１３を作成する（ステップ１０７）。そして、アセンブラソースファイル２１１、オブジェクトファイル２１２およびリストファイル２１３のクローズ処理を行う（ステップ１０８）。
パイプライン型プロセッサの従来のアセンブラでは、コード生成時に、ハザードの検出およびそれに伴うエラー処理が可能である。
【００１１】
しかしながら、同じサイクルにおいて同じアドレスパスを使用してリードとライトとを実行するようなデータハザード（アドレス空間の競合に起因するデータハザード）は、従来のアセンブラでは検出できないという問題がある。
【００１２】
【発明が解決しようとする課題】
この発明は、アドレス空間の競合に起因するデータハザードを検出することができるアセンブラを提供することを目的とする。
【００１３】
【課題を解決するための手段】
この発明による第１のアセンブラは、少なくとも２つのデータメモリに関係するデータ転送を同時に行うといった並列転送が可能であり、かつ命令実行工程が少なくとも２以上に細分化されているパイプライン型プロセッサ、に対するアセンブリーソースプログラムをオブジェクトプログラムに変換するアセンブラにおいて、アセンブリーソースプログラム中の各並列転送命令毎に、並列転送命令において使用されているアドレスレジスタに入るであろうリージョンを互いに異なるアドレス空間のリージョンと判別とし、その判別結果を仮データ配置情報として生成する第１手段、アセンブリーソースプログラムに基づいて、命令実行工程が互いに異なるが同一サイクルにおいて実行される２以上の命令であって、アドレスレジスタによって指定されるデータメモリへの書き込みを行う転送命令と、アドレスレジスタによって指定されるデータメモリからのデータ読み出しを行う転送命令とを含む命令群を抽出する第２手段、および第２手段によって抽出された各命令群毎に、第１手段によって生成された仮データ配置情報に基づいて、同じデータメモリに対するデータの読み出しとデータの書き込みとが同時に行われる可能性があるか否かを判定し、同じデータメモリに対するデータの読み出しとデータの書き込みとが同時に行われる可能性がある場合にはその旨をデータハザード情報として記憶する手段を備えていることを特徴とする。
【００１４】
この発明による第２のアセンブラは、少なくとも２つのデータメモリに関係するデータ転送を同時に行うといった並列転送が可能であり、かつ命令実行工程が少なくとも２以上に細分化されているパイプライン型プロセッサ、に対するアセンブリーソースプログラムをオブジェクトプログラムに変換するアセンブラにおいて、アセンブリーソースプログラム中の各並列転送命令毎に、並列転送命令において使用されているアドレスレジスタに入るであろうリージョンを互いに異なるアドレス空間のリージョンと判別とし、その判別結果を仮データ配置情報として生成する第１手段、アセンブリーソースプログラムに基づいて、命令実行工程が互いに異なるが同一サイクルにおいて実行される２以上の命令であって、任意の第１のアドレスレジスタによって指定されるデータメモリへの書き込みを行う転送命令と、第１のアドレスレジスタとは異なる第２のアドレスレジスタによって指定されるデータメモリからのデータ読み出しを行う転送命令とを含む命令群を抽出する第２手段、および第２手段によって抽出された各命令群毎に、第１手段によって生成された仮データ配置情報に基づいて、同じデータメモリに対するデータの読み出しとデータの書き込みとが同時に行われる可能性があるか否かを判定し、同じデータメモリに対するデータの読み出しとデータの書き込みとが同時に行われる可能性がある場合にはその旨をデータハザード情報として記憶する手段を備えていることを特徴とする。
【００１５】
【発明の実施の形態】
【００１６】
以下、図１〜図９を参照して、この発明の実施の形態について説明する。
【００１７】
〔１〕パインプライン型プロセッサの１種であるＤＳＰの説明
【００１８】
〔１−１〕ＤＳＰの構成の説明
【００１９】
図１は、パインプライン型プロセッサの１種であるＤＳＰの一例を示している。
【００２０】
ＤＳＰは、プログラムメモリ１、命令レジスタ２、デコーダ３、第１データメモリ４（データメモリＡ）、第２データメモリ５（データメモリＢ）、数値演算ユニット６、アドレス演算ユニット７、第１データバス８（データバスＡ）および第２データバス９（データバスＢ）を備えている。
【００２１】
数値演算ユニット６は、１６ビットのＲ０レジスタ１１、１６ビットのＲ１レジスタ１２、１６ビット乗算器１３、３２ビットのパイプラインレジスタ１４、３２ビット加算器１５および３１ビットのアキュムレータ１６を備えている。
【００２２】
Ｒ０レジスタ１１およびＲ１レジスタ１２は、乗算器１３への入力となる値が格納されるデータレジスタである。アセンブリー言語では、Ｒ０レジスタ１１をｒ０で、Ｒ１レジスタ１２をｒ１で表すことにする。パイプラインレジスタ１４は、乗算器１３の演算結果を、加算器１５に渡すためのテンポラリーレジスタである。アキュムレータ１６は、演算結果が格納されるレジスタである。アセンブリー言語では、アキュムレータ１６をａｘで表すことにする。また、アキュムレータ１６の上位１６ビットをａｈで、下位１６ビットをａｌ（ｌはＬの小文字）で表すことにする。
【００２３】
アドレス演算ユニット７は、４つの１６ビットのアドレスレジスタ２１〜２４（Ａ０レジスタ２１、Ａ１レジスタ２２、Ａ２レジスタ２３、Ａ３レジスタ２４）および４つの加算器３１〜３４を備えている。アセンブリー言語では、アドレスレジスタ２１〜２４をａ０、ａ１、ａ２、ａ３で表すことにする。
【００２４】
〔１−２〕ＤＳＰのアーキテクチャの説明
【００２５】
・ハーバードアーキテクチャー：プログラムメモリとデータメモリのメモリ空間が異なる。
・４段パイプライン。
・データ演算は、Ｒ０レジスタ１１およびＲ１レジスタ１２からの入力をもとにアキュムレータ１６との積和演算を行う。
・積和演算と同時に、２つのデータ転送が可能である。つまり、並列転送が可能である。
【００２６】
４段パイプラインについて説明する。このＤＳＰでは、プログラムメモリ１から命令が読み取られて、実行されるまでの処理が、次のような４つの工程に細分化されている。
【００２７】
（１）ＦＥＴＣＨ工程
ＦＥＴＣＨ工程では、プログラムメモリ１から命令が取得される。
【００２８】
（２）ＤＥＣＯＤＥ工程
ＤＥＣＯＤＥ工程では、取得した命令が解読される。
【００２９】
（３）第１のＥＸＥＣＵＴＥ工程
第１のＥＸＥＣＵＴＥ工程では、演算処理またはデータ転送処理が行われる。第１のＥＸＥＣＵＴＥ工程で実行可能な演算処理は、Ｒ０レジスタ１１の内容とＲ１レジスタ１２の内容とを乗算器１３によって乗算するといった乗算処理である。第１のＥＸＥＣＵＴＥ工程で実行可能な転送処理は、データメモリ４または５から読み出したデータを、レジスタ１１または１２に転送するといった転送処理（リード処理）である。
【００３０】
（４）第２のＥＸＥＣＵＴＥ工程
第２のＥＸＥＣＵＴＥ工程では、演算処理またはデータ転送処理が行われる。第２のＥＸＥＣＵＴＥ工程で実行可能な演算処理は、加算器１５によって加算された加算結果をアキュムレータ１６に書き込むといった加算処理である。第２のＥＸＥＣＵＴＥ工程で実行可能な転送処理は、レジスタ１１または１２の内容をデータメモリ４または５に転送するといった転送処理（ライト処理）ならびにレジスタ間の転送処理である。
【００３１】
このＤＳＰでは、データバスが２本設けられているため、各ＥＸＥＣＵＴＥ工程において、互いに異なるデータバスを使用した２つのデータ転送（並列転送）が可能である。
【００３２】
図２は、これらの工程の時間的な流れを示している。図２において、”Ｆ”はＦＥＴＣＨ工程を、”Ｄ”はＤＥＣＯＤＥ工程を、”Ｅ１”は第１のＥＸＥＣＵＴＥ工程を、”Ｅ２”は第２のＥＸＥＣＵＴＥ工程をそれぞれ表している。
【００３３】
図２から、この４工程パイプライン処理では、１工程単位の１サイクル期間に、第１のＥＸＥＣＵＴＥ工程と、第２のＥＸＥＣＵＴＥ工程が同時に行われることがあることがわかる。このため、１サイクル期間に実行される第１のＥＸＥＣＵＴＥ工程と、第２のＥＸＥＣＵＴＥ工程の内容によっては、誤動作（ハザード）が発生する可能性がある。
【００３４】
〔１−３〕ＤＳＰに対する命令の種類の説明
【００３５】
以下、ＤＳＰに対する命令の種類を具体例とともに説明する。
【００３６】
（１）積和演算命令
ax＝ax+r0*r1; ♯ r0 とr1の乗算を行い、その結果とaxとを加算する。
【００３７】
（２）レジスタ間転送命令
r0＝ah;       ♯ ah の値をr0に転送する。
r0＝r1;       ♯ r1 の値をr0に転送する。
a0＝r0;       ♯ r0 の値をa0に転送する。
【００３８】
（３）即値転送命令
r0＝0x1000;   ♯ r0 に0x1000(16 進数表現) の値を入れる。
a0＝0x2000;   ♯ a0 に0x2000(16 進数表現) の値を入れる。
【００３９】
0003754222.tif 000002
【００４０】
（５）並列転送命令
r0＝[a0++], r0＝[a0++];
[a2++]＝r0, r1＝[a3++];
r0＝[a0++], [a1++]＝r1;
[a2++]＝r0, [a3++]＝r1;
【００４１】
並列転送命令の場合には、２つの転送命令を含んでいるが、これらの転送命令において使用されるデータバスが異なるということが前提となっている。ここでは、並列転送命令中の左側の転送命令はデータバスＡを用いた転送命令であり、右側の転送命令はデータバスＢを用いた転送命令である。単一の転送命令は、所定のデータバス、この例では、データバスＡを用いた転送命令であるとする。
【００４２】
（６）積和演算命令＋データ転送命令
ax＝ax+r0*r1, r0＝[a0++], r1＝[a1++];
【００４３】
〔１−４〕ハザードパターンの説明
上記ＤＳＰのハサードパターンは以下の通りである。
【００４４】
（１）コードハザード（構造ハザード）
【００４５】
▲１▼  r0、r1に対するレジスタ間転送の次に、乗算または積和演算命令がくる場合。
【００４６】
r0＝0x1000;   ♯ r0 に0x1000の値を入れる。
r1＝0x2000;   ♯ r1 に0x2000の値を入れる。
r0＝r1;       ♯ r0 にr1を入れる。
ax＝ax+r0*r1; ♯ r0 とr1の乗算を行い、その結果とaxとを加算する。
【００４７】
このような場合には、レジスタ間転送命令(r0 ＝r1) は第２のＥＸＥＣＵＴＥ工程で実行され、積和演算命令（ax＝ax+r0*r1）は第１のＥＸＥＣＵＴＥ工程で実行されるため、同じ１サイクルで、これらの命令が実行されることになる。このため、積和演算命令（ax＝ax+r0*r1）を実行した場合には、 r0 の値はレジスタ間転送命令(r0 ＝r1) が実行される前の値（0x1000）となってしまう。
【００４８】
▲２▼  r0、r1に対するレジスタ間転送の次に、データリード命令がくる場合。
【００４９】
r0＝0x1000;   ♯ r0 に0x1000の値を入れる。
r1＝0x2000;   ♯ r1 に0x2000の値を入れる。
a0＝0x3000;   ♯ a0 に0x3000の値を入れる。
a1＝0x4000;   ♯ a1 に0x4000の値を入れる。
[a0]＝r0;     ♯ a0 が指すデータメモリの0x3000番地にr0の値(0x1000)を入れる。
r1＝a1;       ♯ r1 にa1の値(0x4000)を入れる。
r1＝[a0++];   ♯ a0 が指すデータメモリの0x3000番地のデータをr1に入れる。その後、a0の値をインクリメント(1加算) する。
【００５０】
このような場合には、レジスタ間転送命令(r1 ＝a1) は第２のＥＸＥＣＵＴＥ工程で実行され、データリード命令（r1＝[a0++]）は第１のＥＸＥＣＵＴＥ工程で実行されるため、同じ１サイクルで、これらの命令が実行されることになる。このため、データリード命令（r1＝[a0++]）を実行した場合には、 r1 の値はレジスタ間転送命令(r1 ＝a1) が実行された後の値（0x4000）となってしまう。
【００５１】
▲３▼  a0〜a3に対するレジスタ間転送の次に、データリード命令がくる場合。
【００５２】
r0＝0x1000;   ♯ r0 に0x1000の値を入れる。
r1＝0x2000;   ♯ r1 に0x2000の値を入れる。
a0＝r0;       ♯ a0 にr0の値(0x1000)を入れる。
a0＝r1;       ♯ a0 にr1の値(0x2000)を入れる。
r1＝[a0++];   ♯ a0 が指すデータメモリの0x2000番地のデータをr1に入れる。その後、a0の値をインクリメント(1加算) する。
【００５３】
このような場合には、レジスタ間転送命令(a0 ＝r1) は第２のＥＸＥＣＵＴＥ工程で実行され、データリード命令（r1＝[a0++]）は第１のＥＸＥＣＵＴＥ工程で実行されるため、同じ１サイクルで、これらの命令が実行されることになる。このため、データリード命令（r1＝[a0++]）を実行した場合には、 a0 の値( アドレス) はレジスタ間転送命令(a0 ＝r1) が実行される前の値（0x1000）となってしまう。
【００５４】
（２）データハザード
【００５５】
▲１▼  データバスが競合する場合
【００５６】
r0＝0x1000;   ♯ r0 に0x1000の値を入れる。
r1＝0x2000;   ♯ r1 に0x2000の値を入れる。
a0＝0x3000;   ♯ a0 に0x3000の値を入れる。
a1＝0x4000;   ♯ a1 に0x4000の値を入れる。
[a0]＝r0;     ♯ a0 が指すデータメモリの0x3000番地にr0の値(0x1000)を入れる。
r1＝[a0++];   ♯ a0 が指すデータメモリの0x3000番地のデータをr1に入れる。その後、a0の値をインクリメント(1加算) する。
【００５７】
このような場合には、ライト命令([a0] ＝r0) は第２のＥＸＥＣＵＴＥ工程で実行され、リード命令（r1＝[a0++]）は第１のＥＸＥＣＵＴＥ工程で実行されるため、同じ１サイクルで、これらの命令が実行されることになる。しかしながら、両命令において、データバスが競合するため、動作しなくなる。
【００５８】
▲２▼  データバスは競合しないが、アドレス空間（アドレスバス）が競合する場合
【００５９】
r0＝0x1000;   ♯ r0 に0x1000の値を入れる。
r1＝0x2000;   ♯ r1 に0x2000の値を入れる。
a0＝0x0000;   ♯ a0 に0x0000の値を入れる。
a1＝0x8000;   ♯ a1 に0x8000の値を入れる。
a2＝0x9000;   ♯ a2 に0x9000の値を入れる。
r0＝[a0],[a1] ＝r1;   ♯ a0 が指すデータメモリの0x0000番地のデータをr0に入れるとともに、a1が指すデータメモリの0x8000番地にr1の値(0x2000)を入れる。
r1＝[a2];   ♯ a2 が指すデータメモリの0x9000番地のデータをr1に入れる。
【００６０】
このような場合には、データバスＢを用いたライト命令([a1] ＝r1) は第２のＥＸＥＣＵＴＥ工程で実行され、データバスＡを用いたリード命令（r1＝[a2]）は第１のＥＸＥＣＵＴＥ工程で実行されるため、同じ１サイクルで、これらの命令が実行されることになる。しかしながら、0x8000〜0xffffが１つのアドレス空間を形成しているとすると、両命令において、アドレス空間が競合するため、動作しなくなる。
【００６１】
上記▲１▼▲２▼のいずれのデータハザードも、ライト命令後にリード命令後がくる場合にのみ発生する可能性がある。
【００６２】
上記コードハザードおよびデータハザードのうち、（２）▲２▼のデータバスは競合しないがアドレス空間（アドレスバス）が競合する場合のデータハザードについては、従来のアセンブラで検出することはできなかった。以下、（２）▲２▼のデータバスは競合しないがアドレス空間（アドレスバス）が競合する場合のデータハザードを検出することができるアセンブラについて説明する。
【００６３】
〔２〕アセンブラの説明
【００６４】
〔２−１〕アセンブラの構成の説明
【００６５】
図３は、アセンブラの構成を示している。
【００６６】
アセンブラは、アセンブラソースファイル１１１内のアセンブリソースプログラムに基づいて、オブジェクトプログラムからなるオブジェクトファイル１１２を生成するとともにエラー情報からなるリストファイル（エラーファイル）１１３を生成する。
【００６７】
アセンブラは、ラベル管理部１０２およびデータメモリ配置予測部１０３を有するアセンブラソース解析部１０１、オブジェクトコード生成部１０４、コードハザード検出部１０５、データハザード検出部１０６およびリストファイル生成部１０７を備えている。
【００６８】
ラベル管理部１０２には、アセンブリー言語で用いられるラベルが管理されている。データメモリ配置予測部１０３は、データメモリＡとデータメモリＢの空間的配置を予測する。アセンブラソース解析部１０１は、アセンブリソースプログラムを解析する。オブジェクトコード生成部１０４は、オブジェクトコード（機械語）を生成する。コードハザード検出部１０５は、コードハザードを検出する。データハザード検出部１０６は、データハザードを検出する。リストファイル生成部１０７は、エラー情報からなるリストファイルを生成する。
【００６９】
図４は、アセンブラの全体的な動作手順を示している。
【００７０】
まず、アセンブラソースファイル１１１のオープン処理を行う（ステップ１）。また、オブジェクトファイル１１２、リストファイル１１３の新規オープン処理を行う（ステップ２）。
【００７１】
次に、アセンブラソースファイル１１１内のアセンブリソースプログラムのデータ定義部からデータラベル情報を取得する（ステップ３）。また、アセンブラソースファイル１１１内のアセンブリソースプログラムのコード部からコードラベル情報を取得する（ステップ４）。
【００７２】
そして、取得したデータラベル情報およびコードラベル情報に基づいて、アセンブリソースプログラムのコード解析を行って、オブジェクトファイル１１２を生成する（ステップ５）。
【００７３】
次に、データメモリ配置予測処理を行う（ステップ６）。次に、コードハザード検出処理を行う（ステップ７）。次に、データメモリ配置情報とコードハザード情報とに基づいて、データハザード検出処理を行う（ステップ８）。
【００７４】
次に、コードハザード情報とデータハザード情報とに基づいて、リストファイル１１３を作成する（ステップ９）。そして、アセンブラソースファイル１１１、オブジェクトファイル１１２およびリストファイル１１３のクローズ処理を行う（ステップ１０）。
【００７５】
図５は、図４のステップ５で実行されるコード解析処理手順を示している。
【００７６】
まず、アセンブリソースプログラムのコード１行文を取得する（ステップ１１）。そして、文法が正しいか否かを判別する（ステップ１２）。
【００７７】
文法が正しい場合には、当該行にラベルがあるか否かを判別する（ステップ１３）。
【００７８】
当該行にラベルがない場合には、当該行をマシン語に変換する（ステップ１５）。そして、未だコード解析していないアセンブラコードが残っている場合には（ステップ１７でＹＥＳ）、ステツプ１１に戻る。
【００７９】
上記ステップ１３において、当該行にラベルがあると判別された場合には、当該行のラベルがコードラベルまたはデータラベルとして存在するものか否かを判別する（ステップ１４）。当該行のラベルがコードラベルまたはデータラベルとして存在するものである場合には、当該行をマシン語に変換する（ステップ１５）。そして、未だコード解析していないアセンブラコードが残っている場合には（ステップ１７でＹＥＳ）、ステツプ１１に戻る。
【００８０】
上記ステップ１２で文法が誤っていると判別した場合または上記ステップ１４で当該行のラベルがコードラベルまたはデータラベルとして存在していないと判別された場合には、エラー情報を記憶するとともにマシン語のＮＵＬＬに変換する（ステップ１６）。そして、未だコード解析していないアセンブラコードが残っている場合には（ステップ１７でＹＥＳ）、ステツプ１１に戻る。
【００８１】
このようにして全てのアセンブラコードに対する解析処理が終了すると（ステップ１７でＮＯ）、コード解析処理は終了する。
【００８２】
図６は、図４のステップ６で実行されるデータメモリ配置予測処理手順を示している。
【００８３】
ここでは、図９に示すプログラム例を参考にして、データメモリ配置予測処理手順を説明する。
【００８４】
オブジェクトコードから命令を取得する（ステップ２１）。そして、今回取得した命令がラベルを用いたデータメモリからアドレスレジスタへのデータ転送命令か否かを判別する（ステップ２２）。
【００８５】
今回取得した命令がラベルを用いたデータメモリからアドレスレジスタへのデータ転送命令である場合には、当該アドレスレジスタとラべルのリージョンを記憶する（ステップ２３）。
【００８６】
たとえば、図９中の命令（a0＝d00;) 、（a1＝d10;) 、（a2＝d20;) 、（a3＝d30;) が、ラベルを用いたデータメモリからアドレスレジスタへのデータ転送命令に該当する。取得した命令が（a0＝d00;) である場合には、アドレスレジスタa0と、ラべルd00 のリージョンdata0 領域とを記憶する。取得した命令が（a1＝d10;) である場合には、アドレスレジスタa1と、ラべルd10 のリージョンdata1 領域とを記憶する。取得した命令が（a2＝d20;) である場合には、アドレスレジスタa2と、ラべルd20 のリージョンdata2 領域とを記憶する。取得した命令が（a3＝d30;) である場合には、アドレスレジスタa3と、ラべルd30 のリージョンdata3 領域とを記憶する。
【００８７】
ステップ２３の処理が行われた場合には、上記ステップ２１で取得していないオブジェクトコードが残っているか否かが判別され（ステップ２６）、残っている場合にはステップ２１に戻って次の命令が取得せしめられる。
【００８８】
ステップ２１で取得した命令がラベルを用いたデータメモリからアドレスレジスタへのデータ転送命令でない場合には、その命令が並列転送命令であるか否かが判別される（ステップ２４）。並列転送命令である場合には、使用されているアドレスレジスタに入るであろうリージョンを別のアドレス空間( 別のデータメモリ) のリージョンと判断し、その判断結果を仮データ配置情報として記憶する（ステップ２５）。
【００８９】
たとえば、図９中の命令（[a0]＝r0, [a1]＝r1) 、（r0＝[a0] , r1 ＝[a1]) 、（[a2]＝r0, r1＝[a1]) 、（r0＝[a2], [a3]＝r1) が、並列転送命令に該当する。取得した並列転送命令が（[a0]＝r0, [a1]＝r1) である場合には、アドレスレジスタa0に入るであろうリージョンdata0 領域と、アドレスレジスタa1に入るであろうリージョンdata1 領域とは別のアドレス空間のリージョンと判断される。これは、両アドレスレジスタに入るであろうリージョンが同じアドレス空間である場合には、同じアドレス空間に対して同時にアクセスすることになり、この並列転送を行えないからである。
【００９０】
取得した並列転送命令が（r0＝[a0] , r1 ＝[a1]) である場合にも、同様に、アドレスレジスタa0に入るであろうリージョンdata0 領域と、アドレスレジスタa1に入るであろうリージョンdata1 領域とは別のアドレス空間のリージョンと判断される。
【００９１】
取得した並列転送命令が（[a2]＝r0, r1＝[a1]) である場合には、アドレスレジスタa2に入るであろうリージョンdata2 領域と、アドレスレジスタa1に入るであろうリージョンdata1 領域とは別のアドレス空間のリージョンと判断される。
【００９２】
取得した並列転送命令が（r0＝[a2], [a3]＝r1) である場合には、アドレスレジスタa2に入るであろうリージョンdata2 領域と、アドレスレジスタa3に入るであろうリージョンdata3 領域とは別のアドレス空間のリージョンと判断される。
【００９３】
つまり、リージョンdata0 領域とリージョンdata1 領域とは別のアドレス空間の領域であり、リージョンdata1 領域とリージョンdata2 領域とは別のアドレス空間の領域であり、リージョンdata2 領域とリージョンdata3 領域とは別のアドレス空間の領域であることがわかる。したがって、リージョンdata0 領域がデータメモリＡであるとすると、リージョンdata1 領域はデータメモリＢとなり、リージョンdata2 領域はデータメモリＡとなり、リージョンdata3 領域はデータメモリＢとなる。いいかえれば、リージョンdata0 領域とリージョンdata2 領域とは同じアドレス空間の領域であり、リージョンdata1 領域とリージョンdata3 領域とは同じアドレス空間の領域であることがわかる。
【００９４】
ステップ２５の処理が行われた場合には、上記ステップ２１で取得していないオブジェクトコードが残っているか否かが判別され（ステップ２６）、残っている場合にはステップ２１に戻って次の命令が取得せしめられる。
【００９５】
上記ステップ２４において、今回取得した命令が並列転送命令でないと判別された場合には、ステップ２６に移行し、上記ステップ２１で取得していないオブジェクトコードが残っているか否かが判別され、残っている場合にはステップ２１に戻って次の命令が取得せしめられる。
【００９６】
全てオブジェクトコードに対してステップ２１〜２６までの処理が実行された場合には（ステップ２６でＮＯ）、ステップ２７以降の処理が行われる。
【００９７】
つまり、まず、オブジェクトコードから命令を取得する（ステップ２７）。そして、今回取得した命令が転送命令であるか否かを判別する（ステップ２８）。今回取得した命令が転送命令である場合には、ステップ２１〜２６の処理において生成した仮データ配置情報を、当該オブジェクトコードに付加する（ステップ２９）。そして、上記ステップ２７で取得していないオブジェクトコードが残っているか否かが判別され（ステップ３０）、残っている場合にはステップ２７に戻って次の命令が取得せしめられる。
【００９８】
上記ステップ２８において、今回取得した命令が転送命令でないと判別された場合には、ステップ３０に移行し、上記ステップ２７で取得していないオブジェクトコードが残っているか否かが判別され、残っている場合にはステップ２７に戻って次の命令が取得せしめられる。
【００９９】
全てオブジェクトコードに対してステップ２７〜３０までの処理が実行された場合には（ステップ３０でＮＯ）、データメモリ配置予測処理は終了する。
【０１００】
図７は、図４のステップ７で実行されるコードハザード検出処理手順を示している。
【０１０１】
オブジェクトコードから第１の命令を取得する（ステップ４１）。第１の命令とは、コードによるハザード検出処理開始された直後においては、オブジェクトコードの最初の命令を意味する。
【０１０２】
第１の命令の次の命令（以下、第２の命令という）を取得する（ステップ４２）。
【０１０３】
第１の命令と第２の命令との間のコードハザードをチェックする（ステップ４３）。コードハザードのチェック方法はよく知られているのでその説明を省略する。
【０１０４】
コードハザードを検出した場合には、その旨をハザード情報として記憶する（ステップ４７）。そして、ハザード検出処理を行っていないオブジェクトコードが残っているか否かが判別され（ステップ４８）、残っている場合にはステップ４１に戻って現在の第１の命令の次の命令（現在の第２の命令）を第１の命令として取得する。
【０１０５】
上記ステップ４３において、コードハザードが検出されなかった場合には（ステップ４４でＮＯ）、第１の命令と第２の命令との間にデータハザードが起こる可能性があるか否かをチェックする（ステップ４５）。つまり、第１の命令中にデータメモリに対するライト命令が存在しかつ第２の命令中にデータメモリからのリード命令が存在するか否か調べられる。第１の命令中にデータメモリに対するライト命令が存在しかつ第２の命令中にデータメモリからのリード命令が存在する場合には、第１の命令と第２の命令との間にデータハザードが起こる可能性があると判別される。
【０１０６】
データハザードが起こる可能性があると判別された場合には（ステップ４６でＹＥＳ）、その旨をハザード情報として記憶する（ステップ４７）。そして、ハザード検出処理を行っていないオブジェクトコードが残っているか否かが判別され（ステップ４８）、残っている場合にはステップ４１に戻って現在の第１の命令の次の命令を第１の命令として取得する。
【０１０７】
上記ステップ４５でデータハザードが起こる可能性がないと判別された場合には（ステップ４６でＮＯ）、ステップ４８に移行し、ハザード検出処理を行っていないオブジェクトコードが残っているか否かを判別する。ハザード検出処理を行っていないオブジェクトコードが残っている場合にはステップ４１に戻って現在の第１の命令の次の命令を第１の命令として取得する。
【０１０８】
図８は、図４のステップ８で実行されるデータハザード検出処理手順を示している。ただし、２種類のデータハザード（▲１▼データバスが競合することに起因するデータハザードと、▲２▼アドレス空間が競合することに起因するデータハザード）のうち、▲１▼データバスが競合することに起因するデータハザードの検出方法についてはよく知られているので、ここでは、▲２▼アドレス空間が競合することに起因するデータハザードを検出するための処理手順のみについて説明する。
【０１０９】
ここでは、図９に示すプログラム例を参考にして、データハザード検出処理手順を説明する。
【０１１０】
コードハザード検出処理によって作成されたハザード情報から、データハザードが起こる可能性があることを示すデータハザード情報を取得する（ステップ５１）。
【０１１１】
今回取得したデータハザード情報と、データ配置予測処理によって生成された仮データ配置情報とを比較することにより（ステップ５２）、アドレス空間が競合することに起因するデータハザードが起こるか否かを判別する（ステップ５３）。
【０１１２】
図９中の命令（r0＝[a2],[a3] ＝r1;)中のライト命令（[a3]＝r1;)と、その次のリード命令（r1＝[a0++];)との間では、アドレス空間競合の可能性があるが、a3で示すアドレス空間( データメモリ) とa0で示すアドレス空間( データメモリ) とは異なるアドレス空間であると判断されるため、アドレス空間が競合しないと判別される。
【０１１３】
図９中の命令（r0＝[a2],[a3] ＝r1;)中のライト命令（[a3]＝r1;)と、その次のリード命令（r1＝[a1++];)との間では、a3で示すアドレス空間( データメモリ) とa1で示すアドレス空間( データメモリ) とは同じアドレス空間であると判断されるため、アドレス空間が競合すると判別される。
【０１１４】
データハザードが起こると判別された場合には（ステップ５３でＹＥＳ）、その旨をハザード情報として記憶する（ステップ５４）。そして、コードハザード検出処理によって作成されたハザード情報中に、データハザードが起こる可能性があることを示す他のデータハザード情報があるか否かを判別し（ステップ５５）、他のデータハザード情報がある場合にはステップ５１に戻る。
【０１１５】
上記ステップ５２において、データハザードが起こると判別されなかった場合には（ステップ５３でＮＯ）、ステップ５５に移行し、コードハザード検出処理によって作成されたハザード情報中に、データハザードが起こる可能性があることを示す他のデータハザード情報があるか否かを判別する。そして、他のデータハザード情報がある場合にはステップ５１に戻る。
【０１１６】
上記ステップ５５において、他のデータハザード情報がないと判別された場合には、データハザード検出処理を終了する。
【０１１７】
【発明の効果】
この発明によれば、アドレス空間の競合に起因するデータハザードを検出することができるアセンブラが得られる。
【図面の簡単な説明】
【図１】パインプライン型プロセッサの１種であるＤＳＰの構成を示すブロック図である。
【図２】４工程パイプライン処理の時間的に流れを示すタイムチャートである。
【図３】アセンブラの構成を示すブロック図である。
【図４】図３のアセンブラの全体的な処理手順を示すフローチャートである。
【図５】図４のステップ５で実行されるコード解析処理手順を示すフローチャートである。
【図６】図４のステップ６で実行されるデータメモリ配置予測処理手順を示すフローチャートである。
【図７】図４のステップ７で実行されるコードハザード検出処理手順を示すフローチャートである。
【図８】図４のステップ８で実行されるデータハザード検出処理手順を示すフローチャートである。
【図９】アセンブリーソースプログラムの例を示す図である。
【図１０】従来のアセンブラの構成を示すブロック図である。
【図１１】図１０のアセンブラの全体的な処理手順を示すフローチャートである。
【符号の説明】
１０１  アセンブラソース解析部
１０２  ラベル管理部
１０３  データメモリ配置予測部
１０４  オブジェクトコード生成部
１０６  データハザード検出部
１０７  リストファイル生成部
【図１】
0003754222.tif 000003
【図２】
0003754222.tif 000004
【図３】
0003754222.tif 000005
【図４】
0003754222.tif 000006
【図５】
0003754222.tif 000007
【図６】
0003754222.tif 000008
【図７】
0003754222.tif 000009
【図８】
0003754222.tif 000010
【図９】
0003754222.tif 000011
【図１０】
0003754222.tif 000012
【図１１】
0003754222.tif 000013