(57)【特許請求の範囲】
【請求項１】
複数の被乗数を有するＮビットの数と、前記各被乗数に対応する乗数を有するＭビットの数との積を求めることによって、被乗数と乗数との組に対する乗算結果を求める演算器であって、
８ビットの被乗数を複数個保持し、各被乗数のビット長の総和がＮ（Ｎは３２ビット）を越えないことを条件として配置され、各被乗数の間に０を埋め込んだ状態で、Ｎビットの数を保持する第１レジスタと、
前記各被乗数に対応する８ビットの乗数を保持し、各乗数のビット長の総和がＭ（Ｍは３２ビット）を越えないことを条件として配置され、各乗数の間に０を埋め込んだ状態で、Ｍビットの数を保持する第２レジスタと、
第１レジスタに保持された値と第２レジスタに保持された値との部分積を求めていく処理を行う部分積処理部と、
前記部分積において、１組の被乗数と乗数の、乗算結果の符号を補償するため、乗算結果を２の補数表現したビットを埋込む符号拡張部と、
前記符号拡張部で符号拡張が行われた後、各部分積の和を順次求めていく手段であって、ある組の被乗数と乗数に対する全ての部分積の総和が所定値を越えた場合、該越えた値を、次の他の組の被乗数と乗数に対する部分積の総和を求めていく際に廃棄する、各部分積の総和値を求める総和手段と、
前記総和手段によって求めた、総和値（「Ｎ＋Ｍ」（ビット））のデータから、第１レジスタにおける各被乗数と、これに対応する第２レジスタにおける乗数との乗算結果である値を切り出し、被乗数と乗数との組に対応する乗算結果を、各組について求める処理手段とを有する演算器。
【請求項２】
請求項１において、
さらに、前記第１レジスタにおける各被乗数と、これに対応する第２レジスタにおける乗数との乗算結果に、値を加えるための加算数を複数個保持し、各加算数のビット長の総和が、予め定めた長さを越えないことを条件として配置され、各加算数の間に０を埋込み、加算数を保持する第３レジスタと、
前記第１レジスタにおける各被乗数と、これに対応する第２レジスタにおける乗数との乗算結果に対応する、第３レジスタにおける加算数を加算する加算手段とを備えること
を特徴とする演算器。
【請求項３】
請求項１および２のいずれかにおいて、
前記第１レジスタにおける各被乗数と、これに対応する第２レジスタにおける乗数との乗算結果が、オーバーフロー、あるいは、アンダーフローである場合には、乗算結果を予め定めた値とする乗算値置換部を備えること
を特徴とする演算器。
【請求項４】
複数の被乗数を有するＮビットの数と、前記各被乗数に対応する乗数を有するＭビットの数との積を求めることによって、被乗数と乗数の組に対する乗算結果を求める演算器であって、
被乗数を複数個保持し、各被乗数のビット長の総和がＮを越えないことを条件として配置する、Ｎビットの数を保持する第１レジスタと、
前記各被乗数に対応する乗数を保持し、各乗数のビット長の総和がＭを越えないことを条件として配置する、Ｍビットの数を保持する第２レジスタと、
第１レジスタに保持された値と第２レジスタに保持された値との部分積を求めていく処理を行う部分積処理部と、
前記部分積において、１組の被乗数と乗数の、乗算結果の符号を補償するため、乗算結果を２の補数表現したビットを埋込む符号拡張を行なう符号拡張部と、
ある組の被乗数（ａビット）と乗数（ｂビット）に対する全ての部分積を求めた後、次の他の組の被乗数と乗数に対する部分積を求める際に、当該組に対する部分積において、被乗数の当該組より前の組に対応するビットに、０を埋め込む部分積編成手段と、
各部分積の和を順次求めていく手段であって、ある組の被乗数と乗数に対する全ての部分積の総和が所定値を越えた場合、該越えた値を、次の他の組の被乗数と乗数に対する部分積の総和を求めていく際に廃棄する、各部分積の総和値を求める総和手段と、
前記総和手段によって求めた、総和値（「Ｎ＋Ｍ」（ビット））のデータから、第１レジスタにおける各被乗数と、これに対応する第２レジスタにおける乗数との乗算結果である値を切り出し、被乗数と乗数との組に対応する乗算結果を、各組について求める処理手段とを有する演算器。
【請求項５】
請求項４において、
さらに、前記第１レジスタにおける各被乗数と、これに対応する第２レジスタにおける乗数との乗算結果に、値を加えるための加算数を複数個保持し、各加算数のビット長の総和が、予め定めた長さを越えないことを条件として配置する、加算数を保持する第３レジスタと、
前記第１レジスタにおける各被乗数と、これに対応する第２レジスタにおける乗数との乗算結果に対応する、第３レジスタにおける加算数を加算する加算手段とを備えること
を特徴とする演算器。
【請求項６】
請求項１、２、４および５いずれか記載の演算器と、
予め定められた命令コードが与えられた場合には、前記演算器にデータを与えるデータ入力部と、
前記演算器を起動する起動手段と、
前記演算器の演算結果を得て出力するデータ出力部とを備えること
を特徴とするマイクロプロセッサ。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、画像処理等において用いられる積和演算等の演算処理を高速に行う手段に関する。
【０００２】
【従来の技術】
従来、イメージ処理（画像処理）の分野においては、演算処理を行なう際に、高速、高精度等の、高度の演算性能が要求されるため、演算処理を行なうためには、処理内容に応じて、演算処理のための専用演算器を製作し、イメージ処理に応用してきた。
【０００３】
このような専用演算器を、イメージ処理の内容に応じて製作し、イメージ処理を行なうシステムを設計製造するのでは、システムのコストの上昇を招いてしまう。
【０００４】
一方、比較的低コストでシステム構築を行なえ、イメージ処理に応用可能な、汎用プロセッサの性能は向上してきたが、イメージ処理のすべてを、汎用プロセッサ内に内蔵された演算器で行なうほど、汎用プロセッサ内に内蔵された演算器の処理速度や処理内容は優れたものではない。
【０００５】
ところで、イメージ処理で頻繁に行なわれる演算処理である、いわゆる積和演算は、乗算器と加算器とを、適宜組み合わせて構成した演算器で実行可能である。
【０００６】
このような従来の演算器において、与えられた２つの数の乗算を行なう乗算器は、部分積の生成機能と部分積の加算機能とを有する。
【０００７】
ここで、図１９を参照して、部分積の生成と部分積加算を具体例に説明する。
【０００８】
ここで、乗算に用いるデータのビット数は、５ビットとする。
【０００９】
「部分積」は、乗数１９０１のビットを１ビットずつ調べ、ビットの内容が「１」であれば、被乗数１９００の値、そのものであり、ビットの内容が「０」であれば、部分積を「０」とする。
【００１０】
ただし、乗数１９０１の符号ビットで生成される部分積は、符号ビットの内容が「１」ならば、被乗数１９０１のビット反転の値と加算１とし、符号ビットが「０」ならば「０」とする。
【００１１】
図１９において、部分積は、矩形で囲んで表現しており、その内容を矩形内に示している。
【００１２】
５ビットの乗算においては、乗数のビット数は５（ビット）あるので、図１９に示すように、５個の部分積が生成される。図に示した演算例では、部分積１（１９０２）と、部分積２（１９０３）とは、その生成の際に、調べる対象となるビットの内容が「１」であるので、被乗数１９００そのものとなる。
【００１３】
また、部分積３（１９０４）と、部分積４（１９０５）とは、生成の際に、調べる対象となるビットの内容が「０」であるため「０」となり、部分積５（１９０６）は、乗数の符号ビットで生成され、かつ、生成の際に調べる対象となる符号ビットが「１」であるため、被乗数の負数となる。
【００１４】
また、各部分積の加算は、乗数の下位ビットからの生成順に、部分積を１ビットずつ上位（左）にシフトしていき加算する。また、乗数、被乗数が、負数でも表現されている、いわゆる、２の補数表現のとき、部分積加算を正しく実行するには、符号を拡張（以下「符号拡張」と称する）して加算しなければならない。
【００１５】
図１９に示す例では、部分積１では、４ビット拡張（１９０７）し、部分積２では、３ビット拡張（１９０８）し、部分積３では、２ビット拡張（１９０９）し、部分積４では、１ビット拡張している（１９１０）。このような符号拡張により、正確な部分積加算を実行できる。
【００１６】
通常、この部分積加算は、図２０に示すような、桁上げ保存加算器と、桁上げ伝播加算器を使用して行なわれる。図２０に示す部分積加算器は、３入力全加算器を配列して構成される桁上げ保存加算器である。
【００１７】
ここで部分積加算器の基本構成要素となる、３入力全加算器の動作を図２１に示す。
【００１８】
３入力全加算器は、入力の３ビット（２１００、２１０１、２１０２）を加算して、桁上げ２１０４と和２１０３を出力する。
【００１９】
図２１に示すように、３つの値を入力し、所定の場合には、桁上げ出力（２１０４）を行なって、加算（２１０３）を行なっている。
【００２０】
図２０に示す、桁上げ保存機能を有する加算器である全加算器（２０００、２００１、２００２、２００３、２００４）では、図１９に示す部分積１〜３を入力して、入力された部分積の加算を実行する。各全加算器によって行なわれる加算の結果の「桁上げ」は、次段の一桁上位の全加算器に、「和」は、次段の同じ桁の全加算器（２０１０、２０１１等）に入力し、図１９に示す部分積４との加算を行なう。さらに、その結果は、部分積５の加算に使用する全加算器（２０１２等）に入力され、加算される。
【００２１】
部分積５は、被乗数の値を反転させて、「１」を加算する必要があるので、全加算器２０１２の入力２０１３は、１を加算するための入力として使用する。
【００２２】
一例として、１段目の全加算器２０００は、部分積１の拡張符号２００５（値は「１」）と、部分積２の拡張符号２００６（値は「１」）と、部分積３の符号２００７（値は「０」）を入力し、加算を行なう。
【００２３】
そして、加算結果の桁上げ２００８を、次段の一桁上位の全加算器２０１０に入力し、和２００９を次段の同じ桁の全加算器２０１１に入力する。
【００２４】
全加算器２０１０は、部分積１〜部分積３の拡張符号の加算結果の桁上げと和とを入力し、加算を行なう。その入力信号を生成する全加算器２０１４は、全加算器２０００と同一の計算を行うので、全加算器２０００の加算結果２００９を、全加算器２０１０の入力とする構成とし、その結果、全加算器２０００より、上位の桁の加算を行なう、即ち、左に存在する全加算器２０１４は、省略されうる。
【００２５】
このように、桁上げ保存機能を有する加算器は、「桁上げ」を次段に送って、加算を繰り返すため、全部分積の加算が終了しても、２０２４から２０３８の２出力が残る。そのため、最終結果を得るためには、さらに、その２出力を加算するために、図２０に示すような、いわゆる桁上げ伝播加算器が必要である。
【００２６】
図２０に示す構成では、桁上げ伝播加算器は、全加算器２０１５〜２０２２を有して構成される。これらの全加算器間の接続は、一例として、全加算器２０１６の桁上げ２０２３が、全加算器２０１５の入力となるような接続関係を有しており、文字通り桁上げ伝播加算器を構成している。
【００２７】
【発明が解決しようとしている課題】
前述のように、例えば図２０に示す積和演算器においては、桁上げ保存機能を有する加算器はもちろんのこと、桁上げ伝播加算器をも設けて、積和演算器を実現しなければならなかった。
【００２８】
このように、従来の専用演算器を使用して演算を行なう場合においては、処理性能は満たされるものの、システムのコストの上昇を招くことがほとんどである。一方、汎用演算器を使用したのでは、コストの上昇は抑えられるものの、その処理性能は満足のいくものではないという問題が依然として存在する。
【００２９】
しかしながら、汎用演算器の使用は、コストの低減のためには必要不可欠であるので、該汎用演算器の処理性能の向上を図る必要がある。
【００３０】
そこで、本発明の目的は、汎用プロセッセが備える汎用演算器のうち、イメージ処理等で頻繁に使用される積和演算器の一部を独立に動作させる手段を設けることで、複数の積和演算を同時に行い、コストを抑えた、演算速度の速い、高性能のイメージ処理等に使用可能な演算手段を提供することにある。
【００３１】
【課題を解決するための手段】
上記課題を解決し、本発明の目的を達成するために、以下の手段が考えられる。
【００３２】
複数の被乗数を有するＮビットの数と、前記各被乗数に対応する乗数を複数有するＭビットの数との積を求めることによって、被乗数と乗数の組に対する乗算結果を求める演算器であって、以下の手段を備える演算器である。
【００３３】
すなわち、被乗数を複数個保持し、各被乗数のビット長の総和がＮを越えないことを条件として配置され、各被乗数の間に０を埋め込んだ状態で、Ｎビットの数を保持する第１レジスタと、前記各被乗数に対応する乗数を保持し、各乗数のビット長の総和がＭを越えないことを条件として配置され、各乗数の間に０を埋め込んだ状態で、Ｍビットの数を保持する第２レジスタと、第１レジスタに保持された値と第２レジスタに保持された値との部分積を求めていく処理を行う部分積処理部と、前記部分積において、１組の被乗数と乗数の、乗算結果の符号を補償するため、乗算結果を２の補数表現したビットを埋込む符号拡張部と、各部分積の和を順次求めていく手段であって、ある組の被乗数と乗数に対する全ての部分積の総和が所定値を越えた場合、該越えた値を、次の他の組の被乗数と乗数に対する部分積の総和を求めていく際に廃棄する、各部分積の総和値を求める総和手段と、該手段によって求めた、総和値（「Ｎ＋Ｍ」（ビット））のデータから、第１レジスタにおける各被乗数と、これに対応する第２レジスタにおける乗数との乗算結果である値を切り出し、被乗数と乗数との組に対応する乗算結果を、各組について求める処理手段とを備える。
【００３４】
【作用】
本発明は、汎用の積和演算器であって、入力レジスタ等に格納された各データに対する乗算を分離して同時に行うための機能を有する部分積加算器と、各乗算結果に対して、加算を分離して同時に行うための機能を有する加算器を備えて、演算を行なう。
【００３５】
まず、第１レジスタに、被乗数を複数個保持し、各被乗数のビット長の総和がＮを越えないことを条件として配置し、各被乗数の間に０を埋め込んだ状態で、Ｎビットの数を保持しておく。そして、第２レジスタには、前記被乗数に対応する乗数を複数個保持し、各乗数のビット長の総和がＭを越えないことを条件として配置し、各乗数の間に０を埋め込んだ状態で、Ｍビットの数を保持しておく。
【００３６】
次に、部分積処理部は、第１レジスタに保持された値と第２レジスタに保持された値との部分積を求めていく処理を行い、符号拡張部は、前記部分積において、１組の被乗数と乗数の、乗算結果の符号を補償するため、乗算結果を２の補数表現したビットを埋込む処理を行なう。
【００３７】
そして、総和手段は、各部分積の和を順次求めていき、ある組の被乗数と乗数に対する全ての部分積の総和が所定値を越えた場合、該越えた値を、次の他の組の被乗数と乗数に対する部分積の総和を求めていく際に廃棄する、各部分積の総和値を求める。
【００３８】
最後に、処理手段が、総和手段によって求めた、総和値（「Ｎ＋Ｍ」（ビット））のデータから、第１レジスタにおける各被乗数と、これに対応する第２レジスタにおける乗数との乗算結果である値を切り出し、被乗数と乗数との組に対応する乗算結果を、各組について求め、並列演算を実現する。
【００３９】
【実施例】
以下、本発明の実施例について図面を参照して説明する。
【００４０】
図１に、本発明にかかる実施例の構成図を示す。
【００４１】
本実施例は、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」なる演算を同時に実行するための演算器である。
【００４２】
演算器全体は、レジスタ１００にパック（データが詰めこまれた状態を、以下このように表現する）された、２つの被乗数ａ１、ａ２と、レジスタ１０１にパックされた、２つの乗数、ｂ１、ｂ２とを、それぞれ入力１０２、１０３とし、これら入力に基づいて生成した部分積を加算する機能を有する部分積加算器１０４を備える。
【００４３】
また、レジスタ１０５にパックされた、２つの加数ｃ１、ｃ２を入力１０６とし、この入力データと、部分積加算器１０４の２出力である「ａ１×ｂ１」、「ａ２×ｂ２」との加算を、正確な位取りで実行するために、入力１０６の内容をシフトして、部分積加算器１０４の前記２出力に桁合わせする機能を有する「シフト  アンド  セレクタ」１０７と、部分積加算器１０４の２出力と、「シフトアンド  セレクタ」１０７の出力を加算する機能を有する３入力全加算器列１０８と、３入力全加算器列の２出力を加算する機能を有する６４ビット加算器１０９と、６４ビット加算器１０９の出力を、指定されたフォーマットに変換するアライナ１１０と、加算結果がオーバーフローであるか、または、アンダーフローであるかを判定するオーバーフロー／アンダーフロー判定部１１１と、その判定結果がオーバーフローであれば、アライナ１１０の出力を最大値に、また判定結果がアンダーフローであれば、アライナ１１０の出力を最小値に置き換える最大値／最小値置換部１１２とを有して構成される。そして、最終的な演算結果は、レジスタ１５０にパックされた状態で出力される。
【００４４】
図１の実施例において、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」なる積和演算を行なう際の各構成要素の動作を、データ長３２ビットのレジスタの、上位８ビットおよび下位８ビットに、２つのデータをパックした場合を例にとり説明する。
【００４５】
積和演算を行うデータは、図２に示すデータフォーマット２００の様に、３２ビットの上位８ビットおよび下位８ビットに、２つのデータａ１、ａ２をパックし、その間に「０」値を埋め込んで、３２ビットのデータとしている。
【００４６】
データｂ１、ｂ２、ｃ１、ｃ２（図示せず）も同様に、３２ビットの上位８ビットおよび下位８ビットに、２つのデータをパックし、その間に「０」値を埋め込んで、３２ビットのデータとしている。
【００４７】
データａ１、ａ２をパックした３２ビットのデータと、データｂ１、ｂ２をパックした３２ビットのデータとを、３２ビットのデータ同士で乗算することによって、パックされた８ビットのデータ同士の乗算、即ち、「ａ１×ｂ１」と「ａ２×ｂ２」を同時に実行するものである。
【００４８】
その際、３２ビット乗算結果において、どの部分が乗算「ａ１×ｂ１」と「ａ２×ｂ２」に相当しているのかを図２に示している。なお、図２において、各部分積は、横長の矩形で表現している。
【００４９】
さて、乗算「ａ１×ｂ１」は、部分積２５（２０３）から部分積３２（２０４）までの、各々の上位１５桁、また、乗算「ａ２×ｂ２」は、部分積１（２０１）から部分積８（２０２）までの、各々の下位１５桁を使用して計算される。そのため、図面中黒く塗られた部分は、乗算「ａ１×ｂ１」と「ａ２×ｂ２」の符号を拡張された部分となる。なお、符号拡張の概念については、前述の図１９で示した通りである。
【００５０】
また、乗数データｂ１とｂ２と間に「０」値が埋め込まれているため、それらのビット（値が「０」）から生成される部分積９〜２４は、必ず「０」となる。そのため、全ての部分積を加算した時に、ａ２×ｂ２による部分積加算の結果による桁上げが伝播することに起因する、乗算「ａ１×ｂ１」への影響をなくすことができる。
【００５１】
また、部分積２５の加算で使用される、部分積２５の３２ビット用の符号拡張の加算分を「０」とすることで、３２ビット乗算のための、符号拡張分の加算（部分積１から８までに対応する加算）結果が、「ａ１×ｂ１」の演算結果への影響をなくすことができる。
【００５２】
これら２点の工夫により、「ａ１×ｂ１」と「ａ２×ｂ２」を、分離した状態で演算することができる。
【００５３】
次に、以上で説明した機能を有する部分積加算器１０４の動作について、詳細に説明する。
【００５４】
図３は、乗算ａ２×ｂ２の拡張符号の機能を、汎用の部分積加算器によって実現した構成例である。
【００５５】
図２に示すように、この乗算の拡張符号が必要な範囲は、「部分積１」では、９桁目〜１５桁目まで、「部分積２」では、１０桁目〜１５桁目まで、「部分積３」では、１１桁目〜１５桁目まで、「部分積４」では、１２桁目〜１５桁目まで、「部分積５」では１３桁目〜１５桁目まで、「部分積６」では１４桁目〜１５桁目まで、「部分積７」では１５桁目である。
【００５６】
図３では、一例として、部分積３〜５に相当する部分について図示した。
【００５７】
なお、各全加算器の動作は、図２１に示す通りである。
【００５８】
全加算器３００から３０５は、部分積３の１５桁目から１０桁目の加算に、全加算器３０６から３１１は、部分積４の１５桁目から１０桁目の加算に、全加算器３１２から３１７は、部分積５の１５桁目から１０桁目の加算にそれぞれ使用される。
【００５９】
セレクタ３１８は、信号３３０が「１」ならば、２入力３３１、３３２のうち、３３２の方を選択する。他のセレクタ３１９〜３２１も、同様な動作をする。３３２は、乗算「ａ２×ｂ２」の部分積３の符号であることから、信号３３０を「１」とすることで、符号を表現するための信号３３２によって、符号拡張して、全加算器によって部分積３を加算することができる。
【００６０】
セレクタ３２３〜３２６、セレクタ３２７〜３２９も、信号３３０を「１」にすることによって、それぞれ、部分積４と部分積５の符号３３３、３３４を選択する。これにより、部分積４、部分積５についても、符号拡張を行なった加算が実現できる。
【００６１】
そのほか、図３には示していないが、部分積１、２、６、７に対しても、信号３３０によって、符号拡張のための信号を選択するセレクタを、全加算器の入力側に設けた構成にすることによって、乗算「ａ２×ｂ２」の部分積加算で、符号拡張した加算が実現できることになる。
【００６２】
図２２は、乗数ｂ２の符号ビット（下位から８つ目のビット）から、部分積８を生成するための、汎用の部分積加算器の実現例である。全加算器２２００〜２２０７は、部分積８の下位８ビットの加算を行なう。符号ビットから、部分積を生成するため、図１９に示したように、データを反転させて、「１」を加える処理を実現するための構成である。
【００６３】
論理ゲート２２０８は、信号２２２５が「１」のときに、入力２２２７を反転し、「０」のときには、入力２２２７の値に関係なく「１」を出力する機能を有する。また、セレクタ２２１６は、信号２２２６が「１」のとき論理ゲート２２０８の出力を選択し、信号２２２６が「０」のとき、部分積８の下位から８ビット目のデータ２２２７を選択する機能を有する。
【００６４】
なお、「論理ゲート２２０８、セレクタ２２１６」と、「論理ゲート２２０９〜２２１５と、セレクタ２２１７〜２２２３」とは、同じ動作をする。また、セレクタ２２２４は、信号２２２６が「１」のとき「１」を出力する。
【００６５】
論理ゲート２２０８〜２２１５と、セレクタ２２１６から２２２４を用い、信号２２２６を「１」にすることで、乗算「ａ２×ｂ２」の部分積８の生成と加算が実現できることになる。他の部分積も同様に生成加算できる。このように、図３、図２２に示す構成により、乗算「ａ２×ｂ２」の部分積加算の演算が実行できることになる。
【００６６】
次に、図４に示す構成を有する手段により、３２ビット乗算を行なうための符号拡張分の加算（部分積１から８までの加算）結果による、乗算「ａ１×ｂ１」への影響をなくすための機能を実現するが、この動作について説明する。
【００６７】
まず、全加算器４００〜４０７によって、部分積２５の３２桁目〜２５桁目（乗算「ａ１×ｂ１」の部分積１（図２中の部分積２５））の値を加算する処理を行なう。また、全加算器４０８〜４１４は、部分積２４までの加算結果を出力している。
【００６８】
論理ゲート４１５は、信号４３１が「０」のとき、全加算器４０８の和４３３を「０」にする機能を有する。同様に、論理ゲート４１６〜４２２も、信号４３１が「０」のとき、全加算器４０９から４１４の和を「０」にする機能を有する。また、論理ゲート４２３は、信号４３１が「０」のとき、全加算器４０８の桁上げ４３２を、「０」にする機能を有する。
【００６９】
同様に、論理ゲート４２４〜４３０も、信号４３１が「０」のとき、全加算器４０９から４１４の桁上げを「０」にする機能を有する。信号４３１が「１」のときは、論理素子４１５〜４３０は、全加算器４０８〜４１４からの、桁上げと和の値を、そのまま通過させる機能を有する。
【００７０】
つまり、信号４３１を「０」にするこによって、部分積２４までの加算結果と、部分積２５との加算処理を制御することができる。これにより、３２ビット乗算のための符号拡張分の加算（部分積１から８までの加算）結果による、乗算「ａ１×ｂ１」への影響をなくすことが可能となる。
【００７１】
以上説明してきた、図３、図２２、図４に示す構成を有する手段を備えることにより、部分積加算器１０４は、通常の３２ビット乗算と同一の処理で、「ａ１×ｂ１」と「ａ２×ｂ２」の２つの乗算の部分積加算を、並列に実行することができる。
【００７２】
次に、「シフト  アンド  セレクタ」１０７は、「ａ１×ｂ１＋ｃ１」、「ａ×ｂ２＋ｃ２」の並列実行を行なうことを指示するコントロール信号１１３を受けとり、部分積加算器１０４の演算結果の、上位１６桁と下位１６桁に、それぞれｃ１とｃ２の位取りが正しく合うように、図５の５００に示すようにパックされたｃ１、ｃ２を、５０１に示すようにシフト処理し、ｃ１とｃ２間に「０」を埋め込む。
【００７３】
「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」の演算を、並列実行しないときには、シフトしない状態の、５００を選択する。
【００７４】
３入力全加算器列１０８は、図５に示すような、上位１６桁と下位１６桁に「ａ１×ｂ１」と「ａ２×ｂ２」の部分積加算の、桁上げ保存加算器の出力５０３と、「シフト  アンド  セレクタ」１０７で選択された、入力５０１とを、桁上げ保存加算し、加算結果５０６を得る。「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」の並列実行の場合、５０１において、ｃ１とｃ２との間は、値「０」が埋っているため、ａ１×ｂ１＋ｃ１、ａ２×ｂ２＋ｃ２の間の桁では桁上げが起きない。その結果、ｃ１、ｃ２の加算は互いに影響しない。
【００７５】
図６に、並列に実行した演算結果が、オーバーフローまたはアンダーフローであるかの判定を並列に実行する、オーバーフロー／アンダーフロー判定部１１１の構成例を示す。
【００７６】
上位用判定部６００、下位用判定部６０１は、それぞれ、図５に示す５０６の上位１６ビットと下位１６ビットを、予め定めている値である、８ビット用上限値６０３、８ビット用下限値６０４と比較する処理を行なう。
【００７７】
上位用判定部６００は、図５に示す５０６の上位１６ビットの内容が、８ビット用上限値６０３より大きな場合は、オーバーフローが発生したと判断し、また、８ビット用下限値６０４より小さい場合は、アンダーフローが発生したと判断する。また、下位用判定部６０１は、図５に示す５０６の下位１６ビットの内容に対し、上位用判定部６００と同様の判断を行なう。
【００７８】
３２ビット用判定部６０２は、５０６の下位３２ビットを、予め定めている値である、３２ビット用上限値６０５と３２ビット用下限値６０６とを、それぞれ用いて、３２ビット乗算の場合のオーバーフロー、アンダーフローが発生したか否かを判定する。なお、上位用判定部６００と、下位用判定部６０１とは、別々に動作するので、上位と下位の１６ビットの、オーバーフロー、アンダーフローの判定は、並列に実行できる。
【００７９】
なお、上位用判定部６００が出力する判定信号６０７、６０８は、それぞれ、５０６の上位１６ビットがオーバーフロー、アンダーフローの時「１」となり、下位用判定部６０１が出力する判定信号６０９、６１０は、それぞれ、５０６の下位１６ビットがオーバーフロー、アンダーフローの時「１」となり、３２ビット用判定部６０２が出力する判定信号６１１、６１２は、それぞれ、５０６の下位３２ビットがオーバーフロー、アンダーフローの時「１」となる。
【００８０】
これらの判定信号６０７から６１２は、判定結果を最大値／最小値置換部１１２に送られる。
【００８１】
図７に、通常の積和演算の場合と、今まで述べてきた、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」を求める並列演算を実行する場合の、２つの場合に対応できるように、６４ビット加算器１０９の出力状態（７０１からのデータの取り出し方）を制御する機能を有するアライナ１１０の構成図を示す。
【００８２】
セレクタ７０２は、データ７１９（７０１の上位９ビット目から上位１６ビット目までのデータ）とデータ７２０（７０１の上位３３ビット目から上位４０ビット目までのデータ）との選択を、「ａ１×ｂ１＋ｃ１」および「ａ２×ｂ２＋ｃ２」の並列演算実行時で「０」となり、通常の積和演算時に「１」となる制御信号７２３で行なう。
【００８３】
論理ゲート７０３〜７１８（計１６個あるが、複雑になるため図面では２個を記載し、あとは省略してある）は、制御信号７２３で、データ７２１（７０１の下位２４ビット目から下位９ビット目まで）を「０」とする（図中、７２４で０値と記載している部分）。
【００８４】
すなわち、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」の並列演算実行時は、制御信号７２３が「０」となり、第１に、セレクタ７０２は、データ７１９を選択し、図中ｄ１部は、データ７１９で満たされ、第２に、論理ゲート７１３〜７１８は、アンドゲートであるので、データ７２１は「０」となる。また、データ７２２は変化しないので、アライナの出力は、７２４のようになる。
【００８５】
一方、通常の積和演算時で、制御信号７２３が「１」となると、セレクタ７０２は、データ７２０を選択し、さらに、データ７２１は、論理ゲート７１３〜７１８を、そのまま通過する。また、データ７２２は変化しないのでアライナの出力は７２５のようになる。
【００８６】
この結果、「ａ１×ｂ１＋ｃ１」および「ａ２×ｂ２＋ｃ２」の並列演算実行時では、演算結果ｄ１、ｄ２が、３２ビットのレジスタに、７２４のようにパックされることになる。
【００８７】
次に、図８に、演算条件およびオーバーフロー／アンダーフロー判定部１１１の判定結果と、最大値／最小値置換部１１２の出力との関係を示す。
【００８８】
以下に、出力の態様を示す。
【００８９】
まず、図８中（１）に示す例では、「ａ１×ｂ１＋ｃ１」および「ａ２×ｂ２＋ｃ２」の演算が同時実行された場合で、上位側の結果が、オーバーフローと判定された時、出力の上位８ビットに、予め定めておいた値である最大値（ｍａｘ）を出力し、出力の下位８ビットは、演算結果をそのまま出力する。
【００９０】
また、図８中（２）に示す例では、上位側の結果がアンダーフローと判定された時、出力の上位８ビットに、予め定めておいた値である最小値（ｍｉｎ）を出力し、出力の下位８ビットは、、演算結果をそのまま出力する。
【００９１】
また、図８中（３）に示す例では、下位側の結果が、オーバーフローと判定された時、出力の下位８ビットに、予め定めておいた値である最大値（ｍａｘ）を出力し、出力の上位８ビットは、演算結果をそのまま出力する。
【００９２】
また、図８中（４）に示す例では、下位側の結果がアンダーフローと判定された時、出力の下位８ビットに、予め定めておいた値である最小値（ｍｉｎ）を出力し、出力の上位８ビットは、演算結果をそのまま出力する。
【００９３】
さらに、通常積和実行時で、オーバーフローと判定された場合、３２ビット全体に、予め定めておいた値である最大値を出力し（図８（５）の示す例）、アンダーフローと判定された場合、３２ビット全体に、予め定めておいた値である最小値を出力することも考えられる（図８（６））。
【００９４】
その他、「ａ１×ｂ１＋ｃ１」および「ａ２×ｂ２＋ｃ２」の並列演算が実行された場合でも、通常積和実行時でも、オーバーフローまたはアンダーフローとも判定されなかった場合には、入力値をそのまま出力することも考えられる（図８（７）の例）。
【００９５】
次に、３２ビットのすべてのビットにデータをパックした例、例えば、８ビットの画素データを４個詰めて行う、並列積和演算器の実施例を図９を参照して説明する。
【００９６】
本実施例の構成は、パックされた４つの被乗数ａ１、ａ２、ａ３、ａ４と、パックされた４つの乗数ｂ１、ｂ２、ｂ３、ｂ４とから部分積を求め、加算する部分積加算器９００と、パックされた４つの加数ｃ１、ｃ２、ｃ３、ｃ４を、部分積加算器９００の出力と桁合わせする「シフト  アンド  セレクタ」９０１と、部分積加算器９００の２出力と「シフト  アンド  セレクタ」９０１の出力とを加算する機能を有する３入力全加算器列９０２と、３入力全加算器列の２出力を加算する機能を有する６４ビット加算器９０３と、該加算器の出力を指定されたフォーマットに変換するアライナ９０４と、加算結果がオーバーフロー、アンダーフローであるか否かを判定するオーバーフロー／アンダーフロー判定部９０５と、その結果に基づいて、予め定めた規則に従って、前記アライナ９０４の出力を所定の値に置き換える機能を有する最大値／最小値置換部９０６とを有して構成されている。
【００９７】
図９に示す実施例において、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、「ａ４×ｂ４＋ｃ４」の複数の積和演算を行なう際の動作を、データ長３２ビットに、８ビットデータを４個を詰めた場合を例にとり説明する。
【００９８】
積和演算を行うデータは、図１０に示す、データフォーマット１０００に示すように、４データ「ａ１、ａ２、ａ３、ａ４」で３２ビットのデータを構成する。
【００９９】
ａ１、ａ２、ａ３、ａ４、また、ｃ１、ｃ２、ｃ３、ｃ４についても、同様に、３２ビットのデータとする。
【０１００】
「ａ１、ａ２、ａ３、ａ４」をパックした３２ビットデータと、「ａ１、ａ２、ａ３、ａ４」をパックした３２ビットデータにおいて、３２ビットデータ同士を乗算することで、８ビット同士の乗算「ａ１×ｂ１」、「ａ２×ｂ２」、「ａ３×ｂ３」、「ａ４×ｂ４」を同時に実行するものである。
【０１０１】
その際、３２ビットデータの乗算結果のどの部分が、それぞれ乗算「ａ１×ｂ１」、「ａ２×ｂ２」、「ａ３×ｂ３」、「ａ４×ｂ４」に相当するかについて、図１０を参照して説明する。
【０１０２】
なお、図１０において、各部分積は、矩形で表現している。
【０１０３】
乗算「ａ１×ｂ１」、「ａ２×ｂ２」、「ａ３×ｂ３」および「ａ４×ｂ４」の各々の値は、それぞれ、部分積２５から３２、部分積１７から２４、部分積９から１６、部分積１から８の加算によって求められる。そのため、図中黒く塗られた部分は、乗算「ａ１×ｂ１」、「ａ２×ｂ２」、「ａ３×ｂ３」および「ａ４×ｂ４」の拡張符号となる部分である。
【０１０４】
例えば、乗算「ａ４×ｂ４」では、部分積１では９桁目〜１５桁目まで、部分積２では１０桁目〜１５桁目まで、部分積３では１１桁目〜１５桁目まで、部分積４では１２桁目〜１５桁目まで、部分積５では１３桁目〜１５桁目まで、部分積６では１４桁目〜１５桁目まで、部分積７では１５桁目が拡張符号となる部分である。
【０１０５】
また、前述した２乗算の並列演算と同様に、部分積８、１６、２４、３２は、符号ビットに相当するため負数を作る必要がある。
【０１０６】
１つの部分積の加算に使用される３２個の全加算器のうちの８個に、図２２に示される示される論理ゲート２２０８〜２２１５とセレクタ２２１６〜２２２４と同じものを、全加算器２２００〜２２０７と同じ接続関係で、追加することによって、負数の部分積の生成と加算が実現できる。論理ゲートとセレクタが追加される全加算器は、部分積８については、下位１ビット目〜８ビット目、部分積１６については、９ビット目〜１６ビット目、部分積２４については、１７ビット目〜２４ビット目に、部分積３２については、２５ビット目〜３５ビット目に対応する全加算器である。
【０１０７】
３２ビット乗算の部分積加算で、部分積８と９、部分積１６と１７、部分積２４と２５の間で、加算結果の伝播をさせないようにする必要がある。また、部分積９〜１６においては、下位８ビット（図中の斜線部分）を「０」とし、部分積１７〜２４においては、下位１６ビット（図中の斜線部分）を「０」とし、部分積２５〜３２においては、下位２４ビット（図中の斜線部分）を「０」とする。こらの機能により、４つの乗算の部分積加算の結果は、他と影響しあわず、そのため、４つの乗算の部分積加算が、並列に実行することができる。
【０１０８】
次に、図１１に、４つの乗算の部分積加算の結果が、他と影響しあわない、部分積加算器の一部を例示する。
【０１０９】
図１１に、部分積８の加算結果を、部分積９の加算へ伝播させない機能と、部分積９の下位８ビットを「０」にして、部分積１〜８までの加算結果を壊さない機能を実現する回路構成例を示す。
【０１１０】
全加算器１１００〜１１０７によって、部分積８の１３ビット目から６ビット目までに対する加算処理を行なう。
【０１１１】
また、全加算器１１０８〜１１１５によって、部分積９の１３ビット目から６ビット目までに対する加算処理を行なう。論理ゲート１１１６、１１２０は、信号１１３３を「０」にすることによって、部分積８の加算結果１１２８、１１２９を全加算器１１０８に入力するのを阻止する機能を有する。論理ゲート１１１７〜１１１９、１１２０〜１１２３も、同様な動作を行ない、対応する全加算器への加算結果の入力を阻止する機能を有する。
【０１１２】
なお、信号１１３３は、４乗算を並列に実行するとき「０」となる。
【０１１３】
そのため、全加算器１１０８には、「０」が入力され、部分積９と加算される。これにより、部分積８の加算結果は、部分積９の１０ビット目からの加算に使用ができなくなることになる。
【０１１４】
論理ゲート１１２４は、信号１１４２により部分積９の８ビット目に対して加算処理を行なう全加算器１１１２への入力を阻止する機能を有する。同様に、論理ゲート１１２５〜１１２７も、信号１１３３の入力により、同様の阻止動作をする。
【０１１５】
信号１１４２は、４乗算の並列演算のとき「０」となる。そのため、部分積９の８ビットより下位は、「０」となる。
【０１１６】
これらの構成により、信号１１３３、１１４２と、論理ゲート１０１６〜１１２７を用いて、部分積８までの加算と、部分積９の加算とを分離することができる。同様に、部分積１６と部分積１７、部分積２４と部分積２５の分離も実現できる。したがって、この部分積加算器では、４つの乗算の部分積加算の並列演算が実行できる。
【０１１７】
また、「シフト  アンド  セレクタ」９０１は、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、および「ａ４×ｂ４＋ｃ４」を並列実行する旨の制御信号を受けとって、部分積加算器の結果の上位から１６桁ごとに出力される「ａ１×ｂ１」、「ａ２×ｂ２」、「ａ３×ｂ３」、および「ａ４×ｂ４」のそれぞれに対し、加算値、ｃ１、ｃ２、ｃ３、ｃ４との位取りが正しく合わさるようにする。
【０１１８】
そのため、図１２の１２００に示すようにパックされた、ｃ１、ｃ２、ｃ３、ｃ４を、１２０１に示すように、ｃ１の１ビット目が４９桁目に、ｃ２の１ビット目が３３桁目に、ｃ３の１ビット目が１７桁目に、ｃ４の１ビット目が１桁目にくるように、ｃ１、ｃ２、ｃ３をシフトする。また、１２０１において、ｃ１、ｃ２、ｃ３、ｃ４のデータの存在しない部分には、値「０」を埋めておく。なお、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」を並列演算実行しないときには、１２００に示すようにパックされたデータをシフトしない。
【０１１９】
図１３に、上位から１６ビット単位に「ａ１×ｂ１」、「ｂ２×ｂ２」、「ａ３×ｂ３」、「ａ４×ｂ４」の４つの並列乗算の結果（和と桁あげ）と、「シフトアンド  セレクタ」で選択された入力の３入力を加算し、和と桁上げの２出力の加算結果を得る３入力全加算器列９０２の構成の一部を示す。
【０１２０】
全加算器１３００と全加算器１３０１は、「ａ３×ｂ３＋ｃ３」の演算結果を求める際、下位２ビットの演算に使用される。全加算器１３０２と全加算器１３０３は、「ａ４×ｂ４＋ｃ４」の演算結果を求める際、上位２ビットの演算に使用される。
【０１２１】
論理素子１３０４は、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、「ａ４×ｂ４＋ｃ４」の並列演算を実行する時に「０」となる信号１３０５によって、全加算器１３０２の桁上げ１３０６を阻止する。
【０１２２】
図では、「ａ３×ｂ３＋ｃ３」と「ａ４×ｂ４＋ｃ４」を演算する手段の中間部の構成を示したが、「ａ１×ｂ１＋ｃ１」と「ａ２×ｂ２＋ｃ２」を演算する手段の中間部、「ａ２×ｂ２＋ｃ２」と「ａ３×ｂ３＋ｃ３」を演算する手段の中間部にも、同様の構成の論理回路を設け、桁上げを阻止する。
【０１２３】
これにより、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、「ａ４×ｂ４＋ｃ４」の並列演算を実行しても、４演算間での桁上げによる影響をなくすことができる。また、各乗算の境界において生じた桁上げは、オーバーフロー／アンダーフローの判定に使用するため、オーバーフロー／アンダーフロー判定部に送る。
【０１２４】
図１４に、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、「ａ４×ｂ４＋ｃ４」の積和演算の、各乗算値の境界での桁上げの阻止機能を有する６４ビット加算器の構成の一部を示す。全加算器１４００と１４０１は、「ａ３×ｂ３＋ｃ３」の演算結果を求める際、下位２ビットの演算に使用される。
【０１２５】
全加算器１４０２と全加算器１４０３は、「ａ４×ｂ４＋ｃ４」の演算結果を求める際、上位２ビットの演算に使用される。論理ゲート１４０４は、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、および「ａ４×ｂ４＋ｃ４」の並列演算を実行する時に「０」となる信号１４０５によって、全加算器１４０２の桁上げ１４０６を阻止する。
【０１２６】
図１４では、「ａ３×ｂ３＋ｃ３」、「ａ４×ｂ４＋ｃ４」を演算する手段の中間部の構成を示したが、「ａ１×ｂ１＋ｃ１」と「ａ２×ｂ２＋ｃ２」を演算する手段の中間部、「ａ２×ｂ２＋ｃ２」と「ａ３×ｂ３＋ｃ３」を演算する手段の中間部にも、同様の構成の論理回路を設け、桁上げを阻止する。
【０１２７】
これにより、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、「ａ４×ｂ４＋ｃ４」の並列演算を実行しても、４演算間で、桁上げによる他の演算結果への影響をなくすことができる。また、各演算の境界に生じた桁上げは、オーバーフロー／アンダーフローの判定に使用するために、オーバーフロー／アンダーフロー判定部に送る。
【０１２８】
次に、図１５に、オーバーフロー／アンダーフロー判定部の構成を示す。
【０１２９】
１５００、１５０１、１５０２、１５０３は、それぞれ「ａ１×ｂ１＋ｃ１用判定部」、「ａ２×ｂ２＋ｃ２用判定部」、「ａ３×ｂ３＋ｃ３用判定部」、「ａ４×ｂ４＋ｃ４用判定部」である。
【０１３０】
１３０７〜１３１０は、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、「ａ４×ｂ４＋ｃ４」の演算を並列実行した３入力全加算器列９０２によって求められる、各演算結果間における桁上げデータである。
【０１３１】
１４０７〜１４１０は、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、「ａ４×ｂ４＋ｃ４」の演算を並列実行した６４ビット加算器９０３によって求められる、各演算結果間における桁上げデータである。
【０１３２】
各判定部は、対応する演算の桁上げデータ２つと、６４ビット加算器９０３の出力の対応する演算結果とから、８ビットに演算精度を制限していない演算結果を生成し、予め定めてある、８ビット用上限値および８ビット用下限値とを比較して、演算結果がオーバーフローとなるか、あるいは、アンダーフローとなるかを判定し、判定結果を出力する。
【０１３３】
例えば、「ａ１×ｂ１＋ｃ１用判定部」１５００は、桁上げ１３０７と、１４０７を加算する。
【０１３４】
その加算結果１５０４と、６４ビット加算器の出力の下位１６ビット１５０５とを、１５０４が上位にくるように連結し、１８ビットの演算結果を生成する。
【０１３５】
新しくできた演算結果１５０６と、予め定めてある、８ビット用上限値および８ビット用下限値とを比較してオーバーフローとアンダーフローを判定し、判定結果１５０７を出力する。同様に、判定部１５０１、１５０２、１５０３も、オーバーフロー、アンダーフローの判定を行ない、判定結果をそれぞれ、１５０８、１５０９、１５１０として出力する。
【０１３６】
また、３２ビット用判定部は、６４ビット加算器の出力の下位３２ビットを、予め定めた３２ビット用上限値および３２ビット用下限値と比較し、演算結果のオーバーフロー、アンダーフローを判定し、判定結果１５１１を出力する。
【０１３７】
次に、図１６に、通常の積和演算の場合と、今まで述べてきた「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、および「ａ４×ｂ４＋ｃ４」の並列演算実行の場合の、２つ場合に対応できるように、６４ビット加算器９０３の出力状態（１６０１からのデータの取り出し方）を制御する機能を有するアライナ９０４の構成図を示す。  信号１６００は、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、および「ａ４×ｂ４＋ｃ４」の並列演算実行時で「０」となり、通常の積和演算時に「１」となる信号である。
【０１３８】
セレクタ１６０８は、データ１６０２（１６０１の下位５６ビット目から下位４９ビット目）とデータ１６０３（１６０１の下位３２ビット目から下位２５ビット目）のうち、信号１６００が「１」のときデータ１６０３選択し、また、信号１６００が「０」のときデータ１６０２を選択する。また、セレクタ１６０９は、データ１６０４（１６０１の下位４０ビット目から下位３３ビット目）とデータ１６０５（１６０１の下位２４ビット目から下位１７ビット目）のうち、信号１６００が「１」のときデータ１６０５を選択し、また、信号１６００が「０」のときデータ１６０４を選択する。
【０１３９】
さらに、セレクタ１６１０は、データ１６０５（１６０１の下位２４ビット目から下位１７ビット目）とデータ１６０６（１６０１の下位１６ビット目から下位９ビット目）のうち、信号１６００が「１」のときデータ１６０６を選択し、また、信号１６００が「０」のときデータ１６０５を選択する。
【０１４０】
なお、データ１６０７（１６０１の下位８ビットのデータ）は、信号１６００による選択制御を行なわない。この結果、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、および「ａ４×ｂ４＋ｃ４」の並列演算実行時では、信号１６００が「０」となるので、レジスタの領域ｄ１、ｄ２、ｄ３、ｄ４のそれぞれに、データ１６０２、１６０４、１６０５、１６０７が格納され、３２ビットデータが、１６１１に示すようにパックされる。また、通常の積和演算では、データ１６０３、１６０５、１６０６、１６０７が格納され、１６１２に示すような３２ビットデータが格納される。
【０１４１】
６４ビット加算器の出力は、図１６に示すアライナで、信号１６００が、並列積和演算示す場合、即ち信号１６００が「０」のときは１６１１、通常の３２ビット積和演算の場合、即ち信号１６００が「１」のときは１６１２のように、３２ビットのデータに変換される。
【０１４２】
次に、最大値／最小値置換部９０６は、オーバーフロー／アンダーフロー判定部９０５からの判定信号を受けて、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、「ａ４×ｂ４＋ｃ４」の並列演算実行時では、各演算結果に対して、所定の処理を行なう。
【０１４３】
所定の処理としては、例えば、判定結果がオーバーフローであれば、演算結果を、予め定めた、８ビットで表わされる最大値に置き換え、判定結果がアンダーフローであれば、演算結果を、予め定めた、８ビットで表わされる最小値に置き換え、また、いずれでもなければ、演算結果を置き換えずにそのまま出力する処理が考えられる。
【０１４４】
また、通常の積和演算時には、判定結果がオーバーフローであれば、演算結果を、予め定めた、３２ビットで表わされる最大値に置き換え、判定結果がアンダーフローであれば、演算結果を、予め定めた、３２ビットで表わされる最小値に置き換え、いずれでもなければ、演算結果を置き換えずにそのまま出力する処理をすればよい。
【０１４５】
上述のような構成により、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、および「ａ４×ｂ４＋ｃ４」の各演算が分離して行なえ、３２ビットの汎用の積和演算器を使用して、「ａ１×ｂ１＋ｃ１」、「ａ２×ｂ２＋ｃ２」、「ａ３×ｂ３＋ｃ３」、および「ａ４×ｂ４＋ｃ４」の各演算の並列実行が可能となる。
【０１４６】
もちろん、演算ビット数を考慮して本発明の技術的思想を適用することにより、本実施例により示した「３２ビット×３２ビット」の部分積和演算のみならず、他のビット数での部分積和演算を実行することができる。
【０１４７】
図１７は、本発明にかかる積和演算器、または、乗算器を備えるマイクロプロセッサに対する命令コードの態様である。オペコード１７００〜１７０３は、演算の種類によって定義される。また、オペランド１７０４〜１７０７は、演算に使われるデータのソースレジスタとターゲットレジスタを指定する。
【０１４８】
オペコード１７００と１７０２は、それぞれ並列演算を行ない、同時に、複数の乗算または積和演算を行なうときに使用する。また、オペコード１７０１と１７０３は、それぞれ、通常の乗算または積和演算を行なうときに使用する。
【０１４９】
２データの並列演算を例にとり説明すると、オペコード１７００「ＳｐｌｉｔＭＰＹ」は、ａ１、ａ２がパックされているソースレジスタｒ１と、ｂ１、ｂ２がパックされているソースレジスタｒ２に格納されている、データａ１、ａ２、ｂ１、ｂ２を使用して、乗算「ａ１×ｂ１」および「ａ２×ｂ２」を並列に行ない、結果を、ターゲットレジスタｒ３に格納する命令である。
【０１５０】
また、オペコード１７０２「ＳｐｌｉｔＭＰＹＡＤＤ」は、ａ１、ａ２がパックされているソースレジスタｒ１と、ｂ１、ｂ２がパックされているソースレジスタｒ２と、ｃ１、ｃ２がパックされているソースレジスタｒ３（ｒ３は、ターゲットレジスタを兼ねる）に格納されている、データａ１、ａ２、ｂ１、ｂ２、ｃ１、ｃ２を使用して、積和演算「ａ１×ｂ１＋ｃ１」および「ａ２×ｂ２＋ｃ２」を並列に行ない、結果を、ターゲットレジスタを兼ねるレジスタｒ３に格納する命令である。
【０１５１】
なお、４データの並列演算も、データ数と並列演算の実行数が異なるだけであり、同様に、命令コードを設定することができる。
【０１５２】
一方、オペコード１７０１「ＣｏｎｎｅｃｔＭＰＹ」は、１７０５に示されるレジスタｒ１とｒ２の値（値を、それぞれＲ１、Ｒ２とする）を用いて、乗算「Ｒ１×Ｒ２」を行ない、結果をレジスタｒ２に格納する命令である。また、１７０３「ＣｏｎｎｅｃｔＭＰＹＡＤＤ」は、１７０７に示されるレジスタｒ１、ｒ２、ｒ３の値（値を、それぞれＲ１、Ｒ２、Ｒ３とする）を用いて、積和演算「Ｒ１×Ｒ２＋Ｒ３」を行ない、結果を、ターゲットレジスタを兼ねるレジスタｒ３に格納する命令である。
【０１５３】
オペコード１７０３のみを有するアーキテクチャでは、「ａ１×ｂ１＋ｃ１」および「ａ２×ｂ２＋ｃ２」の演算を実行する場合、２度命令する必要があるが、前述のように、オペコード１７０２を定義して、並列演算させることにより、並列の積和演算「ａ１×ｂ１＋ｃ１」および「ａ２×ｂ２＋ｃ２」を、１度の命令で実行させることが可能となる。
【０１５４】
また、乗算についても、同様に、オペコード１７００を定義することで、オペコード１７０１を使用する場合に比べて、必要な命令数が少なくなる。
【０１５５】
これによりプログラムが短くなり、プログラムはメモリに記憶されるため、これらの命令を使用すればメモリの容量を少なくすることが可能となり、本発明にかかる積和演算器等がマイクロプロセッサの構成要素となるときに、有効である。
【０１５６】
次に、図１８に、本発明にかかる他の実施例を示す。
【０１５７】
図１８は、本発明にかかる、乗算器（例えば、「ａ１×ｂ１」なる演算を行なう手段）および積和演算器（例えば、「ａ１×ｂ１＋ｃ１」なる演算を行なう手段）のうち少なくとも一方を備えたマイクロプロセッサ１８００を有したシステムの構成図である。
【０１５８】
記憶装置には、マイクロプロセッサ１８００が実行する処理を定めるプログラムや、必要なデータ等が記憶されている。本システムにおいて、マイクロプロセッサ１８００が、前記プログラムにしたがって、ある画像処理を行なっているものとする。また、画像処理された画像は、ＣＲＴ等によって実現される表示装置１８０２に表示される。このような表示処理は、マイクロプロセッサ１８００が、予め定められているプログラムにしたがって行なわれる。
【０１５９】
さて、画像処理においては、積和演算を頻繁に実行する必要があり、積和演算に必要なデータは、記憶装置１８０１に記憶されているものとする。
【０１６０】
積和演算器１８０３は、本発明にかかる積和演算器であり、複数個の積和演算を並列に実行する。
【０１６１】
マイクロプロセッサ内のレジスタ１８０４が、記憶装置１８０１に記憶されているデータを使用して積和演算を行なうことを想定する。
【０１６２】
プログラムにより積和演算の実行が指示された場合、マイクロプロセッサ１８００は、記憶装置１８０１にアクセスし、バス１８０５を介して、積和演算に必要なデータを、自己が備えるレジスタ１８０４に保持する。１回の、積和演算に必要なデータのみをアクセスしてもよいが、通常、一度に複数個の積和演算が行なわれるので、該当するデータを、すべてレジスタ１８０４に保持しておく。なお、レジスタ１８０４に保持される、被乗数データ（ａ１、ａ２、ａ３、ａ４）、乗数データ（ｂ１、ｂ２、ｂ３、ｂ４）、加算データ（ｃ１、ｃ２、ｃ３、ｃ４）の例を図１８の左側に示す。図では、１回の積和演算を行なうための１組のデータを示したが、通常、複数組のデータを保持しておく。
【０１６３】
そして、次に、積和演算器が起動する。まず、レジスタ１８０４内の、積和演算に必要な全てのデータをソースバスを介して、取り込む。
【０１６４】
積和演算器は、取り込んだデータに基づいて、前述した積和演算を行ない、演算結果を順次、ターゲットバスを介して、レジスタ１８０４の空きエリアに送り、保持させる。もちろん、演算結果を後に使用するような画像処理を行なう場合、記憶装置１８０１に記憶することも考えられる。
【０１６５】
本発明にかかる積和演算器は、同時に複数種類の積和演算を行なうことができるため、画像処理の処理速度は、著しく向上する。
【０１６６】
複数の積和演算を並列に繰り返して実行できるため、例えば、積和演算を繰り返して行い、画像処理において頻繁に行なわれる処理である、離散コサイン変換等の処理に対しても高速な処理が行なえる。
【０１６７】
以上のように、本発明にかかる積和演算器（乗算器）を組み込んだマイクロプロセッサを実現し、該マイクロプロセッサ使用することにより、例えば、高速に画像処理を行なうことが可能なシステムを構築できる。もちろん、システムが対象とする処理内容は、画像処理に限られず、多量の積和演算を行なう処理であれば、いかなるものでもよい。
【０１６８】
【発明の効果】
以上述べたように、本発明によれば、複数の積和演算を並列に実行できるため、複数の積和演算を極めて高速に行なえる。
【図面の簡単な説明】
【図１】本発明にかかる実施例の構成図である。
【図２】乗算の符号拡張と分離機能の説明図である。
【図３】部分積加算器の符号拡張機能を実現するための手段の構成図である。
【図４】部分積加算器の分離機能を実現するための手段の構成図である。
【図５】「シフト  アンド  セレクタ」の動作の説明図である。
【図６】オーバーフロー／アンダーフロー判定部の構成図である。
【図７】アライナの構成図である。
【図８】最大値／最小値の置き換え処理の説明図である。
【図９】本発明にかかる他の実施例の構成図である。
【図１０】乗算の符号拡張と分離機能の説明図である。
【図１１】部分積加算器の構成図である。
【図１２】「シフト  アンド  セレクタ」の動作の説明図である。
【図１３】３入力全加算器列の構成図である。
【図１４】６４ビット加算器の構成図である。
【図１５】オーバーフロー／アンダーフロー判定部の構成図である。
【図１６】アライナの構成図である。
【図１７】積和演算用の命令の説明図である。
【図１８】本発明にかかる他の実施例の構成図である。
【図１９】従来の乗算処理の説明図である。
【図２０】従来の部分積加算器の説明図である。
【図２１】全加算器の入出力関係の説明図である。
【図２２】負数部分積加算機能を実現する手段の構成図である。
【図１】
0003579087.tif 000002
【図２】
0003579087.tif 000003
【図３】
0003579087.tif 000004
【図４】
0003579087.tif 000005
【図５】
0003579087.tif 000006
【図６】
0003579087.tif 000007
【図７】
0003579087.tif 000008
【図８】
0003579087.tif 000009
【図９】
0003579087.tif 000010
【図１０】
0003579087.tif 000011
【図１１】
0003579087.tif 000012
【図１２】
0003579087.tif 000013
【図１３】
0003579087.tif 000014
【図１４】
0003579087.tif 000015
【図１５】
0003579087.tif 000016
【図１６】
0003579087.tif 000017
【図１７】
0003579087.tif 000018
【図１８】
0003579087.tif 000019
【図１９】
0003579087.tif 000020
【図２０】
0003579087.tif 000021
【図２１】
0003579087.tif 000022
【図２２】
0003579087.tif 000023