(57)【特許請求の範囲】
【請求項１】
第１のレシスタ中に文字列の１部分を記憶し、
該第１のレジスタ中の存在場所を指摘する開始場所を指定し、
プロセッサーで命令を受け取り、
該命令に応えて次の処置を単一命令中で実行し、すなわち、
上記開始場所と同一場所またはそれより後の場所で上記第１のレジスタ中に記憶されている複数の文字と上記特定の文字とを同時に比較し、
その特定文字が発見されたら、該特定文字の存在場所を示すアドレスを１のレジスタ中に保存し、
その特定文字が発見されなければ、上記文字列の調べ終わった部分のすぐ次の文字列中の文字を指摘するアドレスを第２のレジスタに保存する、
というステップを有することを特徴とするプロセッサーにアクセスできるメモリー中に記憶された可変長文字列中にある特定の文字を発見する方法。
【請求項２】
特定の文字が発見されたか否かをプロセッサーが表示するステップをさらに有することを特徴とする請求項１に記載の方法。
【請求項３】
特定の文字が発見されたか否かの表示が条件コードをセットするステップも含むことを特徴とする請求項２に記載の方法。
【請求項４】
特定の文字が予め定められた固定値であることを特徴とする請求項１に記載の方法。
【請求項５】
特定の文字が動的値であることを特徴とする請求項１に記載の方法。
【請求項６】
特定の文字が空文字であることを特徴とする請求項１に記載の方法。
【請求項７】
特定の文字が１バイト長であることを特徴とする請求項１に記載の方法。
【請求項８】
特定の文字が２バイト長以上であることを特徴とする請求項１に記載の方法。
【請求項９】
命令を受け取ることが単一の命令しか受け取らないことを特徴とする請求項１に記載の方法。
【請求項１０】
第１のレジスタ中に文字列の１部分を記憶し、
該第１のレジスタ中の存在場所を指摘する開始場所を指定し、
上記第１のレジスタ中の存在場所を指摘する終端場所を指定し、該第１のレジスタ中に保存されている複数の文字を書き込む開始場所および終端場所を特定の文字と比較し、
プロセッサーで命令を受け取り、
該命令に応えて次の処置を単一命令中で実行し、すなわち、
上記開始場所と終端場所とを含むそれら場所間の複数の場所で上記第１のレジスタ中に記憶されている複数の文字と上記特定の文字とを同時に比較し、
その特定文字が発見されたら、該特定文字の存在場所を示すアドレスを１のレジスタ中に保存し、
その特定文字が発見されなければ、上記文字列の調べ終わった部分のすぐ次の文字列中の文字を指摘するアドレスを１のレジスタに保存する、
というステップを有することを特徴とするプロセッサーにアクセスできるメモリー中に記憶された可変長文字列中にある特定の文字を発見する方法。
【請求項１１】
プロセッサーで命令を受け取り、
該命令に応えて、
サーチされている文字部分と動的文字を複製した連続を含む基準値［reference  value］との間で排他的論理和演算を実行し、
該排他的論理和演算が何らかの文字の存在場所でゼロ結果を出すときは、そのゼロ結果の存在場所を示すアドレスをレジスタ中に保存し、排他的論理和演算がいずれの文字の存在場所でもゼロ結果を出さないときは、その文字列の調べ終わった部分のすぐ次の文字列中の文字を指摘するアドレスレジスタに保存する、
というステップを有することを特徴とする
プロセッサーで可変長文字列中にゼロ値によって表される文字以外の動的文字を発見する方法。
【請求項１２】
排他的論理和演算が調べたバイトの存在場所のいずれかにつきゼロ結果を出すか否かを表示するステップをさらに有することを特徴とする請求項12に記載の方法。
【請求項１３】
ソースアドレスを使って文字列の１部分をロードし、
該文字列の１部分を第１のレジスタに記憶させ、
該第１のレジスタ中に存在場所を指摘する開始場所を指摘し、
プロセッサーで命令を受け取り、
該命令に応えて次の処置を単一命令中で実行し、すなわち、
上記開始場所と同一場所またはそれより後の場所で上記第１のレジスタ中に記憶されている複数の文字と上記特定の文字とを同時に比較し、
その特定文字が発見されたら、該特定文字の存在場所を示すアドレスを１のレジスタ中に保存し、
その特定文字が発見されなければ、上記文字列の調べ終った部分のすぐ次の文字列中の文字を指摘するアドレスを第２のレジスタに保存し、
その特定文字が発見されたら、ソースアドレスとそのターミネーション文字のアドレスとの間に文字列の部分のバイトをターゲットアドレスに保存し、
その特定のターミネーション文字が発見されなければ、その文字列のその部分の最後までソースアドレスによって特定されるバイトの開始端からのその文字列のその部分をターゲットアドレスに保存し、文字列のその部分の長さだけソースアドレスを微増させ、文字列のその部分の長さだけターゲットアドレスを微増させ、そしてソースアドレスの最下位ビットをゼロにセットする、
というステップを有することを特徴とするソースアドレスからターゲットアドレスに特定のターミネーション文字で終る可変長文字列を複製する方法。
【請求項１４】
第１のレジスタ中に文字列の１部分を記憶し、
該第１のレジスタ中の存在場所を指摘する開始場所を指定し、
プロセッサーで命令を受け取り、
該命令に応えて次の処置を単一命令中で実行し、すなわち、
上記開始場所と同一場所またはそれより後の場所で上記第１のレジスタ中に記憶されている複数の文字と上記特定の文字とを同時に比較し、
その特定文字が発見されたら、該第１のレジスタ中の該特定文字の存在場所に対応する最下位ビットを第３のレジスタ中に保存し、
その特定文字が発見されなければ、上記第１のレジスタ中の特定文字の存在場所に対応する最下位ビットを上記第３のレジスタにセットし、
その特定文字が発見されなければ、上記第１のレジスタの初めのアドレスに対応する最下位ビットを上記第３のレジスタにセットし、そして、
その特定文字が発見されたか否かを表示する、
というステップを有することを特徴とするプロセッサーにアクセスできるメモリー中に記憶された可変長文字列中にある特定の文字を発見する方法。
【請求項１５】
特定の文字を求めて第１のレジスタ中の複数の文字を調べる前に第１のレジスタの内容とその特定文字の複製された連続を有する基準値の内容とを排他的論理和演算するステップを有することを特徴とする請求項４に記載の方法。
【請求項１６】
１または２以上のデータ文字を保存することができる第１のレジスタと、
該第１のレジスタ中に入るオフセットを指定する最下位ビットと上記第１のレジスタの内容のメモリーのアドレスを指定する最上位ビットとを有する第２のレジスタと、
該第１のレジスタ中に入るオフセットを指定する最下位ビットと上記第２のレジスタの最上位ビットの内容のコピーを保持する最上位ビットとを有する第３のレジスタと、
特定文字と多数のバイトとを同時に比較するバイト比較論理であって、上記第１のレジスタの文字に結合される１または２以上のOR−GATESを有し、
これらOR−GATESは１文字が１個のOR−GATEに結合されるように、また１個のOR−GATEは１文字に結合されるように配列されたものと、
上記バイト比較論理の出力および上記第２のレジスタの最下位ビットに結合される入力を有する組合せ論理ユニットであって、上記第１のレジスタ中に入るオフセットを示し、かつ、上記第３のレジスタの最下位ビットに送られるオフセット信号出力と上記特定文字が発見されたか否かを示す発見信号出力とを出すもので、特定の文字を発見したときは上記オフセット信号出力が上記第１のレジスタ中に特定の文字の存在場所を特定するオフセットにセットされ、特定文字を発見しないときはゼロにセットされる組合せ論理ユニットと、
を有することを特徴とするコンピュータに可変長文字列中に特定の文字を発見する装置。
【請求項１７】
ORゲートが１個の文字中のビットに接続され、第１のレジスタ中の各文字が１個のORゲートに接続されるように上記第１のレジスタに接続される１または２以上のORゲートであって、第１のレジスタのビットが接続されるORゲートに入力として接続されるものを上記論理が有することを特徴とする請求項17に記載の装置。
【請求項１８】
第２のレジスタの他のビットに接続される第１の入力と、発見した信号の出力の逆値に接続される第２の入力とを有し、さらに、上記第３のレジスタの他のビットに接続される出力を有する加算器をさらに有することとを特徴とする請求項17に記載の装置。
【請求項１９】
データの１または２以上のバイトを保存することができる第１のレジスタと、
上記第１のレジスタ中に入る開始オフセットを指定する最下位ビットと、該第１のレジスタ中のデータに関連するメモリーのアドレスを開始するオフセットロケーションに指定するための最下位ビットを有する第２のレジスタと、
上記第１のレジスタ中に入るオフセットを指定するための最下位ビットと、上記第２のレジスタの最上位ビットの内容のコピーを保持するための最上位ビットとを有する第３のレジスタと、
上記第１のレジスタ中に入る終端のオフセットを指定するための最下位ビットと、第１のレジスタ中のデータに関連するメモリーのアドレスを上記終端のオフセットロケーションに指定するための他のビットとを有する第４のレジスタと、
ゼロ値にされたターミネーション文字と多数のバイトとを同時に比較するバイト比較論理であって、上記第１のレジスタのバイトに結合される１または２以上のOR−GATESを有し、これらOR−GATESは上記第１のレジスタ中のバイト各々が１個のOR−GATEに結合され、また各々のOR−GATEが単一バイトに結合されるように配列されたものと、
上記第４のレジスタの他のビットに結合される第１の入力と、上記第２のレジスタの他のビットに結合される第２の入力とを有するアドレス比較ユニットであって、上記第１および第２の入力が同じメモリーのアドレスを指定するか否かを決定すること、およびその決定の結果を表示する出力を出すことができるものと、
上記バイト比較論理の出力、上記第２のレジスタの最下位ビット、上記第４のレジスタの最下位ビットおよび上記比較論理ユニットの出力に結合される入力を有する組合せ論理ユニットであって、上記第１のレジスタ中に入るオフセットを示し、かつ、上記第３のレジスタの最下位ビットに送られるオフセット信号出力と、特定文字が発見されたか否かを示す発見信号出力とを出すもので、上記オフセット信号出力は特定文字が発見されたら上記第１のレジスタ中の特定文字の存在場所を指定するオフセットにセットされ、特定文字が発見されなければゼロにセットされるもので、第４のレジスタの最下位ビットに指定される最後のオフセットが調べられたか否かを示すラースト信号出力と、エラーが発生したか否かを示すエラー信号出力とを有することを特徴とするコンピュータで文字列中の特定の文字を発見する装置。
【請求項２０】
上記論理が上記第１のレジスタに接続された１または２以上のORゲートを、ORゲートが単一バイト中のビットに接続され第１のレジスタ中の各バイトが単一のORゲートに接続されるように備え、第１のレジスタのビットがそれらが接続されるORゲートに入力として接続されていることを特徴とする請求項19に記載の装置。
【請求項２１】
上記発見信号出力と上記ラースト信号出力とがそれらが接続されるORゲートに入力として接続されていることを特徴とする請求項19に記載の装置。
【請求項２２】
第１のレジスタに１または２以上の文字を記憶し、
第２のレジスタの第１の部分に上記第１のレジスタ中に記憶された第１の文字のアドレスを記憶し、
上記第２のレジスタの第２の部分に上記第１部分に記憶されたアドレスからのオフセットであって特定の文字を求めてサーチを開始する第１のレジスタ中のバイトのロケーションを示すものを記憶し、
上記第２のレジスタの第２部分に指定されたバイトロケーションに存在するか、またはそれより後に存在する第１のレジスタの中の複数の文字を同時にサーチし、
特定文字を発見したら、第３のレジスタに第１のレジスタ中のその特定文字の存在場所を示すアドレスを保存し、
特定文字を発見しなかったら、その文字列の調べ終わった部分のすぐ次の可変長文字列中の文字を指摘するアドレスを第３のレジスタに記憶する、
というステップを有することを特徴とする可変長文字列中に特定文字の発生したことを探知する方法。
【請求項２３】
データの１または２以上の文字を保存することができる第１のレジスタと、
該第１のレジスタ中に入るオフセットを指定する最下位ビットを有する第２のレジスタであって第１のレジスタの内容のメモリーアドレスを指定する最上位ビットを有するものと、
上記第１のレジスタ中に入るオフセットを指定する最下位ビットを有する第３のレジスタであって、第２のレジスタの最上位ビットの内容のコピーを保持する最上位ビットを有するものと、
多数のバイトを特定文字と同時に比較するバイト比較論理であって、１出力と各構成部分が、第１のレジスタ中の文字中から得られるビットを入力として備え、また第１のレジスタ中の１個の構成部分に入力を供給するように配置された１または２以上の構成部分を有するものと、
バイト比較論理の出力および第２のレジスタの最下位ビットに接続される入力を有する組合せ論理ユニットであって、上記第１のレジスタ中に入るオフセットを示し上記第３のレジスタの最下位ビットに送られるオフセット信号出力と特定文字が発見されたか否かを示す発見信号出力とを出すもので、上記オフセット信号出力は特定文字が発見されたときは上記第１のレジスタ中に特定文字の存在場所を指定するオフセットにセットされ、特定文字が発見されないときはゼロにセットされるものと、
を有することを特徴とするコンピュータで可変長文字列中に特定の文字を発見する装置。
【発明の詳細な説明】
発明の分野
本発明はターミネーション文字で終わるバイト列をコンピュータ上で処理する方法に関する。より詳細にはコンピュータで使うバイト列中のターミネーション文字を発見する命令に関する。
発明の背景
コンピュータで実行される通常のオペレーションは、メモリー内の１アドレス、「ソース」、からメモリー中の他のアドレス、「ターゲット」、へバイトまたは文字の列［string］をコピーすることである。バイト列は、不変長か可変長かのいずれかである。普通はバイト列が可変長のときは、代表例としてゼロバイトと呼ばれる空文字のようなターミネーション文字がバイト列の最後をマークするのに使われている。この場合バイト列は、その列の最初のバイトとターミネーション文字とのアドレスによって輪郭つけられるか、その他の方法で限定されているわけである。
コピーオペレーションが単一の命令としてコンピュータで行われるときは、終了するまでに通常複数のサイクルを経る。しかしRISCプロセッサはこのようなオペレーションを実行するのに、各命令が単一サイクルで実行される単一命令順序［an instruction sequence］を使う。
IBM社のRISC System/6000プロセッサでは、所定長さの列または所定のターミネーション文字列が、可変長のバイト列をコピーするのに使われている。この方法だと、列の最初から始まってターミネーション文字までにある所定数のバイトがコピーされる。「Load String And Compare Byte Indexed」（Iscbx）命令、すなわち「列をロードしてインデックスされたバイトを比較せよ」という命令が、記憶装置内の連続バイトを連続レジスタ中にロードするのに使われ、次にストアストリング命令［a store string instruction］がこれらのバイトをレジスタから再び記憶装置へと戻しコピーするのに使われる。しかしこの方法は命令を完遂するのに複数のサイクルを使うのが代表的である。このプロセッサにおける大半の他の命令は単一サイクルで実行されるように設計されているのであるから、これはハードウエアや例外的操作の複雑さを増大させることになる。
RISC System/6000のlscbx命令についてはIBM社発行の「AIX Virsion 3.2 for RISC System/6000,Assembler Language Reference」第２版（1992年１月）の第５−156〜第５−158に記載されている。RISC System/6000はIBM社所有の商標である。またIBMはInternational Business Machines Corporationの登録商標である。
Hewlett Packard Company社のPrecision Architecture（HP−PA）で使われている方法では、UNIT XOR命令によって、あるワードがゼロバイトを含むか否かを発見することができる。この方法によれば、排他的論理和のオペレーションが実行されるとハードウエア探知論理［hardware detection logic］がゼロバイト値を求めて得られた結果の各バイトをチェックする。得られたワード中のバイトのいずれかがゼロか否かを示すように状態結果［status result］をセットすることができる。しかしこの命令はゼロバイトのある場所を示すことはしない。ゼロバイトのある実際の場所を探知するにはもう一つの命令を使わなければならない。
しかもテストされているワードと使用禁止マスク領域につき論理和を正しく実行することによって、先頭バイトすなわちコピーされているバイト列の開始するアドレスの前にあるデータバイトを扱うのにもう一つ別の命令が使われる。先頭バイトにマスクを作りこれを使うことのオーバーヘッドは、小さいバイト列で実行されるコピーオペレーションにとって有益なものとなり得る。
Hewlett Packard Company社のPrecision ArchitectureおよびUNIT XOR命令に関する基本的解説は“PA−RISC 1.1 Architecture and Instruction Set Reference Manual",Hewlett Packard Company,Chapter 5,pgs.5−7,5−109（1990）参照のこと。
Advanced Micro Devices,Inc.（AMD）のAM29050マイクロプロセッサーで使われている方法では、任意ターミネーション状態［an arbitrary termination condition］につきチェックするため二つのレジスタ間のバイトごとの比較を行うのにCPBYTE命令が使われている。それら二つのレジスタの一方はチェックされている列部分を含み、他方はターミネーション文字の複製されたコピーを含む。比較結果はそのターミネーション文字が発見されたか否かを示す。PA−RISC 1.1方法による場合のように、追加の命令がターミネーション文字の在りか及びコピーされる列の開始アドレスを決定するのに使われる。
CPBYTE命令については“Am29050 Microprocessor,User's Manual",Advanced Micro Devices,Inc.,（1991）,page 8−38参照のこと。
発明の概要
本発明は可変長のバイト列中の特定の文字ないし特定の値のアドレスを捜し出すための命令に関する。要するに本発明によれば、列の１部分に入るオフセットが指定され、その列部分が指定されたオフセットで始まる特定の文字の最初に発生するのを求めてサーチされる。その特定の文字が捜し出されたら、その特定文字が存在することが示され、その特定文字のアドレスまたはオフセットが保存されるかその他の方法で示される。特定文字が発見されなかったときは、特定文字不存在の表示がされ、既に調べ終わった列部分のすぐ次の文字を指摘するのに都合のよいアドレスまたはオフセットが保存されるかその他の方法で示される。いずれの場合も、保存その他の方法で示されるアドレスまたはオフセットは、例えばレジスタ、メモリーなどの記憶装置に保存することができる。
特定文字は典型的には、文字列とも呼ばれる可変長バイト列を終了させるのに使われるターミネーション文字である。ターミネーション文字の長さは１バイトまたは２以上のバイトである。ターミネーション文字が１バイト以上の長さのときは、その列内に並べられるのが好ましい。例えば０〜７とナンバー付けされたバイトを有する８バイト列にあっては、２バイトのターミネーション文字が０〜１、２〜３、４〜５または６〜７バイト中にあるのが好ましい。
典型的にはターミネーション文字は空文字である。空文字の値は通常、ASCIIにおける場合のようにゼロバイトであるが、これは言語特異的で、異なる言語によって値は異なるものとなる。
ターミネーション文字は所定の固定値であるか、または動的な任意値かである。動的なターミネーション文字の値はコピーオペレーション間で変化し得るが、所定の固定値をもったターミネーション文字は常に一定である。
ターミネーション文字が固定値のときは、上述の本発明はそのターミネーション文字を探知するように部分的に改変される。換言すれば、本発明に係るコンピュータはその具体的なターミネーション文字を探知するように設置される［hardwired］。
一方、ターミネーション文字が本発明のコンピュータのビルドプロセス［build process］中にあって知られていないとき、または使われる動的ターミネーション文字を許容することが望まれるときは、テストされている列のその部分を有するデータと基準値の各バイトがその具体的なターミネーション文字を含んでいる基準値間にブール論理和［a boolean exclusive−or］が行われる。もしそれが使われている回路技術で実行可能なら、この排他的論理和がその命令自体中で実行することができる。あるいはその命令が実行される前に実行することができる。
ターミネーション文字は典型的にはゼロバイトであるから、ゼロバイトを探知するように特別に設計された命令を有することが好ましい。この場合、ゼロバイト以外の文字を探知する命令を使用することが望まれるときは、排他的論理和オペレーションがその命令を実行する前に行われる。このようにターミネーション文字がゼロバイトのときは排他的論理和オペレーションのオーバーヘッドは発生しない。このアプローチは固定的なターミネーション文字一般にも適用される。
次のようにすれば本発明はソースからターゲットへバイト列をコピーするのに使うこともできる。すなわち本発明に係る命令を１回の呼出しで呼び出している間に、レジスタのサイズと同数のバイトを有する列の１部分につき特定の文字を求めてテストすることができる。本発明は１度に１個のバイトではなく、１レジスタ中の多数のバイトに実行することができ、それによって１度に１バイトしかコピーしないソフトウエアをはるかに凌ぐ改良をパフォーマンスにもたらす。
本発明は加算命令を実行するに匹敵する程度の時間で実行可能であり、特に本発明を実行するのに多数サイクル命令を実行するための特別機を必要とはしない。本発明は、他のロードしストアせよ命令と組合せることができ、それによってコピーオペレーションをこの命令順序を１回または２回以上実行することによって行うことができる。
本発明はまたHP−PAとかAm29050のようなアーキテクチャーのプロセッサーより以下のような数点で有利である。第１に、サーチされている列の部分中に入るオフセットを指定することによって、本発明は先頭バイトをマスキングしなくてもそれらを明示的に無視でき、それによってそうしたマスキングオペレーションに関連するオーバーヘッドを回避することができる。第２に、ターミネーション文字の存在場所を決定するのに、もう一つの別の命令を必要とすることがない。というのは本発明はその情報をその単一サイクルの処理能力内で決定することができるからである。これは処理時間を減少させる。
【図面の簡単な説明】
本発明につき上述の、及びその他の利点は、添付の図面に基づき行う以下の説明によって一層理解を深めることであろう。
図１は本発明のシステムを簡単に説明したブロックダイヤグラムである。
図２は図１のシステムのプロセッサのブロックダイヤグラムである。
図３は本発明に係る命令のフォーマットを示す。
図４は本発明に従ってバイトレジスタ中にある特定の文字を捜し出すためのステップの大略を示すフローチャートである。
図５は本発明に従ってバイトレジスタ中にある任意の文字を捜し出すためのステップの大略を示すフローチャートである。
図６は本発明を具現化するハードウエアの第１実施例である。
図７は本発明を具現化するハードウエアの第２実施例である。
図8Aおよび図8B、すなわち表１および表２は、各々４バイトおよび８バイトの真理表で、図６および図７の組合せ論理ユニットのためのブール論理を含むものである。
図９は本発明を具現化するハードウエアの第３実施例である。
図10、すなわち表３は、図９の組合せ論理ユニットのためのブール論理を含む４バイトの真理表である。
図11はソースアドレスからターゲットアドレスへのターミネーション文字中に終了するバイト列をコピーする本発明の命令を使うステップのフローチャートである。
発明の詳細な説明
図１の30は本発明を組み込むことができるタイプのコンピュータ全体を指す。コンピュータ30は、プロセッサ34、ランダムアクセスメモリー（RAM）36の形式で代表的には具現化されるメインメモリー、およびリードオンリーメモリー（ROM）38を含むことができるスタティックメモリー［static memory］を相互に接続する例えばシステムバスのようなシグナルパス32からなる。
プロセッサ34はロード／ストアアーキテクチャを有するマイクロプロセッサである。例えばこのプロセッサはSun Microsystems,Inc.から購入することができるSPARCマイクロプロセッサとか、IBM社から購入できるRISC System/6000マイクロプロセッサである。
図２に示すようにプロセッサ34はレジスタファイル40と、命令レジスタ41とを有する。あるいはプロセッサ34はステートビット記憶装置［statebit storage］42とキャッシュ［cache］46を有する。従来のロード／ストアアーキテクチャでは、データは計算することなくレジスタとメモリー間を移動し、計算はレジスタ内の値間で行われている。
レジスタファイル40は、レジスタ「ra」50a,レジスタ「rb」50b、レジスタ「rc」50cを含む複数の汎用レジスタ50を有する。これらのレジスタは、場合によって異なるが代表的には４バイトとか８バイトの特定のバイト長である。レジスタ内容のフォーマットは、使用されるメモリーアドレシングスキーム如何で異なる。Big Endianメモリーアドレシングでは、レジスタのバイト０は内容上最上位ビットを含む。すなわちレジスタ中のバイトは０から始まって左から右へ連続的に番号が振られている。Little Endianメモリーアドレシングでは、レジスタのバイト０は内容上最下位ビットを含む。すなわちレジスタ中のバイトは０から始まって右から左へ連続的に番号が振られている。好ましい実施例についてはBig Endianメモリーアドレシングを使ったレジスタに関して記載されている。しかしLittle Endianメモリーアドレシングを使ったレジスタに適用される実施例は当業者には自明なことであろう。
ステートビット記憶装置42は、命令を制御するためのステートビット51aなどの１または２以上のステートビット51を有している。このプロセッサは１または２以上のステートビット51を一定の条件コードまたは状態を示すためにセットすることができる。プロセッサ34は、ステートビット記憶装置42ではなくレジスタファイル40内のレジスタ50を使うことができる。
典型的にはプロセッサ34はキャッシュ46またはメモリー36から命令を引き出し、それを命令レジスタ41にストアする。図３は本発明を具現化するための命令のフォーマットを示す。典型的な命令52は演算コード［opcode］60,3つのレジスタ番号域、すなわちここではra規則子62、rb規則子64およびrc規則子66と、あってもなくてもよいがテストフィールド68とがある。
演算コード60は、「第１フィールド」とも呼ばれるが、プロセッサの命令セット内で一定の命令を特定する。演算コード60は直接または間接に特定の命令を同定する。例えば演算コード60は、本発明を具現化する命令に対応する「110000」のような二進数値たり得る。演算コード60の大きさは命令セットアーキテクチャ次第で決まるが典型的には６ビットフィールドである。
説明の便宜上、本発明の命令をここでは「FINDARBCHAR」または「FINDFIXEDCHAR」命令と呼ぶことにする。FINDARBCHAR命令は、任意の又は動的なターミネーション文字を取り扱うように明示的に設計されていることを別にすればFINDFIXEDCHAR命令と実質的に同一であるが、FINDFIXEDCHARはゼロバイトのような特定の固定的なターミネーション文字専用にされたものである。このようにターミネーション文字を変更する能力があることが望まれる場合とか、コンピュータを構築するときターミネーション文字が知られていない場合などでは、FINDARBCHAR命令が有利である。ターミネーション文字が動的なとき、典型的にはそれはレジスタ50に記憶される。
任意の又は動的なターミネーション文字のためにも、あるいはコンピュータを構築するときにターミネーション文字が未知であるときにFINDFIXEDCHAR命令を使うことができる。この場合は、FINDFIXEDCHAR命令はゼロバイトに等しいターミネーション文字用に設計される。FINDFIXEDCHAR命令が呼び出される前に、サーチされている列部分中に含まれているデータと、FINDFIXEDCHAR命令を呼び出す前のターミネーション文字にセットされた各バイトを有する同一長のマスク間とで排他的論理和［EXCLUSIVE−OR］が実行され、それによってターミネーション文字を含有するバイトをゼロバイトにセットする。FINDFIXEDCHARは次にそのゼロバイトを捜し出すのに使われ、それによってゼロバイトでないターミネーション文字を非明示的に取り扱う。FINDARBCHAR命令の場合は、上記の論理和は命令自体内で行われる。
「第２フィールド」とも呼ばれるra規則子62は、レジスタra50aを特定する。ra規則子62はレジスタra50aのためのレジスタファイル中に入るインデックス、オフセットまたはポインターたり得る。
「第３フィールド」とも呼ばれるrb規則子64は、レジスタrb50bを特定する。rb規則子64はra規則子62と同様である。
「第４フィールド」とも呼ばれるrc規則子66は、レジスタrc50cを特定する。rc規則子66はra規則子62およびrb規則子64と同様である。
３つのレジスタフィールド62、64、66の大きさはサポートされるレジスタ数によって決まる。典型的には５ビットフィールドである。
任意的に「第５フィールド」とも呼ばれるテストフィールド68は、どの条件コードがセットされるべきなのかを特定する。典型的にはこれらの条件コードはブランチ［branches］その他の命令を無効にするのに使われる。セットされるかもしれない多数のステートビット51があるとき、テストフィールド68はそれらのどれが使われるのかを選択する。
FINDFIXEDCHARまたはFINDARBCHARのアセンブリ言語命令は、FBYTE ra,rab,rcテストのように指定することができる。典型的には、より高いレベルのコピー命令を翻訳するときにコンパイラが、文字列のコピーを完遂するのに必要なあらゆる先行する、また後続する制御命令を含むFBYTE命令を作る。あるいはソースコード自体がコピーオペレーションを実行するアセンブリ言語で書かれたルーチンを呼び出す。
図４はFINDFIXEDCHAR命令の実行中に行われるステップの全体を示す。必須的に、ブロック100でgr［ra］の最下位ビット、すなわち「lsb's」とここで呼ぶもの、によって特定されたバイトアドレスで始まるgr［rb］のバイトを調べて特定の文字、すなわちターミネーション文字とか、その他の特定文字を捜し出す。使われる最下位ビット数はレジスタの大きさ、すなわちすべてのバイトのありかを記述するのに必要なビット数によって決まる。例えばレジスタが４バイトの長さであるとすれば、２ビットが場所０−３を記述するのに使われ、レジスタが８バイト長なら３ビットが場所０−７を記述するのに使われる。
特定文字がブロック102で捜し出されたら、ブロック104でgr［rc］、好ましくはそれの最下位ビットがそのターミネーション文字のバイトアドレスを特定するのに更新され、ブロック106で特定文字が発見されたことを表示手段を介して示す。例えばこの表示手段は、セットされる条件コード、または実行されるトラップである。ブロック104、106は順序を逆にして行われても構わない。ブロック102で特定文字を発見できなかったら、ブロック108で、gr［rc］、好ましくはそれの最下位ビットが調べ終わった列のバイトのすぐ後の列中にあるバイトのアドレスまたはこのアドレスを作るのに都合のよい値を特定するように更新される。ブロック110でその特定文字が発見されなかったことを表示する。例えばこの表示手段はセットされた条件コードであるか、実行されたトラップであることもある。ブロック108、110は逆に行われても構わない。
あるいは条件コードを表示手段として使うのなら、ブロック100の前に、特定文字が発見されなかったことを示すよう条件コードを初期化することができ、そしてその特定文字が発見されて初めて更新されるのであって、ブロック110で行われるステップが、ブロック102や108の後に行われるのではなく、ブロック100の前に行われ行われてしまうのでもよい。同様に、この条件コードは、ブロック100で調べられて特定文字が発見されたことを示すように初期化され、特定文字が発見されないときに初めて更新するようにすることもできる。すなわちブロック106で行われるステップをブロック102や104の後に行うのでなく、ブロック100より前に行ってしまうわけである。
条件コードは容易にテストすることができるステートビット51のような条件ビットであるのが好ましい。あるいは条件コードは特定文字が発見されたか否かを示す値をロードされるレジスタであってもよい。
図５はFINDARBCHAR命令の実行中に行われるステップの概略である。基本的にFINDFIXEDCHAR命令を実行するときに行われるのと同じステップであるが、ブロック250でgr［rb］の内容が、論理的にマスクフィールドのついた排他的論理和化されている点で異なる。マスクフィールドは調べている列部分と同じ長さ、すなわちgr［rb］と同じ大きさで、求められている特定のターミネーション文字の例の列を含んでいる。
図６〜図10は本発明に係るFINDFIXEDCHAR命令のハードウエアによる実施例を示す。図６、図７および図９においては、４バイトレジスタが使われているが、８バイトレジスタのような他の大きさのレジスタでも実施可能である。接続線上の斜線は信号またはデータの経路数を示す。図６、図７および図９は１バイト長のターミネーション文字の場合の実施例である。しかし当業者なら１バイト長以上の長さのターミネーション文字の場合にもこれら図６、図７および図９を変更して行うことが容易にできるであろう。
図６においてターミネーション文字がテストされている列部分に発見されないときは、定数「ｎ」を付け加えることによって次の文字単位アドレスを別の命令が作ることができるようにgr［ra］の最下位ビットをクリアする。ここでｎはレジスタgr［rb］内のバイト数である。あるいは図７において、ターミネーション文字が発見されないときは、そのFINDFIXEDCHAR命令内でgr［ra］の最下位ビットがクリアされ、そして定数「ｎ」がそれに付け加えられるのでもよい。
図６において、３つのレジスタgr［ra］300、gr［rb］302、gr［rc］304が次のように接続されている。レジスタgr［rb］302の各バイト中のビットは、バイトをターミネーション文字と比較するため論理305に接続されている。この論理は例えば、１または２以上のORゲート306であるか、または補足された入力値を使うNANDゲート（図示せず）のようなOrゲートの同等物でもよい。
プログラム可能論理回路［Programmable Logic Array］（PLA）のような組合せ論理ユニット［combinatorial logic unit］（CLU）308が論理305の出力、ORゲート306として表されているものと、レジスタgr［ra］300の最下位ビットとを相互に接続する。レジスタgr［ra］の他のビットはレジスタgr［rc］304内の対応するビットに接続される。CLU308の出力はオフセット信号310と発見された信号312である。レジスタgr［rc］304の最下位ビットはオフセット信号310の値にセットされる。発見された信号312は、例えばステートビット51のようなインジケータ314へその内容を送ることによって条件コードをセットするのに使うことができる。
レジスタgr［ra］300の最下位ビットはレジスタgr［rb］302内のどのバイトがターミネーション文字のサーチを始めるかを表示し、またgr［ra］の他のビットはそのバイトの内容がメモリー中のどこにあるのかのアドレスを表示する。
オペレーションのときは、レジスタgr［rb］302内のバイトのビットは論理305を１文字につき１つのORゲート306として殆ど同時に通過する。得られた結果（t0〜t3）がCLU308に入る。レジスタgr［ra］300の最下位ビットもCLU308へ入力として入り、レジスタgr［ra］のその他のビットはレジスタgr［rc］304中の対応する場所にコピーされる。
CLU308はオフセット信号310と発見信号312の２つの出力を作り出す。発見信号312はターミネーション文字がレジスタgr［rb］302に発見されたか否かを特定する。ターミネーション文字が発見されたときは、オフセット信号310がそのターミネーション文字のgr［rb］302内のありかを特定する。そうでないときはオフセット信号310はゼロである。レジスタgr［rc］304の最下位ビットはオフセット信号310の値にセットされる。
図７に示す別の実施例ではターミネーション文字が発見されないときは、レジスタgr［ra］のアドレスがその列中の次の未だ調べられていないバイトのアドレスを特定するように更新される。この実施例では、３つのレジスタgr［ra］350,gr［rb］352,gr［rc］354が次のように相互に接続されている。レジスタgr［rb］352のバイトのビットは、１バイト１ターミネーション文字と比較するように論理355に接続される。この論理は例えば１または２以上のORゲート356またはOrゲート同等物がなり得る。
PLAのような組合せ論理ユニット（CLU）358が論理355の出力、ORゲート356として表されているものと、レジスタgr［ra］350の最下位ビットとを相互に接続する。レジスタgr［ra］のその他のビットは演算数を１づつ微増させるような加算演算を行える加算装置［addition unit］（AU）360中に入力される。AU360は例えば加算器である。
CLU358はオフセット信号362と発見信号364を出力する。オフセット信号362の内容はレジスタgr［rc］354の最下位ビット中にコピーされる。
発見信号364の逆値［the inverse of the value］がAU360に入力として入れられる。AU360の出力はgr［rc］354の対応する最下位ビットに接続される。発見信号364はまたその値を例えばステートビット51のようなインジケータ366に送ることによって条件コードをセットするのに使うこともできる。
オペレーションに当たっては、レジスタgr［rb］352のバイト内のビットは論理355を殆ど同時に通って１バイトごとに１つのORゲートとして表される。得られた結果の（t0〜t3）はCLU358に送られる。レジスタgr［ra］350の最下位ビットはCLU358に第２の入力として送られ、レジスタgr［ra］のその他のビットはAU360に入力として送られる。
ターミネーション文字が発見されたときは、オフセット信号362がgr［rb］352内のそのターミネーション文字のありかを特定する。発見されないときはオフセット信号362はゼロで、gr［rb］352の最初のバイトのありかを特定する。レジスタgr［rc］354の最下位ビットはオフセット信号362の値にセットされる。
発見信号364の逆値がAU360に送られる。その発見された信号がゼロなら、ターミネーション文字が発見されないと表示し、そうするとAU360がAUへのその他の入力として特定されたアドレスに１を加え、gr［rc］中の対応する最上位ビット、すなわち最下位ビット以外のビットが結果にセットされる。発見された信号がターミネーション文字が発見されたことを示す１なら、AU360の出力はその他の入力として特定されたアドレスでgr［rc］中の対応する最上位ビットが結果にセットされる。
表１および表２は各々、図６および図７のPLAの304および358の真理値表である。表１は４バイトの真理値表で、表２は８バイトの真理値表である。これらの真理値表で「ｘ」はその入力値が０か１かに拘わらず同じ出力が作られることを示す。
これらの真理値表の各々は、適当なゲートベルの相互接続仕様を作るSynopsis Corp.から購入できるSynopsisのような論理合成プログラムへの入力として使うことができる。
図９は本発明の実施例を具体化するためのハードウエアを示し、バイト列中の１つのエンドバイトが、ターミネーション文字が発見されるか特定のエンドバイトがサーチされるまでそのどちらが先に生ずるかに関係なくバイト列がターミネーション文字をサーチするように特定されることができる。４つのレジスタgr［ra］400,gr［rb］402,gr［rc］404,gr［rd］406が次のように相互接続されている。gr［ra］およびgr［rd］の最上位ビットが等しいときは、レジスタgr［rd］406の最下位ビットはレジスタgr［rb］342内のバイトをそのバイトを含めてターミネーション文字を求めるよう表示し、gr［rd］のその他のビットはそのバイトの内容のメモリー中のある場所のアドレスを表示する。gr［rd］によって特定されたバイトに到着する前にターミネーション文字が発見されたら、サーチは終了する。
レジスタgr［rd］の最下位ビットは入力として組合せ論理ユニット408中に送られる。最下位ビット以外のgr［rd］のビットは比較論理ユニット412に入力として接続される。最下位ビット以外のgr［ra］のビットも比較論理ユニット412に入力として接続される。比較論理ユニット412の結果はCLU408へ入力として送られる。gr［ra］400の最下位ビットもCLU408へ入力として送られる。
レジスタgr［rb］402のバイト中のビットは１バイトを１ターミネーション文字と比較するために論理419へ接続される。論理419は例えば１または２以上のORゲート420か、Orゲート同等物たり得る。例えばORゲート420のような論理402の出力もCLU408への入力となる。レジスタgr［ra］400のその他のビットはレジスタgr［rc］404内の対応するビットに接続される。
CLU408の出力は、オフセット信号422、発見信号424、ラースト信号426および好ましくは誤り信号428である。オフセット信号422はgr［rc］404の最下位ビットに接続される。使っている条件コードをセットするため、発見信号424をインジケータ１430に接続することができ、ラースト信号426をインジケータ２432に接続することができ、そして誤り信号428をインジケータ３433に接続することができる。インジケータ430、432、433は例えばステートビット51でもよい。あるいはインジケータ１、インジケータ２の両方を使わずにダンインジケータ［done indicator］とも呼ばれる１個のインジケータ434を使ってサーチが終了したことを表示することもできる。このダンインジケータは、発見信号424およびラースト信号426の各値に行われる論理和演算の結果に等しい値をもつ。ダンインジケータはターミネーション文字が発見されたか又はラースト文字が調べられたかのいずれかを指定することができるが、これら２状態のどちらが発生したのかは表示しない。また、誤り信号428は実施の設置においては無視されてしまうこともある。
演算に当たっては、最下位ビットよりもgr［rd］のビット406が、また、最下位ビットよりもgr［ra］のビット400が比較論理ユニット412に入力として入れられ、そこでこれら２値が比較され、それらが等しいか否かを表示し、等しいなら１を戻し等しくないなら０を戻す。サーチされているバイトのアドレスがサーチされるべき最後のバイトのアドレスを含んでいるときは、それらの値は等しい。比較論理ユニット412の出力は入力としてCLU408に入る。
レジスタgr［rb］402のバイト中のビットは、１バイトごとに１個の論理和ゲート420として表された論理419を事実上同時に通過する。結果（t0〜t3）がCLU408に入れられる。レジスタgr［ra］400およびgr［rd］406の最下位ビットも入力としてCLU408に入れられる。レジスタgr［ra］400の他のビットはレジスタgr［rc］404の対応する箇所にコピーされる。
図９において、CLU408は、オフセット信号422、発見信号424、ラースト信号426および誤り信号428の４つの出力を作る。誤り信号428はなくてもよいし、発見信号424とラースト信号426は１つのダン信号にまとめることができる。発見信号424はターミネーション文字がレジスタgr［rb］402中に発見されたか否かを示す。もしターミネーション文字が発見されたのであれば、オフセット信号422がそのターミネーション文字のgr［rb］402中の存在位置を示す。発見されなければオフセット信号422がgr［rb］402の最初のバイトを示す。gr［rc］404の最下位ビットがそのオフセット信号422の値にセットされる。
図９に示された実施例は図７について説明した排他的論理和の実施例を付加することによって動的ターミネーション文字を処理するように修正することができる。同様に、図９の実施例は図７について説明した付加ユニットを付けるように修正することもできる。
表３は図９のPLA408のための４バイト真理値表である。真理値表１および２と同様、真理値表３も論理合成プログラムへの入力として使用することができる。
「ｘ」は、その入力値が０か１か同じ出力が作られることを示す。括弧内の値はエラー状態、すなわち終了アドレスが開始アドレスより小さいときを示す。一般にその他のデータ値はエラー状態が発生したときは無視されるが、プロセッサによってはそうしたエラーをチェックしないものもある。したがって表では出力はエラー状態について定義する。表中に示された値はエラーについての好ましい値であるが、その他のどんな値でも使うことができる。
図11はソースアドレスからターゲットアドレスへの空終了バイト列をコピーするためのFINDFIXEDCHAR命令を使うときに行われるステップを示す。図11もまたFINDARBCHAR命令を使うように修正することができる。
これらのステップはより高いレベルのコンピュータプログラミング言語では、コピー指示呼出しすなわちサブルーチン呼出しに応えて実行される。コピー指示は、ソースパラメータがターミネーション文字で終了するバイト列のアドレスを、またターゲットパラメータがその列がコピーされるべきアドレスを指定する場合には、例えばコピーせよ［COPY］（ソース、ターゲット）と指示される。ソースアドレスおよびターゲットアドレスはレジスタその他の比較的容易にアクセスできる一時記憶装置に既にロードされていることが前提である。例えば、ソースアドレスがロードされるレジスタはgr［ra］と呼ばれる。
簡略化して説明すると、図11ではソースアドレスおよびターゲットアドレスの最下位ビット、すなわちレジスタ内のバイトオフセットを特定するビットは、同じである。そうでないときは追加的にアラインメント演算命令および桁送り命令が使われる。
基本的にバイトの列はレジスタに一杯のバイトを１度にコピーすることによってソースアドレスからターゲットアドレスへとコピーされる。レジスタ一杯のバイトはレジスタgr［rb］にロードされ、gr［ra］の最下位ビットで指定されたgr［rb］内のオフセットで始まる内容につきターミネーション文字如何が調べられる。ターミネーション文字が発見されたらgr［ra］の最下位ビットで指定された存在箇所とそのターミネーション文字の存在箇所との間のgr［rb］内容が包含的にターゲットアドレスで指定された適当なアドレスに記憶される。ターミネーション文字が発見されないときは、gr［ra］の最下位ビットで指定されたオフセットで開始するgr［rb］内容が、最後までターゲットアドレスで指定された適当なアドレス中にストアされgr［ra］が次のコピーされるべき文字のアドレスを指定するように更新される。
具体的には図11に示すように、ブロック550でデータがソースアドレスを使ってgr［rb］にロードされる。ブロック552でFINDFIXEDCHAR命令またはFINDARBCHAR命令が実行される。好ましくはソースアドレスつまりgr［ra］およびデータつまりgr［rb］はパラメータとして呼出しに入れられるのがよい。「ネクスト」とも呼ばれる汎用レジスタgr［rc］および、ここでは「テスト」と呼ばれるテストビットが出力パラメータとして使われる。
ターミネーション文字がブロック552で発見されたか否かを決定するためブロック554で調べられる。もし発見されたなら制御がブロック556へ送られ、発見されないなら制御はブロック558へ送られる。ブロック556では「ｎ」がgr［rb］中のバイト数を指すとして、ソースのモジュロとｎ、すなわちｎでソースを割った残りと、次のモジュロとｎとの間のgr［rb］中のデータのバイトを、ターゲットアドレスにストアする。
ブロック558で、ソースに示されたバイトを含むその後のgr［rb］中のバイト数にカウントセットする。ブロック560で、ターゲットアドレスから開始してgr［rb］のバイト数のカウントをストアする。ブロック562で、ソースの最下位ビットをゼロにセットする。ブロック564でソースをｎだけ微増する。ブロック566でターゲットをｎだけ微増する。ブロック564と566は順序をどちらにしても実行可能である。次に制御をブロック550に移す。図11のステップは開始バイトは勿論gr［rb］中の末端バイトをも指定するように修正することができる。
0003637922.tif 000002
0003637922.tif 000003
0003637922.tif 000004
0003637922.tif 000005
【図１】
0003637922.tif 000006
【図２】
0003637922.tif 000007
【図３】
0003637922.tif 000008
【図４】
0003637922.tif 000009
【図５】
0003637922.tif 000010
【図６】
0003637922.tif 000011
【図７】
0003637922.tif 000012
【図９】
0003637922.tif 000013
【図１１】
0003637922.tif 000014