JP3840149B2 - コンパイラ、演算処理システム及び演算処理方法 - Google Patents
コンパイラ、演算処理システム及び演算処理方法 Download PDFInfo
- Publication number
- JP3840149B2 JP3840149B2 JP2002190818A JP2002190818A JP3840149B2 JP 3840149 B2 JP3840149 B2 JP 3840149B2 JP 2002190818 A JP2002190818 A JP 2002190818A JP 2002190818 A JP2002190818 A JP 2002190818A JP 3840149 B2 JP3840149 B2 JP 3840149B2
- Authority
- JP
- Japan
- Prior art keywords
- object code
- instruction information
- calculation instruction
- instruction
- instructions
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/445—Exploiting fine grain parallelism, i.e. parallelism at instruction level
Description
【発明の属する技術分野】
本発明は、高級言語で代表されるソースプログラムに基づいてオブジェクトコードを生成するコンパイラ及び演算処理方法と、この種のコンパイラで生成されたオブジェクトコードに基づいて演算処理を行う演算処理システムとに関する。
【0002】
【従来の技術】
1サイクルで終わらない処理をプロセッサで行う場合、処理を開始する命令と結果を受け取る命令とが特定の専用命令の組合せであれば、コンパイラでも簡易にスケジューリングを行うことができる。
【0003】
例えば、乗算を行うmul命令と、乗算結果の下位32ビットを受け取るmflo命令(mul命令とmflo命令はRISC型プロセッサの一例であるMIPSアーキテクチャの命令であり、本明細書のアセンブリ命令は、MIPSアーキテクチャの命令を使用している)とを実行するのに、システムクロックの4サイクルを必要とする場合、図27に示すように、mul命令とmflo命令の間に無関係な命令を3命令を入れることで、ストールを起こすことなく、処理を行うことができる。
【0004】
図27の場合、mul 命令と mflo 命令の間の3命令は、HIレジスタとLOレジスタにアクセスしない命令で、かつmflo命令で定義するレジスタを使用しない命令であるという予め定めた規則をコンパイラに組み込むことにより、コンパイラがmul命令とmflo命令を生成した場合だけでなく、プログラマが mul 命令と mflo 命令を 組み込み関数(intrinsics関数)にて記述した場合にも、コンパイラによる命令スケジューリングが可能になる。ちなみに、組み込み関数(intrinsics関数)とは、コンパイラが直接生成できないような機械命令をC言語のソース中に関数形式で記述する方法である。
【0005】
【発明が解決しようとする課題】
しかしながら、プロセッサに接続された演算装置で演算を行う場合、使用する命令は特別の命令ではなく、プロセッサに接続された演算装置や周辺装置にアクセスするための通常の命令(sw命令やlw命令など)であるため、上述したmul命令やmflo命令等の特別な命令の組合せによるスケジューリング手法では対応できない。
【0006】
例えば、演算装置のレジスタにsw命令で書き込んだ内容で演算を行い、その4サイクル後に、演算装置のレジスタからlw命令で演算結果を読み出せるようにした場合、図28のように記述する。なお、レジスタr2には、すでに演算装置のレジスタのアドレスが格納されているものとする。
【0007】
sw命令とlw命令の両方とも、通常のメモリアクセスに使用する命令であるため、mul 命令や mflo 命令等の特定命令の組み合わせのスケジューリングの規則と同様の規則をコンパイラに予め組み込むことはできない。このため、sw命令やlw命令を実行する場合は、プログラマが スケジューリングを考えてプログラムを記述する必要があった。
【0008】
本発明は、このような点に鑑みてなされたものであり、その目的は、オブジェクトコードの実行性能に優れ、コードサイズも削減可能なコンパイラ、演算処理システム及び演算処理方法を提供することにある。
【0009】
【課題を解決するための手段】
本発明の一態様によれば、ソースプログラムに基づいてオブジェクトコードを生成するコンパイラにおいて、前記ソースプログラム中に記述された、第1のオブジェクトコードを指示する第1の演算指示情報と、第2のオブジェクトコードを指示する第2の演算指示情報と、前記第1および第2のオブジェクトの間に開けるべきサイクル数または命令数とを記述した命令スケジューリング情報を検出する命令検出部と、前記第1および第2のオブジェクトコードの間に、これらオブジェクトコードが使用するハードウェアリソースを使用せずに別のハードウェアリソースを使用するオブジェクトコードを前記サイクル数または命令数分だけ挿入するオブジェクトコード挿入部と、を備え、前記命令スケジューリング情報は、前記第1及び第2の演算指示情報と、これら第1及び第2の演算指示情報に対応するオブジェクトコード間に開けるべきサイクル数または命令数と、を引数とする特定の関数であることを特徴とするコンパイラが提供される。
【0010】
また、本発明の一態様によれば、ソースプログラムに基づいて生成されるオブジェクトコードに従って演算処理を行う演算処理システムにおいて、前記ソースプログラム中に記述された、第1のオブジェクトコードを指示する第1の演算指示情報と、第2のオブジェクトコードを指示する第2の演算指示情報と、前記第1および第2のオブジェクトの間に開けるべきサイクル数または命令数とを記述した命令スケジューリング情報に基づいて、前記第1および第2のオブジェクトコードの間に、これらオブジェクトコードが使用するハードウェアリソースを使用せずに別のハードウェアリソースを使用するオブジェクトコードを前記サイクル数または命令数分だけ挿入したオブジェクトコード群に基づいて演算処理を行う演算処理部を備え、前記命令スケジューリング情報は、前記第1及び第2の演算指示情報と、これら第1及び第2の演算指示情報に対応するオブジェクトコード間に開けるべきサイクル数または命令数と、を引数とする特定の関数であることを特徴とする演算処理システムが提供される。
【0011】
【発明の実施の形態】
以下、本発明に係るコンパイラ、演算処理システム及び演算処理方法について、図面を参照しながら具体的に説明する。
【0012】
図1は本発明に係るコンパイラの一実施形態の概略構成を示すブロック図である。図1のコンパイラは、パーソナルコンピュータ等のコンピュータ機器に読み込まれて実行されるプログラムであり、ユーザから与えられたC言語等で記述されたソースプログラムを、プロセッサが実行可能なオブジェクトコードに変換するものである。なお、コンパイラをハードウェアで実装することも可能である。この場合、プロセッサと同一チップに内蔵させてもよいし、プロセッサとは別チップに実装してもよい。
【0013】
図1のコンパイラは、字句解析部1と、構文解析部2と、中間コード生成部3と、中間コード最適化部4と、コード生成部5と、コード最適化部6と、コード出力部7とを備えている。
【0014】
字句解析部1は、ソースプログラムを意味のある最小単位である字句ごとに分割する。例えば図2のようなC言語のソースプログラムの場合、「void」、「x」、「(」、「)」、「{」、「int」、「a」、「;」、「}」のそれぞれが字句である。
【0015】
構文解析部2は、分割された字句それぞれが、ソースプログラムの言語で定められた文法に従って記述されているか否かをチェックする。この構文解析部2では、関数の各引数の記述に誤りがないか否かのチェックも行う。
【0016】
中間コード生成部3は、アセンブリ言語よりも高水準で、高級言語よりも低水準の言語である中間コードを生成する。中間コード最適化部4は、1+1のような定数同士の演算等の最適化を行う。
【0017】
ソースプログラムから直接オブジェクトコードを生成せずに、いったん中間コードに変換するのは、高級言語が異なっていても中間コードは共通化でき、中間コードを生成してからオブジェクトコードを生成するまでの処理を複数の高級言語で共用できるためである。このため、中間コードの段階で命令の最適化処理を行うようにすれば、個々の高級言語ごとに別個に最適化処理を開発する必要がなくなる。
【0018】
コード生成部5は、構文解析結果に基づいて、オブジェクトコードを生成する。コード最適化部6は、生成されたオブジェクトコードに対して最適化処理を行う。このコード最適化部6は、図1に示すように、命令検出部11と、オブジェクトコード挿入部12とを有する。
【0019】
命令検出部11は、ソースプログラムに後述する特定の関数が含まれているか否かを検出する。オブジェクトコード挿入部12は、検出された特定の関数の引数に基づいて、一部のオブジェクトコードの移動やnopコードの挿入を行って、最終的なオブジェクトコードを生成する。生成されたオブジェクトコードは、コード出力部7から出力される。
【0020】
なお、中間コードを生成せずに、ソースプログラムから直接オブジェクトコードを生成してもよい。この場合のブロック構成は図3のようになり、中間コード生成部3と中間コード最適化部4が不要になる。
【0021】
図4は図1のコンパイラが生成したオブジェクトコードに基づいて演算処理を行うプロセッサシステムの概略構成を示すブロック図である。図示のように、メインの演算処理を行うコアプロセッサ13と、コアプロセッサ13とは別個に演算処理を行うプロセッサ外演算装置14と、コアプロセッサ13及びプロセッサ外演算装置により読み書きが可能なメモリ15とを備えている。
【0022】
以下に、本実施形態のコンパイラの使用方法について説明する。まず、単純な例として、コアプロセッサ13に接続されるプロセッサ外演算装置14のレジスタに、sw命令でデータを書き込んで演算を開始し、プロセッサ外演算装置14のレジスタからlw命令で演算結果を読み出す場合について説明する。ここでは、プロセッサ外演算装置14のレジスタは、コアプロセッサ13のメモリ空間上に固有のアドレスを持っているものとする。
【0023】
例えば、プロセッサ外演算装置14のレジスタ(アドレス0x1000番地)に値を書き込んで、その値を二乗する演算を開始し、演算結果をレジスタ(アドレス0x1000番地)に設定するものとする。これをC言語で記述すると、図5のようなソースプログラムになる。
【0024】
図5のソースプログラムを所定のコアプロセッサ13でコンパイルすると、図6のようなオブジェクトコードが得られる。なお、図6では、オブジェクトコードをアセンブリ言語で表している。
【0025】
図6において、addiu r2, r0, 0x1000では、レジスタr2にレジスタr0+0x1000を入れる。ここで、レジスタr0は常にゼロである。sw r4, 0 (r2)では、レジスタr2のアドレスのメモリ15に、レジスタr4の値(ソースプログラムのpara)を書き込む。lw r2, 0 (r2)では、レジスタr2のアドレスのメモリ15から読み込んだ内容を、レジスタr2に入れる。jr raでは、関数を終了して、呼び出し元に戻る。
【0026】
プロセッサ外演算装置14の演算が 1サイクルで終了する場合は、図6のオブジェクトコードのままで特に問題ないが、例えば、上記の演算に必ず4サイクルかかり、sw命令とlw命令の間を 3サイクル分(1命令の実行サイクル数が1の場合は3命令)空ける必要がある場合は、図7のようにソースプログラム中にnop()を記述する必要がある。
【0027】
図7のnop() は、組み込み関数(intrinsics関数)によるnop命令の記述である。図7のソースプログラムをコンパイルすると、図8に示すように、sw命令とlw命令の間に3つのnop命令が配置される。
【0028】
図8のようなオブジェクトコードを得るには、予めプログラマがコアプロセッサ13の処理スケジューリングを考慮に入れて、図7のようなソースプログラムを記述しなければならず、プログラマの負担が大きい。
【0029】
そこで、本実施形態では、特定の関数形式(例えば、__order)によって命令スケジューリング情報をソースプログラム中に記述し、これにより、コンパイラにスケジューリングを行わせる点に特徴がある。このような特定の関数形式__orderを利用して図7のソースプログラムの書き直すと、図9のようになる。
【0030】
図9のソースプログラムをコンパイルすると、図8と同様のコンパイル結果が得られる。
【0031】
図9に示す__order は、命令のスケジューリングを行うために独自に追加した予約語である。本実施形態では、特定の関数形式として__order を使用しているが、ISO/JIS C 言語規格 で規定されている予約語以外の任意の語句で表すことができる。
【0032】
__order は、関数コールの形式で記述される。より具体的には、__order は3つの引数を持っており、第1引数と第2引数にはスケジューリングの対象となる式が記述され、第3引数には第1引数と第2引数から生成されたオブジェクトコードの間に開けるべき必要なサイクル数が記述される。すなわち、第1引数には第1の演算指示情報が記述され、第2引数には第2の演算指示情報が記述され、第3引数には、第1の演算指示情報に対応するオブジェクトコードと第2の演算指示情報に対応するオブジェクトコードとの間に開けるべきサイクル数が記述される。
【0033】
図9のソースプログラムをコンパイルして得られる図8のオブジェクトコードは、sw命令とlw命令の間に配置されたnop命令を有するが、このnop命令はコンパイラが自動的に挿入する。このため、プログラマが予めソースプログラムにnop命令を記述する必要がなくなり、プログラムの開発負担を軽減できる。
【0034】
また、ソースプログラム中の__order文の近くに、他の命令文が存在する場合は、sw命令とlw命令とは無関係で、移動可能なnop命令以外の命令を sw命令とlw命令の間に挿入する。これにより、生成されたオブジェクトコードの実行性能の向上とコードサイズの削減が図れる。
【0035】
このように、ソースプログラム中に__order文があると、その第1引数に対応するオブジェクトコードと第2引数に対応するオブジェクトコードとの間に、これらオブジェクトコードとは無関係なオブジェクトコードが第3引数で指定されるサイクル数だけ挿入される。一例を具体的に説明すれば、第1引数に対応するオブジェクトコードと第2引数に対応するオブジェクトコードとの間に、これらオブジェクトコードが使用するハードウェアリソースを使用せずに別のハードウェアリソースを使用する他のオブジェクトコードが第3引数で指定されるサイクル数だけ挿入される。
【0036】
図10は__order文の近くに他の命令文ary[x][y] = retが存在する場合のソースプログラムの一例を示している。図10のソースプログラムは、配列ary[x][y]に演算結果を入れるものである。このソースプログラムをコンパイルし、sw命令と lw命令の間にnop命令を挿入すると、コンパイル結果を示すオブジェクトコードは図11のようになる。
【0037】
図11において、ary[x][y] = retのコンパイル結果は、lw r7,0(r2)、sll r4,r6,2、sll r8,r5,4、addiu r3,gp,sdaoff(_ary)、addu r2,r3,r8、addu r2,r2,r4である。lw r7,0(r2)では、レジスタr2のアドレスのメモリ15から読み込んだ内容をレジスタr7に入れる。sll r4,r6,2では、図10のソースプログラム中のyを記憶しているレジスタr6を左に2ビットシフトして、レジスタr4に入れる。すなわち、yを4倍する。sll r8,r5,4では、ソースプログラム中のxを記憶しているレジスタr5を左に4ビットシフトして、レジスタr8に入れる。すなわち、xを16倍する。addiu r3,gp,sdaoff(_ary)では、レジスタgpとsdaoff(_ary)を加算して、_aryの先頭アドレスをレジスタr3に入れる。addu r2,r3,r8では、レジスタr3とr8を加算して、レジスタr2に入れる。これにより、ary[x][0]のアドレスが計算される。addu r2,r2,r4では、レジスタr2とr4を加算して、レジスタr2に入れる。これにより、ary[x][y]のアドレスが計算される。
【0038】
これら命令列のうち、sll r4,r6,2やsll r8,r5,4は、lw r7,0(r2)の演算処理とは無関係に実行可能である。そこで、本実施形態のコンパイラは、図11のオブジェクトコードの一部の命令列の順序を入れ替えて、図12のようなオブジェクトコードを生成する。図12では、sw r4,0(r2)とlw r7,0(r2)との間に、sll r4,r6,2、sll r8,r5,4及びaddiu r3,gp,sdaoff(_ary)を配置する。
【0039】
図11のオブジェクトコードは14命令で構成されるのに対し、図12のオブジェクトコードは11命令で構成されている。
【0040】
このように、本実施形態のコンパイラは、__orderの近くに、無関係な命令文が存在する場合には、この無関係な命令をnop命令の代わりに挿入するため、生成されるオブジェクトコードの実行性能が向上し、かつ命令数も削減できるため、コードサイズを減少させることができる。
【0041】
これに対して、プログラマがC言語等のソースプログラムの中で命令スケジューリングを行う場合、図13のようにソースプログラムの記述を修正する必要がある。図13では、*p=paraでメモリ15にparaを入力した後に、ap=&ary[x][y]を挿入して、ary[x][y]のアドレスを求めてapに入れる処理を行っている。
【0042】
図13のように、プログラマ自身でソースプログラムの記述を修正すると、プログラマの負担が大きくなる。また、ソースプログラム上でスケジューリングを行っても、コンパイラの最適化処理により、期待した通りのオブジェクトコードが生成されない場合もある。
【0043】
本実施形態では、プログラマがソースプログラムを修正するのではなく、プログラマはコンパイラに命令のスケジューリング情報を与えるだけである。このスケジューリング情報に基づいて、コンパイラは無関係で移動可能な命令を見つけて、指定された2つの演算命令中に挿入する。また、コンパイラは、無関係で移動可能な命令が必要サイクル分見つからない場合のみ、nopを挿入する。
【0044】
図1のコンパイラは、ソースプログラム中に上述した特定の関数__orderを見つけると、以下のような処理を行う。字句解析部1は、__orderを予約語として認識する。構文解析部2はまず、__orderの各引数の記述内容をチェックし、第1及び第2引数が意味のある式であるか否かをチェックする。例えば、__order(1, 2, 3)のように第1及び第2引数に定数が記述されている場合、スケジューリングすべき命令が生成されないので、エラーとする。また、第3引数が正の整数型定数であるか否かをチェックする。第3引数に定数以外の変数などを記述した場合、コンパイル時にはその値がわからないので、エラーとする。
【0045】
中間コードを生成する場合は、第1及び第2引数の式から生成される通常の中間コードと、この中間コードの前後に__orderで記述されたことを示す目印となる中間コードと、__orderの第3引数で指定された値を示す中間コードとが中間コード生成部3にて生成される。
【0046】
コード生成部5は、__orderの第1及び第2引数に基づいてオブジェクトコードを生成する。__orderで付加されたことを示す目印となる中間コードと第3引数の値を示す中間コードはオブジェクトコードには変換されないが、第1及び第2引数に基づいて生成されたオブジェクトコードに関連するデータとして記憶される。
【0047】
コード最適化部6は、__orderで付加されたことを示す目印と第3引数に基づいて、命令のスケジューリングを行う。
【0048】
図14はコード最適化部6の処理手順を示すフローチャートである。まず、__orderの第1引数から生成されたオブジェクトコードで定義されたリソース(例えば、レジスタやメモリ15など)d1と、演算に使用するリソースu1とを求める(ステップS1)。例えば、図12では、第1引数から生成されたオブジェクトコードは sw r4,0(r2) で、この命令の定義するリソース d1はメモリ15で、使用するリソース u1は r4,r2である。
【0049】
__orderの第1引数から生成されたオブジェクトコードの直前に配置された命令を別の場所に移動可能か否かを調べる(ステップS2)。分岐命令等の移動不可能な命令の場合は、__orderの前方からの移動は不可能なので、第2引数から生成されたオブジェクトコードの後方からの命令移動の処理に移る。
【0050】
直前の命令が移動可能である場合、この命令が定義するリソース d2と使用するリソース u2 を求める(ステップS3)。図12の場合、直前の命令は addiu r2,r0,0x10000 で、この命令の定義するリソース d2はr2で、使用するリソースはなしである。r0は常に0のレジスタで、0x10000は定数のオペランドなので、リソースに含めない。
【0051】
次に、直前の命令に関するリソースd2,u2が、第1引数から生成されたオブジェクトコードのリソースd1,u1と衝突するか否かを調べる(ステップS4)。リソースが衝突しない場合は移動可能と判断する。
【0052】
ここで、リソースが衝突していないという条件は、d1 と u1 の論理和と d2 の論理積が空であり((d1|u1) & d2)、かつ、d1 と u2 の論理(d1 & u2)積が空である場合である。図12の場合、リソースu1とd2がともにr2であり、リソースが衝突するため、移動ができない。
【0053】
移動可能であると判断されると、直前の命令を、第1引数から生成されたオブジェクトコードと第2引数から生成されたオブジェクトコードの間に移動させる(ステップS5)。この命令の移動によって、指定したサイクル数分の命令を移動させた場合は、スケジューリングは終了である。まだ、第3引数で指定した指定したサイクル数分の命令を移動していない場合は、更に前方の命令が移動できるかを調べる(ステップS6)。
【0054】
ステップS4でリソースが衝突すると判断されると、移動不可能と判断して(ステップS7)、リソースの集合を論理和でまとめる(ステップS8)。定義するリソースはd1 にまとめ (d1 = d1 | d2)、使用するリソース はu1 にまとめる (u1 = u1 | u2)。これにより、リソース d1,u1が移動される間にある命令のリソースとなるので、次の直前の命令が移動可能かどうかを調べる場合にも、d1,u1 だけを調べるだけでよい。
【0055】
図12でのリソースをまとめた結果、定義するリソースd1はレジスタr2とメモリ15、使用するリソースu1は レジスタr4,r2である。ステップS8の処理が終了すると、ステップS2以降の処理を行う。
【0056】
一方、第1引数から生成されたオブジェクトコードの前方の命令だけでは、指定したサイクル数分の命令が挿入できなかった場合、あるいは、__orderの第1引数から生成されたオブジェクトコードの直前に配置された命令を別の場所に移動できないと判断された場合は、第2引数から生成されたオブジェクトコードの後方の命令についてもスケジューリングの対象とする。例えば、図12の場合、addiu命令の直前の命令は存在しないので、第2引数から生成されたオブジェクトコード群の後方の命令についてスケジューリングの対象とする。
【0057】
まず、第2引数から生成されたオブジェクトコードが定義するリソースd3と使用するリソースu3 を求める(ステップS9)。図12では、第2引数から生成されたオブジェクトコードは lw r7,0(r2)であるので、定義するリソース d3は レジスタr7,使用するリソース u3 はレジスタr2となる。第2引数から生成されたオブジェクトコードの直後の命令が移動可能か否かを調べる(ステップS10)。
【0058】
分岐命令など移動不可能な命令の場合は、もう移動できる命令がないので、第3引数で指定したサイクル数分に足らない分だけnop命令を挿入し(ステップS11,S12)、このスケジューリングを終了する。
【0059】
直後の命令が移動可能である場合、この命令の定義するリソース d4 と使用するリソース u4 を求める(ステップS13)。図12では、では、直後の命令は sll r4,r6,2 で、定義するリソース d4 は r4、使用するリソース u4は r6、メモリ15である。
【0060】
次に、直前の命令に関するリソースd4,u4が、第1引数から生成されたオブジェクトコードのリソースd3,u3と衝突するか否かを調べる(ステップS14)。リソースが衝突しない場合は移動可能と判断する。
【0061】
ここで、リソースが衝突していないという条件は、d3 と u3 の論理和と d4 の論理積が空であり((d3|u3) & d4)、かつ、d3 と u4 の論理積(d3 & u4)が空である場合である。図12では、lw r7,0(r2)とsll r4,r6,2に衝突するリソースはないので、sll r4,r6,2は移動可能である。
【0062】
移動可能であると判断されると、直前の命令を、第1引数から生成されたオブジェクトコードと第2引数から生成されたオブジェクトコードの間に移動させる(ステップS15)。この命令の移動によって、指定したサイクル数分の命令を移動させた場合は、スケジューリングは終了である。まだ、第3引数で指定した指定したサイクル数分の命令を移動していない場合は、更に前方の命令が移動できるかを調べる(ステップS16)。
【0063】
ステップS14でリソースが衝突すると判断されると、移動不可能と判断して(ステップS17)、リソースの調停処理を行った後(ステップS18)、ステップS10以降の処理を行う。
【0064】
図14のフローチャートでは、第1引数の前から移動させる方を先に行ったが、第2引数の後ろから移動させる方を先に行った場合でも、同様の最適化処理が可能である。
【0065】
なお、第3引数のサイクル数の定義は、第1引数から生成されたオブジェクトコード群の最後から 第2引数から生成されたオブジェクトコード群の先頭までに必要なサイクル数とするのが普通である。しかし、このスケジューリング機能の外部仕様として、第1引数から生成されたオブジェクトコード群の最後から 第2引数から生成されたオブジェクトコード群の最後までに必要なサイクル数と定義することもまた可能である。これは、双方の最後の命令がスケジューリング対象の命令となっていると仮定して、サイクル数をカウントしている。
【0066】
また、コンパイル時に 命令のサイクル数の見積が困難な場合は、第3引数をサイクル数から命令数にしてもよい。
【0067】
図14のフローチャートの処理手順をコンパイラに実装することによって、__order で指定した命令形式の命令スケジューリングを行うことが可能となる。
【0068】
このように、第1の実施形態では、特定の関数に基づいて、リソースが衝突しないように命令の順序を入れ替えるため、nop命令を入れる必要がなくなり、オブジェクトコードの実行性能の向上が図れる。また、オブジェクトコードのサイズも削減できる。
【0069】
(第2の実施形態)
第1の実施形態では、ソースプログラムに記述された特定の関数(例えば、__order)に基づいて命令スケジューリングを行う例を説明したが、別の記述方法で命令スケジューリングを行うことも可能である。
【0070】
#pragma は、ISO/JISC言語規格に規定されている前処理指令の一つであり、処理系によって独自の拡張が許されている。本実施形態では、#pragma の後に order を付加した #pragma order を用いて 命令スケジューリングの指定を行う。
【0071】
図9のソースプログラムを #pragma order を用いて書き直すと、図15のようになる。
【0072】
「#pragma order {」と「#pragma order 3」によって挟まれた式が前半の式で、「#pragma order 3」と「#pragma }」によって挟まれた式が後半の式である。その間の「#pragma order 3」で示された3の定数値が、前半の式と後半の式の間に挿入すべきサイクル数の指定である。4サイクル必要な場合は、「#pragma order 4」と記載される。
【0073】
第1及び第2の実施形態からわかるように、ソースプログラム中に記述する必要がある付加情報は、スケジューリングすべき第1及び第2の演算指示情報とその間に挿入すべき実行サイクル数である。これらの情報をどのような形態で実現するかは特に問わない。
【0074】
図1のコンパイラは、ソースプログラム中の#pragma orderを以下の手順で処理する。
【0075】
字句解析部1は、字句分割を行って、#pragma order文を見つける。構文解析部2は、#pragma order文の記述内容を調べる。まず、{ ,定数,} の順で並んでいるかをチェックする。#pragma order文の先頭部分が「#pragma order {」と記述されていない場合や、{,定数,}の途中で 関数の定義が終了した場合などは、エラーである。また、#pragma order を関数定義中以外で使用した場合もエラーである。定数は、正の整数型定数であるか否かをチェックする。
【0076】
#pragma order文で挟まれた 前半と後半の二つの式についても、構文解析部2でチェック可能であれば、#pragma orderに特有のチェックを行う。しかし、コンパイラの実装上、構文解析部2で式の内容がチェックできない場合などは、後段側のコード生成部5などでチェックを行ってもよい。チェックすべき項目は、スケジューリングすべき意味がある式が記述されているかどうかである。前半、後半の式が記述されていなかったり、意味がないため生成されるオブジェクトコードがないような式を記述した場合は、エラーとなる。
【0077】
#pragma orderから生成される中間コードは、#pragma orderの前方の式から生成される中間コードと後方の式から生成される中間コードとの間に付加される。#pragma orderから生成される中間コードは、#pragma orderの前方と後方の式から生成されたことを示すための目印と挿入すべきサイクル数を示す値とを意味する。
【0078】
中間コードを生成した段階では、第1の実施形態と同じコードになる。このため、以下のコード生成部5、コード最適化部6の構成は第1の実施形態と同じである。
【0079】
このように、第2の実施形態では、C言語等の高級言語で規定されている前処理指令を用いて、オブジェクトコード間のサイクル数を指定するため、第1の実施形態のような関数形式で記述するのと同様に、オブジェクトコードの実行性能の向上とオブジェクトコードサイズの削減が図れる。
【0080】
(第3の実施形態)
第3の実施形態は、図4で示したプロセッサ外演算装置として、コプロセッサを用いたものである。
【0081】
図16はコアプロセッサ13にコプロセッサ16とメモリ15が接続されているプロセッサシステムの一例を示すブロック図である。
【0082】
図16のコプロセッサ16のレジスタにアクセスするための命令は、メモリ15にアクセスするためのロード命令やストア命令とは異なる。このため、コンパイラが自動的に命令スケジューリングができる可能性もあるが、コプロセッサ16の演算の種類によって、演算サイクルが異なる場合には、コンパイラが自動的にスケジューリングするのは一般には困難である。
【0083】
本実施形態は、このような場合でも、プログラマがコプロセッサ16の演算の種類に応じたサイクル数を予めソースプログラム中に指定することにより、コンパイラが最適な命令スケジューリングを行うことができる。
【0084】
図17のソースプログラムは、コプロセッサ16のレジスタの書き込みにCTC2命令を用い、コプロセッサ16の演算の実行にCOP2命令を用い、コプロセッサ16のレジスタの読込みにCFC2命令を用い、組み込み関数(intrinsics関数)を用いてC言語で記述した従来の記述例である。
【0085】
図17のソースプログラムでは、コプロセッサ16のレジスタ2に演算パラメータを設定し、cop2命令で設定されるパラメータ(function number)が1で演算を開始し、より具体的には例えば、コプロセッサ16のレジスタ2から値を読み込んで、その値を二乗する演算を行い、その演算結果を4サイクル後にコプロセッサ16のレジスタ1へ書き込む。図17の場合、コプロセッサ16の演算に時間がかかるため、3つのnop命令を挿入する必要がある。
【0086】
この例を __order を用いて記述すると、図18のようになる。
【0087】
図18のソースプログラムをコンパイルすると、図19のようなオブジェクトコードが生成される。
【0088】
図19の例では、挿入すべき無関係な命令がないため、4つのnop命令が挿入されている。
【0089】
次に無関係な命令を入れた場合の例を挙げる。図20は、配列ary[x][y]に演算結果を入れるプログラムを示している。
【0090】
図20のコンパイル結果は、図21のようになる。図20のary[x][y]=retは、図21の5つの命令sll r4,r6,2、sll r8,r5,4、addiu r3,gp,sdaoff(_ary)、addu r2,r3,r8、addu r2,r2,r4に相当し、そのうちの前者3つがcop2(1)とcfc2 r7,1の間に挿入される。
【0091】
これにより、図19のようにnop命令を挿入する必要がなくなり、生成されるオブジェクトコードの実行性能が向上し、nop命令が減る分、コードサイズも削減できる。
【0092】
このように、第3の実施形態では、コプロセッサ16に対して演算を行わせるためのオブジェクトコードを生成する場合でも、オブジェクトコードの実行性能の向上とオブジェクトコードサイズの削減が図れる。
【0093】
(第4の実施形態)
あるアプリケーション・プログラムで、非常によく利用される関数、すなわちプログラム全体の実行時間に占める割合が大きい関数を、コアプロセッサ13の通常命令による演算からハードウェアでの演算に置き換えることにより、アプリケーション・プログラムの全体の性能向上を図ることができる。
【0094】
図22はソースプログラムの一例であり、このプログラム中で、mul255が非常によく利用される関数であると仮定する。この場合、関数mul255をハードウェア化したプロセッサ外演算装置をコアプロセッサ13に接続する。この演算装置で関数mul255の演算処理を実行する場合の外部仕様を以下のように定める。
【0095】
関数mul255の引数a を設定するレジスタのアドレスが 0x1000 番地、引数 b を設定するレジスタのアドレスが 0x1004番地、演算結果を受け取るレジスタのアドレスが 0x1000番地とする。
【0096】
プロセッサ外演算装置は、0x1000番地のレジスタに値が書き込まれた場合、既に0x1004番地のレジスタに設定してある内容と0x1000番地のレジスタに書き込まれた内容とを乗算し、この乗算結果が255以下の場合はその値のまま、256以上の場合は255 を0x1000番地のレジスタに設定する。演算にかかるサイクル数は、0x1000番地のレジスタに書き込んでから、0x1000番地のレジスタから演算結果を受け取るまで、4サイクル必要とする。
【0097】
プログラマは、このような演算装置の仕様に従って関数mul255の記述を変更する必要がある。__orderを用いて関数mul255を記述すると、図23のようになる。
【0098】
ところが、図23のように関数の内部をレジスタのアクセスに変更しただけでは、__orderの前後に無関係な命令が存在しないため、nop命令が挿入される可能性が高い。図23のソースプログラム をコンパイルすると図24のようになり、nop命令が挿入され、実行性能が落ち、かつコードサイズも増大する。
【0099】
nop命令の挿入を避けるためには、記述を変更した関数mul255をインライン関数として宣言する必要がある。インライン関数にすると、関数コールでなく、関数を呼び出した場所に関数の中身が展開される。このようにすると、展開の前後に無関係な命令が存在する可能性が高くなり、その結果、__orderでnop命令が挿入される可能性が低くなる。なお、インライン関数は、C言語では ISO/IEC 9899:1999 で追加された機能で、以前の仕様 ISO/IEC 9899:1990 には存在していない。
【0100】
上述した関数mul255 をインライン関数として記述すると、図25のようになり、関数mul255の先頭に インライン関数の目印であるinline が追加されている。
【0101】
上記の例のインライン関数を図22の関数testに適用した場合のコンパイル結果は、図26のようになる。sw r2,0(r5)とlw r1,0(r5)との間に無関係な3命令sll r3,r2,3、addiu r6,gp,sdaoff(_ary)、addu r3,r6,r3が挿入され、また、sw r2,0(r5)とlw r1,0(r5)の間にも無関係な3命令sll r3,r2,3、addiu r6,gp,sdaoff(_ary+4)、addu r3,r6,r3が挿入されている。これにより、nop命令を挿入する必要がなくなる。
【0102】
このように、第4の実施形態では、コアプロセッサ13とは別の演算装置(プロセッサ外演算装置14)を制御する関数をinline関数として指定することにより、展開される周囲に無関係な命令が存在する可能性が高くなり、第1〜第3の実施形態と同様に、オブジェクトコードの実行性能の向上とオブジェクトコードサイズの削減が図れる。
【0103】
【発明の効果】
以上詳細に説明したように、本発明によれば、特定の関数に基づいて、リソースが衝突しないように命令の順序を入れ替えるため、nop命令を入れる必要がなくなり、オブジェクトコードの実行性能の向上が図れる。また、オブジェクトコードのサイズも削減できる。
【図面の簡単な説明】
【図1】本発明に係るコンパイラの一実施形態の概略構成を示すブロック図。
【図2】C言語のソースプログラムの一例を示す図。
【図3】中間コードを生成しないコンパイラの一実施形態の概略構成を示すブロック図。
【図4】図1のコンパイラが生成したオブジェクトコードに基づいて演算処理を行うプロセッサシステムの概略構成を示すブロック図。
【図5】C言語のソースプログラムの一例を示す図。
【図6】図5に対応するオブジェクトコードを示す図。
【図7】図5のソースプログラム中にnop()を追加した例を示す図。
【図8】図7に対応するオブジェクトコードを示す図。
【図9】図7のソースプログラムを__orderを用いて書き直したソースプログラムを示す図。
【図10】 __order文の近くに他の命令文ary[x][y] = retが存在する場合のソースプログラムの一例を示す図。
【図11】図10のソースプログラムのコンパイル結果を示すオブジェクトコードを示す図。
【図12】図11のオブジェクトコードの一部の命令列の順序を入れ替えた図。
【図13】プログラマがソースプログラムの記述を修正した例を示す図。
【図14】コード最適化部6の処理手順を示すフローチャート。
【図15】図9のソースプログラムを #pragma order を用いて書き直した図。
【図16】コアプロセッサ13にコプロセッサ16とメモリ15が接続されているプロセッサシステムの一例を示すブロック図。
【図17】コプロセッサに演算をさせる場合のソースプログラムの一例を示す図。
【図18】図17のソースプログラムを__orderを用いて書き直した例を示す図。
【図19】図18のソースプログラムをコンパイルしたオブジェクトコードを示す図。
【図20】配列ary[x][y]に演算結果を入れるプログラムを示す図。
【図21】図20のコンパイル結果を示す図。
【図22】関数mul255が記述されたソースプログラムの一例を示す図。
【図23】 __orderを用いて関数mul255を記述した例を示す図。
【図24】図23のソースプログラムのコンパイル結果を示す図。
【図25】関数mul255 をインライン関数として記述した例を示す図。
【図26】図25のインライン関数のコンパイル結果を示す図。
【図27】 mul命令とmflo命令の間に無関係な命令を3命令を入れたオブジェクトコードの一例を示す図。
【図28】 sw命令とlw命令の間に3つのnop命令を入れたオブジェクトコードの一例を示す図。
【符号の説明】
1 字句解析部
2 構文解析部
3 中間コード生成部
4 中間コード最適化部
5 コード生成部
6 コード最適化部
7 コード出力部
11 命令検出部
12 オブジェクトコード挿入部
Claims (16)
- ソースプログラムに基づいてオブジェクトコードを生成するコンパイラにおいて、
前記ソースプログラム中に記述された、第1のオブジェクトコードを指示する第1の演算指示情報と、第2のオブジェクトコードを指示する第2の演算指示情報と、前記第1および第2のオブジェクトの間に開けるべきサイクル数または命令数とを記述した命令スケジューリング情報を検出する命令検出部と、
前記第1および第2のオブジェクトコードの間に、これらオブジェクトコードが使用するハードウェアリソースを使用せずに別のハードウェアリソースを使用するオブジェクトコードを前記サイクル数または命令数分だけ挿入するオブジェクトコード挿入部と、を備え、
前記命令スケジューリング情報は、前記第1及び第2の演算指示情報と、これら第1及び第2の演算指示情報に対応するオブジェクトコード間に開けるべきサイクル数または命令数と、を引数とする特定の関数であることを特徴とするコンパイラ。 - 前記オブジェクトコード挿入部は、前記第1の演算指示情報に対応するオブジェクトコードと前記第2の演算指示情報に対応するオブジェクトコードとの間に、これらオブジェクトコードが使用するハードウェアリソースを使用せずに別のハードウェアリソースを使用する他のオブジェクトコードを前記サイクル数または命令数分だけ挿入することを特徴とする請求項1に記載のコンパイラ。
- 前記ハードウェアリソースは、演算レジスタ及びメモリの少なくとも一方であることを特徴とする請求項1または2に記載のコンパイラ。
- 前記第1の演算指示情報に対応するオブジェクトコードの直前に実行される予定のオブジェクトコードを他のコード位置に移動可能か否かを判定する第1移動判定部と、
前記第1移動判定部により移動可能と判定されたオブジェクトコードが使用するハードウェアリソースが前記第1の演算指示情報に対応するオブジェクトコードが使用するハードウェアリソースと衝突するか否かを判定する第1リソース判定部と、を備え、
前記オブジェクトコード挿入部は、前記第1リソース判定部により衝突しないと判定されたオブジェクトコードを、前記第1の演算指示情報に対応するオブジェクトコードと前記第2の演算指示情報に対応するオブジェクトコードとの間に移動させることを特徴とする請求項2または3に記載のコンパイラ。 - 前記第2の演算指示情報に対応するオブジェクトコードの直後に実行される予定のオブジェクトコードを他のコード位置に移動可能な否かを判定する第2移動判定部と、
前記第2移動判定部により移動可能と判定されたオブジェクトコードが使用するハードウェアリソースが前記第2の演算指示情報に対応するオブジェクトコードが使用するハードウェアリソースと衝突するか否かを判定する第2リソース判定部と、を備え、
前記オブジェクトコード挿入部は、前記第2リソース判定部により衝突しないと判定されたオブジェクトコードを、前記第1の演算指示情報に対応するオブジェクトコードと前記第2の演算指示情報に対応するオブジェクトコードとの間に移動させることを特徴とする請求項2乃至4のいずれかに記載のコンパイラ。 - 前記オブジェクトコード挿入部は、移動可能な他のオブジェクトコードが存在しない場合は、前記第1の演算指示情報に対応するオブジェクトコードと前記第2の演算指示情報に対応するオブジェクトコードとの間にnopコードを挿入することを特徴とすることを特徴とする請求項1乃至5のいずれかに記載のコンパイラ。
- 前記特定の関数は、ソースプログラムの記述言語に新たに追加された予約語であることを特徴とする請求項1乃至6のいずれかに記載のコンパイラ。
- 前記特定の関数は、ISO/JISのC言語の規格で規定されている予約語以外の語句で構成されることを特徴とする請求項7に記載のコンパイラ。
- 前記命令スケジューリング情報は、前記第1及び第2の演算指示情報と、これら第1及び第2の演算指示情報に対応するオブジェクトコード間に開けるべきサイクル数または命令数と、を記述したISO/JISのC言語の規格で規定されている前処理指令であることを特徴とする請求項1乃至5のいずれかに記載のコンパイラ。
- 前記命令スケジューリング情報は、C言語のISO/IEC 9899:1999 で規定されているinline関数として宣言される関数中に含まれ、
前記オブジェクトコード挿入部は、前記第1の演算指示情報に対応するオブジェクトコードと前記第2の演算指示情報に対応するオブジェクトコードとの間に、ソースプログラム中に展開される前記命令スケジューリング情報の前後に位置する命令に対応するオブジェクトコードを挿入することを特徴とする請求項1乃至6のいずれかに記載のコンパイラ。 - 前記第1及び第2の演算指示情報は、プロセッサとは別個に設けられる演算装置が実行する演算指示情報であることを特徴とする請求項1乃至10のいずれかに記載のコンパイラ。
- 前記演算装置は、プロセッサに付属するコプロセッサであることを特徴とする請求項11に記載のコンパイラ。
- ソースプログラムに基づいて生成されるオブジェクトコードに従って演算処理を行う演算処理システムにおいて、
前記ソースプログラム中に記述された、第1のオブジェクトコードを指示する第1の演算指示情報と、第2のオブジェクトコードを指示する第2の演算指示情報と、前記第1および第2のオブジェクトの間に開けるべきサイクル数または命令数とを記述した命令スケジューリング情報に基づいて、前記第1および第2のオブジェクトコードの間に、これらオブジェクトコードが使用するハードウェアリソースを使用せずに別のハードウェアリソースを使用するオブジェクトコードを前記サイクル数または命令数分だけ挿入したオブジェクトコード群に基づいて演算処理を行う演算処理部を備え、
前記命令スケジューリング情報は、前記第1及び第2の演算指示情報と、これら第1及び第2の演算指示情報に対応するオブジェクトコード間に開けるべきサイクル数または命令数と、を引数とする特定の関数であることを特徴とする演算処理システム。 - プロセッサと、
このプロセッサとは別個に設けられる演算装置と、を備え、
前記演算処理部は、前記演算装置に内蔵されることを特徴とする請求項13に記載の演算処理システム。 - 前記演算装置は、プロセッサに接続されるコプロセッサであることを特徴とする請求項14に記載の演算処理システム。
- ソースプログラムに基づいてオブジェクトコードを生成する演算処理方法において、
前記ソースプログラム中に記述された、第1のオブジェクトコードを指示する第1の演算指示情報と、第2のオブジェクトコードを指示する第2の演算指示情報と、前記第1および第2のオブジェクトの間に開けるべきサイクル数または命令数とを記述した命令スケジューリング情報を命令検出部により検出するステップと、
前記第1および第2のオブジェクトコードの間に、これらオブジェクトコードが使用するハードウェアリソースを使用せずに別のハードウェアリソースを使用するオブジェクトコードを前記サイクル数または命令数分だけオブジェクトコード挿入部により挿入するステップと、を備え、
前記命令スケジューリング情報は、前記第1及び第2の演算指示情報と、これら第1及び第2の演算指示情報に対応するオブジェクトコード間に開けるべきサイクル数または命令数と、を引数とする特定の関数であることを特徴とする演算処理方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002190818A JP3840149B2 (ja) | 2002-06-28 | 2002-06-28 | コンパイラ、演算処理システム及び演算処理方法 |
US10/229,015 US6973645B2 (en) | 2002-06-28 | 2002-08-28 | Compiler, operation processing system and operation processing method |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002190818A JP3840149B2 (ja) | 2002-06-28 | 2002-06-28 | コンパイラ、演算処理システム及び演算処理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2004038279A JP2004038279A (ja) | 2004-02-05 |
JP3840149B2 true JP3840149B2 (ja) | 2006-11-01 |
Family
ID=29774343
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002190818A Expired - Fee Related JP3840149B2 (ja) | 2002-06-28 | 2002-06-28 | コンパイラ、演算処理システム及び演算処理方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US6973645B2 (ja) |
JP (1) | JP3840149B2 (ja) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8233893B2 (en) * | 2002-08-22 | 2012-07-31 | Hewlett-Packard Development Company, L.P. | Mobile handset update package generator that employs nodes technique |
DE102004017050A1 (de) | 2004-04-07 | 2005-10-27 | Robert Bosch Gmbh | Datenkonsistenz in Datenverarbeitungsanlagen |
US7530059B2 (en) * | 2005-02-18 | 2009-05-05 | International Business Machines Corporation | Method for inlining native functions into compiled java code |
JP2006243838A (ja) * | 2005-02-28 | 2006-09-14 | Toshiba Corp | プログラム開発装置 |
JP2009169862A (ja) * | 2008-01-18 | 2009-07-30 | Panasonic Corp | プログラム変換装置、方法、プログラムおよび記録媒体 |
JP2011141676A (ja) * | 2010-01-06 | 2011-07-21 | Toshiba Corp | 言語処理装置、言語処理方法およびコンピュータプログラムプロダクト |
US20140189249A1 (en) * | 2012-12-28 | 2014-07-03 | Futurewei Technologies, Inc. | Software and Hardware Coordinated Prefetch |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5193180A (en) * | 1991-06-21 | 1993-03-09 | Pure Software Inc. | System for modifying relocatable object code files to monitor accesses to dynamically allocated memory |
-
2002
- 2002-06-28 JP JP2002190818A patent/JP3840149B2/ja not_active Expired - Fee Related
- 2002-08-28 US US10/229,015 patent/US6973645B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2004038279A (ja) | 2004-02-05 |
US20040003379A1 (en) | 2004-01-01 |
US6973645B2 (en) | 2005-12-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6289505B1 (en) | Method, apparatus and computer programmed product for binary re-optimization using a high level language compiler | |
US6078744A (en) | Method and apparatus for improving compiler performance during subsequent compilations of a source program | |
US6311324B1 (en) | Software profiler which has the ability to display performance data on a computer screen | |
JP4844971B2 (ja) | インタープリタの最適化をプログラム・コード変換の間に実行する方法及び装置 | |
EP0806725B1 (en) | Method and apparatus for early insertion of assembler code for optimization | |
US20100095286A1 (en) | Register reduction and liveness analysis techniques for program code | |
JPH05257709A (ja) | 並列化判別方法およびそれを用いた並列化支援方法 | |
US20060200796A1 (en) | Program development apparatus, method for developing a program, and a computer program product for executing an application for a program development apparatus | |
US6041181A (en) | Method of, system for, and computer program product for providing quick fusion in WHERE constructs | |
Hong et al. | Improving simd parallelism via dynamic binary translation | |
JP3840149B2 (ja) | コンパイラ、演算処理システム及び演算処理方法 | |
US20010044930A1 (en) | Loop optimization method and a compiler | |
US7111274B1 (en) | Scheduling hardware generated by high level language compilation to preserve functionality of source code design implementations | |
JP4462676B2 (ja) | プログラム変換装置、コンパイラ装置およびプログラム変換プログラムを記録したコンピュータ読み取り可能な記録媒体 | |
El-Shobaky et al. | Automatic vectorization using dynamic compilation and tree pattern matching technique in Jikes RVM | |
Fauth et al. | Global code selection for directed acyclic graphs | |
JPH10320212A (ja) | キャッシュ向け最適化方法 | |
EP1369777A2 (en) | Software development system, simulator, and recording medium | |
Nilsson | Porting GCC for dunces | |
Rohde et al. | Improving HLS generated accelerators through relaxed memory access scheduling | |
JP3551352B2 (ja) | ループ分割方法 | |
Rupf | Automatic Inference of Stream Semantic Registers in LLVM | |
Dragos | Optimizing Higher-Order Functions in Scala | |
JP2003131888A (ja) | 手続き間命令スケジューリング方法 | |
JP3018783B2 (ja) | コンパイル方式 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20051115 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20051118 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20060117 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20060324 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20060524 |
|
A911 | Transfer to examiner for re-examination before appeal (zenchi) |
Free format text: JAPANESE INTERMEDIATE CODE: A911 Effective date: 20060703 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20060718 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20060804 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090811 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100811 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100811 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110811 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110811 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120811 Year of fee payment: 6 |
|
LAPS | Cancellation because of no payment of annual fees |