(57)【特許請求の範囲】
【請求項１】
一の演算命令で一のデータに対する単一データ演算を行うか、一の演算命令で複数のデータに対する複数データ演算を行うかのいずれかを選択可能な演算処理装置において、
前記一の演算命令の演算対象のデータをそれぞれ格納する複数のレジスタをそれぞれ有する第１のレジスタ領域と第２のレジスタ領域を含むレジスタ群と、
前記一の演算命令に基づき生成される第１の命令セットに従って、前記レジスタ群に含まれるいずれかのレジスタから読み出されたデータに対する演算を実行する第１の演算器と、
前記一の演算命令に基づき生成される第２の命令セットに従って、前記レジスタ群に含まれるいずれかのレジスタから読み出されたデータに対する演算を実行する第２の演算器と、を備え、
前記単一データ演算が選択された場合、前記一の演算命令に含まれるレジスタ情報の全てのビットに基づき生成される前記第１の命令セットに従って、前記第１のレジスタ領域又は前記第２のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第１の演算器に実行させ、
前記複数データ演算が選択された場合、前記一の演算命令の命令の種別を表す命令種別コードと前記一の演算命令に含まれるレジスタ情報のうち前記レジスタを指定する一部のビットとに基づき生成される前記第１の命令セットに従って前記第１のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第１の演算器に実行させるとともに、前記命令種別コードと前記一部のビットとに基づき生成される前記第２の命令セット従って前記第２のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第２の演算器に実行させ、
さらに、前記複数データ演算が選択され且つ前記一の演算命令に含まれるレジスタ情報における前記一部のビット以外のビットに拡張情報が設定されている場合、前記第２のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第１の演算器に実行させる、もしくは、前記第１のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第２の演算器に実行させることを特徴とする演算処理装置。
【請求項２】
前記第１の演算器および前記第２の演算器は、それぞれ、前記一の演算命令に含まれる前記命令種別コードに応じて演算の種別を切替可能な、多入力一出力の積和演算器であり、
前記一部のビット以外のビットは、前記一の演算命令に含まれる、各積和演算器へ出力されるべき前記レジスタ群における各データを指示するレジスタ番号指示フィールドの最上位ビットであることを特徴とする請求項１記載の演算処理装置。
【請求項３】
前記第１の演算器および前記第２の演算器は、それぞれ、前記一の演算命令に含まれる前記命令種別コードに応じて演算の種別を切替可能な、多入力一出力の積和演算器であり、
前記一部のビット以外のビットは、前記一の演算命令に含まれる、各積和演算器による演算結果の、前記レジスタ群における格納先を指示するレジスタ番号指示フィールドの最上位ビットであることを特徴とする請求項１または請求項２に記載の演算処理装置。
【請求項４】
前記一部のビット以外のビットに前記拡張情報が設定されている場合、前記第１の演算器による演算の種別と前記第２の演算器による演算の種別との少なくとも一方を切り替えることを特徴とする請求項１〜請求項３のいずれか一項に記載の演算処理装置。
【請求項５】
一の演算命令の演算対象のデータをそれぞれ格納する複数のレジスタをそれぞれ有する第１のレジスタ領域と第２のレジスタ領域を含むレジスタ群と、前記一の演算命令に基づき生成される第１の命令セットに従って、前記レジスタ群に含まれるいずれかのレジスタから読み出されたデータに対する演算を実行する第１の演算器と、前記一の演算命令に基づき生成される第２の命令セットに従って、前記レジスタ群に含まれるいずれかのレジスタから読み出されたデータに対する演算を実行する第２の演算器とを有し、前記一の演算命令で一のデータに対する単一データ演算を行うか、前記一の演算命令で複数のデータに対する複数データ演算を行うかのいずれかを選択可能な演算処理装置の制御方法において、
前記単一データ演算が選択された場合、前記一の演算命令に含まれるレジスタ情報の全てのビットに基づき生成される前記第１の命令セットに従って、前記第１のレジスタ領域又は前記第２のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第１の演算器に実行させ、
前記複数データ演算が選択された場合、前記一の演算命令の命令の種別を表す命令種別コードと前記一の演算命令に含まれるレジスタ情報のうち前記レジスタを指定する一部のビットとに基づき生成される前記第１の命令セットに従って前記第１のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第１の演算器に実行させるとともに、前記命令種別コードと前記一部のビットとに基づき生成される前記第２の命令セット従って前記第２のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第２の演算器に実行させ、
さらに、前記複数データ演算が選択され且つ前記一の演算命令に含まれるレジスタ情報における前記一部のビット以外のビットに拡張情報が設定されている場合、前記第２のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第１の演算器に実行させる、もしくは、前記第１のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第２の演算器に実行させることを特徴とする演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えば浮動小数点積和演算器を用いて複素数行列積演算等の演算を行なう際に用いて好適の技術に関する。
【背景技術】
【０００２】
一般に、複素数を要素とする行列積演算は下記のような計算式(1)で実現される。
X + Yi ← X + Yi + (A + Bi) * (C + Di)
＝ X + A * C - B * D + (Y + A * D + B * C)i    (1)
この行列積演算を、一つの浮動小数点積和演算器を用いて実行する際には、下式(1-1)〜(1-4)による４回の演算が実行されることになる。つまり、一つの浮動小数点積和演算器を用いて複素数の行列積演算を行なう場合、演算器に対して４命令を発行する必要がある。
X ← X + A * C     (1-1)
Y ← Y + A * D     (1-2)
X ← X - B * D     (1-3)
Y ← Y + B * C     (1-4)
【０００３】
一方、一般に、積和演算をより少ない命令数で効率よく実行する手法として、例えば、一つの命令で複数のデータストリームを処理するＳＩＭＤ（Single Instruction stream Multiple Data stream）方式による積和演算が知られている。このＳＩＭＤ方式を採用した演算装置では、レジスタと、このレジスタに格納されたデータ（レジスタ値）に基づいて同じ演算を行なう２つの浮動小数点積和演算器とがそなえられる。これらの２つの浮動小数点積和演算器は、それぞれ、通常浮動小数点積和演算器（通常演算器）および拡張浮動小数点積和演算器（拡張演算器）と呼ばれる。
【０００４】
通常演算器には、レジスタ前半領域の指定レジスタ番号におけるレジスタ値が演算対象データとして入力されるとともに、拡張演算器には、レジスタ後半領域の指定レジスタ番号におけるレジスタ値が演算対象データとして入力される。ここで、レジスタ後半領域の指定レジスタ番号は、レジスタ前半領域の指定レジスタ番号に所定オフセットを加算した番号である。例えば、レジスタ番号の数が１２８であれば、所定オフセットとして６４が設定される。
【０００５】
このように構成することにより、一つの命令で、レジスタから通常演算器へ出力されるべきレジスタ値を指定するレジスタ番号を指示するだけで、レジスタから拡張演算器へ出力されるべきレジスタ値を指定するレジスタ番号も指示することが可能になる。つまり、一つの命令で２つの演算器に対する演算処理命令を行なうことができ、従来、４命令で行なっていた演算処理を２命令で行なえ、スループットを倍増させることができる。
【特許文献１】特開２００３−１６０５１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、上式(1-1)〜(1-4)による４回の演算（つまり４つの命令）によって実行される複素数行列積演算を、そのまま、上述のようなＳＩＭＤ方式を採用した演算装置に適用し、２命令で実行することはできない。これは、上述のごとく通常演算器がレジスタ前半領域を使用し拡張演算器がレジスタ後半領域を使用するという、レジスタの制約と、上述のごとく通常演算器と拡張演算器とが同じ演算を行なうという、演算内容の制約とのためである。
【０００７】
本発明の目的の一つは、例えばＳＩＭＤ浮動小数点積和演算等における各種演算組み合わせを少ない命令種別コード数で実現することである。
なお、前記目的に限らず、後述する発明を実施するための最良の形態に示す各構成により導かれる作用効果であって、従来の技術によっては得られない作用効果を奏することも本発明の他の目的の一つとして位置付けることができる。
【課題を解決するための手段】
【０００８】
本演算処理装置は、一の演算命令で一のデータに対する単一データ演算を行うか、一の演算命令で複数のデータに対する複数データ演算を行うかのいずれかを選択可能な演算処理装置において、
前記一の演算命令の演算対象のデータをそれぞれ格納する複数のレジスタをそれぞれ有する第１のレジスタ領域と第２のレジスタ領域を含むレジスタ群と、
前記一の演算命令に基づき生成される第１の命令セットに従って、前記レジスタ群に含まれるいずれかのレジスタから読み出されたデータに対する演算を実行する第１の演算器と、
前記一の演算命令に基づき生成される第２の命令セットに従って、前記レジスタ群に含まれるいずれかのレジスタから読み出されたデータに対する演算を実行する第２の演算器と、を備え、
前記単一データ演算が選択された場合、前記一の演算命令に含まれるレジスタ情報の全てのビットに基づき生成される前記第１の命令セットに従って、前記第１のレジスタ領域又は前記第２のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第１の演算器に実行させ、
前記複数データ演算が選択された場合、前記一の演算命令の命令の種別を表す命令種別コードと前記一の演算命令に含まれるレジスタ情報のうち前記レジスタを指定する一部のビットとに基づき生成される前記第１の命令セットに従って前記第１のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第１の演算器に実行させるとともに、前記命令種別コードと前記一部のビットとに基づき生成される前記第２の命令セット従って前記第２のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第２の演算器に実行させ、
さらに、前記複数データ演算が選択され且つ前記一の演算命令に含まれるレジスタ情報における前記一部のビット以外のビットに拡張情報が設定されている場合、前記第２のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第１の演算器に実行させる、もしくは、前記第１のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第２の演算器に実行させる。
【０００９】
また、本演算処理装置の制御方法は、一の演算命令の演算対象のデータをそれぞれ格納する複数のレジスタをそれぞれ有する第１のレジスタ領域と第２のレジスタ領域を含むレジスタ群と、前記一の演算命令に基づき生成される第１の命令セットに従って、前記レジスタ群に含まれるいずれかのレジスタから読み出されたデータに対する演算を実行する第１の演算器と、前記一の演算命令に基づき生成される第２の命令セットに従って、前記レジスタ群に含まれるいずれかのレジスタから読み出されたデータに対する演算を実行する第２の演算器とを有し、前記一の演算命令で一のデータに対する単一データ演算を行うか、前記一の演算命令で複数のデータに対する複数データ演算を行うかのいずれかを選択可能な演算処理装置の制御方法において、
前記単一データ演算が選択された場合、前記一の演算命令に含まれるレジスタ情報の全てのビットに基づき生成される前記第１の命令セットに従って、前記第１のレジスタ領域又は前記第２のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第１の演算器に実行させ、
前記複数データ演算が選択された場合、前記一の演算命令の命令の種別を表す命令種別コードと前記一の演算命令に含まれるレジスタ情報のうち前記レジスタを指定する一部のビットとに基づき生成される前記第１の命令セットに従って前記第１のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第１の演算器に実行させるとともに、前記命令種別コードと前記一部のビットとに基づき生成される前記第２の命令セット従って前記第２のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第２の演算器に実行させ、
さらに、前記複数データ演算が選択され且つ前記一の演算命令に含まれるレジスタ情報における前記一部のビット以外のビットに拡張情報が設定されている場合、前記第２のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第１の演算器に実行させる、もしくは、前記第１のレジスタ領域に含まれるいずれかのレジスタから読み出されたデータに対する演算を前記第２の演算器に実行させる。
【発明の効果】
【００１０】
開示の演算処理装置および演算処理装置の制御方法によれば、一の演算命令における一以上の未使用ビット（一部のビット以外のビット）を用いて通常処理とは異なる拡張処理の実行指示を行なえるので、例えばＳＩＭＤ浮動小数点積和演算等における各種演算組み合わせを少ない命令種別コード数で実現できる。したがって、例えば、４つの命令によって行なっていた複素数行列積演算等の複雑な演算を、２つの命令によって実行することが可能になり、スループットを倍増させることができる。
【発明を実施するための最良の形態】
【００１１】
以下、図面を参照して本発明の実施の形態を説明する。
〔１〕演算装置の構成
図１は本発明の一実施形態としての演算装置の構成を示すブロック図で、この図１に示す本実施形態の演算装置１は、演算部１０，命令コード発行部（設定部）２０および生成部３０を有している。
【００１２】
演算部１０は、レジスタ１１と、２組の通常浮動小数点積和演算器（通常演算器もしくは単に演算器）１２ｂおよび拡張浮動小数点積和演算器（拡張演算器もしくは単に演算器）１２ｅとを有している。なお、以下では、「通常浮動小数点積和演算器」を「通常積和演算器」，「通常演算器」もしくは単に「演算器」と記載するとともに、「拡張浮動小数点積和演算器」を「拡張積和演算器」，「拡張演算器」もしくは単に「演算器」と記載する場合がある。
【００１３】
レジスタ１１は、２Ｎ個（本実施形態ではＮ＝６４）のレジスタ番号０〜２Ｎ−１で指定されるレジスタ値（データ）を保持しうるものである。このレジスタ１１は、演算対象データおよび演算器１２ｂ，１２ｅによる演算結果を格納するものである。
【００１４】
本実施形態の演算装置１では、後述するごとく、命令種別コード（opcode）によって、一つの命令で複数（本実施形態では２つ）のデータストリームを処理するＳＩＭＤ方式の採用／不採用（ＳＩＭＤ／非ＳＩＭＤ）を選択することが可能に構成されている。ＳＩＭＤ方式が採用されると、レジスタ１１の領域が前半部分（レジスタ番号０〜Ｎ−１）および後半部分（レジスタ番号Ｎ〜２Ｎ−１）の２領域に分割され、これらの２領域が、基本的に、それぞれ通常演算器１２ｂおよび拡張演算器１２ｂによって使用される。
【００１５】
また、レジスタ１１は、後述する生成部３０から、６つの出力レジスタ番号，２つの入力レジスタ番号および入力レジスタ書き込み制御信号を入力される。６つの出力レジスタ番号によって、レジスタ１１から各演算器１２ｂ，１２ｅへ出力されるべき３つのレジスタ値（積和演算対象のデータ）が指定される。２つの入力レジスタ番号によって、各演算器１２ｂ，１２ｅによる演算結果をレジスタ値として入力・書き込むべき格納先（レジスタ１１のアドレス）が指定される。入力レジスタ書き込み制御信号によって、各演算器１２ｂ，１２ｅによる演算結果をレジスタ１１に書き込むか否かが選択・制御される。
【００１６】
ここで、通常演算器１２ｂによる演算結果の格納先を指定する入力レジスタ番号としては７ビットの値b_rd[6:0]がレジスタ１１に入力される。レジスタ１１から通常演算器１２ｂへ出力されるべき３つのレジスタ値（積和演算対象のデータ）を指定する３つの出力レジスタ番号としては、それぞれ７ビットの値b_rs1[6:0], b_rs2[6:0], b_rs3[6:0]がレジスタ１１に入力される。
【００１７】
また、拡張演算器１２ｅによる演算結果の格納先を指定する入力レジスタ番号としては７ビットの値e_rd[6:0]がレジスタ１１に入力される。レジスタ１１から拡張演算器１２ｅへ出力されるべき３つのレジスタ値（演算対象データ）を指定する３つの出力レジスタ番号としては、それぞれ７ビットの値e_rs1[6:0], e_rs2[6:0], e_rs3[6:0]がレジスタ１１に入力される。
【００１８】
これらの７ビットの値b_rd[6:0], b_rs1[6:0], b_rs2[6:0], b_rs3[6:0], e_rd[6:0], e_rs1[6:0], e_rs2[6:0], e_rs3[6:0]としては、０〜１２７の範囲の整数が設定され、演算器１２ｂ，１２ｅによる積和演算で使用するレジスタ番号が指定される。つまり、各演算器１２ｂ，１２ｅについて、積演算対象の２つのレジスタ番号，和演算対象のレジスタ番号，演算結果格納先のレジスタ番号の計４つのレジスタ番号が０〜１２７の範囲で指定される。なお、レジスタ１１のレジスタ番号０〜６３の範囲を前半領域、レジスタ１１のレジスタ番号６４〜１２７の範囲を後半領域と呼ぶ。
【００１９】
また、本実施形態では、レジスタ番号n（n=0,1,2, .. ,127）におけるレジスタ値を%r[n]で表す。例えば、レジスタ番号n=0,1, .. ,127に格納されたレジスタ値は、それぞれ、%r[0], %r[1], .. ,%r[127]と表される。
【００２０】
これらのレジスタ値%r[0]，%r[1]，.. ,%r[127]の中から、命令によって指定されたレジスタ番号の値は以下のように表される。通常演算器１２ｂに係る４つのレジスタ値をそれぞれ%b1，%b2，%b3，%bd と表すと、例えばb_rs1[6:0] ← 15 の場合、%b1 は %r[15] を表す。同様に、拡張演算器１２ｅに係る４つのレジスタ値をそれぞれ%e1，%e2，%e3，%edと表すと、例えばe_rs1[6:0] ← 79 の場合、%e1 は %r[79] を表す。
【００２１】
また、上述した入力レジスタ書き込み制御信号は、b_we，e_weで表される。制御信号b_weは、通常演算器１２ｂによる積和演算結果をレジスタ１１に書き込むか否かを選択して制御するための１ビットの信号で、書き込む場合に“１”に設定され、書き込まない場合に“０”に設定される。同様に、制御信号e_weは、拡張演算器１２ｅによる積和演算結果をレジスタ１１に書き込むか否かを選択して制御するための１ビットの信号で、書き込む場合に“１”に設定され、書き込まない場合に“０”に設定される。
【００２２】
一方、演算器１２ｂ，１２ｅは、それぞれ、３入力１出力の浮動小数点積和演算器であり、後述する生成部３０からの命令セットに含まれる演算種別コード（単に「演算コード」と呼ぶ場合もある）に応じて、後述するごとく演算種別を切替可能に構成されている。
【００２３】
通常演算器１２ｂは、レジスタ１１から読み出された３つのレジスタ値%b1, %b2, %b3をそれぞれ入力値b_i1, b_i2, b_i3として入力されるとともに、演算結果である出力値b_oをレジスタ値%bdとしてレジスタ１１に出力する。同様に、拡張演算器１２ｅは、レジスタ１１から読み出された３つのレジスタ値%e1, %e2, %e3をそれぞれ入力値e_i1, e_i2, e_i3として入力されるとともに、演算結果である出力値e_oをレジスタ値%edとしてレジスタ１１に出力する。
【００２４】
即ち、通常演算器１２ｂは、後述する生成部３０からの演算コードb_op[1:0]と、レジスタ１１からのデータ%b1, %b2, %b3とを入力され、これらのデータ%b1, %b2, %b3に基づき、演算コードb_op[1:0]に従った種別の演算を行ない、演算結果データ%bdを出力する。同様に、拡張演算器１２ｅは、後述する生成部３０からの演算コードe_op[1:0]と、レジスタ１１からのデータ%e1, %e2, %e3とを入力され、これらのデータ%e1, %e2, %e3に基づき、演算コードe_op[1:0]に従った種別の演算を行ない、演算結果データ%edを出力する。
【００２５】
ここで、本実施形態の演算器１２ｂ，１２ｅのそれぞれにおいて、２ビットの演算コードb_op[1:0], e_op[1:0]によって指定される演算内容（演算名）は、下表１のごとき４種類である。
【００２６】
【表１】
0005481793.tif 000002
【００２７】
命令コード発行部（設定部）２０は、後述する生成部３０を介して演算部１０へ命令コードを発行するもので、後述する設定部としての機能を有している。
ここで、命令コード発行部２０によって発行される命令コードは、例えば下表２や下表３に示すように、命令種別コードと４つのレジスタ番号指示とから構成される。命令種別コードは、opcode[3:0]と表記される４ビットのデータで、１６通りの種別の命令を指示することができる。４つのレジスタ番号指示は、それぞれ、図５（ａ），図８（ａ），図１１（ａ），図１８（ａ），図２２（ａ）に示すように、７ビットで構成され、０〜１２７のレジスタ番号のいずれか一つを指示することができる。
【００２８】
下表２は、演算装置１において、opcode[3:2]を00に設定し、図３〜図５を参照しながら後述する非ＳＩＭＤ方式を採用した状態に対応する、命令種別コードと命令記述とその命令種別コードに応じた演算内容とを示している。この状態で、演算部１０は、拡張演算器１２ｅを用いることなく通常演算器１２ｂのみを用いてレジスタ１１の全ての領域におけるレジスタ値を対象とした積和演算を行なっている。
【００２９】
下表３は、演算装置１において、opcode[3:2]を01に設定し、図６〜図８を参照しながら後述するＳＩＭＤ方式を採用した状態に対応する、命令種別コードと命令記述とその命令種別コードに応じた通常演算器１２ｂ／拡張演算器１２ｅの演算内容とを示している。この状態で、演算部１０において、通常演算器１２ｂには、レジスタ１１の前半領域の指定レジスタ番号におけるレジスタ値が演算対象データとして入力される。また、拡張演算器１２ｅには、レジスタ１１の後半領域の指定レジスタ番号におけるレジスタ値が演算対象データとして入力される。ここで、レジスタ１１の後半領域の指定レジスタ番号は、レジスタ１１の前半領域の指定レジスタ番号に所定オフセット（本実施形態では６４）を加算した番号である。演算器１２ｂ，１２ｅによる演算結果の格納先を指定するレジスタ番号についても同様である。このため、ＳＩＭＤ方式を採用した場合、図８（ａ）に示すように、４つのレジスタ番号指示のそれぞれは７ビット構成(rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0])であるが、各番号指示において、７ビットのうちの６ビット(rd[5:0], rs1[5:0], rs2[5:0], rs3[5:0])が使用され、１ビット(rd[6], rs1[6], rs2[6], rs3[6])は未使用の状態になる。
【００３０】
【表２】
0005481793.tif 000003
【００３１】
【表３】
0005481793.tif 000004
【００３２】
命令コード発行部２０における設定部としての機能は、一の命令（命令セット）における一以上の未使用ビットに、拡張指示情報を設定する機能である。この拡張指示情報は、当該命令によって実行される通常処理とは異なる拡張処理の実行指示をレジスタ１１および演算器１２ｂ，１２ｅのうちの少なくとも一つに対して行なうものである。
【００３３】
未使用ビットとしては、前述したように、例えば、演算装置１においてＳＩＭＤ方式を採用した際に生じる、未使用ビットであるレジスタ番号指示フィールドの最上位ビットrd[6], rs1[6], rs2[6], rs3[6]の一部もしくは全部が用いられる。
【００３４】
なお、未使用ビットを用いる拡張指示情報としては、下記２種類のものが挙げられる。
(a1)例えば図９〜図２４を参照しながら後述するごとく、各演算器１２ｂ，１２ｅへ出力されるべきデータを、各演算器１２ｂ，１２ｅに対応するレジスタ１１の領域以外の領域におけるデータに切り替える指示をレジスタ１１に対して行なう拡張指示情報。このような拡張指示情報によれば、各演算器１２ｂ，１２ｅは、レジスタ１１の前半領域のレジスタ値と後半領域のレジスタを混在させた状態で演算を行なうことができる。
【００３５】
(a2)例えば図２０，図２２（ｂ），図２３，図２４を参照しながら後述するごとく、各演算器１２ｂ，１２ｅによる演算の種別を切り替える指示を各演算器１２ｂ，１２ｅに対して行なう拡張指示情報。このような拡張指示情報によれば、演算器１２ｂ，１２ｅが実行する演算種別を独立に切り替え、演算器１２ｂと演算器１２ｅとのそれぞれに異なる種別の演算を実行させることができる。
【００３６】
生成部３０は、図４，図７，図１０，図１７，図２１，図２５を参照しながら後述するごとく、命令コード発行部（設定部）２０によって設定・発行された命令セット（命令コード）から、演算部１０に入力される命令セットを生成するものである。
【００３７】
ここで、命令コード発行部２０によって発行される命令コードはopcode[3:0], rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]の３２ビットである。また、生成部３０によって生成される演算部１０に入力される命令セットは、b_we, e_we, b_rd[6:0], b_rs1[6:0], b_rs2[6:0], b_rs3[6:0], e_rd[6:0], e_rs1[6:0], e_rs2[6:0], e_rs3[6:0], b_op[1:0], e_op[1:0]の６２ビットである。つまり、命令コード発行部２０からの３２ビットの命令コードは、生成部３０において、演算部１０に入力するための６２ビットの命令セットに変換される。
【００３８】
このとき、生成部３０は、図１０，図１１（ｄ），図１７，図１８（ｄ），図２１，図２２（ｂ），図２２（ｄ），図２５を参照しながら後述するごとく、未使用ビットに設定された拡張指示情報に基づく命令の生成を行なう。つまり、生成部３０は、未使用ビットに設定された拡張指示情報と未使用ビット以外のビットに設定された情報とに基づいて拡張命令を生成し、その拡張命令をレジスタ１１および演算器１２ｂ，１２ｅのうちの少なくとも一つに対し命令セットとして出力する機能も果たす。ここで、拡張命令は、上記項目(a1),(a2)のごとき拡張指示情報によって指示される、拡張処理の実行指示を行なうものである。
【００３９】
〔２〕演算部の基本的な動作
ここで、図２に示すフローチャートに従って、図１に示す演算装置１における演算部１０の基本的な動作（処理）について説明する。
なお、図２では図示しないが、演算装置１では、図２に示すフローチャートに従った処理を実行する前には、命令コード発行部２０によって命令コードを発行するステップ（設定ステップを含む）と、生成部３０による生成ステップとが実行される。
【００４０】
設定ステップでは、前述した通り、命令コード発行部２０における設定部としての機能によって、命令セットにおける一以上の未使用ビットに、拡張指示情報が設定される。また、生成ステップでは、生成部３０によって、命令コード発行部２０からの命令コードが演算部１０に入力するための命令セットに変換され、その際、未使用ビットに設定された拡張指示情報に基づく命令の生成が行なわれる。
【００４１】
上述のごとく生成部３０（生成ステップ）で生成された命令セットb_we, e_we, b_rd, b_rs1, b_rs2, b_rs3, e_rd, e_rs1, e_rs2, e_rs3, b_op, e_opが、演算部１０に入力されると、まず、レジスタ読み出しが行なわれる（ステップＳ１０）。このレジスタ読み出しステップでは、レジスタ値%r[b_rs1], %r[b_rs2], %r[b_rs3], %r[e_rs1], %r[e_rs2], %r[e_rs3]が、レジスタ１１から演算器１２ｂ，１２ｅへ、それぞれ入力値b_i1, b_i2, b_i3, e_i1, e_i2, e_i3として入力される（ステップＳ１１）。
【００４２】
この後、ステップＳ１０（Ｓ１１）で読み出されたレジスタ値に基づいて、通常演算器１２ｂによる演算実行（ステップＳ２０）および拡張演算器１２ｅによる演算実行（ステップＳ３０）が実行される。
【００４３】
ステップＳ２０では、まず、演算コードb_opが演算名fmaddの演算内容を指定する00であるか否かの判定を行なう（ステップＳ２１）。演算コードb_op=00の場合（ステップＳ２１のＹルート）、b_i1 * b_i2 + b_i3なる演算を実行し、その演算結果を出力値b_oとして出力し（ステップＳ２２）、ステップＳ３０の処理に移行する。
【００４４】
演算コードb_op=00ではない場合（ステップＳ２１のＮルート）、演算コードb_opが演算名fnmaddの演算内容を指定する11であるか否かの判定を行なう（ステップＳ２３）。演算コードb_op=11の場合（ステップＳ２３のＹルート）、-b_i1 * b_i2 - b_i3なる演算を実行し、その演算結果を出力値b_oとして出力し（ステップＳ２４）、ステップＳ３０の処理に移行する。
【００４５】
演算コードb_op=11ではない場合（ステップＳ２３のＮルート）、演算コードb_opが演算名fmsubの演算内容を指定する01であるか否かの判定を行なう（ステップＳ２５）。演算コードb_op=01の場合（ステップＳ２５のＹルート）、b_i1 * b_i2 - b_i3なる演算を実行し、その演算結果を出力値b_oとして出力し（ステップＳ２６）、ステップＳ３０の処理に移行する。
【００４６】
演算コードb_op=01ではない場合（ステップＳ２５のＮルート）、演算コードb_opが演算名fnmsubの演算内容を指定する10であるか否かの判定を行なう（ステップＳ２７）。演算コードb_op=10の場合（ステップＳ２７のＹルート）、-b_i1 * b_i2 + b_i3なる演算を実行し、その演算結果を出力値b_oとして出力し（ステップＳ２８）、ステップＳ３０の処理に移行する。なお、演算コードb_op=10ではない場合（ステップＳ２７のＮルート）も、ステップＳ３０の処理に移行する。
【００４７】
同様に、ステップＳ３０では、まず、演算コードe_opが演算名fmaddの演算内容を指定する00であるか否かの判定を行なう（ステップＳ３１）。演算コードe_op=00の場合（ステップＳ３１のＹルート）、e_i1 * e_i2 + e_i3なる演算を実行し、その演算結果を出力値e_oとして出力し（ステップＳ３２）、ステップＳ４０の処理に移行する。
【００４８】
演算コードe_op=00ではない場合（ステップＳ３１のＮルート）、演算コードe_opが演算名fnmaddの演算内容を指定する11であるか否かの判定を行なう（ステップＳ３３）。演算コードe_op=11の場合（ステップＳ３３のＹルート）、-e_i1 * e_i2 - e_i3なる演算を実行し、その演算結果を出力値e_oとして出力し（ステップＳ３４）、ステップＳ４０の処理に移行する。
【００４９】
演算コードe_op=11ではない場合（ステップＳ３３のＮルート）、演算コードe_opが演算名fmsubの演算内容を指定する01であるか否かの判定を行なう（ステップＳ３５）。演算コードe_op=01の場合（ステップＳ３５のＹルート）、e_i1 * e_i2 - e_i3なる演算を実行し、その演算結果を出力値e_oとして出力し（ステップＳ３６）、ステップＳ４０の処理に移行する。
【００５０】
演算コードe_op=01ではない場合（ステップＳ３５のＮルート）、演算コードe_opが演算名fnmsubの演算内容を指定する10であるか否かの判定を行なう（ステップＳ３７）。演算コードe_op=10の場合（ステップＳ３７のＹルート）、-e_i1 * e_i2 + e_i3なる演算を実行し、その演算結果を出力値e_oとして出力し（ステップＳ３８）、ステップＳ４０の処理に移行する。なお、演算コードe_op=10ではない場合（ステップＳ３７のＮルート）も、ステップＳ４０の処理に移行する。
【００５１】
なお、図２では、ステップＳ２０の処理の後にステップＳ３０の処理を実行するように記載されているが、実際には、ステップＳ２０の処理とステップＳ３０の処理とは並列的に実行される。また、ステップＳ２１，Ｓ２３，Ｓ２５，Ｓ２７による判定処理や、ステップＳ３１，Ｓ３３，Ｓ３５，Ｓ３７による判定処理は、図２に示す順序に限定されるものではない。
【００５２】
ステップＳ４０では、制御信号b_we, e_weおよび指定レジスタ番号b_rd, e_rdに基づき、演算器１２ｂ，１２ｅによる演算結果のレジスタ１１に対する書き込みが制御される。
つまり、制御信号b_weが1であるか否かの判定を行なう（ステップＳ４１）。制御信号b_we=1の場合（ステップＳ４１のＹルート）、演算器１２ｂの出力値b_oが、レジスタ値%r[b_rd]としてレジスタ１１に書き込まれる（ステップＳ４２）。
【００５３】
制御信号b_we=0の場合（ステップＳ４１のＮルート）、または、ステップＳ４２による書き込み処理を終えた後には、制御信号e_weが1であるか否かの判定を行なう（ステップＳ４３）。制御信号e_we=1の場合（ステップＳ４３のＹルート）、演算器１２ｅの出力値e_oが、レジスタ値%r[e_rd]としてレジスタ１１に書き込まれる（ステップＳ４４）。制御信号e_we=0の場合（ステップＳ４３のＮルート）、または、ステップＳ４４による書き込み処理を終えた後には、演算部１０の演算処理を終了する。
【００５４】
〔３〕非ＳＩＭＤ採用時の演算装置の動作
表２を参照しながら前述したように、演算装置１において非ＳＩＭＤ方式を採用する場合、命令コード発行部２０によって発行される命令種別コードの上位２ビットopcode[3:2]には00が設定される。以下、図３〜図５を参照しながら、非ＳＩＭＤ方式を採用した場合の演算装置１の動作について説明する。
【００５５】
図３は非ＳＩＭＤ採用時の図１に示す演算装置１における演算部１０の動作を簡単に説明するための図である。図４は非ＳＩＭＤ採用時の図１に示す演算装置１における命令コード発行部２０および生成部３０の動作を説明するための図である。図５（ａ）〜図５（ｄ）は、それぞれ、非ＳＩＭＤ採用時の図１に示す演算装置１における命令コード，演算コード，レジスタ書き込み信号およびレジスタ番号指定（最上位ビットのみ）を具体的に示す図である。
【００５６】
図３に示すように、非ＳＩＭＤ方式を採用した場合、演算装置１の演算部１０では、拡張演算器１２ｅを用いることなく通常演算器１２ｂのみを用いてレジスタ１１の全ての領域におけるレジスタ値を対象とした積和演算が行なわれる。つまり、命令種別コードopcode[1:0]とレジスタ１１からの入力値とに従って通常演算器１２ｂで演算し、通常演算器１２ｂの演算結果を、制御信号b_weの値に応じてレジスタ１１に書き込む。
【００５７】
このとき、図４および図５（ｃ）に示すように、制御信号e_weは常に0に設定されており、拡張演算器１２ｅの演算結果はレジスタ１１に書き込まれない。また、命令コード発行部２０によって発行される４つのレジスタ番号指示rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]では、図５（ａ）に示すように、全７ビットが使用され、レジスタ１１の全ての領域の中から４つのレジスタ値が指示される。
【００５８】
非ＳＩＭＤ採用時には、命令コード発行部２０によって発行された命令コードopcode[3:0]および４つのレジスタ番号指示rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]が、生成部３０において、図４に示すように変換され、命令セットb_we, e_we, b_rd[6:0], b_rs1[6:0], b_rs2[6:0], b_rs3[6:0], e_rd[6:0], e_rs1[6:0], e_rs2[6:0], e_rs3[6:0], b_op[1:0], e_op[1:0]として演算部１０に入力される。
【００５９】
ここで、図４および図５（ｂ）に示すように、通常演算器１２ｂ用演算コードb_op[1:0]としては、命令コードに含まれる命令種別コードの下位２ビットの値opcode[1:0]が用いられる。このとき、図４および図５（ｃ）に示すように、通常演算器１２ｂ用のレジスタ書き込み制御信号b_weとして1が設定され、通常演算器１２ｂによる演算結果がレジスタ１１へ書き込まれる。
【００６０】
一方、図４および図５（ｂ）に示すように、拡張演算器１２ｅ用演算コードe_op[1:0]としては、00を固定的に入力する。このとき、図４および図５（ｃ）に示すように、拡張演算器１２ｅ用のレジスタ書き込み制御信号ｅ_weとして0が設定され、拡張演算器１２ｅによる演算結果をレジスタ１１に書き込まない。
【００６１】
また、図４および図５（ｄ）に示すように、命令コードに含まれる４つのレジスタ番号指示の７ビットrd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]が通常演算器１２ｂ用レジスタ番号指示b_rd[6:0], b_rs1[6:0], b_rs2[6:0], b_rs3[6:0]として入力される。一方、拡張演算器１２ｅ用レジスタ番号指示e_rd[6:0], e_rs1[6:0], e_rs2[6:0], e_rs3[6:0]としては、図４および図５（ｄ）に示すように、全て0が入力される。
【００６２】
次に、非ＳＩＭＤ採用時の具体的な動作例、例えばfnmsub %f80, %f10, %f20, %f40の演算を実施する場合について説明する。
その演算内容は、
%f[80] ← -%f[10] * %f[20] + %f[40]
として表される。
【００６３】
この場合、下表４に示す命令コードで指定された命令種別コードopcode[3:0]およびレジスタ番号指示rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]の値が、下表５に示す通常演算器１２ｂ用の入力信号の値、つまり演算コードb_op[1:0]およびレジスタ番号指示b_rd[6:0], b_rs1[6:0], b_rs2[6:0], b_rs3[6:0]の値に変換されて入力される。拡張演算器１２ｅ用の演算コードe_op[1:0]およびレジスタ番号指示e_rd[6:0], e_rs1[6:0], e_rs2[6:0], e_rs3[6:0]の値としては、下表５に示すように0が入力される。通常演算器１２ｂ用のレジスタ書き込み制御信号b_weとして1が入力され、通常演算器１２ｂの演算結果がレジスタ１１にレジスタ値%r[80]として書き込まれる。拡張演算器１２ｅ用のレジスタ制御書き込み信号e_weの値として0が入力される。
【００６４】
【表４】
0005481793.tif 000005
【００６５】
【表５】
0005481793.tif 000006
【００６６】
〔４〕ＳＩＭＤ採用時の演算装置の動作
表３を参照しながら前述したように、演算装置１においてＳＩＭＤ方式を採用する場合、命令コード発行部２０によって発行される命令種別コードの上位２ビットopcode[3:2]には01が設定される。以下、図６〜図８を参照しながら、ＳＩＭＤ方式を採用した場合の演算装置１の動作について説明する。
【００６７】
図６はＳＩＭＤ採用時の図１に示す演算装置１における演算部１０の動作を簡単に説明するための図である。図７はＳＩＭＤ採用時の図１に示す演算装置１における命令コード発行部２０および生成部３０の動作を説明するための図である。図８（ａ）〜（ｄ）は、それぞれ、ＳＩＭＤ採用時の図１に示す演算装置１における命令コード，演算コード，レジスタ書き込み信号およびレジスタ番号指定（最上位ビットのみ）を具体的に示す図である。
【００６８】
図６に示すように、ＳＩＭＤを採用した場合、演算装置１の演算部１０では、通常演算器１２ｂに、レジスタ１１の前半領域の指定レジスタ番号におけるレジスタ値が演算対象データとして入力される。また、拡張演算器１２ｅに、レジスタ１１の後半領域の指定レジスタ番号におけるレジスタ値が演算対象データとして入力される。ここで、拡張演算器１２ｅ用の指定レジスタ番号は、通常演算器１２ｂ用の指定レジスタ番号に所定オフセットＮ（本実施形態では６４）を加算した番号である。つまり、通常演算器１２ｂと拡張演算器１２ｅとにおいて、命令種別コードopcode[1:0]に応じた同一種別の演算が、異なる入力値（レジスタ値）に対して実行される。そして、通常演算器１２ｂによる演算結果および拡張演算器１２ｅによる演算結果が、それぞれレジスタ１１の前半領域および後半領域に書き込まれる。
【００６９】
このとき、命令コード発行部２０によって発行される４つのレジスタ番号指示rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]では、図８（ａ）に示すように、全７ビットのうちの下位６ビットrd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が使用される。このような一組の命令コードによって、通常演算器１２ｂ用のレジスタ番号と拡張演算器１２ｅ用のレジスタ番号とが同時に指示される。従って、ＳＩＭＤ方式を採用した場合、図８（ａ）に示すように、最上位ビットrd[6], rs1[6], rs2[6], rs3[6]は使用されない。
【００７０】
ＳＩＭＤ採用時には、命令コード発行部２０によって発行された命令コードopcode[3:0]および４つのレジスタ番号指示rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]が、生成部３０において、図７に示すように変換され、命令セットb_we, e_we, b_rd[6:0], b_rs1[6:0], b_rs2[6:0], b_rs3[6:0], e_rd[6:0], e_rs1[6:0], e_rs2[6:0], e_rs3[6:0], b_op[1:0], e_op[1:0]として演算部１０に入力される。
【００７１】
ここで、図７および図８（ｂ）に示すように、通常演算器１２ｂ用演算コードb_op[1:0]および拡張演算器１２ｅ用演算コードe_op[1:0]としては、命令コードに含まれる命令種別コードの下位２ビットの値opcode[1:0]が用いられる。通常演算器１２ｂと拡張演算器１２ｅとには必ず同じ演算コードが入力され、これらの演算器１２ｂ，１２ｅは、同一種別の演算を実行する。
【００７２】
このとき、図７および図８（ｃ）に示すように、通常演算器１２ｂ用のレジスタ書き込み制御信号b_weおよび拡張演算器１２ｅ用のレジスタ書き込み制御信号e_weとしては、固定値1が設定される。これにより、通常演算器１２ｂおよび拡張演算器１２ｅによる演算結果は、常にレジスタ１１の前半領域および後半領域へそれぞれ書き込まれる。
【００７３】
また、図７に示すように、命令コードに含まれる４つのレジスタ番号指示の下位６ビットrd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が通常演算器１２ｂ用レジスタ番号指示b_rd[5:0], b_rs1[5:0], b_rs2[5:0], b_rs3[5:0]として入力される。同時に、同一のrd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が拡張演算器１２ｅ用レジスタ番号指示e_rd[5:0], e_rs1[5:0], e_rs2[5:0], e_rs3[5:0]としても入力される。
【００７４】
そして、図７および図８（ｄ）に示すように、通常演算器１２ｂ用レジスタ番号指示の最上位ビットb_rd[6], b_rs1[6], b_rs2[6], b_rs3[6]には固定値0が設定されるとともに、拡張演算器１２ｅ用レジスタ番号指示の最上位ビットe_rd[6], e_rs1[6], e_rs2[6], e_rs3[6]には固定値1が設定される。これにより、通常演算器１２ｂではレジスタ１１の前半領域（レジスタ番号０〜６３）のレジスタ値が使用される。また、拡張演算器１２ｅでは、通常演算器１２ｂ用レジスタ番号に６４を加算したレジスタ番号のレジスタ値、つまりレジスタ１１の後半領域（レジスタ番号６４〜１２７）のレジスタ値が使用される。
【００７５】
次に、ＳＩＭＤ採用時の具体的な動作例、例えばsimd-fnmsub %f40, %f10, %f20, %f30の演算を実施する場合について説明する。
この場合、演算部１０の演算器１２ｂ，１２ｅによって、以下のような内容の２つの演算がそれぞれ実行される。
通常演算器１２ｂの演算内容：  %r[40] ← -%r[10] * %r[20] + %r[30]
拡張演算器１２ｅの演算内容：  %r[104] ← -%r[74] * %r[84] + %r[94]
【００７６】
この場合、下表６に示す命令コードで指定された命令種別コードopcode[3:0]およびレジスタ番号指示rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]の値が、下表７に示す演算器１２ｂ，１２ｅ用の入力信号の値に変換されて入力される。つまり、通常演算器１２ｂ用レジスタ番号指示および拡張演算器１２ｅのレジスタ番号指示としては、下位6ビットに同じ値rd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が入力され、最上位ビットにはそれぞれ固定値0, 1が入力される。また、通常演算器１２ｂ用の演算コードb_op[1:0]および拡張演算器１２ｅ用の演算コードe_op[1:0]としては、同一の演算コード10が入力される。これにより、通常演算器１２ｂおよび拡張演算器１２ｅには、それぞれレジスタ１１からの４つの入力値と、同一の演算コードとが入力されるため、通常演算器１２ｂおよび拡張演算器１２ｅでは、同一種別の演算が、それぞれ異なる入力値に対して実行される。そして、レジスタ書き込み制御信号b_we, e_weとしていずれも1が設定されているため、通常演算器１２ｂによる演算結果は、レジスタ１１の前半領域にレジスタ値%r[40]として書き込まれる。同様に、拡張演算器１２ｅによる演算結果は、レジスタ１１の後半領域にレジスタ値%r[104]として書き込まれる。
【００７７】
【表６】
0005481793.tif 000007
【００７８】
【表７】
0005481793.tif 000008
【００７９】
〔５〕第１の未使用ビット利用態様採用時の演算装置の動作
図９は第１の未使用ビット利用態様採用時の図１に示す演算装置１における演算部１０の動作を簡単に説明するための図である。図１０は第１の未使用ビット利用態様採用時の図１に示す演算装置１における命令コード発行部（設定部）２０および生成部３０の動作を説明するための図である。図１１（ａ）〜（ｄ）は、それぞれ、第１の未使用ビット利用態様採用時の図１に示す演算装置１における命令コード，演算コード，レジスタ書き込み信号およびレジスタ番号指定（最上位ビットのみ）を具体的に示す図である。図１２〜図１５は第１の未使用ビット利用態様採用時の図１に示す演算装置１における演算部１０による演算組み合わせの具体例を示す図である。
【００８０】
ＳＩＭＤ方式を採用した場合、レジスタ１１の前半領域の値を入力値とする通常演算器１２ｂとレジスタ１１の後半領域の値を入力値とする拡張演算器１２ｅとが、同一種別の演算を同時に実行する。そして、演算器１２ｂ，１２ｅによる演算結果が、それぞれ、レジスタ１１の前半領域および後半領域に書き込まれる。そのため、上述したＳＩＭＤ方式では、一つの演算器１２ｂまたは１２ｅにおいて、レジスタ１１の前半領域の値と後半領域の値とを入力値として混在させた演算を行なうことはできない。
【００８１】
本項目で説明する実施態様では、上述した４つの命令セットsimd-fmadd, simd-fmsub, simd-fnmsub, simd-fnmaddに、さらに、４つの命令セットcross-fmadd1, cross-fmadd2, cross-fmadd3, cross-fmadd4（図１１（ａ）参照）が追加されている。これらの命令セットcross-fmadd1, .., cross-fmadd4は、図９の左側例に示すように、通常演算器１２ｂへの３入力値をレジスタ１１の後半領域の値とし、拡張演算器１２ｅへの３入力値をレジスタ１１の前半領域の値とするように切り替える命令である。
【００８２】
つまり、これらの命令を用いることで、レジスタ１１の前半領域の値およびレジスタ１１の後半領域の値が、クロスされ、それぞれ通常演算器１２ｂおよび拡張演算器１２ｅに入力される。このとき、通常演算器１２ｂと拡張演算器１２ｅとでは異なる種別の演算を実行することが可能になっている。これらの命令セットcross-fmadd1, .., cross-fmadd4においても、ＳＩＭＤ方式の命令コードと同様、各レジスタ番号指示rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]の全７ビットのうち、下位６ビットrd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が使用され、最上位ビットrd[6], rs1[6], rs2[6], rs3[6]は使用されない。
【００８３】
以下に説明する実施態様（第１の未使用ビット利用態様）では、命令セットcross-fmadd1, .., cross-fmadd4における未使用ビットrd[6], rs1[6], rs2[6], rs3[6]のうちの２つ、具体的にはrs1[6], rs2[6]が利用される。これら２つの未使用ビットrs1[6], rs2[6]に、命令コード発行部２０における設定部としての機能によって、拡張指示情報が設定される。この拡張指示情報は、rs1[6], rs2[6]を使用しない命令セットcross-fmadd1, .., cross-fmadd4による通常処理とは異なる拡張処理（例えば図１２〜図１５の演算組み合わせ参照）の実行指示をレジスタ１１および演算器１２ｂ，１２ｅに対して行なうものである。そして、生成部３０は、図１０および図１１を参照しながら後述するごとく、未使用ビットに設定された拡張指示情報と未使用ビット以外のビットに設定された情報とに基づき、レジスタ１１および演算器１２ｂ，１２ｅに対し前記拡張処理の実行指示を行なう拡張命令を生成して出力する。
【００８４】
これにより、図９の右側例に示すように、一つの演算器１２ｂまたは１２ｅにおいて、レジスタ１１の前半領域の値と後半領域の値とを入力値として混在させた演算を実現できる。特に、未使用ビットrs1[6], rs2[6]を用いて拡張処理の実行指示を行なうことで、各演算器１２ｂ，１２ｅにおける積演算対象となる２つの入力値を、それぞれレジスタ１１の前半領域および後半領域から入力させることが可能になる。従って、上式(1-1)〜(1-4)による４回の演算（つまり４つの命令）によって実行される複素数行列積演算を、後述するごとく、２命令で実行することが可能になる。
【００８５】
この第１の未使用ビット利用態様を採用する場合（つまり命令セットcross-fmadd1, .., cross-fmadd4による処理を採用する場合）、命令コード発行部２０によって発行される命令種別コードの上位２ビットopcode[3:2]には11が設定される。以下、図１０〜図１５を参照しながら、この第１の未使用ビット利用態様を採用した場合の演算装置１の動作について説明する。
【００８６】
第１の未使用ビット利用態様採用時には、命令コード発行部２０によって発行された命令コードopcode[3:0]および４つのレジスタ番号指示rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]が、生成部３０において、図１０に示すように変換され、命令セットb_we, e_we, b_rd[6:0], b_rs1[6:0], b_rs2[6:0], b_rs3[6:0], e_rd[6:0], e_rs1[6:0], e_rs2[6:0], e_rs3[6:0], b_op[1:0], e_op[1:0]として演算部１０に入力される。
【００８７】
ここで、cross-fmadd1, .., cross-fmadd4においては、図１０，図１１（ｂ）および下表８に示すように、命令コードに含まれる命令種別コードの下位２ビットの値opcode[1:0]に基づいて、通常演算器１２ｂ用演算コードb_op[1:0]および拡張演算器１２ｅ用演算コードe_op[1:0]がそれぞれ生成される。上述したＳＩＭＤ方式の場合と異なり、通常演算器１２ｂおよび拡張演算器１２ｅにおいて実行される演算の種別は、独立に制御されて切り替えられる。これにより、通常演算器１２ｂおよび拡張演算器１２ｅは、同一種別の演算を実行することも、異なる種別の演算を実行することも可能になっている。
【００８８】
【表８】
0005481793.tif 000009
【００８９】
このとき、図１０および図１１（ｃ）に示すように、通常演算器１２ｂ用のレジスタ書き込み制御信号b_weおよび拡張演算器１２ｅ用のレジスタ書き込み制御信号e_weとしては、固定値1が設定される。これにより、通常演算器１２ｂおよび拡張演算器１２ｅによる演算結果は、常にレジスタ１１の前半領域および後半領域へそれぞれ書き込まれる。
【００９０】
また、図１０に示すように、命令コードに含まれる４つのレジスタ番号指示の下位６ビットrd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が通常演算器１２ｂ用レジスタ番号指示b_rd[5:0], b_rs1[5:0], b_rs2[5:0], b_rs3[5:0]として入力される。同時に、同一のrd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が拡張演算器１２ｅ用レジスタ番号指示e_rd[5:0], e_rs1[5:0], e_rs2[5:0], e_rs3[5:0]としても入力される。
【００９１】
そして、図１０，図１１（ｄ）および下表９に示すように、通常演算器１２ｂ用レジスタ番号指示の最上位ビットb_rd[6], b_rs3[6]には固定値0が設定されるとともに、拡張演算器１２ｅ用レジスタ番号指示の最上位ビットe_rd[6], e_rs3[6]には固定値1が設定される。一方、通常演算器１２ｂ用レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6]および拡張演算器１２ｅ用レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6]には、命令種別コードopcode[1:0]とレジスタ番号指示の最上位ビットrs1[6], rs2[6]の値（拡張指示情報）とに基づいて算出・生成された値が設定される。その値は、図１０，図１１（ｄ）および下表９に示すように、命令種別コードに応じて、レジスタ番号指示の最上位ビットrs1[6], rs2[6]の値に基づき算出される。これにより、各演算器１２ｂ，１２ｅにおける積演算対象となる２つの入力値を、それぞれレジスタ１１の前半領域および後半領域から入力させることが可能になる。つまり、未使用ビットrs1[6], rs2[6]に設定した拡張指示情報により、レジスタ１１から各演算器１２ｂ，１２ｅへの値を、各演算器１２ｂ，１２ｅに対応するレジスタ１１の領域以外の領域における値に切り替える指示が、レジスタ１１に対して行なわれる。なお、“~Ｘ”はＸの反転値を示す。
【００９２】
【表９】
0005481793.tif 000010
【００９３】
次に、第１の未使用ビット利用態様採用時の具体的な動作例、例えばcross-fmadd1 %f30, %f10, %f20, %f30の演算を実施する場合について説明する。
この場合、演算部１０の演算器１２ｂ，１２ｅによって、以下のような内容の２つの演算がそれぞれ実行される。
通常演算器１２ｂの演算内容：  %r[30] ← %r[10] * %r[20] + %r[30]
拡張演算器１２ｅの演算内容：  %r[94] ← %r[10] * %r[84] + %r[94]
【００９４】
これら２つの演算は、レジスタ１１の前半領域に実数パートの値を、レジスタ１１の後半領域に虚数パートの値を保持した場合の、以下の複素数演算に対応している。
X ← X + A * C     (1-1)
Y ← Y + A * D     (1-2)
【００９５】
この場合、下表１０に示す命令コードで指定された命令種別コードopcode[3:0]およびレジスタ番号指示rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]の値が、下表１１に示す演算器１２ｂ，１２ｅ用の入力信号の値に変換されて入力される。つまり、下表１０に示すように、命令コード発行部２０により命令種別コードopcode[3:0]として1100が設定されるとともに、命令コード発行部２０の設定部としての機能により、未使用ビットrs1[6], rs2[6]に0,0が設定される（後述する図１２の左上例参照）。これらの値に従い、生成部３０によって、図１１（ｄ）や表９に示す式に基づき、通常演算器１２ｂ用のレジスタ番号指示の最上位ビットb_rd[6], b_rs1[6], b_rs2[6], b_rs3[6]として0,0,0,0が算出・設定される（下表１１参照）。また、同様にして、拡張演算器１２ｅ用のレジスタ番号指示の最上位ビットe_rd[6], e_rs1[6], e_rs2[6], e_rs3[6]として1,0,1,1が算出・設定される（下表１１参照）。また、通常演算器１２ｂおよび拡張演算器１２ｅには、図１１（ｂ）や上表８に示すごとく命令種別コードopcode[1:0]によって決まる演算コード00,00がそれぞれ入力される。従って、この具体例では、通常演算器１２ｂと拡張演算器１２ｅとは同一種別の演算（fmadd）を行なうことになる。なお、通常演算器１２ｂ用レジスタ番号指示および拡張演算器１２ｅのレジスタ番号指示の下位6ビットには、同じ値rd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が入力される。
【００９６】
これにより、図１２の左上例のごとく、通常演算器１２ｂは、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,0,0によって選択されたレジスタ前半領域からの３つの値A（%r[rs1]=%r[10]）, C（%r[rs2]=%r[20]）, X（%r[rs3]=%r[30]）を入力値として上式(1-1)に基づく演算を行なう。また、図１２の左上例のごとく、拡張演算器１２ｅは、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,1,1によって選択されたレジスタ前半領域からの１つの値A（%r[rs1]=%r[10]）とレジスタ後半領域からの２つの値D（%r[N+rs2]=%r[84]）, Y（%r[N+rs3]=%r[94]）を入力値として上式(1-2)に基づく演算を行なう。従って、通常演算器１２ｂおよび拡張演算器１２ｅから、異なる入力値を使用した同一種別の演算による演算結果が出力される。なお、通常演算器１２ｂ用のレジスタ書き込み制御信号b_weおよび拡張演算器１２ｅ用のレジスタ書き込み信号には固定値1が設定されている。このため、通常演算器１２ｂによる演算結果は、レジスタ１１の前半領域にレジスタ値%r[rd]=%r[30]として書き込まれる。同様に、拡張演算器１２ｅによる演算結果は、レジスタ１１の後半領域にレジスタ値%r[N+rd]=%r[94]として書き込まれる。つまり、上式(1-1),(1-2)による２種類の演算を一つの命令によって実行することができる。同様にして、上式(1-3),(1-4)についても一つの命令によって実行することが可能である。従って、従来、４つの命令によって実行されていた複素数演算を、２つの命令によって実行することができる。
【００９７】
【表１０】
0005481793.tif 000011
【００９８】
【表１１】
0005481793.tif 000012
【００９９】
上述した具体的な動作例では、命令種別コードopcode[3:0]に1100が設定され且つ未使用ビットrs1[6], rs2[6]に0,0が設定された場合について説明した。しかし、第１の未使用ビット利用態様採用時には、他に１５種類の演算組み合わせを実現することもできる。演算部１０による１６種類の演算組み合わせについて、図１２〜図１５を参照しながら説明する。
【０１００】
図１２は、命令種別コードopcode[3:0]=1100の場合の、４種類の演算組み合わせを示している。このとき、演算器１２ｂ，１２ｅは同一種別の演算fmaddを実行する。
このとき、未使用ビット（最上位ビット）rs1[6], rs2[6]が0,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,1,1となる。従って、図１２の左上例の通り、通常演算器１２ｂは、レジスタ前半領域からの３つの値%r[rs1], %r[rs2], %r[rs3]を入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs1]とレジスタ後半領域からの２つの値%r[N+rs2], %r[N+rs3]とを入力値として演算（fmadd）を行なう。
【０１０１】
未使用ビット（最上位ビット）rs1[6], rs2[6]が0,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,0,1となる。従って、図１２の左下例の通り、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs1], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs2]とを入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの２つの値%r[rs1], %r[rs2]とレジスタ後半領域からの１つの値%r[N+rs3]とを入力値として演算（fmadd）を行なう。
【０１０２】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,1,1となる。従って、図１２の右上例の通り、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs2], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs1]とを入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ後半領域からの３つの値%r[N+rs1], %r[N+rs2], %r[N+rs3]を入力値として演算（fmadd）を行なう。
【０１０３】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,0,1となる。従って、図１２の右下例の通り、通常演算器１２ｂは、レジスタ前半領域からの１つの値%r[rs3]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs2]とを入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs2]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs3]とを入力値として演算（fmadd）を行なう。
【０１０４】
図１３は、命令種別コードopcode[3:0]=1101の場合の、４種類の演算組み合わせを示している。このとき、通常演算器１２ｂは演算fnmsubを実行し、拡張演算器１２ｅは演算fmaddを実行する。
このとき、未使用ビット（最上位ビット）rs1[6], rs2[6]が0,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,0,1となる。従って、図１３の左上例の通り、通常演算器１２ｂは、レジスタ前半領域からの１つの値%r[rs3]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs2]とを入力値として演算（fnmsub）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs2]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs3]とを入力値として演算（fmadd）を行なう。
【０１０５】
未使用ビット（最上位ビット）rs1[6], rs2[6]が0,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,1,1となる。従って、図１３の左下例の通り、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs2], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs1]とを入力値として演算（fnmsub）を行なう。また、拡張演算器１２ｅは、レジスタ後半領域からの３つの値%r[N+rs1], %r[N+rs2], %r[N+rs3]を入力値として演算（fmadd）を行なう。
【０１０６】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,0,1となる。従って、図１３の右上例の通り、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs1], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs2]とを入力値として演算（fnmsub）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの２つの値%r[rs1], %r[rs2]とレジスタ後半領域からの１つの値%r[N+rs3]とを入力値として演算（fmadd）を行なう。
【０１０７】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,1,1となる。従って、図１３の右下例の通り、通常演算器１２ｂは、レジスタ前半領域からの３つの値%r[rs1], %r[rs2], %r[rs3]を入力値として演算（fnmsub）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs1]とレジスタ後半領域からの２つの値%r[N+rs2], %r[N+rs3]とを入力値として演算（fmadd）を行なう。
【０１０８】
図１４は、命令種別コードopcode[3:0]=1110の場合の、４種類の演算組み合わせを示している。このとき、通常演算器１２ｂは演算fmaddを実行し、拡張演算器１２ｅは演算fnmsubを実行する。
このとき、未使用ビット（最上位ビット）rs1[6], rs2[6]が0,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,0,1となる。従って、図１４の左上例の通り、通常演算器１２ｂは、レジスタ前半領域からの１つの値%r[rs3]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs2]とを入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs2]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs3]とを入力値として演算（fnmsub）を行なう。
【０１０９】
未使用ビット（最上位ビット）rs1[6], rs2[6]が0,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,1,1となる。従って、図１４の左下例の通り、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs2], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs1]とを入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ後半領域からの３つの値%r[N+rs1], %r[N+rs2], %r[N+rs3]を入力値として演算（fnmsub）を行なう。
【０１１０】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,0,1となる。従って、図１４の右上例の通り、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs1], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs2]とを入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの２つの値%r[rs1], %r[rs2]とレジスタ後半領域からの１つの値%r[N+rs3]とを入力値として演算（fnmsub）を行なう。
【０１１１】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,1,1となる。従って、図１４の右下例の通り、通常演算器１２ｂは、レジスタ前半領域からの３つの値%r[rs1], %r[rs2], %r[rs3]を入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs1]とレジスタ後半領域からの２つの値%r[N+rs2], %r[N+rs3]とを入力値として演算（fnmsub）を行なう。
【０１１２】
図１５は、命令種別コードopcode[3:0]=1111の場合の、４種類の演算組み合わせを示している。このとき、演算器１２ｂ，１２ｅは同一種別の演算fnmsubを実行する。
このとき、未使用ビット（最上位ビット）rs1[6], rs2[6]が0,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,1,1となる。従って、図１５の左上例の通り、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs2], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs1]とを入力値として演算（fnmsub）を行なう。また、拡張演算器１２ｅは、レジスタ後半領域からの３つの値%r[N+rs1], %r[N+rs2], %r[N+rs3]を入力値として演算（fnmsub）を行なう。
【０１１３】
未使用ビット（最上位ビット）rs1[6], rs2[6]が0,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,0,1となる。従って、図１５の左下例の通り、通常演算器１２ｂは、レジスタ前半領域からの１つの値%r[rs3]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs2]とを入力値として演算（fnmsub）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs2]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs3]とを入力値として演算（fnmsub）を行なう。
【０１１４】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,1,1となる。従って、図１５の右上例の通り、通常演算器１２ｂは、レジスタ前半領域からの３つの値%r[rs1], %r[rs2], %r[rs3]を入力値として演算（fnmsub）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs1]とレジスタ後半領域からの２つの値%r[N+rs2], %r[N+rs3]とを入力値として演算（fnmsub）を行なう。
【０１１５】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,0,1となる。従って、図１５の左下例の通り、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs1], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs2]とを入力値として演算（fnmsub）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの２つの値%r[rs1], %r[rs2]とレジスタ後半領域からの１つの値%r[N+rs3]とを入力値として演算（fnmsub）を行なう。
【０１１６】
〔６〕第２の未使用ビット利用態様採用時の演算装置の動作
図１６は第２の未使用ビット利用態様採用時の図１に示す演算装置１における演算部１０の動作を簡単に説明するための図である。図１７は第２の未使用ビット利用態様採用時の図１に示す演算装置１における命令コード発行部（設定部）２０および生成部３０の動作を説明するための図である。図１８（ａ）〜（ｄ）は、それぞれ、第２の未使用ビット利用態様採用時の図１に示す演算装置１における命令コード，演算コード，レジスタ書き込み信号およびレジスタ番号指定（最上位ビットのみ）を具体的に示す図である。
【０１１７】
前述した第１の未使用ビット利用態様では、命令セットcross-fmadd1, .., cross-fmadd4における未使用ビットrs1[6], rs2[6]を利用し、図１２〜図１５を参照しながら説明した拡張処理の実行指示を行なう場合について説明した。ここで説明する第２の未使用ビット利用態様では、第１の利用態様に加え、図６〜図８を参照しながら説明したＳＩＭＤ方式の命令セットsimd-fmadd, simd-fmsub, simd-fnmsub, simd-fnmaddにおける、未使用ビットrd[6], rs1[6], rs2[6], rs3[6]を利用する。特に、これらの未使用ビットrd[6], rs1[6], rs2[6], rs3[6]のうちの２つ、具体的にはrs1[6], rs2[6]が利用される（図１８（ａ）参照）。
【０１１８】
これら２つの未使用ビットrs1[6], rs2[6]に、命令コード発行部２０における設定部としての機能によって、拡張指示情報が設定される。この拡張指示情報は、rs1[6], rs2[6]を使用しない命令セットsimd-fmadd, simd-fmsub, simd-fnmsub, simd-fnmaddによる通常処理（図１６の左側例参照）とは異なる拡張処理の実行指示をレジスタ１１および演算器１２ｂ，１２ｅに対して行なうものである。そして、生成部３０は、図１７および図１８を参照しながら後述するごとく、未使用ビットに設定された拡張指示情報と未使用ビット以外のビットに設定された情報とに基づき、レジスタ１１および演算器１２ｂ，１２ｅに対し前記拡張処理の実行指示を行なう拡張命令を生成して出力する。
【０１１９】
これにより、図１６の右側例に示すように、一つの演算器１２ｂまたは１２ｅにおいて、レジスタ１１の前半領域の値と後半領域の値とを入力値として混在させた演算を実現できる。特に、未使用ビットrs1[6], rs2[6]を用いて拡張処理の実行指示を行なうことで、各演算器１２ｂ，１２ｅにおける積演算対象となる２つの入力値を、それぞれレジスタ１１の前半領域および後半領域から入力させることが可能になる。このような拡張処理により、ＳＩＭＤ方式による演算のレジスタ組み合わせ数を増加させることができ、複素数演算のみではなく、種々の演算において、レジスタ前半領域の値とレジスタ後半領域の値との様々な組み合わせを実現することができる。
【０１２０】
この第２の未使用ビット利用態様を採用する場合（つまり命令セットsimd-fmadd, simd-fmsub, simd-fnmsub, simd-fnmaddによる処理を採用する場合）、命令コード発行部２０によって発行される命令種別コードの上位２ビットopcode[3:2]には01が設定される。以下、図１７および図１８を参照しながら、この第２の未使用ビット利用態様を採用した場合の演算装置１の動作について説明する。
【０１２１】
第２の未使用ビット利用態様の採用時には、命令コード発行部２０によって発行された命令コードopcode[3:0]および４つのレジスタ番号指示rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]が、生成部３０において、図１７に示すように変換され、命令セットb_we, e_we, b_rd[6:0], b_rs1[6:0], b_rs2[6:0], b_rs3[6:0], e_rd[6:0], e_rs1[6:0], e_rs2[6:0], e_rs3[6:0], b_op[1:0], e_op[1:0]として演算部１０に入力される。
【０１２２】
ここで、図１７および図１８（ｂ）に示すように、通常演算器１２ｂ用演算コードb_op[1:0]および拡張演算器１２ｅ用演算コードe_op[1:0]としては、命令コードに含まれる命令種別コードの下位２ビットの値opcode[1:0]が用いられる。通常演算器１２ｂと拡張演算器１２ｅとには必ず同じ演算コードが入力され、これらの演算器１２ｂ，１２ｅは、同一種別の演算を実行する。
【０１２３】
このとき、図１７および図１８（ｃ）に示すように、通常演算器１２ｂ用のレジスタ書き込み制御信号b_weおよび拡張演算器１２ｅ用のレジスタ書き込み制御信号e_weとしては、固定値1が設定される。これにより、通常演算器１２ｂおよび拡張演算器１２ｅによる演算結果は、常にレジスタ１１の前半領域および後半領域へそれぞれ書き込まれる。
【０１２４】
また、図１７に示すように、命令コードに含まれる４つのレジスタ番号指示の下位６ビットrd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が通常演算器１２ｂ用レジスタ番号指示b_rd[5:0], b_rs1[5:0], b_rs2[5:0], b_rs3[5:0]として入力される。同時に、同一のrd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が拡張演算器１２ｅ用レジスタ番号指示e_rd[5:0], e_rs1[5:0], e_rs2[5:0], e_rs3[5:0]としても入力される。
【０１２５】
そして、図１７および図１８（ｄ）に示すように、通常演算器１２ｂ用レジスタ番号指示の最上位ビットb_rd[6], b_rs3[6]には固定値0が設定されるとともに、拡張演算器１２ｅ用レジスタ番号指示の最上位ビットe_rd[6], e_rs3[6]には固定値1が設定される。一方、通常演算器１２ｂ用レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6]には、rs1[6]の値およびrs2[6]の値がそれぞれ設定される。また、拡張演算器１２ｅ用レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6]には、~rs1[6]の値および~rs2[6]の値がそれぞれ設定される。これにより、各演算器１２ｂ，１２ｅにおける積演算対象となる２つの入力値を、それぞれレジスタ１１の前半領域および後半領域から入力させることが可能になる。つまり、未使用ビットrs1[6], rs2[6]に設定した拡張指示情報により、レジスタ１１から各演算器１２ｂ，１２ｅへの値を、各演算器１２ｂ，１２ｅに対応するレジスタ１１の領域以外の領域における値に切り替える指示が、レジスタ１１に対して行なわれる。なお、“~Ｘ”はＸの反転値を示す。
【０１２６】
次に、第２の未使用ビット利用態様採用時の具体的な動作例、例えばsimd-fmsub %f40, %f10, %f80, %f30の演算を実施する場合について説明する。
この場合、演算部１０の演算器１２ｂ，１２ｅによって、以下のような内容の２つの演算がそれぞれ実行される。
通常演算器１２ｂの演算内容：  %r[40] ← %r[10] * %r[80] - %r[30]
拡張演算器１２ｅの演算内容：  %r[104] ← %r[74] * %r[16] - %r[94]
【０１２７】
この場合、下表１２に示す命令コードで指定された命令種別コードopcode[3:0]およびレジスタ番号指示rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]の値が、下表１３に示す演算器１２ｂ，１２ｅ用の入力信号の値に変換されて入力される。つまり、下表１２に示すように、命令コード発行部２０により命令種別コードopcode[3:0]として0101が設定されるとともに、命令コード発行部２０の設定部としての機能により、未使用ビットrs1[6], rs2[6]に0,1が設定される。これらの値に従い、生成部３０によって、図１８（ｄ）に示す式に基づき、通常演算器１２ｂ用のレジスタ番号指示の最上位ビットb_rd[6], b_rs1[6], b_rs2[6], b_rs3[6]として0,0,1,0が算出・設定される（下表１３参照）。また、同様にして、拡張演算器１２ｅ用のレジスタ番号指示の最上位ビットe_rd[6], e_rs1[6], e_rs2[6], e_rs3[6]として1,1,0,1が算出・設定される（下表１３参照）。また、通常演算器１２ｂ用の演算コードb_op[1:0]および拡張演算器１２ｅ用の演算コードe_op[1:0]としては、同一の演算コード01が入力される。ここでは、通常演算器１２ｂと拡張演算器１２ｅとは同一種別の演算を行なう。なお、通常演算器１２ｂ用レジスタ番号指示および拡張演算器１２ｅのレジスタ番号指示の下位6ビットには、同じ値rd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が入力される。
【０１２８】
これにより、通常演算器１２ｂは、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,1,0によって選択されたレジスタ前半領域からの２つの値%r[rs1]=%r[10], %r[rs3]=%r[30]とレジスタ後半領域からの１つの値%r[rs2]=%r[80]とを入力値として演算（fnmsub）を行なう。また、拡張演算器１２ｅは、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,0,1によって選択されたレジスタ前半領域からの１つの値%r[N+rs2]=%r[16]とレジスタ後半領域からの２つの値%r[N+rs1]=%r[74], %r[N+rs3]=%r[94]を入力値として演算を行なう。従って、通常演算器１２ｂおよび拡張演算器１２ｅから、異なる入力値を使用した同一種別の演算による演算結果が出力される。なお、通常演算器１２ｂ用のレジスタ書き込み制御信号b_weおよび拡張演算器１２ｅ用のレジスタ書き込み信号には固定値1が設定されている。このため、通常演算器１２ｂによる演算結果は、レジスタ１１の前半領域にレジスタ値%r[40]として書き込まれる。同様に、拡張演算器１２ｅによる演算結果は、レジスタ１１の後半領域にレジスタ値%r[104]として書き込まれる。
【０１２９】
【表１２】
0005481793.tif 000013
【０１３０】
【表１３】
0005481793.tif 000014
【０１３１】
上述した具体的な動作例では、命令種別コードopcode[3:0]に0101が設定され且つ未使用ビットrs1[6], rs2[6]に0,1が設定された場合について説明したが、第２の未使用ビット利用態様採用時には、他の演算組み合わせを実現することもできる。ここで、opecode[1:0]によって演算器１２ｂ，１２ｅによる４種類の演算種別が選択される。そして、各演算種別毎に、未使用ビットrs1[6], rs2[6]の値によって、各演算器１２ｂ，１２ｅに入力される２つの値（積対象のデータ）をレジスタ前半領域もしくはレジスタ後半領域のいずれから読み出すかが指示・選択される。
【０１３２】
例えば、未使用ビット（最上位ビット）rs1[6], rs2[6]が0,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,1,1となる。従って、通常演算器１２ｂは、レジスタ前半領域からの３つの値%r[rs1], %r[rs2], %r[rs3]を入力値として演算を行なう。また、拡張演算器１２ｅは、レジスタ後半領域からの３つの%r[N+rs1], %r[N+rs2], %r[N+rs3]を入力値として演算を行なう。
【０１３３】
未使用ビット（最上位ビット）rs1[6], rs2[6]が0,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,0,1となる。従って、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs1], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs2]とを入力値として演算を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs2]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs3]とを入力値として演算を行なう。
【０１３４】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,1,1となる。従って、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs2], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs1]とを入力値として演算を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs1]とレジスタ後半領域からの２つの値%r[N+rs2], %r[N+rs3]とを入力値として演算を行なう。
【０１３５】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,0,1となる。従って、通常演算器１２ｂは、レジスタ前半領域からの１つの値%r[rs3]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs2]とを入力値として演算を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの２つの値%r[rs1], %r[rs2]とレジスタ後半領域からの１つの値%r[N+rs3]とを入力値として演算を行なう。
【０１３６】
〔７〕第３の未使用ビット利用態様採用時の演算装置の動作
図１９および図２０は第３の未使用ビット利用態様採用時の図１に示す演算装置１における演算部１０の動作を簡単に説明するための図である。図２１は第２の未使用ビット利用態様採用時の図１に示す演算装置１における命令コード発行部（設定部）２０および生成部３０の動作を説明するための図である。図２２（ａ）〜（ｄ）は、それぞれ、第３の未使用ビット利用態様採用時の図１に示す演算装置１における命令コード，演算コード，レジスタ書き込み信号およびレジスタ番号指定（最上位ビットのみ）を具体的に示す図である。図２３および図２４は第３の未使用ビット利用態様採用時の図１に示す演算装置における演算部１０による演算組み合わせの具体例を示す図である。図２５は第３の未使用ビット利用態様採用時の図１に示す演算装置１における生成部３０の具体的な実現例を示す回路図である。
【０１３７】
ここで説明する第３の未使用ビット利用態様では、図２２（ａ）に示すように、前述したＳＩＭＤ方式の命令セットsimd-fmadd, simd-fmsub, simd-fnmsub, simd-fnmaddにおける、未使用ビットrd[6], rs1[6], rs2[6], rs3[6]の全てを利用する。第２の利用態様においては、未使用ビットrs1[6], rs2[6]を利用してＳＩＭＤ命令を拡張したが、この第３の利用態様では、未使用ビットrs3[6], rd[6] を利用することで、ＳＩＭＤ命令をさらに拡張する。
【０１３８】
ここで、未使用ビットrs3[6]の値は、拡張演算器１２ｅ側の積入力レジスタ番号の選択のために使用され、未使用ビットrd[6]の値は、拡張演算器１２ｅの演算コードe-op[1:0]の選択ために使用される。このような拡張により、図１９および図２０に示すように、第１の利用態様で追加した新規命令と同じ演算をＳＩＭＤ命令の拡張によって実現することができる。従って、第３の利用態様では、第１の利用態様で新規に追加した命令cross-fmadd1, .., cross-fmadd4は不要になる。
【０１３９】
これら４つの未使用ビットrd[6], rs1[6], rs2[6], rs3[6]に、命令コード発行部２０における設定部としての機能によって、拡張指示情報が設定される。この拡張指示情報は、rd[6], rs1[6], rs2[6], rs3[6]を使用しない命令セットsimd-fmadd, simd-fmsub, simd-fnmsub, simd-fnmaddによる通常処理（図１９の左側例参照）とは異なる拡張処理（例えば図２３，図２４の演算組み合わせ参照）の実行指示をレジスタ１１および演算器１２ｂ，１２ｅに対して行なうものである。そして、生成部３０は、図２１および図２２を参照しながら後述するごとく、未使用ビットに設定された拡張指示情報と未使用ビット以外のビットに設定された情報とに基づき、レジスタ１１および演算器１２ｂ，１２ｅに対し前記拡張処理の実行指示を行なう拡張命令を生成して出力する。
【０１４０】
これにより、図１９の右側例や図２０に示すように、一つの演算器１２ｂまたは１２ｅにおいて、レジスタ１１の前半領域の値と後半領域の値とを入力値として混在させた演算を実現できる。また、拡張演算器１２ｅによる演算の種別を切り替える指示を行なって、演算器１２ｅにおける演算種別が変更制御される。従って、上式(1-1)〜(1-4)による４回の演算（つまり４つの命令）によって実行される複素数行列積演算を、後述するごとく、２命令で実行することが可能になる。
【０１４１】
この第３の未使用ビット利用態様を採用する場合、命令コード発行部２０によって発行される命令種別コードの上位２ビットopcode[3:2]には01が設定される。以下、図２１〜図２５を参照しながら、この第３の未使用ビット利用態様を採用した場合の演算装置１の動作について説明する。
【０１４２】
第３の未使用ビット利用態様採用時には、命令コード発行部２０によって発行された命令コードopcode[3:0]および４つのレジスタ番号指示rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]が、生成部３０において、図２１に示すように変換され、命令セットb_we, e_we, b_rd[6:0], b_rs1[6:0], b_rs2[6:0], b_rs3[6:0], e_rd[6:0], e_rs1[6:0], e_rs2[6:0], e_rs3[6:0], b_op[1:0], e_op[1:0]として演算部１０に入力される。
【０１４３】
ここで、通常演算器１２ｂ用演算コードb_op[1:0]としては、命令コードに含まれる命令種別コードの下位２ビットの値opcode[1:0]が用いられる。また、生成部３０においては、図２２（ｂ）および下表１４に示すように、未使用ビットrd[6]の値に基づいて、拡張演算器１２ｅ用演算コードe_op[1:0]が生成される。上述したＳＩＭＤ方式の場合と異なり、通常演算器１２ｂおよび拡張演算器１２ｅにおいて実行される演算の種別は、独立に制御されて切り替えられる。これにより、通常演算器１２ｂおよび拡張演算器１２ｅは、同一種別の演算を実行することも、異なる種別の演算を実行することも可能になっている。このように、ＳＩＭＤ命令と未使用ビットrd[6]に設定された値（拡張指示情報）とを組み合わせることで、第１の利用態様で追加された命令と同等の数の演算組み合わせを、ＳＩＭＤ命令だけで実現することができる。
【０１４４】
【表１４】
0005481793.tif 000015
【０１４５】
このとき、図２１および図２２（ｃ）に示すように、通常演算器１２ｂ用のレジスタ書き込み制御信号b_weおよび拡張演算器１２ｅ用のレジスタ書き込み制御信号e_weとしては、固定値1が設定される。これにより、通常演算器１２ｂおよび拡張演算器１２ｅによる演算結果は、常にレジスタ１１の前半領域および後半領域へそれぞれ書き込まれる。
【０１４６】
また、図２１に示すように、命令コードに含まれる４つのレジスタ番号指示の下位６ビットrd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が通常演算器１２ｂ用レジスタ番号指示b_rd[5:0], b_rs1[5:0], b_rs2[5:0], b_rs3[5:0]として入力される。同時に、同一のrd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が拡張演算器１２ｅ用レジスタ番号指示e_rd[5:0], e_rs1[5:0], e_rs2[5:0], e_rs3[5:0]としても入力される。
【０１４７】
そして、図２１，図２２（ｄ）および下表１５に示すように、通常演算器１２ｂ用レジスタ番号指示の最上位ビットb_rd[6], b_rs3[6]には固定値0が設定されるとともに、拡張演算器１２ｅ用レジスタ番号指示の最上位ビットe_rd[6], e_rs3[6]には固定値1が設定される。また、通常演算器１２ｂ用レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6]には、rs1[6]の値およびrs2[6]の値がそれぞれ設定される。一方、拡張演算器１２ｅ用レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6]には、それぞれ~rs1[6] ^ rs3[6]および ~rs2[6] の値が算出・生成されて設定される。これにより、各演算器１２ｂ，１２ｅにおける積演算対象となる２つの入力値を、それぞれレジスタ１１の前半領域および後半領域から入力させることが可能になる。つまり、未使用ビットrs1[6], rs2[6], rs3[6]に設定した拡張指示情報により、レジスタ１１から各演算器１２ｂ，１２ｅへの値を、各演算器１２ｂ，１２ｅに対応するレジスタ１１の領域以外の領域における値に切り替える指示が、レジスタ１１に対して行なわれる。なお、“~Ｘ”はＸの反転値を示す。また、“Ａ^Ｂ”はＡとＢとの排他的論理和（ＥＯＲ：Exclusive OR）を示す。
【０１４８】
未使用ビットrs1[6], rs2[6], rs3[6]に設定された値（拡張指示情報）と、その値よって最上位ビットb_rs1[6], b_rs2[6], e_rs1[6], e_rs2[6]に設定される値との対応関係を下表１５に示す。
【０１４９】
【表１５】
0005481793.tif 000016
【０１５０】
ここで、上述したように未使用ビットrs1[6], rs2[6], rs3[6]にそれぞれ設定される値（拡張指示情報）は、以下のように機能することになる。
rs1[6]：1を設定された場合、通常演算器１２ｂの１番目の入力値b_i1をレジスタ後半領域から供給する。
rs2[6]：1を設定された場合、通常演算器１２ｂの２番目の入力値b_i2をレジスタ後半領域から供給する。
rs3[6]：1を設定された場合、拡張演算器１２ｅの１番目の入力値b_i1を通常演算器１２ｂの１番目の入力値b_i1と同じレジスタ領域から供給する（rs1コピーフラグ）。
rd[6]：拡張演算器１２ｅの演算コードe_op[1:0]を変更する（積演算の結果に -1 を乗算する）。
【０１５１】
次に、第１の未使用ビット利用態様採用時の具体的な動作例、例えばsimd-fmadd %f30, %f10, %f20, %f{30+64}の演算を実施する場合について説明する。
この場合、演算部１０の演算器１２ｂ，１２ｅによって、以下のような内容の２つの演算がそれぞれ実行される。
通常演算器１２ｂの演算内容：  %r[30] ← %r[10] * %r[20] + %r[30]
拡張演算器１２ｅの演算内容：  %r[94] ← %r[10] * %r[84] + %r[94]
【０１５２】
これら２つの演算は、レジスタ１１の前半領域に実数パートの値を、レジスタ１１の後半領域に虚数パートの値を保持した場合の、以下の複素数演算に対応している。
X ← X + A * C     (1-1)
Y ← Y + A * D     (1-2)
【０１５３】
この場合、下表１６に示す命令コードで指定された命令種別コードopcode[3:0]およびレジスタ番号指示rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]の値が、下表１７に示す演算器１２ｂ，１２ｅ用の入力信号の値に変換されて入力される。つまり、下表１６に示すように、命令コード発行部２０により命令種別コードopcode[3:0]として0100が設定されるとともに、命令コード発行部２０の設定部としての機能により、４つの未使用ビットrd[6], rs1[6], rs2[6], rs3[6]に0,0,0,1が設定される（後述する図２３の左から３番目の上段例参照）。これらの値に従い、生成部３０によって、図２２（ｄ）に示す式や上表１５に基づき、通常演算器１２ｂ用のレジスタ番号指示の最上位ビットb_rd[6], b_rs1[6], b_rs2[6], b_rs3[6]として0,0,0,0が算出・設定される（下表１７参照）。また、同様にして、拡張演算器１２ｅ用のレジスタ番号指示の最上位ビットe_rd[6], e_rs1[6], e_rs2[6], e_rs3[6]として1,0,1,1が算出・設定される（下表１７参照）。通常演算器１２ｂには、命令種別コードopcode[1:0]によって決まる演算コード00が入力される。また、拡張演算器１２ｅには、図２２（ｂ）に示す式や上表１４に示すごとく未使用ビットrd[6]の値および命令種別コードopcode[1:0]によって決まる演算コード00が入力される。従って、この具体例では、通常演算器１２ｂと拡張演算器１２ｅとは同一種別の演算（fmadd）を行なうことになる。なお、通常演算器１２ｂ用レジスタ番号指示および拡張演算器１２ｅのレジスタ番号指示の下位6ビットには、同じ値rd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]が入力される。
【０１５４】
これにより、図２３の左から３番目の上段例のごとく、通常演算器１２ｂは、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,0,0によって選択されたレジスタ前半領域からの３つの値A（%r[rs1]=%r[10]）, C（%r[rs2]=%r[20]）, X（%r[rs3]=%r[30]）を入力値として上式(1-1)に基づく演算を行なう。また、図２３の左から３番目の上段例のごとく、拡張演算器１２ｅは、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,1,1によって選択されたレジスタ前半領域からの１つの値A（%r[rs1]=%r[10]）とレジスタ後半領域からの２つの値D（%r[N+rs2]=%r[84]）, Y（%r[N+rs3]=%r[94]）を入力値として上式(1-2)に基づく演算を行なう。従って、通常演算器１２ｂおよび拡張演算器１２ｅから、異なる入力値を使用した同一種別の演算による演算結果が出力される。なお、通常演算器１２ｂ用のレジスタ書き込み制御信号b_weおよび拡張演算器１２ｅ用のレジスタ書き込み信号には固定値1が設定されている。このため、通常演算器１２ｂによる演算結果は、レジスタ１１の前半領域にレジスタ値%r[rd]=%r[30]として書き込まれる。同様に、拡張演算器１２ｅによる演算結果は、レジスタ１１の後半領域にレジスタ値%r[N+rd]=%r[94]として書き込まれる。つまり、上式(1-1),(1-2)による２種類の演算を一つの命令によって実行することができる。同様にして、上式(1-3),(1-4)についても一つの命令によって実行することが可能である。従って、従来、４つの命令によって実行されていた複素数演算を、２つの命令によって実行することができる。
【０１５５】
【表１６】
0005481793.tif 000017
【０１５６】
【表１７】
0005481793.tif 000018
【０１５７】
上述した具体的な動作例では、命令種別コードopcode[3:0]に0100(simd-fmadd)が設定され且つ４つの未使用ビットrd[6], rs1[6], rs2[6], rs3[6]に0,0,0,1が設定された場合について説明した。しかし、第３の未使用ビット利用態様採用時には、他に６３種類の演算組み合わせを実現することもできる。４種類のＳＩＭＤ命令〔命令種別コードopcode[3:0]=0100(simd-fmadd), 0101(simd-fmsub), 0110(simd-fnmsub), 0111(simd-fnmadd)〕のそれぞれについて１６種類の演算組み合わせを実現することができる。つまり、第３の利用形態では、全部で６４種類の演算組み合わせパターンを実現することができる。ここでは、４種類のＳＩＭＤ命令のうち、命令種別コードopcode[3:0]=0100(simd-fmadd)についての全て（１６種類）の演算組み合わせパターンを、図２３および図２４を参照しながら説明する。なお、他の３種類のＳＩＭＤ命令のそれぞれについても、図２３および図２４と同様、１６種類の演算組み合わせパターンが実現される。
【０１５８】
図２３は、命令種別コードopcode[3:0]=0100の場合で且つ未使用ビットrd[6]=0の場合の、８種類の演算組み合わせを示している。このとき、演算器１２ｂ，１２ｅは同一種別の演算fmaddを実行する。
また、図２３の左半部は、未使用ビットrd[6]=0且つ未使用ビットrs3[6]=0の場合の、４種類の演算組み合わせを示している。
【０１５９】
このとき、未使用ビット（最上位ビット）rs1[6], rs2[6]が0,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,1,1となる。従って、図２３の左から１番目の上段例の通り、通常演算器１２ｂは、レジスタ前半領域からの３つの値%r[rs1], %r[rs2], %r[rs3]を入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ後半領域からの３つの値%r[N+rs1], %r[N+rs2], %r[N+rs3]を入力値として演算（fmadd）を行なう。
【０１６０】
未使用ビット（最上位ビット）rs1[6], rs2[6]が0,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,0,1となる。従って、図２３の左から１番目の下段例の通り、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs1], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs2]とを入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs2]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs3]とを入力値として演算（fmadd）を行なう。
【０１６１】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,1,1となる。従って、図２３の左から２番目の上段例の通り、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs2], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs1]とを入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs1]とレジスタ後半領域からの２つの値%r[N+rs2], %r[N+rs3]とを入力値として演算（fmadd）を行なう。
【０１６２】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,0,1となる。従って、図２３の左から２番目の下段例の通り、通常演算器１２ｂは、レジスタ前半領域からの１つの値%r[rs3]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs2]とを入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの２つの値%r[rs1], %r[rs2]とレジスタ後半領域からの１つの値%r[N+rs3]とを入力値として演算（fmadd）を行なう。
【０１６３】
また、図２３の右半部は、未使用ビットrd[6]=0且つ未使用ビットrs3[6]=1の場合の、４種類の演算組み合わせを示している。
このとき、未使用ビット（最上位ビット）rs1[6], rs2[6]が0,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,1,1となる。従って、図２３の左から３番目の上段例の通り、通常演算器１２ｂは、レジスタ前半領域からの３つの値%r[rs1], %r[rs2], %r[rs3]を入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs1]とレジスタ後半領域からの２つの値%r[N+rs2], %r[N+rs3]とを入力値として演算（fmadd）を行なう。
【０１６４】
未使用ビット（最上位ビット）rs1[6], rs2[6]が0,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=0,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=0,0,1となる。従って、図２３の左から３番目の下段例の通り、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs1], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs2]とを入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの２つの値%r[rs1], %r[rs2]とレジスタ後半領域からの１つの値%r[N+rs3]とを入力値として演算（fmadd）を行なう。
【０１６５】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,0であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,0,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,1,1となる。従って、図２３の左から４番目の上段例の通り、通常演算器１２ｂは、レジスタ前半領域からの２つの値%r[rs2], %r[rs3]とレジスタ後半領域からの１つの値%r[N+rs1]とを入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ後半領域からの３つの値%r[N+rs1], %r[N+rs2], %r[N+rs3]を入力値として演算（fmadd）を行なう。
【０１６６】
未使用ビット（最上位ビット）rs1[6], rs2[6]が1,1であれば、レジスタ番号指示の最上位ビットb_rs1[6], b_rs2[6], b_rs3[6]=1,1,0、且つ、レジスタ番号指示の最上位ビットe_rs1[6], e_rs2[6], e_rs3[6]=1,0,1となる。従って、図２３の左から４番目の下段例の通り、通常演算器１２ｂは、レジスタ前半領域からの１つの値%r[rs3]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs2]とを入力値として演算（fmadd）を行なう。また、拡張演算器１２ｅは、レジスタ前半領域からの１つの値%r[rs2]とレジスタ後半領域からの２つの値%r[N+rs1], %r[N+rs3]とを入力値として演算（fmadd）を行なう。
【０１６７】
図２４は、命令種別コードopcode[3:0]=0100の場合で且つ未使用ビットrd[6]=1の場合の、８種類の演算組み合わせを示している。このとき、通常演算器１２ｂは演算fmaddを実行し、拡張演算器１２ｅは演算fnmsubを実行する。また、図２４の左半部は、未使用ビットrd[6]=1且つ未使用ビットrs3[6]=0の場合の、４種類の演算組み合わせを示し、図２４の右半部は、未使用ビットrd[6]=1且つ未使用ビットrs3[6]=1の場合の、４種類の演算組み合わせを示している。この図２４に示す演算組み合わせでは、未使用ビットrd[6]=1とすることにより拡張演算器１２ｅが通常演算器１２ｂとは異なる演算fnmsubを実行するように切り替えられている以外は、図２３に示す演算組み合わせと同じであるので、図２４についての詳細な説明は省略する。
【０１６８】
ここで、図２５を参照しながら、第３の未使用ビット利用態様採用時の図１に示す演算装置１における生成部３０の具体的な実現例について説明する。図２５に示す生成部３０は、４つの論理積回路（ＡＮＤゲート）３１，３２，３３，３４と、２つの排他的論理和回路（ＥＯＲゲート）３５，３６と、反転回路（ＮＯＴゲート，インバータ）３１ａ，３２ａ，３４ａ，３６ａとをそなえて構成されている。なお、この生成部３０は、命令種別コードのopcode[2]により、図３〜図５を参照しながら前述した非ＳＩＭＤ方式にも対応可能になっている。つまり、opcode[2]=1の場合、図１９〜図２４を参照しながら説明した第３の利用態様が採用される一方、opcode[2]=0の場合、図３〜図５を参照しながら非ＳＩＭＤ方式が採用される。
【０１６９】
論理積回路３１は、rd[6]とopcode[2]の反転値との論理積を算出し、レジスタ番号指示b_rd[6]として出力する。論理積回路３１に入力されるopcode[2]の反転値は、反転回路３１ａによって生成・出力される。つまり、opcode[2]=0で非ＳＩＭＤ方式が採用された場合、opcode[2]の反転値1が論理積回路３１に入力され、rd[6]の値がb_rd[6]として出力される。一方、opcode[2]=1で第３利用態様が採用された場合、opcode[2]の反転値0が論理積回路３１に入力され、b_rd[6]が0に固定される。
【０１７０】
論理積回路３２は、rs3[6]とopcode[2]の反転値との論理積を算出し、レジスタ番号指示b_rs3[6]として出力する。論理積回路３１に入力されるopcode[2]の反転値は、反転回路３２ａによって算出される。つまり、opcode[2]=0で非ＳＩＭＤ方式が採用された場合、opcode[2]の反転値1が論理積回路３２に入力され、rs6[6]の値がb_rs3[6]として出力される。一方、opcode[2]=1で第３利用態様が採用された場合、opcode[2]の反転値0が論理積回路３１に入力され、b_rs3[6]が0に固定される。
【０１７１】
排他的論理和回路３６は、rs3[6]とrs1[6]の反転値との排他的論理和を算出して出力する。排他的論理和回路３６に入力されるrs1[6]の反転値は、反転回路３６ａによって算出される。この排他的論理和回路３６によって算出される排他的論理和は、表１５，図２１，図２２（ｄ）を参照しながら説明した値~rs1[6]^rs3[6]である。
【０１７２】
論理積回路３３は、排他的論理和回路３６の出力とopcode[2]との論理積を算出し、レジスタ番号指示e_rs1[6]として出力する。つまり、opcode[2]=0で非ＳＩＭＤ方式が採用された場合、e_rs1[6]が0に固定される。一方、opcode[2]=1で第３利用態様が採用された場合、~rs1[6]^rs3[6]がe_rs1[6]として出力される（図２２（ｄ）参照）。
【０１７３】
論理積回路３４は、rs2[6]の反転値とopcode[2]との論理積を算出し、レジスタ番号指示e_rs2[6]として出力する。rs2[6]の反転値~rs2[6]は、反転回路３４ａによって算出される。つまり、opcode[2]=0で非ＳＩＭＤ方式が採用された場合、e_rs2[6]が0に固定される。一方、opcode[2]=1で第３利用態様が採用された場合、~rs2[6]がe_rs2[6]として出力される（図２２（ｄ）参照）。
【０１７４】
排他的論理和回路３５は、rd[6]とopcode[1]との排他的論理和を算出し、演算コードe_op[1]として出力する。また、図２５に示す生成部３０は、opcode[1:0]を演算コードb_op[1:0]としてそのまま出力するとともに、opcode[0]を演算コードe_op[0]としてそのまま出力される。これにより、生成部２５は、表１４の通り、演算コードb_op[1:0], e_op[1:0]を出力する。
【０１７５】
そして、図２５に示す生成部３０は、レジスタ書き込み制御信号b_weとして1を固定的に出力するとともに、opcode[2]をレジスタ書き込み制御信号e_wおよびレジスタ番号指定e_rd[6], e_rs3[6]としてそのまま出力する。また、生成部３０は、rd[5:0], rs1[6:0], rs2[6:0], rs3[5:0]をそれぞれレジスタ番号指定b_rd[5:0], b_rs1[6:0], b_rs2[6:0], b_rs3[5:0]として出力するとともに、rd[5:0], rs1[5:0], rs2[5:0], rs3[5:0]をそれぞれレジスタ番号指定e_rd[5:0], e_rs1[5:0], e_rs2[5:0], e_rs3[5:0]として出力する。
【０１７６】
これにより、図２５に示す生成部３０は、opcode[2]=1で第３利用態様が採用された場合、命令コード発行部２０からの命令コードopcode[1:0], rd[6:0], rs1[6:0], rs2[6:0], rs3[6:0]を、表１４，表１５，図２１，図２２を参照しながら説明した、命令セットb_we, e_we, b_rd[6:0], b_rs1[6:0], b_rs2[6:0], b_rs3[6:0], e_rd[6:0], e_rs1[6:0], e_rs2[6:0], e_rs3[6:0], b_op[1:0], e_op[1:0]に変換して出力する。また、opcode[2]=0で非ＳＩＭＤ方式が採用された場合、命令コード発行部２０からの命令コードを、図４および図５を参照しながら説明した命令セットに変換して出力する。
【０１７７】
〔８〕本実施形態の効果
このように、本発明の一実施形態としての演算装置１および演算方法によれば、命令コード発行部（設定部）２０および生成部３０の機能を用いることで、一の命令における一以上の未使用ビットrd[6], rs1[6], rs2[6], rs3[6]を用いて通常処理とは異なる拡張処理の実行指示を行なうことができる。これにより、例えばＳＩＭＤ浮動小数点積和演算等における各種演算組み合わせを少ない命令種別コード数で実現できる。したがって、上述したように、例えば、４つの命令によって行なっていた複素数行列積演算等の複雑な演算を、２つの命令によって実行することが可能になり、スループットを倍増させることができる。
【０１７８】
また、演算装置１では、通常演算器１２ｂについての演算種別および入力レジスタ番号指示と、拡張演算器１２ｅについての演算種別および入力レジスタ番号指示とを独立して入力している。このため、通常演算器１２ｂと拡張演算器１２ｅとにおいて、異なる入力値（レジスタ値）や異なる演算種別による演算を実行させることが可能になる。従って、演算装置１では、未使用ビットrd[6], rs1[6], rs2[6], rs3[6]を用いることにより、上述のような複素数行列積演算だけでなく、図１２〜図１５，図２３，図２４を参照しながら説明した各種演算組み合わせパターンによる演算を容易に実行することができる。
【０１７９】
〔９〕その他
なお、本発明は上述した実施形態に限定されるものではなく、本発明の趣旨を逸脱しない範囲で種々変形して実施することができる。
例えば、上述した実施形態では、演算器として通常演算器と拡張演算器との２つをそなえた場合について説明したが、本発明は、これに限定されるものではなく、３以上の演算器をそなえた場合にも同様に適用され、上述した実施形態と同様の作用効果を得ることができる。
【０１８０】
また、未使用ビットとして、ＳＩＭＤ方式を採用することにより未使用になったビットを用いているが、本発明は、これに限定されるものではなく、各種方式の採用等によって生じた未使用ビットに上記拡張処理情報を設定することでも、上述した実施形態と同様の作用効果を得ることができる。
【０１８１】
さらに、上述した設定部２０（設定ステップ）および生成部３０（生成ステップ）としての機能（全部もしくは一部の機能）は、コンピュータ（ＣＰＵ，情報処理装置，各種端末を含む）が所定のアプリケーションプログラムを実行することによって実現される。
【０１８２】
そのプログラムは、例えばフレキシブルディスク，ＣＤ（ＣＤ−ＲＯＭ，ＣＤ−Ｒ，ＣＤ−ＲＷなど），ＤＶＤ（ＤＶＤ−ＲＯＭ，ＤＶＤ−ＲＡＭ，ＤＶＤ−Ｒ，ＤＶＤ−ＲＷ，ＤＶＤ＋Ｒ，ＤＶＤ＋ＲＷなど）等のコンピュータ読取可能な記録媒体に記録された形態で提供される。この場合、コンピュータはその記録媒体からプログラムを読み取って内部記憶装置または外部記憶装置に転送し格納して用いる。また、そのプログラムを、例えば磁気ディスク，光ディスク，光磁気ディスク等の記憶装置（記録媒体）に記録しておき、その記憶装置から通信回線を介してコンピュータに提供するようにしてもよい。
【０１８３】
ここで、コンピュータとは、ハードウエアとＯＳ（Operating System）とを含む概念であり、ＯＳの制御の下で動作するハードウエアを意味している。また、ＯＳが不要でアプリケーションプログラム単独でハードウェアを動作させるような場合には、そのハードウェア自体がコンピュータに相当する。ハードウエアは、少なくとも、ＣＰＵ等のマイクロプロセッサと、記録媒体に記録されたコンピュータプログラムを読み取るための手段とをそなえている。上記プログラムは、上述のようなコンピュータに、設定部２０（設定ステップ）および生成部３０（生成ステップ）としての機能を実現させるプログラムコードを含んでいる。また、その機能の一部は、アプリケーションプログラムではなくＯＳによって実現されてもよい。
【０１８４】
さらに、本実施形態における記録媒体としては、上述したフレキシブルディスク，ＣＤ，ＤＶＤ，磁気ディスク，光ディスク，光磁気ディスクのほか、ＩＣカード，ＲＯＭカートリッジ，磁気テープ，パンチカード，コンピュータの内部記憶装置（ＲＡＭやＲＯＭなどのメモリ），外部記憶装置等や、バーコードなどの符号が印刷された印刷物等の、コンピュータ読取可能な種々の媒体を利用することもできる。
【０１８５】
〔１０〕付記
以上の第１〜第４実施形態を含む実施形態に関し、さらに以下の付記を開示する。
（付記１）  演算対象のデータを格納するレジスタと、該レジスタから読み出されたデータに基づく演算を実行する一以上の演算器とを有し、該レジスタから読み出されるべきデータおよび該演算器によって実行されるべき演算の種別を指示する、複数ビットからなる一の命令を受け、該演算器が、該一の命令によって指示されたデータに基づいて、該一の命令によって指示された種別の演算を実行する演算装置であって、
該一の命令における一以上の未使用ビットに、該一の命令によって実行される通常処理とは異なる拡張処理の実行指示を該レジスタおよび該演算器のうちの少なくとも一方に対して行なう拡張指示情報を設定する設定部を有することを特徴とする、演算装置。
【０１８６】
（付記２）  該設定部によって該未使用ビットに設定された該拡張指示情報と該一の命令における該未使用ビット以外のビットに設定された情報とに基づき、該レジスタおよび該演算器のうちの少なくとも一方に対し該拡張処理の実行指示を行なう拡張命令を生成して該一の命令として出力する生成部をさらに有することを特徴とする、付記１記載の演算装置。
【０１８７】
（付記３）  該未使用ビットが、該レジスタの領域を分割して使用する二以上の該演算器をそなえ該一の命令で複数のデータストリームを処理するＳＩＭＤ方式を採用することにより該通常処理時は未使用になったビットであることを特徴とする、付記１または付記２に記載の演算装置。
【０１８８】
（付記４）  該二以上の演算器が、それぞれ、該一の命令に含まれる演算種別コードに応じて演算の種別を切替可能な、多入力一出力の積和演算器であり、
該未使用ビットが、該一の命令に含まれる、各積和演算器へ出力されるべき該レジスタにおける各データを指示するレジスタ番号指示フィールドの最上位ビットであることを特徴とする、付記３記載の演算装置。
【０１８９】
（付記５）  該二以上の演算器が、それぞれ、該一の命令に含まれる演算種別コードに応じて演算の種別を切替可能な、多入力一出力の積和演算器であり、
該未使用ビットが、該一の命令に含まれる、各積和演算器による演算結果の、該レジスタにおける格納先を指示するレジスタ番号指示フィールドの最上位ビットであることを特徴とする、付記３または付記４に記載の演算装置。
【０１９０】
（付記６）  該拡張指示情報が、各積和演算器へ出力されるべきデータを、各積和演算器に対応する該レジスタの領域以外の領域におけるデータに切り替える指示を該レジスタに対して行なうものであることを特徴とする、付記４または付記５に記載の演算装置。
【０１９１】
（付記７）  該拡張指示情報が、各積和演算器による演算の種別を切り替える指示を各積和演算器に対して行なうものであることを特徴とする、付記４〜付記６のいずれか一項に記載の演算装置。
【０１９２】
（付記８）  演算対象のデータを格納するレジスタと、該レジスタから読み出されたデータに基づく演算を実行する一以上の演算器とを有する演算装置において、該レジスタから読み出されるべきデータおよび該演算器によって実行されるべき演算の種別を指示する、複数ビットからなる一の命令を受け、該演算器が、該一の命令によって指示されたデータに基づいて、該一の命令によって指示された種別の演算を実行する演算方法であって、
該一の命令における一以上の未使用ビットに、該一の命令によって実行される通常処理とは異なる拡張処理の実行指示を該レジスタおよび該演算器のうちの少なくとも一方に対して行なう拡張指示情報を設定する設定ステップを含むことを特徴とする、演算方法。
【０１９３】
（付記９）  該設定ステップにおいて該未使用ビットに設定された該拡張指示情報と該一の命令における該未使用ビット以外のビットに設定された情報とに基づき、該レジスタおよび該演算器のうちの少なくとも一方に対し該拡張処理の実行指示を行なう拡張命令を生成して該一の命令として出力する生成ステップをさらに含むことを特徴とする、付記８記載の演算方法。
【０１９４】
（付記１０）  該未使用ビットが、該レジスタの領域を分割して使用する二以上の該演算器をそなえ該一の命令で複数のデータストリームを処理するＳＩＭＤ方式を採用することにより該通常処理時は未使用になったビットであることを特徴とする、付記８または付記９に記載の演算方法。
【０１９５】
（付記１１）  該二以上の演算器が、それぞれ、該一の命令に含まれる演算種別コードに応じて演算の種別を切替可能な、多入力一出力の積和演算器であり、
該未使用ビットが、該一の命令に含まれる、各積和演算器へ出力されるべき該レジスタにおける各データを指示するレジスタ番号指示フィールドの最上位ビットであることを特徴とする、付記１０記載の演算方法。
【０１９６】
（付記１２）  該二以上の演算器が、それぞれ、該一の命令に含まれる演算種別コードに応じて演算の種別を切替可能な、多入力一出力の積和演算器であり、
該未使用ビットが、該一の命令に含まれる、各積和演算器による演算結果の、該レジスタにおける格納先を指示するレジスタ番号指示フィールドの最上位ビットであることを特徴とする、付記１０または付記１１に記載の演算方法。
【０１９７】
（付記１３）  該拡張指示情報が、各積和演算器へ出力されるべきデータを、各積和演算器に対応する該レジスタの領域以外の領域におけるデータに切り替える指示を該レジスタに対して行なうものであることを特徴とする、付記１１または付記１２に記載の演算方法。
【０１９８】
（付記１４）  該拡張指示情報が、各積和演算器による演算の種別を切り替える指示を各積和演算器に対して行なうものであることを特徴とする、付記１１〜付記１３のいずれか一項に記載の演算方法。
【図面の簡単な説明】
【０１９９】
【図１】本発明の一実施形態としての演算装置の構成を示すブロック図である。
【図２】図１に示す演算装置における演算部の基本的な動作を説明するためのフローチャートである。
【図３】非ＳＩＭＤ採用時の図１に示す演算装置における演算部の動作を簡単に説明するための図である。
【図４】非ＳＩＭＤ採用時の図１に示す演算装置における命令コード発行部および生成部の動作を説明するための図である。
【図５】（ａ）〜（ｄ）は、それぞれ、非ＳＩＭＤ採用時の図１に示す演算装置における命令コード，演算コード，レジスタ書き込み信号およびレジスタ番号指定（最上位ビットのみ）を具体的に示す図である。
【図６】ＳＩＭＤ採用時の図１に示す演算装置における演算部の動作を簡単に説明するための図である。
【図７】ＳＩＭＤ採用時の図１に示す演算装置における命令コード発行部および生成部の動作を説明するための図である。
【図８】（ａ）〜（ｄ）は、それぞれ、ＳＩＭＤ採用時の図１に示す演算装置における命令コード，演算コード，レジスタ書き込み信号およびレジスタ番号指定（最上位ビットのみ）を具体的に示す図である。
【図９】第１の未使用ビット利用態様採用時の図１に示す演算装置における演算部の動作を簡単に説明するための図である。
【図１０】第１の未使用ビット利用態様採用時の図１に示す演算装置における命令コード発行部（設定部）および生成部の動作を説明するための図である。
【図１１】（ａ）〜（ｄ）は、それぞれ、第１の未使用ビット利用態様採用時の図１に示す演算装置における命令コード，演算コード，レジスタ書き込み信号およびレジスタ番号指定（最上位ビットのみ）を具体的に示す図である。
【図１２】第１の未使用ビット利用態様採用時の図１に示す演算装置における演算部による演算組み合わせの具体例を示す図である。
【図１３】第１の未使用ビット利用態様採用時の図１に示す演算装置における演算部による演算組み合わせの具体例を示す図である。
【図１４】第１の未使用ビット利用態様採用時の図１に示す演算装置における演算部による演算組み合わせの具体例を示す図である。
【図１５】第１の未使用ビット利用態様採用時の図１に示す演算装置における演算部による演算組み合わせの具体例を示す図である。
【図１６】第２の未使用ビット利用態様採用時の図１に示す演算装置における演算部の動作を簡単に説明するための図である。
【図１７】第２の未使用ビット利用態様採用時の図１に示す演算装置における設定部および生成部の動作を説明するための図である。
【図１８】（ａ）〜（ｄ）は、それぞれ、第２の未使用ビット利用態様採用時の図１に示す演算装置における命令コード，演算コード，レジスタ書き込み信号およびレジスタ番号指定（最上位ビットのみ）を具体的に示す図である。
【図１９】第３の未使用ビット利用態様採用時の図１に示す演算装置における演算部の動作を簡単に説明するための図である。
【図２０】第３の未使用ビット利用態様採用時の図１に示す演算装置における演算部の動作を簡単に説明するための図である。
【図２１】第２の未使用ビット利用態様採用時の図１に示す演算装置における命令コード発行部（設定部）および生成部の動作を説明するための図である。
【図２２】（ａ）〜（ｄ）は、それぞれ、第３の未使用ビット利用態様採用時の図１に示す演算装置における命令コード，演算コード，レジスタ書き込み信号およびレジスタ番号指定（最上位ビットのみ）を具体的に示す図である。
【図２３】第３の未使用ビット利用態様採用時の図１に示す演算装置における演算部による演算組み合わせの具体例を示す図である。
【図２４】第３の未使用ビット利用態様採用時の図１に示す演算装置における演算部による演算組み合わせの具体例を示す図である。
【図２５】第３の未使用ビット利用態様採用時の図１に示す演算装置における生成部の具体的な実現例を示す回路図である。
【符号の説明】
【０２００】
１    演算装置
１０    演算部
１１    レジスタ
１２ｂ    通常浮動小数点積和演算器（通常演算器，演算器）
１２ｅ    拡張浮動小数点積和演算器（拡張演算器，演算器）
２０    命令コード発行部（設定部）
３０    生成部
３１，３２，３３，３４    論理積回路（ＡＮＤゲート）
３５，３６    排他的論理和回路（ＥＯＲゲート）
３１ａ，３２ａ，３４ａ，３６ａ    反転回路（ＮＯＴゲート，インバータ）
【図１】
0005481793.tif 000019
【図２】
0005481793.tif 000020
【図３】
0005481793.tif 000021
【図４】
0005481793.tif 000022
【図５】
0005481793.tif 000023
【図６】
0005481793.tif 000024
【図７】
0005481793.tif 000025
【図８】
0005481793.tif 000026
【図９】
0005481793.tif 000027
【図１０】
0005481793.tif 000028
【図１１】
0005481793.tif 000029
【図１２】
0005481793.tif 000030
【図１３】
0005481793.tif 000031
【図１４】
0005481793.tif 000032
【図１５】
0005481793.tif 000033
【図１６】
0005481793.tif 000034
【図１７】
0005481793.tif 000035
【図１８】
0005481793.tif 000036
【図１９】
0005481793.tif 000037
【図２０】
0005481793.tif 000038
【図２１】
0005481793.tif 000039
【図２２】
0005481793.tif 000040
【図２３】
0005481793.tif 000041
【図２４】
0005481793.tif 000042
【図２５】
0005481793.tif 000043