以下、図面を用いて実施形態を説明する。信号および情報が伝達される信号線には、信号名および情報名と同じ符号を使用する。
図1は、演算処理装置、演算器および演算処理装置の制御方法の一実施形態を示す。図1に示す演算処理装置100は、例えば、RISC(Reduced Instruction Set Computer)型のプロセッサであり、命令デコーダ1、レジスタファイル2および演算器3を有する。演算処理装置100は、即値演算命令の受信に基づいて、定数Pと即値IMとを乗算し、乗算結果とレジスタファイル2が保持するデータDTとの演算を実行する機能を有する。即値演算命令は、式(1)、(2)、(3)に示す演算を実行する命令であり、式(1)-(3)毎に命令コードが異なる。符号Xsは、符号Xsで示されるレジスタが保持するデータを示し、符号Xdは、即値演算命令の演算結果および演算結果が格納されるレジスタを示す。以下では、レジスタXsが保持するデータは、データXsとも称される。
Xd=P・IM‥‥(1)
Xd=Xs+P・IM‥‥(2)
Xd=Xs-P・IM‥‥(3)
命令デコーダ1は、図示しない命令バッファ等から出力される命令INSTをデコードし、デコード結果に基づいてレジスタファイル2の動作を制御する選択情報RSELと、演算器3等の動作を制御する各種の制御情報を生成する。命令デコーダ1は、即値演算命令をデコードした場合、選択情報RSEL、即値IMおよびシフト制御情報SFT1、SFT2等を生成する。例えば、選択情報RSELおよびシフト制御情報SFT1、SFT2等の制御情報は、制御信号として出力される。
式(1)に示す即値演算命令は、即値IMと、式(4)で示される定数Pとを乗算する命令である。式(2)に示す即値演算命令は、即値IMと、式(4)で示される定数Pとを乗算し、レジスタファイル2に保持されるデータDTと乗算により得られる値(=P・IM)とを加算する命令である。式(3)に示す即値演算命令は、即値IMと、式(4)で示される定数Pとを乗算し、レジスタファイル2に保持されるデータDTから乗算により得られる値(=P・IM)を減算する命令である。以下では、主に式(2)に示す即値演算命令を実行する場合について説明される。
P=2a+c・2b(a、bは”0”以上の整数、cは”-1”、”0”、”1”のいずれか) ‥‥(4)
特に限定されないが、図1に示す命令ISNTのビット数は、命令INSTの種類に依
存せず、32ビット等に固定される。命令ISNTが即値演算命令の場合、命令INSTは、即値演算命令を識別する値を示す命令コードICODEと、即値IMと、定数Pに対応するコードCODEと、レジスタファイル2内のレジスタを識別するレジスタ番号REGNとを含む。
命令デコーダ1は、定数算出部1bおよび制御情報生成部1cを含むシフト制御部1aを有する。定数算出部1bは、即値演算命令に含まれるコードCODEに基づいて定数Pを算出する。なお、定数算出部1bは、コードCODEと定数Pとの関係を示すテーブルを参照することでコードCODEから定数Pを生成してもよい。
制御情報生成部1cは、定数算出部1bが算出した定数Pに基づいて、シフト制御情報SFT1、SFT2を生成する。すなわち、シフト制御部1aは、命令デコーダ1が即値演算命令をデコードした場合、定数Pに基づいてシフト制御情報SFT1、SFT2を生成する。なお、命令デコーダ1は、即値演算命令をデコードした場合、即値演算命令に含まれる即値IMを取り出して演算器3に出力する。シフト制御情報SFT1は、第1のシフト制御情報の一例であり、シフト制御情報SFT2は、第2のシフト制御情報の一例である。
レジスタファイル2は、図示しない複数のレジスタを有する。複数のレジスタの各々は、命令デコーダ1からの選択情報RSELに基づいて選択される。例えば、選択情報RSELは、複数のレジスタのレジスタファイル2内での位置を示すアドレスである。そして、レジスタファイル2は、選択情報RSELに基づいて選択したレジスタからデータDTを読み出し、あるいは、選択情報RSELに基づいて選択したレジスタに演算器3等から出力されるデータを格納する。
演算器3は、演算部4、5を有する。演算部4は、シフト部6、7および加算部8を有する。演算部4は、第1の演算部の一例であり、演算部5は、第2の演算部の一例である。シフト部6は、第1のシフト部の一例であり、シフト部7は、第2のシフト部の一例である。
シフト部6は、シフト制御情報SFT1に基づいて、2進数で表される即値IMを上位側にaビットシフトしたシフト値IMS1を生成する。すなわち、シフト部6は、即値IMを式(4)に示す”2a”で乗じたシフト値IMS1を生成する。シフト値IMS1は、第1のシフト値の一例である。
シフト部7は、シフト制御情報SFT2に基づいて、2進数で表される即値IMまたは即値IMの補数を上位側にbビットシフトしたシフト値IMS2または”0”を示すシフト値IMS2を生成する。すなわち、シフト部7は、即値IMを式(4)に示す”c・2b”で乗じたシフト値IMS2を生成する。シフト値IMS2は、第2のシフト値の一例である。なお、シフト制御情報SFT2は、即値IMまたは即値IMの補数のいずれをシフトするかを示す情報を含む。
加算部8は、シフト値IMS1、IMS2を加算して加算値ADTを生成する機能を有し、例えば、全加算器である。ここで、加算値ADTは、式(5)に示すように、即値IMと定数Pとの積IM・Pである。
ADT=IM・2a+IM・(c・2b)=IM・(2a+c・2b)=IM・P ‥‥(5)
演算部5は、2つの入力を有し、例えば、加算値ADTと、レジスタファイル2において選択情報RSELで選択されるレジスタXsに保持されるデータDTとの演算を実行し、演算により得られたデータを演算結果RSLTとして出力する。式(2)に示す即値演算命令を実行する場合、演算部5は、データDTと加算値ADTとを加算した値を演算結果RSLTとして出力する。式(3)に示す即値演算命令を実行する場合、演算部5は、データDTから加算値ADTを減算した値を演算結果RSLTとして出力する。式(1)に示す即値演算命令を実行する場合、演算部5は、レジスタファイル2に保持されるデータDTを使用せず、”0”と加算値ADTとを加算した値を演算結果RSLTとして出力する。演算結果RSLTは、レジスタファイル2において符号Xdで示されるレジスタに格納される。例えば、演算部5による即値演算命令の演算は、演算部5が有する全加算器により実行される。
なお、演算部5は、全加算器以外に、乗算器、除算器または論理演算器等を有してもよい。そして、演算部5は、即値演算命令以外の命令である乗算命令または加算命令等を実行する場合、レジスタファイル2において2つの選択情報RSELで選択される2つのレジスタに保持された2つのデータDTの演算を実行する。
図2は、図1に示す演算処理装置100が即値演算命令を実行する場合の動作の一例を示す。すなわち、図2は、演算処理装置100の制御方法の一例を示す。図2の下側のかぎ括弧内に示す動作(B)、(C)は、比較対象である他の演算処理装置の動作の例を示す。なお、演算処理装置100は、命令を複数のステージに分けて処理する命令パイプラインを有する。命令パイプラインの各ステージは1サイクル(例えば、クロックサイクル)で実行される。
動作(A)のサイクル1において、命令デコーダ1は、受信した即値演算命令をデコードし、選択情報RSELおよび即値IMを生成し、定数算出部1bで定数Pを算出し、制御情報生成部1cでシフト制御情報SFT1、SFT2を生成する。命令デコーダ1に定数算出部1bを設けることで、コード化された定数Pが即値演算命令に記述される場合にも、命令をデコードするステージにおいて、定数Pを算出することができる。そして、命令デコーダ1の制御情報生成部1cは、定数算出部1bが算出した定数Pに基づいて、命令をデコードするステージにおいて、シフト制御情報SFT1、SFT2を生成できる。命令をデコードするステージにおいて定数Pおよびシフト制御情報SFT1、SFT2を生成できるため、後述するサイクル2において、命令を演算器3に投入するタイミングが遅れることを抑止することができる。この結果、各ステージの時間を延ばすことなく、即値演算命令を実行することができる。
次に、サイクル2において、命令デコーダ1は、選択情報RSEL、即値IMおよびシフト制御情報SFT1、SFT2を出力することで、レジスタファイル2および演算器3に命令を投入する。次に、サイクル3において、選択情報RSELを受信したレジスタファイル2は、選択情報RSELが示すレジスタからデータDTを読み出し、演算器3に出力する。また、サイクル3において、演算部4のシフト部6は、シフト制御情報SFT1に基づいて、即値IMをシフトする動作を実行し、シフト値IMS1を生成する。演算部4のシフト部7は、シフト制御情報SFT2に基づいて、即値IMをシフトする動作を実行し、シフト値IMS2を生成する。演算部4の加算部8は、シフト部6、7から出力されるシフト値IMS1、IMS2を加算し、加算値ADT(すなわち、P・IM)を生成する。
定数Pと即値IMとの積は、被乗数を乗数の各桁で乗じて得られる複数の部分積を桁毎に加算するCSA(Carry Save Adder)を有する乗算器ではなく、2つのシフト部6、7と加算部8とを有する演算部4により算出される。換言すれば、演算部4は、乗算”P・IM”を、即値IMをシフトする動作と、シフトにより得られたシフト値IMS1、IMS2を加算する動作により実行することができる。
演算部4の論理段数は、CSAを有する乗算器の論理段数に比べて少ない。CSAを持たない演算部4により定数Pと即値IMとの乗算を実行することで、即値演算命令における乗算”P・IM”は、レジスタファイル2からデータDTを読み出すサイクル中に実行することができる。すなわち、レジスタファイル2からデータDTを読み出す処理と並列に乗算”P・IM”を実行することができる。
次に、サイクル4において、演算部5が有する加算器は、例えば、演算部4からの加算値ADTとレジスタファイル2からのデータDT(Xs)とを加算する。そして、サイクル5において、式(1)-(3)に示す即値演算命令の演算結果RSLT(例えば、Xs+P・IM)が演算器3から出力され、レジスタファイル2のレジスタXdに格納される。即値演算命令の実行は、例えば、演算部5が有する加算器が実行する加算命令の実行と同様に、5サイクルで完了する。
かぎ括弧内に示す動作(B)は、図1に示す演算部4を使用せずに、演算部5を使用して即値演算命令を実行する場合の動作の例を示す。まず、サイクル1において、命令デコーダ1は、即値演算命令をデコードし、選択情報RSELおよび即値IMを生成し、定数Pを算出する。動作(B)では、命令デコーダ1は、シフト制御情報SFT1、SFT2を生成しない。
次に、サイクル2において、命令デコーダ1は、即値IMおよび定数Pを演算部5に出力することで、演算部5が有する乗算器に命令を投入し、1番目のフローが開始される。次に、サイクル3からサイクル6において、乗算器は、定数Pと即値IMとの乗算を実行し、サイクル6で演算結果RSLT(=P・IM)を得る。例えば、乗算器はCSAを有する。CSAでは、部分積の数が多いほど加算器の段数が増加し、演算時間が長くなる。このため、乗算器による乗算は、複数のサイクル(複数のステージ)を使用して実行される。演算結果RSLT(=P・IM)は、サイクル6の終了前に演算部5が有する加算器にバイパスされる。
一方、サイクル5において、命令デコーダ1は、選択情報RSELを出力することで、レジスタファイル2に命令を投入し、2番目のフローが開始される。例えば、演算処理装置100は、命令デコーダ1から出力される各種制御信号(すなわち、命令)を保持し、保持した各種制御信号を演算器3が実行可能な順に出力するリザベーションステーション等の実行制御部(図1には図示せず)を有する。そして、実行制御部は、サイクル5において選択情報RSELを出力する。サイクル6において、選択情報RSELを受信したレジスタファイル2は、選択情報RSELが示すレジスタXsからデータDTを読み出し、演算部5に出力する。
サイクル7において、演算部5が有する加算器は、乗算器からバイパスされる演算結果RSLT(=P・IM)とレジスタファイル2から出力されるデータDT(Xs)とを加算する。そして、サイクル7において、演算結果RSLT(例えば、Xs+P・IM)が演算器3から出力され、レジスタファイル2のレジスタXdに格納される。動作(B)では、即値演算命令は、2つのフローに分けて演算部5の乗算器と加算器とを順次動作させて実行されるため、7サイクルで実行される。
かぎ括弧内に示す動作(C)は、図1に示す演算部4の代わりに、CSAを有する即値の演算用の乗算器を有する演算処理装置が即値演算命令の乗算(P・IM)を実行する場合の動作の例を示す。
まず、サイクル1において、命令デコーダは、命令INSTを受信し、即値演算命令をデコードし、選択情報RSELおよび即値IMを生成し、定数Pを算出する。命令デコーダは、シフト制御情報SFT1、SFT2を生成しない。次に、サイクル2において、命令デコーダは、選択情報RSEL、即値IMおよび定数Pを出力することで、レジスタファイルと乗算(P・IM)を実行する乗算器とに命令を投入する。
次に、サイクル3において、選択情報RSELを受信したレジスタファイルは、選択情報RSELが示すレジスタからデータDT(Xs)を読み出し、図1に示す演算部5と同様の演算部が有する加算器に出力する。また、サイクル3において、乗算(P・IM)を実行する乗算器は、命令デコーダから受信する定数Pと即値IMとの乗算を実行し、乗算結果を得る。但し、CSAを有する乗算器では、動作(B)と同様に、乗算(P・IM)の実行に4サイクルが掛かる。パイプライン処理を実行する各ステージの時間は、処理時間が最も長いステージの時間に合わせて設定される。このため、動作(C)を実行する演算処理装置では、各サイクルの時間は、例えば、動作(A)、(B)に示すサイクルの時間の4倍に設定される。
次に、サイクル4において、演算部が有する加算器は、乗算器から受信した乗算結果(P・IM)とレジスタファイルから受信したデータDT(Xs)とを加算する。そして、サイクル5において、演算結果RSLT(例えば、Xs+P・IM)が演算器から出力され、レジスタXdに格納される。かぎ括弧内に示す動作(C)では、即値演算命令は、5サイクルで実行される。但し、1サイクルの時間が動作(A)、(B)に示す1サイクルの時間の4倍に設定されるため、実際には、即値演算命令の実行には、20サイクル分の演算時間が掛かる。
以上、図1に示す実施形態では、定数Pが”2a+c・2b”で示される即値演算命令を実行する場合、乗算”P・IM”を実行する演算部4を、2つのシフト部6、7と加算部8により実現することができる。すなわち、乗算”P・IM”を実行する演算部4の回路規模(論理段数)を、CSAを有する乗算器の回路規模(論理段数)に比べて削減することができる。これにより、レジスタファイル2からデータDTを読み出すサイクル中に乗算”P・IM”を実行することができる。換言すれば、演算処理装置100が有する命令パイプラインの各ステージの時間を延ばすことなく、演算”P・IM”を実行する演算部4を演算処理装置100に追加することができる。この結果、定数Pと即値IMとを乗算し、乗算結果とレジスタファイル2が保持するデータDTとの演算を実行する即値演算命令を、演算部5が有する加算器が実行する加算命令と同じサイクル数で実行することができる。すなわち、即値演算命令を実行する場合、図2で説明した動作(B)、(C)に比べて、実行時間を短縮することができる。
命令デコーダ1に定数算出部1bを設けることで、即値演算命令にコード化された定数Pが記述される場合にも、命令デコーダ1が命令をデコードするステージ(=サイクル1)において、定数Pを算出することができる。そして、命令デコーダ1の制御情報生成部1cは、定数算出部1bが算出した定数Pに基づいて、命令デコーダ1が命令をデコードするステージ(=サイクル1)において、シフト制御情報SFT1、SFT2を生成することができる。したがって、レジスタファイル2からデータDTを読み出すサイクルが開始される前に定数Pの算出およびシフト制御情報SFT1、SFT2の生成を実行することができる。この結果、レジスタファイル2からデータDTを読み出すサイクル中に乗算”P・IM”を実行することができる。
図3は、演算処理装置、演算器および演算処理装置の制御方法の別の実施形態を示す。図1に示す要素と同一または同様の要素については、同じ符号を付し、詳細な説明は省略する。図3に示す演算処理装置102は、例えば、RISC型のプロセッサであり、命令デコーダ10、リザベーションステーション20、レジスタファイル30および演算器40を有する。演算器40は、即値演算部50、セレクタ72、74、演算部80および複数のレジスタ91、92、93、94、95、96を有する。なお、即値演算部50を除き、演算器40の各構成要素は、SIMD(Single Instruction Multiple Data)演算を実行可能にするため、複数のベクトルデータを並列に演算する複数の要素を有する。
即値演算部50は、第1の演算部の一例であり、演算部80は、第2の演算部の一例である。レジスタ91、92、93、94、95、96は、クロックに同期してデータ等を保持するラッチ回路を含み、命令パイプラインの各ステージの境界に設けられる。
命令デコーダ10は、図示しない命令バッファ等から出力される命令INSTをデコードし、デコード結果に基づいてレジスタファイル30の動作を制御する選択情報RSELと、演算器40等の動作を制御する各種の制御情報とを生成する。命令ISNTの形式は、図1に例示した命令INSTと同様に、命令コードICODEと、命令コードICODEに応じたレジスタ番号REGN等の所定数のパラメータとを含む。命令ISNTのビット数は、命令INSTの種類に依存せず、32ビット等に固定される。制御情報は、シフト制御情報SFT1、SFT2、キャリーCARYおよび選択情報RSEL、SEL1、SEL2、OPSELを含み、信号として出力される。
命令デコーダ10は、即値演算部50を演算の実行に使用する即値演算命令をデコードした場合、選択情報RSEL、即値IM、シフト制御情報SFT1、SFT2、キャリーCARYおよび選択情報SEL1、SEL2、OPSELを生成する。即値演算命令の形式は、図1と同じであり、命令コードICODE、即値IM、定数Pに対応するコードCODE、およびレジスタ番号REGNを含む。即値演算命令は、上述した式(1)-(3)に示す演算を実行する命令であり、式(1)-(3)中の定数Pは、上述した式(4)により示される。
命令デコーダ10は、即値演算部50を演算の実行に使用しない乗算命令または加算命令等の演算部80で実行する命令をデコードした場合、選択情報RSEL、SEL1、SEL2、OPSEL等を生成する。即値IM、シフト制御情報SFT1、SFT2、キャリーCARYは生成されない。命令デコーダ10が出力する情報は、演算器40に命令を実行させる情報であるため、以下では命令情報とも称される。命令デコーダ10の例は、図4に示される。
リザベーションステーション20は、命令デコーダ10から出力される命令情報を保持する図示しない複数のエントリを有し、エントリに保持した命令情報を演算器40が実行可能な順に出力する。リザベーションステーション20は、演算器40で実行する命令の順序をデータの依存関係に応じて入れ換えることで、アウトオブオーダ実行を制御する。リザベーションステーション20は、実行制御部の一例である。
レジスタファイル30は、命令デコーダ10からの選択情報RSEL(例えば、アドレス)に基づいて選択される複数のレジスタREG(REG0、REG1、REG2、...)を有する。そして、レジスタファイル30は、選択情報RSELが示すレジスタREGからデータ(DT1、DT2)を読み出し、読み出したデータを選択情報RSELに基づいてレジスタ91、92の少なくともいずれかに出力する。また、レジスタファイル30は、レジスタ96から出力される演算結果RSLT、または図示しないデータキャッシュから出力されるデータを選択情報RSELが示すレジスタに格納する。
1つの命令で複数のデータの演算を並列に実行するために、レジスタファイル30の各レジスタREGには、複数のデータが格納される。すなわち、各レジスタREGは、SIMD型のベクトルレジスタである。各レジスタREGには、固定小数点数または浮動小数点数が格納可能であるが、即値演算命令の実行時には、固定小数点数が格納される。固定小数点数を扱う場合、各レジスタREGには、8ビット、16ビット、32ビットまたは64ビットのいずれかの複数のデータが格納される。レジスタREGに格納されるデータの数は、図6で説明される。なお、レジスタファイル30は、SIMD型のレジスタREG以外に、整数型のレジスタを有してもよい。
即値演算部50は、即値IMとシフト制御情報SFT1、SFT2とキャリーCARYとに基づいて、上述した式(1)-(3)中の定数Pと即値IMとの積(P・IM)を算出し、算出した積をセレクタ74に出力する。即値演算部50の例は、図5に示される。
セレクタ72は、レジスタ91、95から出力されるデータまたは”0”を選択情報SEL1に基づいて選択し、選択したデータをオペランドデータOP1としてレジスタ93に出力する。セレクタ72が選択したデータは、データキャッシュにも出力されてもよい。セレクタ74は、即値演算部50またはレジスタ92、95、96から出力されるデータを選択情報SEL2に基づいて選択し、選択したデータをオペランドデータOP2としてレジスタ94に出力する。レジスタ93、94が保持するオペランドデータOP1、OP2は、演算部80に出力される。
演算部80は、加算器ADD、乗算器MUL、論理積演算器ANDおよび論理和演算器OR等の複数の演算器を有する。例えば、加算器ADDは、2つの入力を有し、レジスタ93、94から出力される固定小数点数のオペランドデータOP1、OP2を加算する全加算器である。加算器ADDは、加算により得られたデータを演算結果RSLTとしてレジスタ95に出力する。なお、演算部80が有する演算器は、図3に示す演算器に限定されず、除算器DIVまたはシフト演算器SFT等の他の演算器を有してもよい。また、演算部80は、浮動小数点数を演算する演算器を有してもよい。レジスタ95は、演算部80から受信した演算結果RSLTを保持し、保持した演算結果RSLTをレジスタファイル30への中継用のレジスタ96に出力する。
図4は、図3に示す命令デコーダ10の一例を示す。命令デコーダ10は、デコード部12およびシフト制御部14を有する。シフト制御部14は、定数算出部16およびシフトデコーダ18を有する。シフトデコーダ18は、制御情報生成部の一例である。
デコード部12は、受信した命令INSTをデコードし、選択情報OPSEL、SEL1、SEL2を生成する。デコード部12は、命令INSTにレジスタ番号REGNが含まれる場合、レジスタ番号REGNに基づいて、選択情報RSELを生成する。デコード部12は、命令INSTが即値演算命令の場合、命令INSTに含まれる即値IMとコードCODEを取り出して出力する。
シフト制御部14の定数算出部16は、即値演算命令に含まれるコードCODEに基づいて定数Pを算出する。なお、定数算出部16は、コードCODEと定数Pとの関係を示すテーブルを参照することでコードCODEから定数Pを生成してもよい。シフト制御部14のシフトデコーダ18は、定数算出部16から出力される定数Pに基づいてシフト制御情報SFT1、SFT2およびキャリーCARYを生成する。シフトデコーダ18の動作の例は、図7に示される。
図5は、図3に示す即値演算部50の一例を示す。即値演算部50は、補数生成部52、複数のシフタ54、シフタ56a、56b、セレクタ58、60、加算器62および複数のレジスタ64、65、66、67を有する。シフタ54は、第1のシフタの一例であり、シフタ56aは、第2のシフタの一例であり、シフタ56bは、第3のシフタの一例である。セレクタ58は第1の選択部の一例であり、セレクタ60は第2の選択部の一例である。シフタ54およびセレクタ58は、第1のシフト部の一例であり、補数生成部52、シフタ56a、56bおよびセレクタ60は、第2のシフト部の一例である。加算器62は、加算部の一例である。
補数生成部52は、レジスタ64を介してリザベーションステーション20から受信する即値IMのビット値を反転して即値IMの補数/IM(1の補数)を生成し、生成した補数/IMをシフタ56bおよびセレクタ60に出力する。
なお、補数生成部52は、補数生成部52の入力データ(即値IM)の右側(最下位ビット側、以下同様)に付加ビット“0”を付け加え、この付加ビットが追加された入力データの補数(1の補数)を生成する。
例えば、入力データ(即値IM)が2進数表記で”0011”の場合、補数生成部52は、”0011”の最下位ビット(LSB;Least Significant Bit)の右側に”0”が付加されることで生成されるビット列(00110)の各ビットを反転する。つまり、入力データ”0011”の場合、補数生成部52は”11001”を補数/IMとして出力する。
なお、補数生成部52によって付加された付加ビット”0”(これは、補数生成部52による演算の結果、”1”に反転される)は、シフタ56bで使用される。付加ビットは、シフタ56bの演算が完了した後は不要なため、補数/IMがセレクタ60に入力される際に削除される。詳細は後述する。
各シフタ54は、レジスタ64を介してリザベーションステーション20から受信する即値IMをシフトする。各シフタ54に付した数値は、即値IMを上位ビット側にシフトするビット数を示す。すなわち、各シフタ54は、上述した式(4)において、aを”1”以上の整数とする値2aに対応して、即値IMをaビットシフトする。例えば、”<<8”を付けたシフタ54は、即値IM(2進数)を上位ビット側に8ビットシフトし、シフト値IMSを出力する。これにより、即値IMを256倍したシフト値IMSが生成される。”<<2”を付けたシフタ54は、即値IM(2進数)を上位ビット側に2ビットシフトし、シフト値IMSとして出力する。これにより、即値IMを4倍したシフト値IMSが生成される。なお、即値演算部50は、即値IMを上位ビット側に9ビット以上シフトするシフタ54を有してもよい。
逆に、即値演算命令によって指定される定数P(即値演算命令に含まれるコードCODEに基づいて算出される定数P)が特定の値に限定される場合、即値演算部50は1つのシフタ54のみを有する構成でもよい。例えば、即値演算命令によって指定される定数Pが、”P=22+c・2b”(a=”2”、bは”0”以上の整数、cは”-1”、”0”、”1”のいずれか)で表される値に限定されている場合、即値演算部50は、即値を2ビット左シフトするシフタ54のみを有していればよい。
セレクタ58は、シフタ54から出力される複数のシフト値IMSまたは即値IMのいずれかを、シフト制御情報SFT1に基づいて選択し、選択した値をシフト値IMS1として出力する。セレクタ58は、”0”から”8”のいずれかを示すシフト制御情報SFT1を受信し、受信したシフト制御情報SFT1の値と同じ番号の入力で受信する複数のシフト値IMSまたは即値IMのいずれかを選択する。複数のシフタ54およびセレクタ58は、式(5)に示す”IM・2a”を算出し、シフト値IMS1として出力する。
シフタ56aは、レジスタ64を介してリザベーションステーション20から受信する即値IM(2進数)を上位ビット側に1ビットシフトし、シフト値IMSとして出力する。すなわち、シフタ56aは、式(4)において、cを”1”とし、bを”1”以上の整数とする値c・2bに対応して、即値IMをbビットシフトする。
シフタ56bは、補数生成部52から受信する補数/IM(2進数)を上位ビット側に1ビットシフトし、シフト値IMSとして出力する。シフタ56bが補数/IMをシフトするとき、補数生成部52によって付加された付加ビット”1”も左シフトされる。シフト操作の後、シフトされたデータの最右ビット(付加ビットに相当する位置のビット)は削除される(つまりシフタ56bに出力されない)。例えば、補数生成部52から受信する補数/IMが2進数表記で”11001”の場合、シフタ56bは”11001”を左シフトすることで”10010”を算出し、この計算結果(10010)の上位4ビットをシフト値IMSとして出力する。つまり、シフト値IMSは”1001”である。なお、”11001”の最右ビットの“1”は付加ビットであり、元の即値IMは4ビット長のデータである。これにより、シフタ56bは、式(4)において、cを”-1”とし、bを”1”以上の整数とする値c・2bに対応して、補数/IMをbビットシフトする。
図5に示す例では、シフタ56aにより即値IMを2倍したシフト値IMSが生成され、シフタ56bにより補数/IMを2倍したシフト値IMSが生成される。なお、即値演算部50は、即値IMを上位ビット側に2ビット以上シフトするシフタ56aを有してもよく、補数/IMを上位ビット側に2ビット以上シフトするシフタ56bを有してもよい。即値演算部50が、補数/IMを2ビット以上左シフトするシフタ56bを有するのであれば、補数生成部52は複数の付加ビットを付加する。例えば、即値演算部50が、補数/IMをnビット左シフトするシフタ56bを有する場合(nは1より大きい整数である)、補数生成部52はnビットの”0”を即値IMの右側に付加してから、補数(1の補数)の計算を行う。さらに、シフト量が互いに異なる複数のシフタ56aと、シフト量が互いに異なる複数のシフタ56bとが、即値演算部50に設けられてもよい。
セレクタ60は、シフタ56a、56bから出力される2つのシフト値IMS、即値IM、補数/IMまたは”0”のいずれかを、シフト制御情報SFT2に基づいて選択し、選択した値をシフト値IMS2として出力する。セレクタ60は、”0”から”4”のいずれかを示すシフト制御情報SFT2を受信し、受信したシフト制御情報SFT2の値と同じ番号の入力で受信する2つのシフト値IMS、即値IM、補数/IMまたは”0”のいずれかを選択する。補数生成部52、シフタ56a、56bおよびセレクタ60は、即値IMを式(5)に示す”IM・(c・2b)”を算出し、シフト値IMS2として出力する。
係数cが”0”の場合、セレクタ60は、”0”のシフト制御情報SFT2を受信し、”0”をシフト値IMS2として出力する。係数cが”1”の場合、セレクタ60は、”1”または”2”のシフト制御情報SFT2を受信し、即値IMを2倍したシフト値IMSまたは即値IMのいずれかをシフト値IMS2として出力する。係数cが”-1”の場合、セレクタ60は、”3”または”4”のシフト制御情報SFT2を受信し、補数/IMを2倍したシフト値IMSまたは補数/IMのいずれかをシフト値IMS2として出力する。
なお、補数/IMがセレクタ60の”3”の入力に入力される場合、補数生成部52によって補数/IMに付加されている付加ビットは入力されない。同様に、シフタ56bは付加ビットを含まないシフト値IMSを出力するので、付加ビットはセレクタ60の”4”の入力に入力されない。
加算器62は、例えば、全加算器であり、シフト値IMS1、IMS2とキャリーCARYとを加算して加算値ADT(=P・IM)を生成し、生成した加算値ADTをレジスタ67に出力する。これにより、式(5)に示す定数Pと即値IMとの乗算を、CSAを有する乗算器に比べて論理段数が少ない簡易な即値演算部50により実行することができる。換言すれば、即値演算部50は、定数Pと即値IMとの乗算を、CSAを有する乗算器に比べて、短い演算時間で実行することができる。
なお、係数cが”-1”の場合、加算器62は、”1”のキャリーCARYを受信する。すなわち、補数生成部52が生成した補数/IM(1の補数)に基づいてセレクタ60が出力するシフト値IMS2にキャリーCARYが加算されることで、加算器62は、シフト値IMS2を2の補数として扱うことができる。補数生成部52で即値IMの2の補数を生成せずに、加算器62に与えるキャリーCARYにより2の補数を生成することで、補数生成部52は、即値IMの各ビットの論理を反転するインバータ(NOT回路)を有すればよい。したがって、補数生成部52の論理規模を、2の補数を生成する補数生成部の論理規模に比べて小さくすることができる。
図6は、即値演算命令で使用するデータの総ビット幅VLと、SIMD演算に使用する各データのビット幅Eとに応じて設定される定数Pの一例を示す。図6では、説明を分かりやすくするため、演算式に対応する4つのグループGr(GrA、GrB、GrC、GrD)に分けて定数Pを記載する。各グループGrにおいて、即値演算命令に含まれるコードCODEから得られる定数Pは、太枠で囲った24個の値のいずれかである。なお、即値演算命令に含まれるコードCODEから得られる定数Pは、図6に示す4つのグループGrの演算式を使用して得られる値に限定されず、他の演算式を使用して得られる定数Pであって、”2a+c・2b”で示される定数Pでもよい。すなわち、演算処理装置102は、上述した式(4)を満足する定数Pであれば、図6に示す定数P以外の即値演算命令を実行可能である。
総ビット幅VLは、図3に示す各レジスタREGのビット幅であり、即値演算命令を実行する演算処理装置毎に設定され、2のn乗(例えば、nは6以上の整数)で示される。図3に示す演算処理装置102では、例えば、総ビット幅VLは、512ビット(n=9)であり、各レジスタREGは、64ビットのビット幅を有する8個のサブレジスタを有する。SIMD演算に使用する各データ(ベクトル)のビット幅Eは、命令コードICODEに応じて8ビット、16ビット、32ビット、64ビットのいずれかに設定される。換言すれば、式(1)-(3)に示す即値演算命令の各々は、さらに、データ(ベクトル)が8ビット、16ビット、32ビット、64ビットのいずれかである4つの命令に分けられる。
総ビット幅VLが512ビットの場合にビット幅E毎に設定される定数Pの値は、二重の太枠内に示される。なお、総ビット幅VL(上限)が512ビットの演算処理装置102は、総ビット幅VLが256ビット、128ビットまたは64ビットに対応する定数Pの値を使用して即値演算命令を実行可能である。
グループGrAにおける定数Pは式(6)で示される。式(6)に示す総ビット幅VLを各データのビット幅Eで除して得られる定数Pは、SIMD演算に使用する各データ(ベクトル)の数を示す。総ビット幅VLが512ビットでビット幅Eが8ビットの場合、定数Pは64であり、総ビット幅VLが512ビットでビット幅Eが16ビットの場合、定数Pは32である。
P=VL/E ‥‥(6)
グループGrBでは、定数Pは式(7)で示される。グループGrCでは、定数Pは式(8)で示される。式(8)中の”mod”は、”VL/E”を”4”で除して余りを求める剰余演算を示す。グループGrDでは、定数Pは式(9)で示される。式(9)中の”mod”は、”VL/E”を”3”で除して余りを求める剰余演算を示す。
P=”VL/E≦2nを満たす最小の2n” ‥‥(7)
P=VL/E-(VL/E mod 4) ‥‥(8)
P=VL/E-(VL/E mod 3) ‥‥(9)
総ビット幅VLが512ビットの場合、定数算出部16(図4)は、即値演算命令に含まれるコードCODE(図1)に基づいて定数P=”64”、”32”、”16”、”8”、”63”、”30”、”15”、”6”のいずれかを算出する。
図7は、図4に示すシフトデコーダ18の動作の概要を示す。なお、図7では、シフトデコーダ18は、即値演算命令に含まれるコードCODEに基づいて、図6に太枠で示した全ての定数Pを算出可能である。定数Pは、上述した式(4)に示したように、”2a+c・2b”で表すことができる。
例えば、総ビット幅VLが512ビットに対応する即値演算命令に含まれるコードCODEのみを命令デコーダ10がデコードする場合、シフトデコーダ18は、図7に示す動作の一部を実行できればよい。すなわち、シフトデコーダ18は、網掛けで示すNo.6、8、9、10、11、15、16、17に示す定数Pに対応するシフト制御情報SFT1、SFT2およびキャリーCARYを生成できればよい。例えば、図7に示す”No.”は、即値演算命令に含まれるコードCODEの値である。
シフトデコーダ18は、即値演算命令に含まれるコードCODE(すなわち、No.)に対応する定数Pを算出し、定数Pから式(4)に示す指数a、bと係数cとを算出する。そして、シフトデコーダ18は、指数aの値を示すシフト制御情報SFT1を出力する。また、シフトデコーダ18は、係数cが”0”の場合、”0”を示すシフト制御情報SFT2を出力する。シフトデコーダ18は、係数cが”1”で指数bが”0”の場合、”1”を示すシフト制御情報SFT2を出力し、係数cが”1”で指数bが”1”の場合、”2”を示すシフト制御情報SFT2を出力する。シフトデコーダ18は、係数cが”-1”で指数bが”0”の場合、”3”を示すシフト制御情報SFT2を出力し、係数cが”-1”で指数bが”1”の場合、”4”を示すシフト制御情報SFT2を出力する。さらに、シフトデコーダ18は、係数cが”0”または”1”の場合、”0”を示すキャリーCARYを出力し、係数cが”-1”の場合、”1”を示すキャリーCARYを出力する。
図8は、図3に示す演算処理装置102が即値演算命令を実行する場合の動作の一例を示す。すなわち、図8は、演算処理装置102の制御方法の一例を示す。図8では、主に式(2)に示した即値演算命令が実行される場合の動作が説明される。命令パイプラインは、命令が順次転送される複数のステージD、DT、P、PT、B1、B2、X、Uを有し、各ステージは1サイクル(例えば、クロックサイクル)で実行される。以下では、ステージD、DT、P、PT、B1、B2、X、Uが実行されるサイクルは、それぞれDサイクル、DTサイクル、Pサイクル、PTサイクル、B1サイクル、B2サイクル、Xサイクル、Uサイクルとも称される。
まず、Dサイクルにおいて、命令デコーダ10は、即値演算命令をデコードし、定数Pを算出し、即値演算命令から即値IMを取り出す。命令デコーダ10は、定数Pに基づいてシフト制御情報SFT1、SFT2およびキャリーCARYを生成する。さらに、命令デコーダ10は、選択情報RSEL、SEL1、SEL2、OPSEL等を生成する。なお、式(1)に示したデータXsとの演算を含まない即値演算命令の演算を実行する場合、命令デコーダ10は、レジスタファイル30の動作を制御する選択情報RSELを生成しない。
次に、DTサイクルにおいて、命令デコーダ10は、即値IM、シフト制御情報SFT1、SFT2、キャリーCARYおよび選択情報RSEL、SEL1、SEL2、OPSEL等をリザベーションステーション20に転送する。
次に、Pサイクルにおいて、リザベーションステーション20は、複数のエントリに保持された命令の中から演算器40に投入する命令を決定する。図8に示す例では、即値演算命令を実行するための制御情報を保持するエントリが選択される。なお、図8では、即値演算命令を実行するための制御情報を保持するエントリが選択されるため、Pサイクルは、DTサイクルの次のサイクルに実行される。しかしながら、リザベーションステーション20が、他の命令を実行するために他のエントリを選択した場合、即値演算命令の実行用のDTサイクルとPサイクルの間に空きサイクルが挿入される。
次に、PTサイクルにおいて、リザベーションステーション20は、Pサイクルで投入を決定した即値演算命令を演算器40およびレジスタファイル30に投入する。すなわち、リザベーションステーション20は、選択情報RSELをレジスタファイル30に出力し、即値IM、シフト制御情報SFT1、SFT2、キャリーCARYおよび選択情報SEL1、SEL2、OPSELを演算器40に出力する。
次に、B1サイクルにおいて、レジスタファイル30は、選択情報RSELに基づいて、レジスタREG(Xs)を選択し、選択したレジスタREGからのデータDT1(Xs)を読み出す。また、B1サイクルにおいて、即値演算部50は、即値IM、シフト制御情報SFT1、SFT2およびキャリーCARYに基づいて、定数Pと即値IMとの積を算出し、加算値ADTとして出力する。レジスタファイル30からデータを読み出すB1サイクル中に、積P×IMを算出することで、レジスタファイル30から読み出したデータと、積P×IMとをB2サイクルで演算部80に出力することができる。なお、式(1)に示した即値演算命令の演算を実行する場合、レジスタファイル30からのデータの読み出しは実行されない。
次に、B2サイクルにおいて、演算器40は、演算部80の加算器ADDで加算するデータを決定する。すなわち、セレクタ72は、選択情報SEL1に基づいてレジスタ91から出力されるデータDT1(Xs)を選択し、選択したデータDT1をレジスタ93に出力する。なお、式(1)に示した即値演算命令の演算を実行する場合、セレクタ72は”0”を選択する。セレクタ74は、選択情報SEL2に基づいて即値演算部50から出力される加算値ADT(=P・IM)を選択し、選択した加算値ADTをレジスタ94に出力する。
次に、Xサイクルにおいて、演算部80の加算器ADDは、レジスタ93、94から受信するデータDT1(Xs)と加算値ADT(=P・IM)との加算を実行し、加算結果RSLT(Xs+P・IM)をレジスタ95に出力する。なお、式(1)に示した即値演算命令の演算を実行する場合、加算器ADDは、レジスタ93から受信する”0”と、レジスタ94から受信する加算値ADT(=P・IM)との加算を実行し、加算結果RSLT(P・IM)をレジスタ95に出力する。式(1)に示した即値演算命令の演算を実行する場合、セレクタ72に”0”を選択させることで、即値演算部50および加算器ADDを用いて式(1)-(3)に示した即値演算命令の全てを実行することができ、回路規模の増加を抑制することができる。また、式(3)に示した即値演算命令の演算を実行する場合、加算器ADDは、データDT1(Xs)から加算値ADT(=P・IM)を差し引く減算を実行し、減算結果RSLT(Xs-P・IM)をレジスタ95に出力する。
そして、式(2)の演算が実行される場合、Uサイクルにおいて、演算結果RSLT(Xs+P・IM)がレジスタ95から出力され、即値演算命令の実行が完了する。一方、式(1)の演算が実行される場合、Uサイクルにおいて、演算結果RSLT(P・IM)がレジスタ95から出力される。式(3)の演算が実行される場合、Uサイクルにおいて、演算結果RSLT(Xs-P・IM)がレジスタ95から出力される。即値演算命令の実行に掛かるサイクル数(=8)は、加算器ADDにより実行される通常の加算命令の実行に掛かるサイクル数と同じである。
図9および図10は、即値演算命令を実行する他の演算処理装置200と、他の演算処理装置200の動作の概要を示す。図3に示す演算処理装置102と同様の要素については、同じ符号を付し、詳細な説明は省略する。図9および図10に示す太線は、即値演算命令を実行する場合のデータおよび制御情報の流れと、動作する演算器とを示す。演算処理装置200は、命令デコーダ210、リザベーションステーション220、レジスタファイル30および演算器240を有する。
命令デコーダ210は、シフト制御情報SFT1、SFT2およびキャリーCARYの代わりに定数Pを出力する機能を有することを除き、図3に示す命令デコーダ10と同様である。換言すれば、命令デコーダ210は、図4に示すシフトデコーダ18を持たず、定数算出部16が算出した定数Pをリザベーションステーション220に出力する。リザベーションステーション220は、シフト制御情報SFT1、SFT2およびキャリーCARYの代わりに定数Pを保持することを除き、図3に示すリザベーションステーション20と同様である。
演算器240は、図3に示す即値演算部50を持たないことと、図3に示すセレクタ72、74の代わりにセレクタ272、274を有することとを除き、図3に示す演算器40と同様である。セレクタ272は、レジスタ91、95から出力されるデータ、”0”または定数Pを選択情報SEL1に基づいて選択し、選択したデータをオペランドデータOP1としてレジスタ93に出力する。セレクタ274は、即値IM、レジスタ92、95、96から出力されるデータまたは演算部80から出力される演算結果RSLTを選択情報SEL2に基づいて選択し、選択したデータをオペランドデータOP2としてレジスタ94に出力する。
図9において、即値演算命令をデコードした命令デコーダ210は、選択情報RSEL、定数P、即値IMおよび選択情報SEL1、SEL2、OPSELを生成する。選択情報RSELは、図10でレジスタファイル30からデータを読み出すために使用される。選択情報OPSELは、図9で乗算器MULを動作させるための情報と、図10で加算器ADDを動作させるための情報とを含む。
リザベーションステーション220は、上述した式(1)-(3)中の定数Pと即値IMとの積を乗算器MULに算出させるために、定数P、即値IMおよび選択情報SEL1、SEL2、OPSELを出力する。セレクタ272は、選択情報SEL1に基づいて、定数Pを選択し、選択した定数Pを演算部80に向けて出力する。セレクタ274は、選択情報SEL2に基づいて、即値IMを選択し、選択した即値IMを演算部80に向けて出力する。演算部80は、選択情報OPSELに基づいて乗算器MULを動作させ、定数Pと即値IMとを乗算し、乗算により得られる演算結果RSLT(P×IM)を出力する。
次に、図10において、リザベーションステーション220は、例えば、上述した式(2)に示したデータXsとデータ(P×IM)との和を加算器ADDに算出させるために、選択情報RSEL、SEL1、SEL2、OPSELを出力する。セレクタ272は、選択情報SEL1に基づいて、レジスタ91を介してレジスタファイル30から出力されるデータDT1(Xs)を選択し、選択したデータDT1(Xs)を演算部80に向けて出力する。セレクタ274は、選択情報SEL2に基づいて、演算結果RSLT(P×IM)を選択し、選択した演算結果RSLT(P×IM)を演算部80に向けて出力する。演算部80は、選択情報OPSELに基づいて加算器ADDを動作させ、データXsと乗算結果P×IMとを加算し、加算により得られる演算結果RSLT(Xs+P×IM)を出力する。
これにより、式(2)に示した演算(すなわち、即値演算命令)が実行される。図3に示した即値演算部50を持たない演算処理装置200では、即値演算命令は、図9および図10に示すように、2つのフローに分けて実行される。
図11は、図9および図10に示す演算処理装置102が即値演算命令を実行する場合の動作の一例を示す。図8と同様の動作については、詳細な説明は省略する。図11に示す第1フローは、定数Pと即値IMとを乗算する図9に示す動作に対応し、図11に示す第2フローは、データXsと乗算結果P×IMとを加算する図10に示す動作に対応する。
まず、第1フローのDサイクルにおいて、命令デコーダ210は、即値演算命令をデコードし、命令から即値IMを取り出し、定数Pを算出し、リザベーションステーション220に出力する各種制御情報を生成する。次に、DTサイクルにおいて、命令デコーダ210は、生成した各種制御情報をリザベーションステーション220に出力する。
次に、Pサイクルにおいて、リザベーションステーション220は、定数Pと即値IMとの乗算を実行するための制御情報の演算器240への投入を決定する。次に、PTサイクルにおいて、リザベーションステーション220は、Pサイクルで投入を決定した制御情報を演算器240に投入する。
次に、B1サイクルでは、レジスタファイル30は、リザベーションステーション220から制御情報を受信しないため、動作しない。次に、B2サイクルにおいて、セレクタ272、274が動作することで、演算部80に投入するデータ(すなわち、定数Pと即値IM)が決定し、データが乗算器MULに出力される。この後、複数のXサイクルが実行され、乗算器MULは、定数Pと即値IMとの乗算を実行する。例えば、乗算器MULは、内蔵するCSAを使用して乗算を実行するため、乗算の実行には、複数サイクルが掛かる。乗算器MULは、サイクル(k-2)で演算結果RSLTを得る。演算結果RSLTは、レジスタ95に保持される前にセレクタ274に転送される。
乗算器MULによる乗算の実行中に第2フローが開始される。まず、第2フローのPサイクルにおいて、リザベーションステーション220は、データXsと乗算結果P×IMとの加算を実行させるための選択情報RSEL、SEL1、SEL2、OPSELの出力を決定する。次に、PTサイクルにおいて、リザベーションステーション220は、Pサイクルで投入を決定した選択情報RSELをレジスタファイル30に投入し、Pサイクルで投入を決定した選択情報SEL1、SEL2、OPSELを演算器240に投入する。
次に、B1サイクルにおいて、レジスタファイル30は、選択情報RSELに基づいて、データXsを保持するレジスタREGを選択し、選択したレジスタREGからのデータXsの読み出し処理を実行する。次に、B2サイクル(k-2サイクル)において、選択情報SEL1、SEL2に基づいてセレクタ272、274が動作する。セレクタ272は、レジスタファイル30から出力されたデータXsを選択し、選択したデータXsを即値演算部50に向けて出力する。セレクタ274は、演算部80からバイパスされた演算結果RSLTであるデータP×IMを選択し、選択したデータP×IMを即値演算部50に向けて出力する。
次に、第2フローのXサイクルにおいて、演算部80の加算器ADDは、選択情報OPSELに基づいて、データXsとデータP×IMとの加算を実行する。すなわち、式(2)に示す加算が実行される。そして、Uサイクルにおいて、演算結果RSLTがレジスタ95から出力され、即値演算命令の実行が完了する。
以上、図3から図8に示す実施形態においても、図1および図2に示す実施形態と同様の効果を得ることができる。すなわち、即値演算命令で実行される乗算”P・IM”(式(1)-(3))を、CSAを有する乗算器MULではなく、補数生成部52、シフタ54、56a、56b、セレクタ58、60および加算器62を含む即値演算部50により実行することができる。論理段数が乗算器MULより小さい即値演算部50を使用することで、レジスタファイル30からデータDT1(Xs)を読み出すサイクル中に乗算”P・IM”を実行することができる。この結果、即値演算命令を、演算部80が有する加算器ADDが実行する加算命令と同じサイクル数で実行することができ、即値演算命令を2フローで実行する場合に比べて、実行時間を短縮することができ、演算処理装置102の処理性能を向上することができる。
命令デコーダ10に定数算出部16を設けることで、即値演算命令にコード化された定数Pが記述される場合にも、命令をデコードするステージDにおいて、定数Pを算出することができる。そして、シフトデコーダ18が、定数Pに基づいてシフト制御情報SFT1、SFT2およびキャリーCARYを生成することで、レジスタファイル30からデータDT1(Xs)を読み出すサイクル中に乗算”P・IM”を実行することができる。
さらに、図3から図8に示す実施形態では、加算器62に与えるキャリーCARYにより2の補数を生成することで、補数生成部52は、即値IMの2の補数を生成せずに、インバータにより即値IMの各ビットの論理を反転して1の補数をすればよい。これにより、補数生成部52の論理規模を、2の補数を生成する機能を含む補数生成部の論理規模に比べて小さくすることができる。また、式(1)に示した即値演算命令の演算を実行する場合、セレクタ72に”0”を選択させることで、即値演算部50および加算器ADDを用いて式(1)-(3)に示した即値演算命令の全てを実行することができ、回路規模の増加を抑制することができる。
また、演算処理装置の構成は、上述した構成に限定されない。例えば、上述した実施形態では、即値演算部50の補数生成部52が、補数生成部52の入力データ(即値IM)の右側に付加ビット”0”を付加し、付加ビットの付された入力データの補数(1の補数)を生成する。しかしながら別の実施形態では、即値演算部50の補数生成部52は、即値IMの右側に付加ビット”0”を付加せず、付加ビットを含まない即値IMをシフタ56bに送信してもよい。その代わりにシフタ56bは、補数/IMが左シフトされる場合、最下位ビット(LSB)に”1”をセットする機能を有する。なお、即値演算部50が、補数/IMをnビット(nは1より大きい整数)左シフトするシフタ56bを別に有する場合、当該シフタ56bは、nビット左シフトされた補数/IMの下位nビットに”1”をセットする。
例えば、即値IMが2進数表記で”0011”の場合、補数生成部52は”1100”を補数/IMとして出力する。続いてシフタ56bが補数/IM(1100)を受信すると、シフタ56bはこの値”1100”を1ビット左シフトし、シフトされた値のLSBに”1”をセットする。その結果、このシフタ56bによって得られるシフト値は”1001”になる。
以上の詳細な説明により、実施形態の特徴点および利点は明らかになるであろう。これは、特許請求の範囲がその精神および権利範囲を逸脱しない範囲で前述のような実施形態の特徴点および利点にまで及ぶことを意図するものである。また、当該技術分野において通常の知識を有する者であれば、あらゆる改良および変更に容易に想到できるはずである。したがって、発明性を有する実施形態の範囲を前述したものに限定する意図はなく、実施形態に開示された範囲に含まれる適当な改良物および均等物に拠ることも可能である。