(57)【要約】【課題】演算途中の結果が汎用レジスタのビット幅を超えるような演算においても、チップに対する占有面積の増加を抑えて、高精度の演算が可能な演算装置を提供する。【解決手段】複数の汎用レジスタ１２は、第１のビット幅を有している。演算器１３は、第１、第２の入力端を有し、少なくとも第１の入力端が第１のビット幅より広い第２のビット幅を有し、汎用レジスタ１２から第１、第２の入力端に供給されるデータを演算する。第１のビット幅より狭いビット幅を有する第１、第２のレジスタｏｖ０、ｏｖ１は、演算器１３による演算の結果、あふれた桁のデータをオーバーフローデータとして保持し、演算器１３の少なくとも一方の入力端に、上位ビットとして保持したオーバーフローデータを供給する。【選択図】      図１
2008102715.tif 000002
【特許請求の範囲】
【請求項１】
第１のビット幅を有する複数の汎用レジスタと、
第１、第２の入力端を有し、少なくとも前記第１の入力端が前記第１のビット幅より広い第２のビット幅を有し、前記汎用レジスタから前記第１、第２の入力端に供給されるデータを演算する演算器と、
前記演算器による演算の結果、あふれた桁のデータをオーバーフローデータとして保持し、前記演算器の少なくとも一方の入力端に保持した前記オーバーフローデータを上位ビットとして供給する少なくとも１つのレジスタと
を具備する演算装置。
【請求項２】
前記少なくとも１つのレジスタは、保持した前記オーバーフローデータを前記演算器の前記第１、第２の入力端にオーバーフローデータとして供給することを特徴とする請求項１記載の演算装置。
【請求項３】
前記演算器による演算の結果、あふれた１ビットのデータを記憶するレジスタと、
前記少なくとも２つのレジスタに保持されたオーバーフローデータと、前記レジスタに保持された１ビットのデータを加算する加算器と
をさらに具備することを特徴とする請求項１記載の演算装置。
【請求項４】
前記汎用レジスタは、汎用ベクタレジスタであり、
前記演算器は、前記汎用ベクタレジスタのビット幅を２ｎ等分したデータを演算する２ｎ（ｎは、１以上の自然数）個の演算器と、
前記２ｎ個の演算器の演算の結果、あふれたデータをオーバーフローデータとして前記少なくとも１つのレジスタに供給するセレクタと
をさらに具備することを特徴とする請求項１記載の演算装置。
【請求項５】
前記汎用ベクタレジスタと、前記２ｎ個の演算器はＳＩＭＤ（Single Instruction Multi Data）演算回路を構成することを特徴とする請求項４記載の演算装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えばマイクロプロセッサに適用される演算装置に係わり、特に、高精度の演算結果を得ることが可能な演算装置に関する。
【背景技術】
【０００２】
プロセッサは、通常、発行された命令に応じて、汎用レジスタに一時的に保持されたデータを取り出して演算する。例えば３２ビットの汎用レジスタと演算器を持つプロセッサにより、例えば式（１）を演算する場合を考える。プログラム（２）は、式（１）を演算するアセンブラ命令の例を示している。
【０００３】
ｄ＝（ａ＋ｂ＋ｃ）＞＞２                        …（１）
ここで、Ｒ０＝ａ，Ｒ１＝ｂ，Ｒ２＝ｃ，Ｒ５＝ｄ
ＡＤＤ  Ｒ５，  Ｒ０，  Ｒ１
ＡＤＤ  Ｒ５，  Ｒ５，  Ｒ２
ＳＲＬ  Ｒ５，  Ｒ５，  ２                      …（２）
ここで、ＡＤＤは、加算命令であり、２番目と３番目に記載された汎用レジスタの内容を加算し、１番目に記載された汎用レジスタに代入することを示している。例えばプログラム（２）の１行目に記載されたＡＤＤ命令は、汎用レジスタＲ０とＲ１に保持されたデータを加算し、汎用レジスタＲ５に保持することを示している。２行目のＡＤＤ命令は、汎用レジスタＲ５とＲ２のデータを加算して汎用レジスタＲ５に保持することを示している。３行目のＳＲＬ命令は、２番目に示された汎用レジスタの内容を、３番目に記載された定数値だけ右方向（ＬＳＢ方向）へシフトして１番目に示された汎用レジスタに保持するシフト命令を示している。
【０００４】
上記プログラムをプロセッサで実行した場合の演算精度は、汎用レジスタのビット幅と演算器のビット幅に依存する。すなわち、３２ビットのプロセッサにより、３２ビットのデータ“ａ”と３２ビットのデータ“ｂ”を加算すると、場合によっては桁上がりが生じる。この場合、３２ビットの汎用レジスタにより、演算結果を正しく保持することはできない。このように、桁あふれ（オーバーフロー）が発生するデータを演算する場合、３２ビットよりビット幅が広い、例えば４０ビットの汎用レジスタと演算器を使用する必要がある。しかし、最近のプロセッサは、多数の汎用レジスタを有している。このため、汎用レジスタ及び演算器のビット幅を４０ビットに設定した場合、プロセッサにおける汎用レジスタの占有面積が大きくなるという問題がある。
【０００５】
ところで、３２ビットの“ａ”，“ｂ”，“ｃ”，“ｄ”という変数がある場合において、例えば式（３）に示すような演算を行うとする。
【０００６】
ｄ＝（ａ＋ｂ＋ｃ）／４                            …（３）
この場合、最終的な演算結果“ｄ”の値は、必ず３２ビット以下の値となるが、“ａ”，“ｂ”，“ｃ”の値によっては、演算の途中で３２ビットを越える場合がある。このように演算途中においてのみ、オーバーフローが発生する場合、必ずしも汎用レジスタのビット幅を増加させる必要は無い。この場合、演算器の中間結果を保持する例えば３３ビットのパイプラインレジスタと、この３３ビットのレジスタの内容と４０ビットのレジスタのデータとを加算し、この４０ビットのレジスタに保持させる４０ビット×３３ビットの加算器とからなるアキュムレータと、４０ビットのレジスタと３３ビットのレジスタのデータの一方を選択するセレクタを用いることが多い。
【０００７】
式（４）は、式（３）を例えばＣ言語で記述した例を示し、プログラム（５）は、式（４）を演算するためのアセンブラ命令の例を示している。
【０００８】
ｄ＝（ａ＋ｂ＋ｃ）＞＞２                          …（４）
ここで、Ｒ０＝ａ，Ｒ１＝ｂ，Ｒ２＝ｃ，Ｒ５＝ｄ
ＡＣＣ  Ｒ０、Ｒ１
ＡＣＣ  Ｒ２
ＡＣＣＳＲＬ  ２
ＡＣＣＭＯＶ  Ｒ５                                …（５）
上記プログラム（５）において、ＡＣＣはアキュムレータによる累積命令、ＡＣＣＳＲＬはアキュムレータの内容を定数値だけ右方向にシフトして再度アキュムレータに入れる命令、ＡＣＣＭＯＶはアキュムレータの内容を指定された汎用レジスタにコピーする命令とする。例えばプログラム（５）の１行目は、汎用レジスタＲ０とＲ１のデータを累積することを示し、２行目は、前記累積結果にさらに汎用レジスタＲ２のデータを累積することを示している。３行目のＡＣＣＳＲＬは、アキュムレータのデータを右方向に２ビットシフトすることを示し、ＡＣＣＭＯＶは、アキュムレータのデータを汎用レジスタＲ５に格納することを示している。
【０００９】
上記アキュムレータを用いることにより、４０ビット×３３ビットの加算器を使って高速に演算することができる。しかし、この場合、アキュムレータは、演算途中のデータを保持することが可能なビット幅の大きなレジスタと加算器が必要であり、多数のアキュムレータを持つとチップに対するアキュムレータの占有面積が増加する。また、アキュムレータを増やした場合、パイプラインのステージが増加し、構造が複雑になる。さらに、アキュムレータから汎用レジスタ又はメモリへの取り出し命令が必要となるという問題がある。
【００１０】
尚、上記演算装置に関連する技術として、演算ユニットにおいてオーバーフローが発生した場合、第１入力データの上位ビットをインクリメント又はデクリメントする演算補正回路と、演算ユニット及び演算補正回路の出力を受けて、Ｍビットの演算結果を出力する出力データ設定回路を備えた演算装置が例えば特許文献１に示されている。
【００１１】
また、演算精度を可変するとともに、有効桁数を少なくすることにより、消費電力を低減した演算装置が例えば特許文献２に示されている。
【特許文献１】特開２００１−１０９６１３号公報
【特許文献２】特開平０７−１４６７７７号公報
【発明の開示】
【発明が解決しようとする課題】
【００１２】
本発明は、演算途中の結果が汎用レジスタのビット幅を超えるような演算においても、チップに対する占有面積の増加を抑えて、高精度の演算が可能な演算装置を提供しようとするものである。
【課題を解決するための手段】
【００１３】
本発明の第１の態様は、第１のビット幅を有する複数の汎用レジスタと、第１、第２の入力端を有し、少なくとも前記第１の入力端が前記第１のビット幅より広い第２のビット幅を有し、前記汎用レジスタから前記第１、第２の入力端に供給されるデータを演算する演算器と、前記演算器による演算の結果、あふれた桁のデータをオーバーフローデータとして保持し、前記演算器の少なくとも一方の入力端に保持した前記オーバーフローデータを上位ビットとして供給する少なくとも１つのレジスタとを具備する演算装置である。
【発明の効果】
【００１４】
本発明によれば、演算途中の結果が汎用レジスタのビット幅を超えるような演算においても、チップに対する占有面積の増加を抑えて、高精度の演算が可能な演算装置を提供できる。
【発明を実施するための最良の形態】
【００１５】
以下、本発明の実施の形態について、図面を参照して説明する。
【００１６】
（第１の実施形態）
図１は、第１の実施形態を示している。図１に示す演算装置１１において、汎用レジスタ部１２は、ビット幅が例えば３２ビットの汎用レジスタを、例えば３２個有している。すなわち、汎用レジスタ部１２は、汎用レジスタＲ０〜Ｒ３１を有している。選択された汎用レジスタのデータは、パイプラインレジスタＰＲ０、ＰＲ１に保持される。これらレジスタＰＲ０、ＰＲ１は、演算器としての算術論理演算ユニット（ＡＬＵ）１３の第１、第２の入力端に接続されている。ＡＬＵ１３は、第１、第２の入力端のビット幅がそれぞれ例えば４０ビットである。すなわち、このＡＬＵ１３は４０ビット×４０ビットのデータを演算可能とされている。このＡＬＵ１３の出力端は、第１、第２のオーバーフローレジスタｏｖ０、ｏｖ１に接続されるとともに、パイプラインレジスタＰＲ２に接続されている。
【００１７】
第１、第２のオーバーフローレジスタｏｖ０、ｏｖ１は、ビット幅が例えば８ビットのレジスタであり、ＡＬＵ１３の出力データの上位８ビットを記憶する。第１のオーバーフローレジスタｏｖ０の出力端は、ＡＬＵ１３の第１の入力端の上位８ビットに接続され、第２のオーバーフローレジスタｏｖ１の出力端は、ＡＬＵ１３の第２の入力端の上位８ビットに接続されている。
【００１８】
また、パイプラインレジスタＰＲ２の出力端は、汎用レジスタ部１２に接続されている。
【００１９】
ＡＬＵ１３の第１、第２の入力端のビット幅は、４０ビットに限定されるものではなく、第１、第２のオーバーフローレジスタのビット幅は、８ビットに限定されるものではない。ＡＬＵ１３と第１、第２のオーバーフローレジスタのビット幅は、適宜設定することが可能である。また、オーバーフローレジスタの数は、２個に限定されるものではなく、２個以上とすることも可能である。
【００２０】
第１の実施形態において、ＡＬＵ１３は、演算を行う際、第１、第２のオーバーフローレジスタｏｖ０、ｏｖ１からのデータを、汎用レジスタからのデータの上位に連結して演算する。図１に示す例の場合、３２ビットの汎用レジスタのデータに、８ビットの第１、第２のオーバーフローレジスタｏｖ０、ｏｖ１のデータを連結し、４０ビットのデータとして演算する。さらに、ＡＬＵ１３の演算結果のうち、３２ビットより上位の８ビットは、第１、第２のオーバーフローレジスタｏｖ０、ｏｖ１のいずれかに格納される。
【００２１】
上記構成の演算装置により、例えば式（６）を演算する場合の動作について説明する。
【００２２】
ｄ＝（ａ＋ｂ＋ｃ）＞＞２                                      …（６）
プログラム（７）は、上記式（６）を演算するためのアセンブラ命令の例を示している。
【００２３】
ＡＤＤ｛ｏｖ０，ｎｕｌ，ｎｕｌ｝Ｒ５，Ｒ０，Ｒ１
ＡＤＤ｛ｏｖ０，ｏｖ０，ｎｕｌ｝Ｒ５，Ｒ５，Ｒ２
ＳＲＬ｛ｎｕｌ，ｏｖ０，ｎｕｌ｝Ｒ５，Ｒ５，２                …（７）
ここで、Ｒ０＝ａ，Ｒ１＝ｂ，Ｒ２＝ｃ，Ｒ５＝ｄ
式（７）において、“ｏｖ０”は、第１のオーバーフローレジスタｏｖ０を使用することを示し、“ｎｕｌ”は、第１、第２のオーバーフローレジスタｏｖ０、ｏｖ１のいずれも使用しないことを示している。
【００２４】
式（７）の１行目のＡＤＤ命令において、汎用レジスタＲ０，Ｒ１は、ビット幅が３２ビットであり、オーバーフローが発生しないため、第１、第２のオーバーフローレジスタは使用しない。すなわち、“ｎｕｌ”はオーバーフローレジスタを使用しないことを示している。また、加算結果が供給される汎用レジスタＲ５は、オーバーフローが発生する可能性があるため、オーバーフローしたデータを第１のオーバーフローレジスタｏｖ０に保持する。“ｏｖ０”は、第１のオーバーフローレジスタｏｖ０にデータを保持することを示している。
【００２５】
２行目のＡＤＤ命令は、汎用レジスタＲ５（ａ＋ｂ）とＲ２（ｃ）の加算を行う際、汎用レジスタＲ５のデータの上位に第１のオーバーフローレジスタｏｖ０の値を連結して加算し、演算結果を再度汎用レジスタＲ５に保持することを示し、その際、オーバーフローしたデータが再度第１のオーバーフローレジスタｏｖ０に保持されることを示している。
【００２６】
３行目のＳＲＬ命令は、汎用レジスタＲ５のデータ（ａ＋ｂ＋ｃ）の上位に、第１のオーバーフローレジスタｏｖ０のデータを連結して右方向にシフトし、この結果を再度汎用レジスタＲ５に保持することを示している。シフト後のデータは、３２ビット以下になることが保障されるため、シフト後のデータは第１のオーバーフローレジスタｏｖ０に保持されないことを示している。
【００２７】
尚、式（６−１）は、式（６）を例えばＣ言語で記述した他の例を示している。
【００２８】
ｄ＝（ａ＋ｂ＋ｃ）＞＞２／／overflow                  …（６−１）
ここで、“ａ”“ｂ”“ｃ”“ｄ”は、ユーザが、変数として例えば整数で、３２ビットのデータであることを予め定義しているものとする。また、“／／”より右側に、例えばコメントとして記載された“overflow”は、式（６−１）が演算途中でオーバーフローすることを示している。コンパイラは、“overflow”の記述がある場合、上記プログラム（７）に示すように、演算途中においてオーバーフローが発生する可能性がある命令に第１又は第２のオーバーフローレジスタを割り付ける。
【００２９】
オーバーフローの有無を示す記載は、コメントとして記載する場合に限定されるものではなく、コンパイラにより判別可能な記載であればよい。
【００３０】
また、オーバーフローの有無は、ユーザにより定義する場合に限定されるものではなく、コンパイラが自動的に判別してオーバーフローレジスタを割り付けることも可能である。
【００３１】
上記第１の実施形態によれば、プロセッサの命令により、汎用レジスタと組み合わせるオーバーフローレジスタを指定し（又はオーバーフローレジスタを使用しないことを明示し）、演算途中においてオーバーフローしたデータをオーバーフローレジスタに保持し、このオーバーフローレジスタのデータを演算時に再度利用している。このため、演算途中において、汎用レジスタのビット幅、例えば３２ビットを超える場合においても、演算精度を低下させることなく演算することが可能である。
【００３２】
しかも、第１の実施形態において、汎用レジスタのビット幅を増加せず、ＡＬＵ１３のビット幅を増加するとともに、オーバーフローレジスタを設けることにより、チップに対する演算装置の占有面積の増加を抑制している。
【００３３】
すなわち、一般に、オーバーフローレジスタは、途中の演算結果を保持するときだけ使用される。このため、オーバーフローレジスタの数は、汎用レジスタの数に比べて少ない数で十分な場合が多い。また、ＡＬＵ１３は最大の演算精度のビット幅を持つ必要があるが、汎用レジスタＲ０〜Ｒ３１は、ＡＬＵ１３と同一のビット幅を有する必要はなく、ＡＬＵ１３のビット幅より少ないビット幅でよい。このため、従来のように、例えば４０ビットの汎用レジスタを３２個配置した場合と、第１の実施形態のように、３２ビットの汎用レジスタを３２個と８ビットのオーバーフローレジスタが２個を配置した場合とを比べた場合、次式のようになる。
【００３４】
４０×３２−（３２×３２＋８×２）＝２４０ビット
したがって、第１の実施形態によれば、従来に比べて２４０ビット分のフリップフロップを削減することが可能であり、演算装置のチップ占有面積を低減することができる。
【００３５】
尚、第１の実施形態は、加算命令とシフト命令を使った動作例のみを説明した。しかし、第１の実施形態は、一般的なプロセッサで実行される演算命令の全てに適用することが可能である。
【００３６】
（第２の実施形態）
図２は、第２の実施形態を示している。図２において、図１と同一部分には同一符号を付している。
【００３７】
第２の実施形態に係る演算装置は、主として汎用レジスタ部１２、ＡＬＵ２２、セレクタ２３、加算器２４、第１、第２のオーバーフローレジスタｏｖ０、ｏｖ１、第３のオーバーフローレジスタＧＲを有している。
【００３８】
汎用レジスタ部１２は、例えば３２個の汎用レジスタＲ０〜Ｒ３１により構成されている。各汎用レジスタＲ０〜Ｒ３１は、３１ビットにより構成されている。ＡＬＵ２２は、第１の入力端が４０ビット、第２の入力端が３２ビットにより構成されている。第１の入力端には、３２ビットのパイプランレジスタＰＲ０と８ビットの第１、第２のオーバーフローレジスタｏｖ０、ｏｖ１の出力データが供給される。第２の入力端には、３２ビットのパイプランレジスタＰＲ０の出力データが供給される。ＡＬＵ２２の出力端は、パイプランレジスタＰＲ２の入力端に接続されるとともに、第３のオーバーフローレジスタＧＲの入力端、及びセレクタ２３の一方入力端に接続される。
【００３９】
パイプラインレジスタＰＲ２の出力端は、汎用レジスタ部１２に接続されている。第３のオーバーフローレジスタＧＲは、１ビットのレジスタであり、ＡＬＵ２２の演算結果のうち、汎用レジスタのビット幅を超えた１ビットを保持する。
【００４０】
加算器２４の第１、第２の入力端は、共に８ビットにより構成されている。加算器２４の第１の入力端は、第１のオーバーフローレジスタｏｖ０の出力端に接続され、第２の入力端は、第２のオーバーフローレジスタｏｖ１の出力端に接続されている。さらに、加算器２４の第３の入力端は、第３のオーバーフローレジスタＧＲの出力端に接続されている。この加算器２４は、第１、第２の入力端に供給されたデータを加算するとともに、この加算結果に第３の入力端に供給されたデータを加算する。
【００４１】
この加算器２４の出力端は、前記セレクタ２３の他方入力端に接続されている。このセレクタ２３の出力端は、第１、第２のオーバーフローレジスタの入力端に接続されている。
【００４２】
上記構成の演算装置により、前記式（６）を演算する場合の動作について説明する。
【００４３】
プログラム（８）は、上記式（６）を演算するアセンブラ命令の例を示している。
【００４４】
ＡＤＤ｛ｏｖ０，ｎｕｌ｝Ｒ５，Ｒ０，Ｒ１
ＡＤＤ｛ｏｖ０，ｏｖ０｝Ｒ５，Ｒ５，Ｒ２
ＳＲＬ｛ｎｕｌ，ｏｖ０｝Ｒ５，Ｒ５，２                        …（８）
ここで、Ｒ０＝ａ，Ｒ１＝ｂ，Ｒ２＝ｃ，Ｒ５＝ｄ
第２の実施形態において、第１の実施形態と異なる点は、汎用レジスタの値を演算する演算器２２の２つの入力のうち、第１の入力端だけに第１、第２のオーバーフローレジスタｏｖ０、ｏｖ１のデータが供給されるようになっている点である。このため、第１の実施形態は、最大の演算精度を有する２つのデータを入力するため、第１、第２の入力端共、４０ビットにより構成されていたのに対して、第２の実施形態は、第１の入力端のみ４０ビットにより構成され、第２の入力端は汎用レジスタＲ０〜Ｒ３１と同様のビット幅、すなわち、３２ビットにより構成されている。このため、ＡＬＵ２２の面積を削減することが可能である。
【００４５】
プログラム（８）に示す例の場合、ＡＬＵ２２の２つの入力端のうち、第１の入力端だけがオーバーフローレジスタを指定できるようになっている。すなわち、プログラム（８）に示すアセンブラの記述において、デスティネーションレジスタとＡＬＵ２２の第１の入力端にデータを供給する汎用レジスタのみがオーバーフローレジスタを指定可能とされている。
【００４６】
例えばプログラム（８）の１行目に記載されたＡＤＤ命令において、デスティネーションレジスタとしての汎用レジスタＲ５と、ＡＬＵ２２の第１の入力端にデータを供給する汎用レジスタＲ０のみがオーバーフローレジスタを使用可能とされている。しかし、このＡＤＤ命令において、汎用レジスタＲ０は３２ビット幅であるため、オーバーフローレジスタは使用しない。すなわち、“ｎｕｌ”はオーバーフローレジスタを使用しないことを示している。一方、汎用レジスタＲ５はオーバーフローが発生する可能性があるため、オーバーフローしたデータをオーバーフローレジスタに保持する必要がある。すなわち、“ｏｖ０”は、オーバーフローしたデータを第１のオーバーフローレジスタｏｖ０に保持することを示している。
【００４７】
プログラム（８）の２行目の記述において、デスティネーションレジスタとしての汎用レジスタＲ５と、ＡＬＵ２２の第１の入力端にデータを供給する汎用レジスタＲ５に対応して“ｏｖ０”が記述されている。すなわち、両汎用レジスタＲ５、Ｒ５は、共に第１のオーバーフローレジスタｏｖ０を使用することを示している。
【００４８】
プログラム（８）の３行目の記述において、デスティネーションレジスタとしての汎用レジスタＲ５に対応して“ｎｕｌ”が記述され、ＡＬＵ２２の第１の入力端にデータを供給する汎用レジスタＲ５に対応して“ｏｖ０”が記述されている。すなわち、シフト結果が保持される汎用レジスタＲ５は、オーバーフローが発生しないため、オーバーフローレジスタを使用しないことを示している。
【００４９】
第３のオーバーフローレジスタＧＲは、ＡＬＵ２２により汎用レジスタ同士の演算を行った結果、汎用レジスタのビット幅を超えた１ビットのデータを保持する。また、加算器２４は演算途中において、第１、第２のオーバーフローレジスタｏｖ０、ｏｖ１のデータ及び第３のオーバーフローレジスタＧＲのデータを加算する。
【００５０】
式（９）は、演算途中において、２つの汎用レジスタのビット幅を超えるデータ同士を演算する必要がある場合を示している。
【００５１】
ｅ＝（（ａ＊３＋ｂ）＋（ｃ＊３＋ｄ））＞＞３                    …（９）
プログラム（１０）は、上記式（９）演算するアセンブラ命令の例を示している。
【００５２】
ＭＵＬ｛ｏｖ０，ｎｕｌ｝Ｒ５，Ｒ０，３
ＡＤＤ｛ｏｖ０，ｏｖ０｝Ｒ５，Ｒ５，Ｒ１
ＭＵＬ｛ｏｖ１，ｎｕｌ｝Ｒ６，Ｒ２，３
ＡＤＤ｛ｏｖ１，ｏｖ１｝Ｒ６，Ｒ６，Ｒ３
ＡＤＤ｛ＧＲ，ｎｕｌ｝Ｒ５，Ｒ５，Ｒ６
ｏｖａｄｄ｛ｏｖ０，ｏｖ１，ＧＲ｝
ＳＲＬ｛ｎｕｌ，ｏｖ０｝Ｒ５，Ｒ５，３                        …（１０）
ここで、Ｒ０＝ａ，Ｒ１＝ｂ，Ｒ２＝ｃ，Ｒ３＝ｄ，Ｒ６＝ｅ
プログラム（１０）の１行目のＭＵＬ（乗算）命令は、汎用レジスタＲ０のデータ“ａ”に定数“３”を乗算し、この演算結果“ａ＊３”を汎用レジスタＲ５に格納し、汎用レジスタＲ５からオーバーフローした上位ビットは、第１のオーバーフローレジスタｏｖ０に保持されることを示している。
【００５３】
２行目のＡＤＤ命令は、汎用レジスタＲ５のデータ“ａ＊３”と汎用レジスタＲ１のデータ“ｂ”を加算し、この演算結果“ａ＊３＋ｂ”を汎用レジスタＲ５に保持し、汎用レジスタＲ５の上位ビットは第１のオーバーフローレジスタｏｖ０に保持されることを示している。
【００５４】
３行目のＭＵＬ命令は、汎用レジスタＲ２のデータ“ｃ”に定数“３”を乗算し、この演算結果“ｃ＊３”を汎用レジスタＲ６に保持し、汎用レジスタＲ６のオーバーフローした上位ビットが第２のオーバーフローレジスタｏｖ１に保持されていることを示している。
【００５５】
４行目のＡＤＤ命令は、汎用レジスタＲ６のデータ“ｃ＊３”と、汎用レジスタＲ３のデータ“ｄ”とを加算し、この演算結果“ｃ＊３＋ｄ”を汎用レジスタＲ６に保持し、汎用レジスタＲ６の上位ビットが第２のオーバーフローレジスタｏｖ１に保持されていることを示している。
【００５６】
４行目のＡＤＤ命令を実行した時点において、“ａ＊３＋ｂ”の演算結果が汎用レジスタＲ５に保持され、“ｃ＊３＋ｄ”の演算結果が汎用レジスタＲ６に格納されている。さらに、汎用レジスタＲ５の上位ビットは、第１のオーバーフローレジスタｏｖ０に保持され、汎用レジスタＲ６の上位ビットは、第２のオーバーフローレジスタｏｖ１に保持されている。
【００５７】
５行目のＡＤＤ命令は、汎用レジスタＲ５とＲ６のデータを加算し、この加算結果を汎用レジスタＲ５に格納するとともに、１ビットのオーバーフローデータを第３のオーバーフローレジスタＧＲに格納することを示している。すなわち、（ａ＊３＋ｂ）と（ｃ＊３＋ｄ）を加算するとき、３２ビットを超える２つの値の加算が行われ、加算結果の１ビットが第３のオーバーフローレジスタＧＲに格納される。
【００５８】
６行目のｏｖａｄｄ命令は、加算器２４に対する命令であり、加算器２４により、第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１のデータと、第３のオーバーフローレジスタＧＲのデータを順次加算し、第１のオーバーフローレジスタｏｖ０に格納することを示している。これにより、Ｒ５＋Ｒ６の上位ビットの演算結果が第１のオーバーフローレジスタｏｖ０に代入され、第１のオーバーフローレジスタｏｖ０と汎用レジスタＲ５の結果を連結させた値が、（ａ＊３＋ｂ）＋（ｃ＊３＋ｄ）の結果となる。
【００５９】
図３は、ＡＤＤ｛ＧＲ，ｎｕｌ｝Ｒ５，Ｒ５，Ｒ６の演算結果が保持された汎用レジスタＲ５のデータと、ｏｖａｄｄ｛ｏｖ０，ｏｖ１，ＧＲ｝の演算結果が保持された第１のオーバーフローレジスタｏｖ０のデータとを連結させる動作を模式的に示す図である。
【００６０】
７行目のＳＲＬ命令は、汎用レジスタＲ５と第１のオーバーフローレジスタｏｖ０のデータを右方向に３ビットシフトし、この結果を汎用レジスタＲ５に格納することを示している。
【００６１】
第２の実施形態によれば、ＡＬＵ２２の上位１ビットを保持する第３のオーバーフローレジスタＧＲと、第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１のデータ同士、及び第３のオーバーフローレジスタＧＲのデータを加算する加算器２４を設けている。このため、４０ビット×３２ビットのＡＬＵ２２と、８ビット×８ビットの加算器２４を組み合わせて、４０ビット同士の加算を行うことが可能となる。４０ビット×３２ビットのＡＬＵ２２と、８ビット×８ビットの加算器を合わせた面積は、一般に４０ビット×４０ビットのＡＬＵよりも小さい。したがって、チップに対する演算装置の占有面積を削減することが可能となる。
【００６２】
また、第２の実施形態は、ＡＬＵ２２の第１の入力端のみに第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１のデータを供給している。このため、第１の実施形態に比べて、命令フォーマットのオーバーフローレジスタを指定するフィールドを削減することが可能である。
【００６３】
（第３の実施形態）
図４は、第３の実施形態を示している。第３の実施形態は、汎用レジスタとＡＬＵがＳＩＭＤ（Single Instruction Multiple Data ）演算を処理できるように構成されている点が、第１、第２の実施形態と相違する。
【００６４】
図４に示すＳＩＭＤ演算装置３０において、汎用ベクタレジスタ部３１は、ＳＩＭＤデータを保持することができるレジスタであり、３２ビット×３２ビットのビット幅を有している。この汎用ベクタレジスタ部３１は、パイプレインレジスタ３２、３３にの入力端に接続されている。これらパイプレインレジスタ３２、３３は、共に３２ビットのビット幅を有している。
【００６５】
パイプラインレジスタ３２、３３の出力端は、４並列ＡＬＵ３４、２並列ＡＬＵ３５に接続されている。４並列ＡＬＵ３４は、第１、第２の入力端が共に例えば１０ビットにより構成された４つのＡＬＵを含み、各ＡＬＵの第１の入力端にパイプラインレジスタ３２の出力データが供給され、第２の入力端にパイプラインレジスタ３３の出力データが供給される。また、２並列ＡＬＵ３５は、第１、第２の入力端が共に例えば２０ビットにより構成された２つのＡＬＵを含み、各ＡＬＵの第１の入力端にパイプラインレジスタ３２の出力データが供給され、第２の入力端にパイプラインレジスタ３３の出力データが供給される。４並列ＡＬＵ３４の出力端、及び２並列ＡＬＵ３５の出力端は、セレクタ３６の入力端に接続されている。
【００６６】
このセレクタ３６は、３２ビットのビット幅を有している。４並列ＡＬＵ３４を構成する各ＡＬＵからそれぞれ出力される１０ビットのデータのうち、下位８ビットはセレクタ３６に供給される。また、２並列ＡＬＵ３５を構成する各ＡＬＵからそれぞれ出力される２０ビットのデータのうち、下位１６ビットはセレクタ３６に供給される。セレクタ３６は、４並列ＡＬＵ３４から供給される３２ビットのデータと、２並列ＡＬＵ３５から供給される３２ビットのデータのうちの一方を選択する。セレクタ３６の出力端は、パイプラインレジスタ３７の入力端に接続されている。このパイプラインレジスタ３７は、３２ビットのビット幅を有し、出力端は、前記汎用ベクタレジスタ部３１に接続されている。
【００６７】
また、４並列ＡＬＵ３４を構成する各ＡＬＵからそれぞれ出力される１０ビットのデータのうち上位２ビットと、２並列ＡＬＵ３５を構成する各ＡＬＵからそれぞれ出力される２０ビットのデータのうち上位４ビットは、それぞれセレクタ３８に供給される。このセレクタ３８は、例えば８ビットのビット幅を有し、４並列ＡＬＵ３４から供給される８ビットのデータと、２並列ＡＬＵ３５から供給される８ビットのデータの一方を選択する。このセレクタ３８の出力端は、第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１の入力端に接続されている。
【００６８】
第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１は、８ビットのビット幅を有し、セレクタ３８から供給される８ビットのデータを保持する。第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１から出力される８ビットのデータは、２ビットずつ４並列ＡＬＵ３４を構成する各ＡＬＵの第１、第２の入力端に２ビットずつ供給される。さらに、第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１から出力される８ビットのデータは、４ビットずつ２並列ＡＬＵ３５を構成する各ＡＬＵの第１、第２の入力端に４ビットずつ供給される。
【００６９】
上記構成によれば、８ビットの第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１により、８ビット×４並列ＳＩＭＤ演算を行う場合、４つの演算結果におけるオーバーフローをそれぞれ２ビットずつ保持することができる。また、第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１により、１６ビット×２並列ＳＩＭＤ演算を行う場合、２つの演算結果のオーバーフローを４ビットずつ保持できる。
【００７０】
以下に、８ビット×４並列ＳＩＭＤ演算を行う場合の動作について説明する。
【００７１】
この演算を行う際、汎用ベクタレジスタ部３１は、３２ビットが、８ビット×４に分割して使用され、８ビットのデータがそれぞれ４並列ＡＬＵ３４の各ＡＬＵに供給される。４並列ＡＬＵ３４による演算において、第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１が使われない場合、すなわち、変数の定義通りの場合、８ビットのデータが１０ビットに拡張されて使われる。また、第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１を使う場合、第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１に格納された８ビットのデータのうち、４つの演算器に対応した２ビットずつが、１０ビットの入力データのうちの上位２ビットとして使用される。
【００７２】
４つのＡＬＵから出力された各１０ビットのデータにおいて、演算結果を第１又は第２のオーバーフローレジスタｏｖ０，ｏｖ１に保持しない場合、各１０ビットのデータのうち上位２ビットは破棄される。演算結果を第１又は第２のオーバーフローレジスタｏｖ０，ｏｖ１に保持する場合、各１０ビットのデータのうち上位２ビットずつが結合され、８ビットのデータとして第１又は第２のオーバーフローレジスタｏｖ０，ｏｖ１に保持される。４つのＡＬＵから出力された各１０ビットのデータのうち、下位８ビットは、３２ビットのデータに結合されて、汎用ベクタレジスタ部３１の指定した汎用ベクタレジスタに保持される。
【００７３】
式（１１）は、ＳＩＭＤ演算に適用される式の例を示している。
【００７４】
ｄ０＝（ａ０＋ｂ０＋ｃ０）＞＞２
ｄ１＝（ａ１＋ｂ１＋ｃ１）＞＞２
ｄ２＝（ａ２＋ｂ２＋ｃ２）＞＞２
ｄ３＝（ａ３＋ｂ３＋ｃ３）＞＞２                            …（１１）
プログラム（１２）は、式（１１）を８ビット×４並列でＳＩＭＤ演算する場合のアセンブラ命令の例を示している。
【００７５】
ＡＤＤ．ｈ｛ｏｖ０，ｎｕｌ，ｎｕｌ｝ＶＲ５，ＶＲ０，ＶＲ１
ＡＤＤ．ｈ｛ｏｖ０，ｏｖ０，ｎｕｌ｝ＶＲ５，ＶＲ５，ＶＲ２
ＳＲＬ．ｈ｛ｎｕｌ，ｏｖ０，ｎｕｌ｝ＶＲ５，ＶＲ５，２      …（１２）
ここで、ＡＤＤ．ｈ、ＳＲＬ．ｈは、８ビット×４並列のＳＩＭＤ演算命令であり、ＡＤＤ．ｈは、加算命令、ＳＲＬ．ｈは、右方向への論理シフト命令である。ＶＲ０〜ＶＲ５は、汎用ベクタレジスタであり、具体的には次の通りである。
【００７６】
ＶＲ０＝［ａ０，ａ１，ａ２，ａ３］
ＶＲ１＝［ｂ０，ｂ１，ｂ２，ｂ３］
ＶＲ２＝［ｃ０，ｃ１，ｃ２，ｃ３］
ＶＲ５＝［ｄ０，ｄ１，ｄ２，ｄ３］
次に、８ビット×４並列ＳＩＭＤ演算の動作について説明する。
【００７７】
この演算が行われる場合、３２ビットの汎用ベクタレジスタの内容が上記のように、８ビット×４に分割される。この８ビットのデータが、４並列ＡＬＵ３４を構成する各ＡＬＵに供給される。すなわち、プログラム（１２）の１行目のＡＤＤ．ｈ命令の場合、汎用ベクタレジスタＶＲ０、ＶＲ１のデータが４並列ＡＬＵ３４により加算される。ここで、演算結果を保持する汎用ベクタレジスタＶＲ５はオーバーフローする可能性があるため、第１のオーバーフローレジスタｏｖ０が指定されている。
【００７８】
８ビット×４並列ＳＩＭＤ演算において、第１又は第２のオーバーフローレジスタｏｖ０，ｏｖ１を使う場合、８ビットの第１又は第２のオーバーフローレジスタｏｖ０，ｏｖ１の２ビットずつに分けられる。４並列ＡＬＵ３４を構成する各ＡＬＵの演算結果のうち上位２ビットは、第１のオーバーフローレジスタｏｖ０に２ビットずつ保持される。
【００７９】
一方、４つのＡＬＵから出力された各８ビットのデータは、セレクタ３６、パイプレインレジスタ３７を介して３２ビットのデータに結合され、汎用ベクタレジスタ部３１の指定された汎用ベクタレジスタＶＲ５に保持される。
【００８０】
プログラム（１２）の２行目のＡＤＤ．ｈ命令の場合、汎用ベクタレジスタＶＲ５のデータとＶＲ２のデータが加算される。このとき、汎用ベクタレジスタＶＲ５から供給される４つのデータの上位に、第１のオーバーフローレジスタｏｖ０から供給される４つの２ビットのデータが連結され、１０ビットのデータとして４つのＡＬＵの一方入力端に供給される。このＡＤＤ命令の場合も、各ＡＬＵの演算結果のうち上位２ビットが第１のオーバーフローレジスタｏｖ０に２ビットずつ保持される。また、各ＡＬＵの演算結果のうち８ビットは結合されて３２ビットのデータとされ、汎用ベクタレジスタ部３１の指定した汎用ベクタレジスタＶＲ５に保持される。
【００８１】
プログラム（１２）の３行目のＳＲＬ．ｈ命令の場合、汎用ベクタレジスタＲ５の４つのデータの上位に、第１のオーバーフローレジスタｏｖ０の２ビットずつのデータが結合され、１０ビットのデータとして４つのＡＬＵの一方入力端に供給される。このＳＲＬ．ｈ命令の演算結果はオーバーフローしないため、４つのＡＬＵからそれぞれ出力される８ビットのデータは結合されて、汎用ベクタレジスタＶＲ５に格納される。
【００８２】
尚、上記説明は、８ビット×４並列ＳＩＭＤ演算であるが、１６ビット×２並列ＳＩＭＤ演算の場合、第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１は、４ビットずつに分けられ、２０ビット×２０ビットのＡＬＵの演算結果のうち、上位４ビットを保持する。また、第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１に保持されたデータは、汎用ベクタレジスタから供給されるデータの上位に結合され、指定されたＡＬＵに供給される。
【００８３】
また、第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１を使用しない場合、８ビットのデータが１０ビットに拡張され，１６ビットのデータが２０ビットに拡張されて使われる。
【００８４】
また、演算結果を第１又は第２のオーバーフローレジスタｏｖ０，ｏｖ１に保持しない場合、４つのＡＬＵから出力された各１０ビットのデータのうち上位２ビットは破棄され、２つのＡＬＵから出力された各２０ビットのデータのうち上位４ビットは破棄される。
【００８５】
従来のＳＩＭＤ演算器は、演算途中のデータの精度が低くなることにより、ＳＩＭＤ化が制限されることが多い。例えば、８ビット×４並列のＳＩＭＤ演算において、符号付変数は−１２８〜１２７の値しかとることができない。このため、演算途中の結果が、前記値を超えた場合、一度、途中の演算結果を１６ビットのデータに拡張してから再度演算することが一般的である。この場合、１６ビット×２並列のＳＩＭＤ演算しか行えず、性能が大きく低下してしまう。しかも、８ビットから１６ビットへデータを拡張するための命令が必要となるという問題を有している。
【００８６】
これに対して、第３の実施形態によれば、第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１を用いることにより、演算途中のデータのビット幅を変えずに、８ビット×４並列、又は１６ビット×２並列のＳＩＭＤ演算を行うことが可能となる。しかも、第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１やセレクタ３８は、僅かな面積である。このため、チップに対する少ない面積の増加によってＳＩＭＤ演算の性能を向上させることができる。
【００８７】
尚、第３の実施形態は、ＳＩＭＤ演算回路に第１の実施形態と同様の第１、第２のオーバーフローレジスタｏｖ０，ｏｖ１を組み合わせた場合について説明した。しかし、これに限定されるものではなく、ＳＩＭＤ演算回路に、例えば第２の実施形態と同様に、各ＡＬＵの上位１ビットを保持する第３のオーバーフローレジスタと、第１、第２のオーバーフローレジスタのデータ、及び第３のオーバーフローレジスタのデータを加算する加算器とを組み合わせることも可能である。
【００８８】
また、ＳＩＭＤ演算回路は、２並列、４並列の回路を１つずつ合計２個設けた場合について説明したが、これに限定されるものではなく、例えば８並列の回路を１つ用いたり、２並列、４並列、８並列の回路の３つを用いたりすることも可能である。一般には、汎用ベクタレジスタのビット幅を２ｎ等分したデータを演算する２ｎ個（ｎは、１以上の自然数）の演算回路を、１組以上用いることが可能である。このように、並列数及び並列回路の数は、汎用ベクタレジスタのビット幅、及び演算精度に応じて変更可能なことは言うまでもない。
【００８９】
その他、本発明の要旨を変更しない範囲で種々変形実施可能なことは勿論である。
【図面の簡単な説明】
【００９０】
【図１】第１の実施形態に係る演算装置を示す回路構成図。
【図２】第２の実施形態に係る演算装置を示す回路構成図。
【図３】第２の実施形態の動作を模式的に示す図。
【図４】第３の実施形態に係る演算装置を示す回路構成図。
【符号の説明】
【００９１】
１１…演算装置、１２…汎用レジスタ部、Ｒ０〜Ｒ３１…汎用レジスタ、１３…ＡＬＵ、ｏｖ０，ｏｖ１…第１、第２のオーバーフローレジスタ、２３…セレクタ、２４…加算器、ＧＲ…第３のオーバーフローレジスタ、３０…ＳＩＭＤ演算装置、３１…汎用ベクタレジスタ部、３４…４並列ＡＬＵ、３５…２並列ＡＬＵ。
【図１】
2008102715.tif 000003
【図２】
2008102715.tif 000004
【図３】
2008102715.tif 000005
【図４】
2008102715.tif 000006