(57)【特許請求の範囲】
【請求項１】
半導体装置はベクトル命令およびスカラ命令を実行可能なデータ処理装置を備え、
前記データ処理装置は、第１および第２のベクトルレジスタと、汎用レジスタまたは専用レジスタと、を有し、
前記ベクトル命令は、前記第１のベクトルレジスタの内容と前記第２のベクトルレジスタの内容とを要素ごとに演算し、要素ごとの演算結果に基づく付加情報を連結し、前記汎用レジスタまたは前記専用レジスタの内容を右または左にシフトし、シフトによって空いた部分に連結した付加情報を挿入して、前記汎用レジスタまたは前記専用レジスタに前記付加情報を蓄積する命令であり、
前記データ処理装置は、１度目のベクトル命令の実行で、第１の連結した付加情報を前記汎用レジスタまたは前記専用レジスタに保存し、前記１度目の実行に連続する２度目の前記ベクトル命令の実行で、第２の連結した付加情報を前記汎用レジスタまたは前記専用レジスタにさらに保存し、前記第１の連結した付加情報および前記第２の連結した付加情報に基づいて前記スカラ命令を実行するよう構成される。
【請求項２】
請求項１の半導体装置において、
前記第１および第２のベクトルレジスタはそれぞれＮ個の要素を格納可能であり、
前記データ処理装置は前記Ｎ個の要素の演算を並列に実行可能であり、Ｎ個の付加情報を生成するよう構成される。
【請求項３】
請求項２の半導体装置において、
前記ベクトル命令は前記第１のベクトルレジスタの内容と前記第２のベクトルレジスタの内容を比較する命令であり、
前記付加情報は比較結果に基づくフラグであり、比較条件に合致する場合１または０になり、比較条件に合致しない場合は０または１になる。
【請求項４】
請求項３の半導体装置において、
前記ベクトル命令は、前記右または左のシフトと、前記比較条件と、並列に演算する要素数と、を明示的に指定することが可能であり、前記汎用レジスタまたは前記専用レジスタは暗黙的に指定されるよう構成される。
【請求項５】
請求項４の半導体装置において、
さらに、第３のベクトルレジスタを有し、
前記ベクトル命令は、前記演算結果を前記第３のベクトルレジスタに格納する命令である。
【請求項６】
請求項５の半導体装置において、
Ｎは１から４であり、１要素は３２ビットの幅であり、
前記第１、第２および第３のベクトルレジスタはそれぞれ１２８ビットの幅であり、
前記汎用レジスタおよび前記専用レジスタは３２ビットの幅であり、
前記データ処理装置は、４個のベクトル命令を連続実行するごとに前記スカラ命令を実行するよう構成される。
【請求項７】
請求項２の半導体装置において、
前記Ｎ個の付加情報はＮビットの幅であり、
前記汎用レジスタおよび前記専用レジスタは、Ｍビット（Ｎ×２以上の自然数）の幅であり、
前記データ処理装置は、Ｍ÷Ｎ以下の数のベクトル命令を連続実行して、それぞれのベクトル命令の実行で生成された付加情報を、前記汎用レジスタまたは前記専用レジスタに順次格納することで全て保持し、前記汎用レジスタまたは前記専用レジスタに保持された前記付加情報に基づいて前記スカラ命令を実行するよう構成される。
【請求項８】
請求項２の半導体装置において、さらに、
前記付加情報を連結する第１の連結回路と、
前記汎用レジスタまたは前記専用レジスタの内容を右または左にシフトするシフト回路と、
前記第１の連結回路の出力と前記シフト回路の出力とを連結する第２の連結回路と、
を備える。
【請求項９】
請求項８の半導体装置において、
前記専用レジスタはデータの読む込みと書込みが並列して行うことが可能であるよう構成される。
【請求項１０】
請求項９の半導体装置において、
前記スカラ命令は前記専用レジスタの内容を前記汎用レジスタに転送する命令および前記汎用レジスタの下位ビットまたは上位ビットから最初に１または０がある場所を検出する命令を含む。
【請求項１１】
半導体装置は、
ベクトル命令およびスカラ命令を実行可能な中央処理装置と、
前記ベクトル命令および前記スカラ命令を格納可能な記憶装置と、
を備え、
前記中央処理装置は、
第１、第２および第３のベクトルレジスタと、
汎用レジスタと、
専用レジスタと、
を備え、
前記ベクトル命令は、第１のベクトルレジスタの内容と第２のベクトルレジスタの内容とを要素ごとに比較し、比較結果を前記第３のベクトルレジスタに格納し、要素ごとの比較結果に基づく付加情報を連結し、前記汎用レジスタまたは前記専用レジスタの内容を右または左にシフトし、シフトによって空いた部分に連結した付加情報を挿入して、前記汎用レジスタまたは前記専用レジスタに前記付加情報を蓄積する命令であり、
前記中央処理装置は、１度目のベクトル命令の実行で、第１の連結した付加情報を前記汎用レジスタまたは前記専用レジスタに保存し、前記１度目の実行に連続する２度目の前記ベクトル命令の実行で、第２の連結した付加情報を前記汎用レジスタまたは前記専用レジスタにさらに保存し、前記第１の連結した付加情報および前記第２の連結した付加情報に基づいて前記スカラ命令を実行するよう構成される。
【請求項１２】
請求項１１の半導体装置において、
前記第１、第２および第３のベクトルレジスタはそれぞれＮ個の要素を格納可能であり、
前記中央処理装置は前記Ｎ個の要素の比較を並列に実行可能であり、Ｎ個の付加情報を生成するよう構成される。
【請求項１３】
請求項１１の半導体装置において、
Ｎは１から４であり、１要素は３２ビットの幅であり、
前記第１、第２および第３のベクトルレジスタはそれぞれ１２８ビットの幅であり、
前記汎用レジスタおよび前記専用レジスタは３２ビットの幅であり、
前記中央処理装置は、４個のベクトル命令を連続実行するごとに前記スカラ命令を実行するよう構成される。
【請求項１４】
請求項１２の半導体装置において、
前記Ｎ個の付加情報はＮビットの幅であり、
前記汎用レジスタおよび前記専用レジスタは、Ｍビット（Ｎ×２以上の自然数）の幅であり、
前記中央処理装置は、Ｍ÷Ｎ以下の数のベクトル命令を連続実行して、それぞれのベクトル命令の実行で生成された付加情報を、前記汎用レジスタまたは前記専用レジスタに順次格納することで全て保持し、前記汎用レジスタまたは前記専用レジスタに保持された前記付加情報に基づいて前記スカラ命令を実行するよう構成される。
【請求項１５】
請求項１２の半導体装置において、
前記付加情報は比較結果に基づくフラグであり、比較条件に合致する場合１または０になり、比較条件に合致しない場合は０または１になる。
【請求項１６】
請求項１５の半導体装置において、
前記ベクトル命令は、前記右または左のシフトと、前記比較条件と、並列に演算する要素数と、を明示的に指定することが可能であり、前記汎用レジスタまたは前記専用レジスタは暗黙的に指定されるよう構成される。
【請求項１７】
請求項１６の半導体装置において、さらに、
前記付加情報を連結する第１の連結回路と、
前記汎用レジスタまたは前記専用レジスタの内容を右または左にシフトするシフト回路と、
前記第１の連結回路の出力と前記シフト回路の出力とを連結する第２の連結回路と、
を備える。
【請求項１８】
請求項１７の半導体装置において、
前記専用レジスタはデータの読む込みと書込みが並列して行うことが可能であるよう構成される。
【請求項１９】
請求項１１の半導体装置において、
前記スカラ命令は前記専用レジスタの内容を前記汎用レジスタに転送する命令および前記汎用レジスタの下位ビットまたは上位ビットから最初に１または０がある場所を検出する命令を含む。
【請求項２０】
請求項１９の半導体装置において、
前記中央処理装置は、
前記ベクトル命令を実行するベクトル演算ユニットと、
前記スカラ命令を実行するスカラ演算ユニットと、
を備える。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は半導体装置に関し、例えばベクトル命令を実行するＣＰＵを内蔵する半導体装置に適用することができる。
【背景技術】
【０００２】
文字列を処理するために２つのパック化演算対象のデータ要素の各々を比べる単一命令複数データ（ＳＩＭＤ：Single Instruction Multiple Data）命令がある（例えば、米国特許出願公開第２００８／００７７７７３号明細書）。ＳＩＭＤ命令はベクトル命令とも呼ばれるので、以下、本開示ではベクトル命令という。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】米国特許出願公開第２００８／００７７７７３号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００４】
配列の中のデータ探索等において、配列の大きさが１つのベクトル命令で扱う要素数を越える場合、ベクトル命令の間にスカラ命令を挟む必要があり、ベクトル命令を効率的に活用することができない。
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【０００５】
本開示のうち、代表的なものの概要を簡単に説明すれば、下記のとおりである。
すなわち、ベクトル命令は、演算結果と別に付加情報を生成し、付加情報をベクトルレジスタとは異なるレジスタに蓄積する。
【発明の効果】
【０００６】
本開示によれば、ベクトル命令を効率的に活用することができる。
【図面の簡単な説明】
【０００７】
【図１】実施形態に係るベクトル命令を説明するためのブロック図。
【図２】実施例１に係る半導体装置を説明するためのブロック図。
【図３】実施例１に係るベクトル命令を説明するためのブロック図。
【図４】挿入動作を説明するための図。
【図５】挿入動作を説明するための図。
【図６】図３の専用回路の動作を説明するためのブロック図。
【図７】比較例に係るベクトル命令を説明するためのブロック図。
【図８】比較例に係るベクトル命令を用いて連続する配列での比較動作を説明するための図。
【図９】実施例１に係るベクトル命令を用いて連続する配列での比較動作を説明するための図。
【図１０】実施例２に係るベクトル命令を説明するためのブロック図。
【図１１】図１０の専用レジスタを説明するためのブロック図。
【図１２】比較例に係るベクトル命令を用いた場合のアルゴリズムを実行する命令の構造を説明するためのブロック図。
【図１３】比較例に係るベクトル命令を用いてアルゴリズムを実行した場合の実行過程を説明するためのブロック図。
【図１４】実施例２に係るベクトル命令を用いた場合のアルゴリズムを実行する命令の構造を説明するためのブロック図。
【図１５】実施例２に係るベクトル命令を用いてアルゴリズムを実行した場合の実行過程を説明するためのブロック図。
【発明を実施するための形態】
【０００８】
以下、実施形態および実施例について、図面を用いて説明する。ただし、以下の説明において、同一構成要素には同一符号を付し繰り返しの説明を省略することがある。
【０００９】
＜実施形態＞
図１は実施形態に係るベクトル命令を説明するための図である。実施形態に係るベクトル命令はベクトルレジスタでの演算を行うベクトル命令で、ベクトル命令はＮ個分のデータを同時に演算する。このとき、ベクトル命令はＮ個の演算結果を生成すると共に、その演算結果に応じて、演算結果を補助するような情報（演算結果のフラグや比較結果などの付加情報）を生成する。
【００１０】
実施形態に係るベクトル命令は第１のベクトルレジスタ（ＷＲ[ｗｒｅｇ１]）の内容と第２のベクトルレジスタ（ＷＲ[ｗｒｅｇ２]）の内容とを演算し、演算結果を第３のベクトルレジスタ（ＷＲ[ｗｒｅｇ３]）に格納し、その演算結果とは別に、付加情報（ＣＣ）を生成し、ベクトルレジスタ（ＷＲ）１０１とは別の付加情報（ＣＣ）を格納するレジスタ（ＭＰＸＣＣ）１０４に蓄積する命令である。演算結果は、必ずしもベクトルレジスタ（ＷＲ）１０１に格納される必要はない。また、演算結果は第３のベクトルレジスタ（ＷＲ[ｗｒｅｇ３]）に格納されるのではなく、第１のベクトルレジスタ（ＷＲ[ｗｒｅｇ１]）または第２のベクトルレジスタ（ＷＲ[ｗｒｅｇ２]）に格納されてもよい。ベクトルレジスタ（ＷＲ）１０１のそれぞれはＮ個の要素（ｗ０，ｗ１，・・・，ｗ（Ｎ−１））を格納する。
【００１１】
実施形態に係るベクトル命令を実行するデータ処理装置は、ベクトルレジスタ（ＷＲ）１０１とベクトルレジスタ（ＷＲ）１０１の内容を演算するＮ個の演算器（ＡＬＵ）１０２と専用回路１０３とレジスタ（ＭＰＸＣＣ）１０４とを備える。Ｎ個の演算器（ＡＬＵ）１０２はそれぞれ付加情報要素（ｃｃ０，ｃｃ１，・・・，ｃｃ（Ｎ−１））を生成する。付加情報要素（ｃｃ０，ｃｃ１，・・・，ｃｃ（Ｎ−１））は専用回路１０３で連結され、付加情報（ＣＣ）となる。連結とは、任意の複数のビットやビット列を結合し、一つのビット列と扱うことをいう。付加情報要素（ｃｃ０，ｃｃ１，・・・，ｃｃ（Ｎ−１））がｍビットならば、付加情報（ＣＣ）はＮ＊ｍビットになる。専用回路１０３は、レジスタ（ＭＰＸＣＣ）１０４の既存の内容を右または左にシフトした上で、空いたビット領域に付加情報（ＣＣ）を挿入する。言い換えると、レジスタ（ＭＰＸＣＣ）に格納する付加情報（ＣＣ）は、レジスタ（ＭＰＸＣＣ）１０４の内容を全て上書きするのではない。レジスタ（ＭＰＸＣＣ）１０４の幅をＬビットとすると、Ｌ／（Ｎ＊ｍ）個の付加情報（ＣＣ）をレジスタ（ＭＰＸＣＣ）１０４に格納することができる。実施形態に係るベクトル命令は、一命令で演算可能なデータ数を越えた場合でも、ベクトル命令を連続で実行するだけで付加情報をレジスタに蓄積することができる。
【００１２】
以下、付加情報（ＣＣ）を格納するレジスタを付加情報格納レジスタ（ＭＰＸＣＣ）といい、ＭＰＸＣＣは通常の算術演算に利用される汎用レジスタを用いてもよいし、専用レジスタを用いてもよい。なお、演算結果のデータは、例えば８ビットから６４ビットまで等、ベクトル命令の種類に応じて様々である。Ｎ個の演算毎に生成されるｍビットの付加情報は、フラグであれば通常２〜３ビット、比較演算の結果であれば１ビットである。
【実施例１】
【００１３】
図２は実施例１に係る半導体装置の構成を示すブロック図である。実施例１に係る半導体装置１００は一つの半導体基板上にデータ処理装置である中央処理装置（ＣＰＵ）１と記憶装置（メモリ）２とを備える。ＣＰＵ１はベクトル演算（ＳＩＭＤ演算）を実行することができるユニットを保持している。命令フェッチユニット１２はメモリ２から命令をフェッチし、命令発行ユニット１３はフェッチした命令をベクトル演算ユニット１１に渡し、ベクトル演算ユニット１１がその命令を実行する。ＣＰＵ１はベクトル演算ユニット１１以外に、標準的な命令を実行するためのスカラ演算ユニット１４やメモリ２をアクセスするメモリアクセスユニット１５を持つ。ベクトル演算ユニット１１はスカラ演算ユニット１４およびメモリアクセスユニット１５と接続されており、データの授受やメモリアクセスの代行などを依頼する。メモリ２はベクトル演算ユニット１１で実行されるベクトル命令およびスカラ演算ユニット１４で実行されるスカラ命令を格納する。ベクトルレジスタ１１１を用いる命令をベクトル命令ともいい、汎用レジスタ１６を用いる命令をスカラ命令ともいう。なお、汎用レジスタ１６は、例えば３２ビット幅のレジスタを３２本（ＧＲ［０］〜ＧＲ［３１］）備える。
【００１４】
ＣＰＵ１は、演算の途中結果を格納するための汎用レジスタ１６以外に、ＣＰＵ１の制御情報やアクセス権限を管理するためのシステムレジスタ１７を備える。ベクトル演算ユニット１１もシステムレジスタ１７を保持しており、通常はベクトル演算の設定情報や、フラグの内容などを保持する。通常命令は汎用レジスタ１６をアクセスすることができるが、システムレジスタ１７をアクセスすることはできない。システムレジスタアクセス命令を使うことにより汎用レジスタ１６の内容をシステムレジスタ１７に転送したり、システムレジスタ１７の値を汎用レジスタ１６に転送したりすることができる。メモリ２はキャッシュメモリ等の揮発性メモリまたはフラッシュメモリ等の電気的に書き換え可能な不揮発性メモリで構成される。
【００１５】
図３は実施例１に係るベクトル命令の機能を説明するためのブロック図である。ベクトル演算ユニット１１はベクトルレジスタ（ＷＲ）１１１と演算器（ＡＬＵ）１１２と回路１１３とを備える。ベクトルレジスタ（ＷＲ）１１１のそれぞれは４個の要素（ｗ０，ｗ１，ｗ２，ｗ３）を格納する。したがって、ベクトル演算ユニット１１はベクトルレジスタ（ＷＲ）１１１の内容を演算する演算器（ＡＬＵ）１１２も４個備える。４個の演算器（ＡＬＵ）１１２はそれぞれ付加情報要素（ｃｃ０，ｃｃ１，ｃｃ２，ｃｃ３）を生成する。付加情報要素（ｃｃ０，ｃｃ１，ｃｃ２，ｃｃ３）は専用回路１１３で連結され、付加情報（ＣＣ）となる。付加情報（ＣＣ）は４ビットである。専用回路１１３は、ＭＰＸＣＣである汎用レジスタ（ＧＲ［１］）１１４の既存の内容を右または左にシフトした上で、空いたビット領域に付加情報（ＣＣ）を挿入する。言い換えると、汎用レジスタ（ＧＲ［１］）１１４に格納する付加情報（ＣＣ）は、汎用レジスタ（ＧＲ［１］）１１４の内容を全て上書きするのではない。汎用レジスタ（ＧＲ［１］）１１４の幅を３２ビットとすると、３２／４＝８個の付加情報（ＣＣ）を汎用レジスタ（ＧＲ［１］）１１４に格納することができる。本実施例ではＭＰＸＣＣとして汎用レジスタのうちのＧＲ［１］を使用しているが、これに限定されるものではなく、汎用レジスタであればどのレジスタであってもよい。
【００１６】
実施例１に係るベクトル命令は、２つのベクトルレジスタを用いて演算を行い、その演算結果をベクトルレジスタに書き込むとともに、その演算結果に応じて、演算結果を補助するような付加情報を出力する命令であり、例えば以下に示すような命令である。
ｃｍｐ１．Ｎ  ｏｒｄｅｒ，ｃｏｎｄ，ｗｒｅｇ１，ｗｒｅｇ２，ｗｒｅｇ３
実施例に係るベクトル命令はベクトルレジスタ（ｗｒｅｇ１）の内容とベクトルレジスタ（ｗｒｅｇ２）の内容を比較して、その結果をベクトルレジスタ（ｗｒｅｇ３）に格納するとともに、暗黙的に指定される汎用レジスタ（ＧＲ［１］）１１４に付加情報を格納する。実施例に係るベクトル命令は、比較結果が不一致の場合は０を、比較結果が一致の場合はすべて１を、ｗｒｅｇ３に格納する。ｗｒｅｇ１、ｗｒｅｇ２、ｗｒｅｇ３は１２８ビット長であり、Ｎ（＝１、２、４）個のデータに分割される。Ｎ＝１の場合はベクトルレジスタの最下位ワードのｗ０を使用し、Ｎ＝２の場合はベクトルレジスタの下位２ワードのｗ１、ｗ０が使用され、Ｎ＝４の場合はベクトルレジスタの全体のｗ３、ｗ２、ｗ１、ｗ０が使用される。１ワードは３２ビットであり、ｗ３、ｗ２、ｗ１、ｗ０はそれぞれ３２ビットである。実施例に係るベクトル命令は、比較の結果、Ｎビットの付加情報（ＣＣ）を生成し、汎用レジスタ（ＧＲ［１］）１１４に挿入する。ここでＮビットの付加情報（ＣＣ）の挿入は、まず汎用レジスタ（ＧＲ［１］）の値がＮビット右または左にシフトされ、空いた部分に付加情報（ＣＣ）が格納されることにより行われる。このとき、「ｏｒｄｅｒ」によって、汎用レジスタ（ＧＲ［１］）に対して、付加情報（ＣＣ）を上位から挿入（右シフト）するか、下位から挿入（左シフト）するかが指定される。これによりアドレス上位からの検索とアドレス下位からの検索を可能とする。なお、図３では右にシフトする場合を示している。「ｃｏｎｄ」によって、付加情報のセット条件（＝、＞、＜、≧、≦、≠等）が指定される。
【００１７】
図４および図５は挿入動作を説明する図である。図４はレジスタの下位からデータが挿入される場合であり、図５はレジスタの上位からデータが挿入される場合である。Ｌビットのレジスタ（sysreg（ＧＲ［１］））に対してｎビットのデータ挿入が行われる場合、具体的な動作を、Verilog-HDL風の記述で示すと下記のとおりである。
レジスタの下位から挿入される場合（図４）：
sysreg[L-1: 0] <= {sysreg[L-n: 0], FLAG[n-1: 0]}
レジスタの上位から挿入される場合（図５）：
sysreg[L-1: 0] <= {FLAG[ 0:n-1], sysreg[L-n: 0]}
レジスタの下位からデータが挿入される場合、図４に示すように、Ｌビットのレジスタ（sysreg）の内容がｎビット左にシフトされ、ｎビットの情報（FLAG）がsysregの下位に格納される。sysregの下位（Ｌ−ｎ）ビットとｎビットのFLAGとが連結され、sysregの上位ｎビットは破棄される。レジスタの上位からデータが挿入される場合、図５に示すように、Ｌビットのレジスタの内容がｎビット右にシフトされ、ｎビットのFLAGがレジスタの上位に格納される。ｎビットのFLAG とsysregの上位（Ｌ−ｎ）ビットとが連結され、sysregの下位ｎビットは破棄される。
【００１８】
汎用レジスタ（ＧＲ［１］）１１４に付加情報を格納するための回路である専用回路１１３について説明する。図６は図３の専用回路の動作を説明するためのブロック図である。実施例に係るベクトル命令は、演算の結果生成された付加情報要素（ｃｃ［３：０］）を連結回路１１３１で連結して付加情報（ＣＣ）を生成し、汎用レジスタ（ＧＲ［１］）１１４に格納している。汎用レジスタＧＲ［１］）１１４に付加情報（ＣＣ）が格納されるためには、一度格納先の汎用レジスタ（ＧＲ［１］）１１４からデータパス１１５を介してレジスタ値が読み込まれ、シフタ１１３２でシフト処理が行われ、連結回路１１３３で付加情報（ＣＣ）の挿入が行われ、その結果の値が汎用レジスタ（ＧＲ［１］）１１４へデータパス１１６を介して書き戻される。シフタ１１３２は「ｏｒｄｅｒ」によって指定される方向（右または左）に「Ｎ」で指定される固定値（例えば４ビット）分データをシフトする。
【００１９】
＜比較例＞
次に、本願発明者が本開示に先立って検討した技術（以下、比較例という。）について説明する。図７は比較例に係るベクトル命令について説明するためのブロック図である。比較例に係るベクトル命令は、２つのベクトルレジスタを用いて演算を行い、その演算結果をベクトルレジスタに書き込むとともに、その演算結果に応じて、演算結果を補助するような情報（演算結果のフラグ、比較結果などの付加情報を処理してインデックス）を出力する命令であり、例えば以下に示すような命令である。
ｃｍｐ３.Ｎ  ｏｒｄｅｒ，ｃｏｎｄ，ｗｒｅｇ１，ｗｒｅｇ２，ｗｒｅｇ３
比較例に係るベクトル命令は、ベクトルレジスタ（ｗｒｅｇ１）とベクトルレジスタ（ｗｒｅｇ２）の中身を文字列として、ｗｒｅｇ１とｗｒｅｇ２の各要素を比較し、その結果をベクトルレジスタ（ｗｒｅｇ３）に格納するとともに、比較結果が成立した最上位／最下位ビットの位置（付加情報）を算出して汎用レジスタ（暗黙的に指定されるレジスタで例えばＧＲ［１］）に格納する命令である。つまり、比較例に係るベクトル命令は、比較が初めて成立したビットの位置（結果の位置情報）を汎用レジスタに格納する。
【００２０】
ある配列の中から、条件を満たすデータを探すために、比較結果の付加情報を汎用レジスタに移動させることでシーケンシャルな処理に変換されており、探索に時間がかかる。具体的には、下記に示すような昇順または降順に配置された配列からある境界値を越えた場所を探索する第１のアルゴリズムを、比較例に係るベクトル命令を用いて実現することを考える。なお、本開示では、疑似コードを用いてアルゴリズムを記述する。本疑似コードは、Ｃ言語を基本に記載している。先頭が”//”で始まる文はコメントである。
for (i = 0; i < M; i++) {
// array[]は探索する配列、borderは探索すべき境界
if (border > array[i]) return i;
}  
図７に示すように、比較例に係るベクトル命令はベクトルレジスタ３１１の内容を文字列として捉え、ベクトル演算器３１２を用いて比較を実行し、その結果を専用回路３１３の連結回路３１３１によって集める。次に、専用回路３１３のインデックス生成回路３１３２は、比較結果の付加情報のビット列でビットが１となった最上位ビットの位置を算出し、インデックスを生成する。そして、その結果は汎用レジスタ（ＧＲ［１］）３１４に格納される。また、比較が成立したベクトル要素が１つも存在しない場合、汎用レジスタ（ＧＲ［１］）３１４には特別な数値が書き込まれる。比較対象とする文字がベクトルレジスタ３１１中に存在していたかどうかの確認は、比較例に係るベクトル命令を実行後、汎用レジスタ（ＧＲ［１］）３１４を読み取り、汎用レジスタ（ＧＲ［１］）３１４が、比較成立したベクトル要素が一つも存在しないことを示す特別な数値であるかをチェックすることにより行われる。この結果を元に次の文字列をベクトルレジスタ３１１に読み込み比較するかが決められる。これらの処理はスカラ命令を用いて行われる。
【００２１】
このように比較例に係るベクトル命令を利用した場合、比較結果の付加情報から生成される情報はインデックスの情報になっているため、一度の比較毎に汎用レジスタを参照し、探索が成功したか否かが確認される必要がある。つまり、比較例に係るベクトル命令が同時に４個の比較を実行することができる場合（Ｎ＝４の場合）、アルゴリズムとしては、４個に１回、該当する値が４個の配列中に存在するかをチェックしていることになる。比較例に係るベクトル命令では、インデックスが汎用レジスタに格納されるため、比較命令、分岐命令などのスカラ命令が必要になり、ベクトル命令とスカラ命令が混在し、パイプラインを効率的に活用できない。もし汎用レジスタの内容の確認が行わずに連続して比較例に係るベクトル命令が実行された場合、汎用レジスタの内容は上書きされ、過去のベクトル命令の比較結果の付加情報は引き継がれなくなる。
【００２２】
すなわち、比較例に係るベクトル命令を利用した場合、下記のステップを踏む必要がある。
ステップ１：ＡＮＳ＝０とする。ＡＮＳは探索文字のインデックスを示す任意の汎用レジスタである。
ステップ２：比較例に係るベクトル命令を実行する。
ステップ３：ＧＲ［１］＝４をチェックする。ＧＲ［１］＝４ならば、ＡＮＳ＝ＡＮＳ＋ＧＲ［１］を実行後、ステップ４へ移動する。ＧＲ［１］≠４ならばステップ５へ移動する。ＧＲ［１］＝４は特殊数値で、比較対象の値が存在しなかったことを示す。
ステップ４：次の文字列をベクトルレジスタにロードし、ステップ２へ移動する。
ステップ５：終了。ＡＮＳ＝ＡＮＳ＋ＧＲ［１］が探索文字のインデックスになる。
【００２３】
上記のように、比較例に係るベクトル命令では、ベクトル命令以外に多くのスカラ命令が必要である。このようにインデックスの探索のために多くの命令が必要になってしまう原因は、比較例に係るベクトル命令は、前のベクトル命令の比較結果の付加情報を引き継がないため、比較例に係るベクトル命令の比較を実行する毎にスカラ命令によってチェックを行なわなければならない。
【００２４】
また、比較例に係るベクトル命令では、インデックスの格納先を汎用レジスタとしているため、ベクトル命令の結果を取り出してチェックするためには、ベクトル命令によるインデックスの付加情報を汎用レジスタへ書き込み後、スカラ命令による付加情報を汎用レジスタから読み出して演算する必要があり、Read After Write（ＲＡＷ）ハザードを解決するために待ち合わせ（パイプラインインストール）が発生してしまう。これにより、比較例に係るベクトル命令では、ベクトル命令により比較自身の高速化は果せるものの、実際のアルゴリズムに適用した場合に、効率的にＣＰＵのパイプラインを使えているとは言えない。
【００２５】
実施例１に係る命令では、１命令につきベクトル演算器の数（Ｎ個の演算を同時に実行できるならば、Ｎビット）だけレジスタに結果を挿入することができるようになる。また、ベクトル演算器が４並列でベクトル命令の比較を実行した場合、ベクトル要素毎に１ビット、合計４ビットの比較結果の付加情報が生成される。一方で汎用レジスタ（ＧＲ［１］）１１４の幅は３２ビットである。これにより、汎用レジスタ（ＧＲ［１］）１１４が全て埋まるまで（３２要素分の比較を実行するまで）、ベクトル命令による比較を連続して実行できる。すなわち、演算器１１２の並列数が４であり、汎用レジスタのビット数が３２ビットである場合、３２／４＝８回分ベクトル命令を実行しても、汎用レジスタ（ＧＲ［１］）内で結果が溢れることがない。一方、比較例に係るベクトル命令は、１命令を実行後すぐに演算結果の判定用のスカラ命令を挿入する必要がある。このため、実施例１に係るベクトル命令は、ベクトル演算命令を連続して実行できる分、比較例に係るベクトル命令よりも効率的に配列内を探索可能である。
【００２６】
例として、
配列Ａ＝[0,4,5,10,12,8,16,27,9,1,5,8,1,0,1,1]と、
配列Ｂ＝[1,3,7,9,15,9,20,13,11,0,3,1,9,0,0,0]と、
を比較例に係るベクトル命令を用いて比較する場合と、実施例に係るベクトル命令を用いて比較する場合について説明する。ベクトル命令の並列度は４とすると、それぞれの配列を４エレメント（要素）ずつロードしていき比較する。このとき、付加情報格納レジスタである汎用レジスタ（ＧＲ［１］）は初期値０であるとし、Ａ［ｉ］＜Ｂ［ｉ］ならばフラグ（付加情報要素）は１、それ以外ならばフラグは０とする。
【００２７】
図８は比較例に係るベクトル命令を用いて連続する配列での比較動作を説明するための図である。比較例に係るベクトル命令を用いて比較をするならば、配列Ａ、Ｂを４要素ずつロードし、最初に比較条件が成立したインデックスを返すことになる。以下、詳細に説明する。
（１）最初の４要素である A=[0,4,5,10], B=[1,3,7,9] がベクトルレジスタにロードされ、比較が実行される。第１要素はベクトルレジスタの最下位ワードに第４要素は最上位ワードに格納される。したがって、wreg1=[10,5,4,0]、wreg2=[9,7,3,1]となり、最下位ワードは比較条件が成立するので、比較結果の付加情報（インデックス）=0となる。
（２）比較結果がベクトルレジスタに格納される。wreg3=[0x0000_0000, 0xffff_ffff, 0x0000_0000, 0xffff_ffff] となる。ここで、「0x」は１６進数であることを示す。
（３）汎用レジスタ（ＧＲ［１］）に付加情報（インデックス）の0が格納される。ここでは、GR[1]=0000_0000_0000_0000 となる。
（４）次の配列Ａ、Ｂについて上記（１）〜（３）を繰り返す。
【００２８】
第２番目の４要素は、A=[12,8,16,27], B=[15,9,20,13]であるので、wreg1=[27,16,8,12]、wreg2=[13,20,9,15]であり、最下位ワードは比較条件が成立するので、インデックス=0, GR[1]=0x0000となる。
第３番目の４要素は、A=[9,1,5,8], B=[11,0,3,1,]であるので、wreg1=[8,5,1,9]、wreg2=[1,3,0,13]であり、最下位ワードは比較条件が成立するので、インデックス=0, GR[1]=0x0000となる。
第４番目の４要素は、A=[11,0,1,1],B=[9,0,0,0] であるので、wreg1=[1,1,0,11]、wreg2=[0,0,0,9]であり、いずれのワードも比較条件が成立しないので、インデックス=4, GR[1]=0x0004となる。
【００２９】
上述したように、付加情報格納レジスタ（ＧＲ［１］）の値は常に更新され、前の比較結果の付加情報は残らない。したがって、ベクトル演算による比較を行った直後に、付加情報格納レジスタ（ＧＲ［１］）の値をチェックする必要がある。なお、比較例に係るベクトル命令は最初に比較条件が成立した要素のインデックスを返すため、比較条件が成立した要素より後の要素の比較結果は付加情報格納レジスタ（ＧＲ［１］）に反映されない。
【００３０】
図９は実施例１に係るベクトル命令を用いて連続する配列での比較動作を説明するための図である。実施例１に係るベクトル命令では、比較結果の付加情報はビット列として表現され、その結果は付加情報格納レジスタである汎用レジスタ（ＧＲ［１］）に上または下からプッシュされる。以下、詳細に説明する。
（１）最初の４要素である A=[0,4,5,10], B=[1,3,7,9] がベクトルレジスタにロードされ、比較が実行される。第１要素はベクトルレジスタの最下位ワードに第４要素は最上位ワードに格納される。したがって、wreg1=[10,5,4,0]、wreg2=[9,7,3,1]、比較結果の付加情報（フラグ）=[0,1,0,1] となる。
（２）比較結果がベクトルレジスタに格納される。wreg3=[0x0000_0000, 0xffff_ffff, 0x0000_0000, 0xffff_ffff] となる。ここで、「0x」は１６進数であることを示す。
（３）付加情報格納レジスタ（ＧＲ［１］）の内容が右にシフトされ、ＧＲ［１］にフラグの４ビット[0,1,0,1]が挿入される。ここでは、ＧＲ［１］の上位から付加情報が挿入されていき、GR[1]=0101_0000_0000_0000 となる。
（４）次の配列Ａ、Ｂについて上記（１）〜（３）を繰り返す。
【００３１】
第２番目の４要素は、A=[12,8,16,27], B=[15,9,20,13]であるので、wreg1=[27,16,8,12]、wreg2=[13,20,9,15]であり、フラグ=[0,1,1,1], GR[1]=0111_0101_0000_0000となる。
第３番目の４要素は、A=[9,1,5,8], B=[11,0,3,1,] であるので、wreg1=[8,5,1,9]、wreg2=[1,3,0,13]であり、フラグ=[0,0,0,1], GR[1]=0001_0111_0101_0000となる。
第４番目の４要素は、A=[11,0,1,1],B=[9,0,0,0] であるので、wreg1=[1,1,0,11]、wreg2=[0,0,0,9]であり、フラグ=[0,0,0,0], GR[1]=0000_0001_0111_0101となる。
【００３２】
上記の動作により、付加情報格納レジスタ（ＧＲ［１］）に格納される値は１６進数で0x1175 であり、それぞれの比較結果の付加情報の値を示している。
【００３３】
上述したように、実施例１に係るベクトル命令では、前のベクトル命令の比較結果の付加情報は、レジスタ幅の限界により押し出されるまで付加情報格納レジスタ中に保持される。従って、ベクトル命令を連続実行しても、付加情報格納レジスタにその結果が保持できる範囲では、比較結果の付加情報を保存しておくことができる。比較例に係るベクトル命令は、前のベクトル命令の比較結果の付加情報を引き継がないが、実施例１に係るベクトル命令は、付加情報格納レジスタ（ＧＲ［１］）１１４に付加情報を蓄積するため、付加情報格納レジスタ（ＧＲ［１］）１１４が溢れない限り前のベクトル命令の結果を引き継ぐことができる。
【００３４】
実施例１に係るベクトル命令は、ベクトル命令の演算結果と別に付加情報を生成し、ベクトルレジスタとは異なるレジスタに挿入することで、ベクトル命令で並列に実行可能なデータ数を越えた場合でも、ベクトル命令を連続で実行するだけで結果をレジスタに蓄積することができる。これにより、比較例にようにベクトル命令を１命令実行する毎にスカラ命令によってフラグなどの結果を確認する必要がなく、付加情報格納レジスタが一杯になるまでベクトル命令を実行し、最後に付加情報格納レジスタの確認を行うだけで済む。
【実施例２】
【００３５】
実施例１に係るベクトル命令では、汎用レジスタ（ＧＲ［１］）で付加情報（ＣＣ）のレジスタへの挿入を実現するためには、汎用レジスタ（ＧＲ［１］）の読み出しと書き込みが必要になり、汎用レジスタの待ち合わせが必要になる。すなわち、実施例１に係るベクトル命令が連続する場合、ＲＡＷハザードを解決するために待ち合わせが発生してしまう。そこで、実施例２に係るベクトル命令では、付加情報を格納するための専用レジスタと専用回路を持たせる。
【００３６】
図１０は実施例２に係るベクトル命令を説明するためのブロック図である。図１１は図１０の専用レジスタを説明するためのブロック図である。実施例２に係るベクトル命令を実行する半導体装置は、実施例１に係る半導体装置とベクトル演算ユニットの構成が異なるが、それ以外は実施例１と同様である。実施例２に係るベクトル演算ユニット１１Ａの専用回路１１３が専用回路２１３に接続されている点および専用回路２１３が汎用レジスタ１６に接続されている点を除き、実施例１に係るベクトル演算ユニット１１と同様である。なお、専用回路２１３はベクトル演算ユニット１１Ａの外にあってもよい。専用回路２１３は専用レジスタ（ＳＲ）２１４とセレクタ２１７を備える。
【００３７】
実施例２に係るベクトル命令は、２つのベクトルレジスタを用いて演算を行い、その演回路結果をベクトルレジスタに書き込むとともに、その演算結果に応じて、演算結果を補助するような付加情報を出力する命令であり、例えば以下に示すような命令である。
ｃｍｐ２．Ｎ  ｏｒｄｅｒ，ｃｏｎｄ，ｗｒｅｇ１，ｗｒｅｇ２，ｗｒｅｇ３
実施例２に係るベクトル命令はベクトルレジスタ（ｗｒｅｇ１）の内容とベクトルレジスタ（ｗｒｅｇ２）の内容を比較して、その結果をベクトルレジスタ（ｗｒｅｇ３）に格納するとともに、暗黙的に指定される専用レジスタ（ＳＲ）に付加情報を格納する。実施例２に係るベクトル命令は付加情報の格納先を除き、実施例１に係るベクトル命令と同様である。
【００３８】
実施例２に係るベクトル命令は、演算の結果生成された付加情報要素（ｃｃ［３：０］）を連結回路１１３１で連結して付加情報（ＣＣ）を生成し、専用レジスタ（ＳＲ）２１４に格納する。専用レジスタ（ＳＲ）２１４に付加情報（ＣＣ）が格納されるためには、一度格納先の専用レジスタ（ＳＲ）２１４からデータパス２１５を介してレジスタ値が読み込まれ、シフタ１１３２でシフト処理が行われ、連結回路１１３３で付加情報（ＣＣ）の挿入が行われ、その結果の値が専用レジスタ（ＳＲ）２１４へデータパス２１６を介して書き戻される。シフタ１１３２は「ｏｒｄｅｒ」によって指定される方向（右または左）に「Ｎ」で指定される固定値（例えば４ビット）分データをシフトする。
【００３９】
専用レジスタ（ＳＲ）２１４は、システムレジスタ１７と同様に専用レジスタを読み書きする命令（専用レジスタから汎用レジスタに移動する命令、または汎用レジスタから専用レジスタに移動する命令）により読み書きされる。専用レジスタ（ＳＲ）２１４は３２ビット幅のデータを同一サイクルの間に読み書きする回路を持っている。したがって、専用レジスタ（ＳＲ）２１４はデータパス２１５からのデータの読み出しとデータパス２１８からのデータの書込みを並列して行うことができるので、ベクトル命令が連続した場合のＲＡＷハザードを発生することなく、レジスタの更新が可能となる。
【００４０】
また、付加情報を取り出してチェックするためには、実施例２に係るベクトル命令の直後に専用レジスタから汎用レジスタに移動する命令を実行することになる。専用レジスタ（ＳＲ）２１４はデータパス２２０からのデータの読み出しとデータパス２１８からのデータの書込みを並列して行うことができるので、ＲＡＭハザードを発生することなく、汎用レジスタ１６にデータを読み出すことが可能となる。なお、汎用レジスタから専用レジスタに移動する命令により、データがデータパス２１９、セレクタ２１７、データパス２１８を介して専用レジスタ（ＳＲ）２１４に書き込まれる。
【００４１】
次に、上記した昇順または降順に配置された配列から、ある境界値を越えた場所（インデックス）を探索する第１のアルゴリズムを考える。
【００４２】
上記第１のアルゴリズムを実現するためには、非ベクトル命令を利用して、配列の要素を一つ一つ比較するか、ベクトル命令を用いて、複数の要素を同時に比較する方法が存在する。配列の要素を一つ一つ比較する方法は、非ベクトル命令（ベクトルレジスタを参照せず、基本的に汎用レジスタを用いる命令で、スカラ命令ともいう。）を用いて値を比較していく方法である。一方でベクトル命令を用いる場合、array[]に格納されている値を、複数個同時にborderと比較することができるようになる。第１のアルゴリズムは、下記に示す第２のアルゴリズムに変更できる。なお、簡単化のため、配列の要素Ｍはベクトル命令の並列数Ｎの倍数であると仮定している。
【００４３】
// Nワードを同時に実行可能なベクトル演算命令で、Nワードの同時比較を実行する場合
// ベクトルレジスタvborderの全てのwayに、borderの値を格納する。
vborder = {border, border, …, border, border};
for (i = 0;i < M / N; i++) {
// arrayの中から値を取り出し、ベクトルレジスタに格納する
varray = {array[i*N+(N-1)], array[i*N+(N-2)],…, array[i*N+1], array[i*N+0]};
// 比較を実行
vresult = v_compare (vborder, array);
}  
上記第２のアルゴリズムで、ベクトル命令を用いてＮワードずつ値を比較することができるが、ベクトルレジスタ（vresult）から、比較結果の付加情報が変化した（配列の値がborderよりも大きくなった）場所を探索するためには、多くの命令が必要になる。通常は下記に示すような第３のアルゴリズムを取る。
【００４４】
// Nワードを同時に実行可能なベクトル演算命令で、Nワードの同時比較を実行する場合
// ベクトルレジスタvborderの全てのwayに、borderの値を格納する。
vborder = {border, border, …, border, border};
index = 0;
for (i = 0;i < M / N; i++) {
// arrayの中から値を取り出し、ベクトルレジスタに格納する
varray = {array[i*N+(N-1)], array[i*N+(N-2)],…, array[i*N+1], array[i*N+0]};
// 比較を実行
// vborderとvarrayの各要素を比較し、結果をvresultに格納する。
// flagには、各ベクトル要素のフラグが格納される(Nビット)
vresult = v_compare (vborder, varray, flag);
// ベクトル比較命令にてNワードの比較を実行後
if (全ての演算結果で比較結果不成立 (フラグなどを参照する)) {
//比較の結果、該当するベクトル要素が含まれている場合には脱出する
break;
} else {
index = index + N;    // 比較したベクトル列の中にはヒットしなかった。
}
}
// 比較の結果、該当するベクトル要素が含まれている場合、どのベクトル要素から成立しているのかを1つずつ調べる。
for (i = 0; i < N; i++) {
if (flag[i] == 1) {
break; 
} else { 
index = index + 1;
}
}  
例として、昇順の配列Ａ=[0,1,2,4, 5,7,8,10, 12,15,16,20, 22,25,30,31]の中から、値１５を越える配列のインデックスを探索する第３のアルゴリズムを比較例に係るベクトル命令を用いる場合について説明する。
【００４５】
図１２は比較例に係るベクトル命令を用いた場合のアルゴリズムを実行するための命令の構造を示す図である。図１３は比較例に係るベクトル命令を用いてアルゴリズムを実行した場合の実行過程を示す図である。比較例に係るベクトル命令では、比較結果の付加情報の該当するインデックスを汎用レジスタ（ＧＲ［１］）３１４に格納する。そして比較結果内に、該当する結果が表われなければ、比較例に係るベクトル命令はインデックスとして４を汎用レジスタ（ＧＲ［１］）３１４に格納する。以下、比較例に係るベクトル命令を用いた場合の手順について図１３を参照して説明する。ベクトル命令の並列度は４とする。また、比較命令はＡ［ｉ］＞Ｂ［ｉ］であれば１、それ以外は０とする。
【００４６】
ステップ１：
if (GR[1]!=4) {
borderを越える値が見つかった
} else {
ANS = ANS + 4
}
（１）ベクトルレジスタ（wreg2）にborderの15が格納され、wreg2=[15,15,15,15]となる。
（２）ベクトルレジスタ（wreg1）に配列Ａ[3-0] の値が格納とされ、wreg1=[4,2,1,0]となる。
（３）wreg1とwreg2とが比較され、インデックス=4、GR=0000_0000_0000_0100 となる。
【００４７】
ステップ２：
if (GR[1]!=4) {
borderを越える値が見つかった
} else {
ANS = ANS + 4
}
（１）ベクトルレジスタ（wreg1）に配列Ａ[7-4] の値が格納され、wreg1=[10,8,7,5] となる。
（２）wreg1とwreg2とが比較され、インデックス=4、GR=0000_0000_0000_0100 となる。
【００４８】
ステップ３：
if (GR[1]!=4) {
borderを越える値が見つかった
ANS = ANS + GR[1] ⇒ ループ終了 
}
ANS = ANS + GR[1];
} 
（１）ベクトルレジスタ（wreg1）に配列Ａ[11-8] の値が格納され、wreg1=[20,16,15,12]となる。
（２）wreg1とwreg2とが比較され、インデックス=2、GR=0000_0000_0000_0010 となる。
【００４９】
なお、配列Ａ[12-15]（ステップ４）については、比較例に係るベクトル命令は実行されない。
【００５０】
比較例に係るベクトル命令は付加情報格納レジスタ（ＧＲ［１］）３１４を上書きし、前の結果を保持しないため、比較例に係るベクトル命令を実行する毎にborderを越える値が見つかったどうかの判定を行うスカラ命令を挿入する必要がある。この判定はスカラ演算ユニットの演算器１４１を用いて行われる。また、汎用レジスタ１６はベクトル命令とスカラ命令で交互にアクセスされることになる。このため、ベクトル命令とスカラ命令（４を越えるかどうかの判定）を実行する必要があり、実行効率が低下する。
【００５１】
以上のように、比較例に係るベクトル命令は、複数の値を同時に比較することができるものの、その後に汎用レジスタに移動されたインデックスから比較条件が成立した場所を探さなければならない。第３のアルゴリズムを実行するためには、
汎用レジスタの内容を比較する命令（比較命令）
比較命令の結果に基づいて分岐する分岐命令
が必要になり、ベクトル命令を効率的に活用できていることにはならない。
【００５２】
一方で、実施例２に係るベクトル命令を利用すると、Ｎワード同時に演算が実行可能な命令だとすると、ｃｅｉｌ（Ｍ／Ｎ）回、実施例２に係るベクトル命令を実行することにより、付加情報格納レジスタにＭビットの情報が並び、２進数で 11...10...000 のように並ぶ。付加情報格納レジスタに対して、最上位または最下位から0/1の場所までの数を数える命令を使うことにより、境界値のインデックスを計算することができる。具体的には、下記に示す第４のアルゴリズムに変更される。なお、付加情報格納レジスタとして、ベクトル演算結果の付加情報をＫビットまで格納できる専用レジスタ（ＳＲ）２１４を用いる場合である。
【００５３】
vborder = {border, border, …, border, border};
for (i = 0; i < M/K; i++) {
head_idx = i * K;
for (j = 0; j < K/N; j++) {
// arrayの中から値を取り出し、ベクトルレジスタに格納する
varray = {array[head_idx+(N-1)], array[head_idx+(N-2)], … aray[head_idx+0]};
// 比較を実行
vresult = v_compare (vborder, array);
head_idx = head_idx + N;
}
if (専用レジスタ != 0x00) {
goto finish;
}
}
finish:
// search_1_from_right は、1が立っているビットの場所をLSBから順に検索する
// この機能は多くのCPUでは命令として存在する。
one_index = search_1_from_right(専用レジスタ);
return head_idx + one_index;  
例として、昇順の配列Ａ=[0,1,2,4, 5,7,8,10, 12,15,16,20, 22,25,30,31]の中から、値１５を越える配列のインデックスを探索する第４のアルゴリズムを実施例２に係るベクトル命令を用いる場合について説明する。ここで、Ｍ＝１６、Ｋ＝１６、Ｎ＝４とする。なお、専用レジスタ（ＳＲ）２１４は３２ビット幅であると説明したが、ここでは図面およびその説明を簡単にするために１６ビット幅（Ｋ＝１６）としている。
【００５４】
図１４は実施例２に係るベクトル命令を用いた場合のアルゴリズムを実行するための命令の構造を示す図である。図１５は実施例２に係るベクトル命令を用いてアルゴリズムを実行した場合の実行経過を示す図である。上記アルゴリズムの最内ループにはベクトル命令以外は存在しない。これは、図１４の破線で囲まれたベクトル命令に対応する。ベクトル命令は、比較結果の付加情報を格納する専用レジスタ（ＳＲ）２１４が全て埋まるまで（Ｋ（＝１６）ビット分）繰り返して連続で実行することができる。ここでは、Ｋ／Ｎ（＝１６／４＝４）回実行している。実施例２に係るベクトル命令は、最内ループ内でベクトル命令の結果を汎用レジスタ１６に移動する必要はなく、専用レジスタ（ＳＲ）３１４のＫ（＝１６）ビット分が満杯になるまで連続して比較を実行することができる。
【００５５】
Ｋ（＝１６）ビット分の比較が完了すると、専用レジスタ（ＳＲ）２１４を評価して、０以外が格納されていれば、borderを越える値が存在していたことを意味する。専用レジスタ（ＳＲ）２１４に０が格納されていれば、比較を実行したＫ（＝１６）個の配列には、borderを越える値は存在しなかったということになり、次の配列の場所から比較を再開する（最外ループ）。これは図１４の破線で囲まれたスカラ命令に対応する。
【００５６】
以下、実施例２に係るベクトル命令を用いた場合の手順について図１５を参照して説明する。ベクトル命令の並列度は４とする。また、比較命令はＡ［ｉ］＞Ｂ［ｉ］であれば１、それ以外は０とする。専用レジスタSR=0とする。
【００５７】
ステップ１：
（１）ベクトルレジスタ（wreg2）にborderの15が格納され、wreg2=[15,15,15,15]となる。
（２）ベクトルレジスタ（wreg1）に配列Ａ[3-0] の値が格納され、wreg1=[4,2,1,0] となる。
（３）wreg1とwreg2とが比較され、フラグ=[0,0,0,0]、SR=0000_0000_0000_0000 となる。
【００５８】
ステップ２：
（１）ベクトルレジスタ（wreg1）に配列Ａ[7-4] の値が格納され、wreg1=[10,8,7,5]となる。
（２）wreg1とwreg2とが比較され、フラグ=[0,0,0,0]、SR=0000_0000_0000_0000 となる。
【００５９】
ステップ３：
（１）ベクトルレジスタ（wreg1）に配列Ａ[11-8] の値が格納され、wreg1=[20,16,15,12] となる。
（２）wreg1とwreg2とが比較され、フラグ=[1,1,0,0]、SR=1100_0000_0000_0000 となる。
【００６０】
ステップ４：
（１）ベクトルレジスタ（wreg1）に配列Ａ[15-12] の値が格納され、wreg1=[31,30,25,22] となる。
（２）wreg1とwreg2とが比較され、フラグ=[1,1,1,1]、SR=1111_1100_0000_0000 となる。
【００６１】
以上の処理で、配列Ａ内で値が１５を越えた場所で比較結果が反転し、１５を越える配列のインデックスは１０であることが分かる。これは、専用レジスタの値を汎用レジスタに移動する命令、汎用レジスタの下位ビットから順に１が立っている場所を検出する命令の１命令で実現可能である。
【００６２】
上記の例では、第４のアルゴリズムの内の最内ループを１度だけ実行した例だが、配列Ａの大きさ（Ｍ）が１６より大きくなっても、専用レジスタのサイズ（Ｋ＝１６ビット）が一杯になる毎に専用レジスタの値を汎用レジスタに移動して、比較結果の付加情報を判定する。
【００６３】
以上から、実施例２に係るベクトル命令を用いることにより、付加情報を汎用レジスタに移動する処理が不要となる。最内ループで、比較結果に基づくループ脱出の判定が不要となる。
【００６４】
以上の理由から、実施例２に係るベクトル命令は、ベクトル比較命令を効率的に活用でき、サイクル性能を向上させることができるようになる。また、ベクトル比較の結果を専用レジスタに格納し、専用レジスタにはデータ挿入のための専用回路が組込まれているため、比較命令の実行毎に専用レジスタの値を更新するために読み出し動作をする必要がなく、専用レジスタのＲＡＭハザードを回避することができる。Ｋ回に一度、専用レジスタの値が０か否かを確認するときだけ、専用レジスタの読み出し操作が必要になる。
【００６５】
一方、実施例２に係るベクトル命令を用いる場合は、上記のようにＫビット分をチェックしてからループを抜けるか判定を行うため、比較例に係るベクトル命令を用いる場合に、スカラ命令を用いて１ワードずつ比較してループ脱出の判定条件を行っている方法とは、トレードオフが存在する。探索する配列が小さい、または、該当するインデックスがＫよりも小さい場合は、スカラ命令を用いた方が早くインデックスを探索できる可能性がある。しかし、配列のサイズが大きくなったり、探索するインデックスが大きくなったりすると、Ｋビット分ずつ比較していく実施例２に係るベクトル命令の方がサイクル性能を向上することができる。
【００６６】
実施例２に係るベクトル命令は、昇順あるいは降順に配置された配列から、ある境界値を越えた場所(インデックス)を探索するアルゴリズムを高速化することができる。
【００６７】
以上、本発明者によってなされた発明を実施形態および実施例に基づき具体的に説明したが、本発明は、上記実施形態および実施例に限定されるものではなく、種々変更可能であることはいうまでもない。
【００６８】
例えば、実施例では、半導体装置にＣＰＵとメモリを内蔵している例を説明したが、メモリはＣＰＵが内蔵される半導体装置とは別の半導体装置に内蔵するようにしてもよい。実施例では、ＣＰＵにベクトル演算ユニットを内蔵している例を説明したが、ベクトル演算ユニットはＣＰＵの外に置いてもよい。実施例では専用レジスタを３２ビット幅として説明したが、１６ビット幅や６４ビット幅等他のビット幅であってもよい。実施例では汎用レジスタを３２ビット幅として説明したが、１６ビット幅や６４ビット幅等他のビット幅であってもよい。実施例ではベクトルレジスタを１２８ビット幅として説明したが、６４ビット幅や２５６ビット幅等他のビット幅であってもよい。実施例ではベクトル演算ユニットの演算器を４個として説明したが、８個等他の個数であってもよい。
【００６９】
＜実施態様＞
以下、実施態様について付記する。
（付記１）
ベクトル命令を実行可能なデータ処理装置を備える半導体装置であって、
前記データ処理装置は、前記ベクトル命令を実行した演算処理の結果から付加情報を生成し、
前記データ処理装置は付加情報格納レジスタを備え、
前記付加情報格納レジスタは、前記ベクトル命令に基づいて前記付加情報を表すビット数分だけシフトされて空いた部分に前記付加情報を表すビットを連結し格納する
半導体装置。
【００７０】
（付記２）
（付記１）に記載の半導体装置において、
前記付加情報格納レジスタは、複数回の前記データ処理装置の実行によって生成された前記付加情報を表すビットを格納する。
【符号の説明】
【００７１】
１・・・中央処理装置（ＣＰＵ）
１１・・・ベクトル演算ユニット
１０１・・・ベクトルレジスタ
１０２・・・演算器
１０３・・・専用回路
１０４・・・付加情報格納レジスタ
１１１・・・ベクトルレジスタ
１１２・・・演算器
１１３・・・専用回路
１１４・・・付加情報格納レジスタ（汎用レジスタ）
１１３１・・・連結回路
１１３２・・・シフタ
１１３３・・・連結回路
１２・・・命令フェッチユニット
１３・・・命令発行ユニット
１４・・・スカラ演算ユニット
１５・・・メモリアクセスユニット
１６・・・汎用レジスタ
１７・・・システムレジスタ
１８・・・コミットユニット
２・・・記憶装置（メモリ）
１１Ａ・・・ベクトル演算ユニット
２１３・・・専用回路
２１４・・・付加情報格納レジスタ（専用レジスタ）
２１７・・・セレクタ
【図１】
0006616608.tif 000002
【図２】
0006616608.tif 000003
【図３】
0006616608.tif 000004
【図４】
0006616608.tif 000005
【図５】
0006616608.tif 000006
【図６】
0006616608.tif 000007
【図７】
0006616608.tif 000008
【図８】
0006616608.tif 000009
【図９】
0006616608.tif 000010
【図１０】
0006616608.tif 000011
【図１１】
0006616608.tif 000012
【図１２】
0006616608.tif 000013
【図１３】
0006616608.tif 000014
【図１４】
0006616608.tif 000015
【図１５】
0006616608.tif 000016