(57)【要約】【課題】複素乗算を含む複素演算を実行するマイクロプロセッサにおいて、入力される複素数データの実部及び虚部の格納順序に対する制約を緩和する。【解決手段】マイクロプロセッサ１は、複素演算ユニット１４０を含む命令実行部１４を備える。複素演算ユニット１４０は、レジスタファイル１３から供給される第１及び第２の複素数データを用いて複素乗算を含む複素演算を実行し、当該複素演算の結果をレジスタファイル１３に向けて出力する。さらに、複素演算ユニット１４０は、データ格納位置決定手段の具体例であるセレクタ１４９０及び１４９１を有する。セレクタ１４９０及び１４９１は、複素演算ユニット１４０の出力データの実部及び虚部のレジスタファイル１３内における格納順序が、第１及び第２の複素数データの実部及び虚部の格納順序と一致するように、出力データの実部及び虚部のレジスタファイル１３内での格納位置を決定する。【選択図】図５
2009048532.tif 000002
【特許請求の範囲】
【請求項１】
命令をデコードする命令デコード部と、
複数のレジスタを含むレジスタファイルと、
前記命令デコード部によってデコードされる命令に基づいて、前記レジスタファイルから供給される第１及び第２の複素数データを用いて複素乗算を含む複素演算を実行し、当該複素演算の結果を前記レジスタファイルに向けて出力する複素演算ユニットと、
前記複素演算ユニットの出力データの実部及び虚部の前記レジスタファイル内における格納順序が、前記第１及び第２の複素数データの実部及び虚部の格納順序と一致するように、前記出力データの実部及び虚部の前記レジスタファイル内での格納位置を決定するデータ格納位置決定手段と、
を備えるマイクロプロセッサ。
【請求項２】
命令をデコードする命令デコード部と、
第１乃至第３のレジスタを有し、前記第１のレジスタは第１の複素数データの実部及び虚部を格納可能であり、前記第２のレジスタは第２の複素数データの実部及び虚部を前記第１のレジスタと同じ順序で格納可能であるレジスタファイルと、
前記命令デコード部によってデコードされる命令に基づいて、前記レジスタファイルから供給される前記第１及び第２複素数データを用いて複素演算を実行し、当該複素演算の結果を前記第３のレジスタに向けて出力する複素演算ユニットとを備え、
前記複素演算ユニットは、
それぞれが１系統の積和演算を行うことができる第1及び第２の積和演算回路によって複素乗算を実行する複素乗算器と、
前記第１及び第２の積和演算回路の各々の出力先を、前記第３のレジスタの第１の領域及び前記第１の領域に隣接する第２の領域との間で入れ替え可能な第１の選択回路とを有する、
マイクロプロセッサ。
【請求項３】
前記第１の積和演算回路は、前記第１のレジスタから供給される前記第１の複素数データの前半部分と前記第２のレジスタから供給される前記第２の複素数データの後半部分の乗算、前記第１の複素数データの後半部分と前記第２の複素数データの前半部分の乗算、及び当該２つの乗算結果の加算又は減算を実行し、
前記第２の積和演算回路は、前記第１及び第２の複素数データの前半部分同士の乗算、前記第１及び第２の複素数データの後半部分同士の乗算、及び当該２つの乗算結果の加算又は減算を実行する、請求項２に記載のマイクロプロセッサ。
【請求項４】
前記複素演算ユニットは、前記第３のレジスタの前記第１の領域にデータを出力する第１の出力端子と、前記第２の領域にデータを出力する第２の出力端子とを備え、
前記第１の選択回路は、前記第１及び第２の積和演算回路と前記第１及び第２の主力端子との間の接続関係を入れ替え可能である、請求項２又は３に記載のマイクロプロセッサ。
【請求項５】
前記複素演算ユニットは、複素加算又は複素減算を実行可能な加減算器をさらに有し、
前記第１及び第２のソースレジスタから前記複素乗算器及び前記加減算器に対して、前記第１及び第２の複素数データが並行して供給され、
第２の選択回路が、前記複素乗算器及び前記加減算器の出力側に設けられており、
前記第２の選択回路は、前記命令デコード部によってデコードされた命令に基づいて動作し、デコードされた命令が複素乗算命令であれば前記複素乗算器の出力データを選択して出力し、デコードされた命令が複素加算又は複素減算を行うための命令であれば前記加減算器の出力データを選択して出力する、請求項２乃至４のいずれか１項に記載のマイクロプロセッサ。
【請求項６】
命令をデコードする命令デコード部と、
第１乃至第３のレジスタを有し、前記第１のレジスタは第１の複素数データの実部及び虚部を格納可能であり、前記第２のレジスタは第２の複素数データの実部及び虚部を前記第１のレジスタと同じ順序で格納可能であるレジスタファイルと、
前記命令デコード部によってデコードされる命令に基づいて、前記レジスタファイルから供給される複素数データを用いて複素演算を実行し、当該複素演算の結果を前記第３のレジスタに向けて出力する複素演算ユニットと、
前記複素演算ユニットの出力データの格納先を、前記第３のレジスタの第１の領域又は前記第１の領域に隣接する第２の領域との間で切り替える格納領域選択回路と、
前記格納領域選択回路の動作を制御する制御回路とを備え、
前記複素演算ユニットは、
積和演算回路と、
前記積和演算回路に入力されるデータの組み合わせを切り替える第３の選択回路とを有し、
前記積和演算回路は、
前記第３の選択回路の切り替え動作によって、前記第１のレジスタから供給される前記第１の複素数データの前半部分と前記第２のレジスタから供給される前記第２の複素数データの後半部分の乗算、前記第１の複素数データの後半部分と前記第２の複素数データの前半部分の乗算、及び当該２つの乗算結果の加算又は減算を実行する第１の動作状態、及び、
前記第１及び第２の複素数データの前半部分同士の乗算、前記第１及び第２の複素数データの後半部分同士の乗算、及び当該２つの乗算結果の加算又は減算を実行する第２の動作状態のいずれかを選択可能であり、
前記制御回路は、前記命令デコード部にてデコードされた命令に応じて、前記第３の選択回路と前記格納領域選択回路を同調させて切り替える、
マイクロプロセッサ。
【請求項７】
前記制御回路は、
第１の積和演算命令がデコードされた場合に、前記積和演算回路が前記第１の動作状態となるよう前記第３の選択回路を動作させるともに、前記複素演算ユニットの出力データの格納先が前記第１の領域となるよう前記格納領域選択回路を動作させ、
前記第１の積和演算命令とは異なる第２の積和演算命令がデコードされた場合に、前記積和演算回路が第２の動作状態となるよう前記第３の選択回路を動作させるともに、前記演算ユニットの出力データの格納先が前記第２の領域となるよう前記格納領域選択回路を動作させる、請求項６に記載のマイクロプロセッサ。
【請求項８】
前記複素演算ユニットは、複素加算又は複素減算を実行可能な加減算器をさらに有し、
前記第１及び第２のソースレジスタから前記積和演算器及び前記加減算器に対して、前記第１及び第２の複素数データが並行して供給され、
第２の選択回路が、前記積和演算器及び前記加減算器の出力側に設けられており、
前記第２の選択回路は、前記命令デコード部によってデコードされた命令に基づいて動作し、デコードされた命令が積和演算命令であれば前記積和演算器の出力データを選択して出力し、デコードされた命令が複素加算又は複素減算を行うための命令であれば前記加減算器の出力データを選択して出力する、請求項６又は７に記載のマイクロプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、高速フーリエ変換（ＦＦＴ：Fast Fourier transform）、高速逆フーリエ変換（ＩＦＦＴ：Inverse Fast Fourier transform）等の複素乗算が含まれた複素演算を実行するマイクロプロセッサに関する。
【背景技術】
【０００２】
ＦＦＴ計算及びＩＦＦＴ計算をマイクロプロセッサに効率よく実行させるための様々な提案が行われている。例えば、非特許文献１には、１２８ビット長のデータを一括処理可能なＳＩＭＤ（Single Instruction Multiple Data）アーキテクチャを採用したプロセッサに、周波数間引き（ＤＩＦ：Decimation In Frequency）型のＦＦＴ計算を実行させるためのプログラム例が開示されている。
【０００３】
また、特許文献１には、２つの複素数の乗算（複素乗算）を行う複素乗算ユニットをＳＩＭＤアーキテクチャのマイクロプロセッサ内に配置するとともに、当該複素演算ユニットに複素乗算を計算させるための特殊命令を定義し、当該特殊命令を使用することで複素乗算を数多く含むＦＦＴ計算を効率的に実行する技術が開示されている。
【０００４】
特許文献１に開示されているのと同等の複素乗算ユニット７０の構成を図１８に示す。図１８の複素乗算ユニット７０は、レジスタＲ３及びＲ４に格納されている２つの複素数Ｘ及びＹを読み込み、複素数Ｘ及びＹを乗算して得られる複素数ＺをレジスタＲ５に出力する。入力データを格納するレジスタＲ３及びＲ４並びに複素乗算ユニット７０の出力先レジスタであるレジスタＲ５は、複素乗算命令のオペランドにより指定される。
【０００５】
より具体的に述べると、４つの乗算器７００〜７０３が、Ｘの実部ＸＲとＹの実部ＹＲの積、Ｘの虚部ＸＩとＹの虚部ＹＩの積、Ｘの実部ＸＲとＹの虚部ＹＩの積、及びＸの虚部ＸＩとＹの実部ＹＲの積を計算する。乗算器７００〜７０３の計算結果は、パイプラインラッチ７１０〜７１３に保持される。
【０００６】
次に減算器７２１が、レジスタ７１３に保持されたＸＲＹＲとレジスタ７１２に保持されたＸＩＹＩとの差を計算する。また、加算器７２０が、レジスタ７１１に保持されたＸＲＹＩとレジスタ７１０に保持されたＸＩＹＲとの和を計算する。つまり、減算器７２１の計算結果は、複素乗算後の出力Ｚの実部ＺＲとなる。また、加算器７２０の計算結果は、複素乗算後の出力Ｚの虚部ＺＩとなる。
【０００７】
なお、レジスタＲ３〜Ｒ５のレジスタ長がそれぞれ３２ビットであり、複素数データＸ及びＹの実部及び虚部がそれぞれ１６ビット長である場合、複素乗算の計算精度を維持するために、複素乗算ユニット７０内での演算結果は３２ビット長とされる。このため、丸め回路７３１は、減算器７２１の３２ビットの出力ＺＲを１６ビットに丸めてレジスタＲ５の下位１６ビットに格納する。また、丸め回路７３０は、加算器７２０の３２ビットの出力ＺＩを１６ビットに丸めてレジスタＲ５の上位１６ビットに格納する。
【非特許文献１】Complex Fixed-Point Fast Fourier Transform Optimization for AltiVecTM、[online]、2006年10月、Freescale Semiconductor, Inc.、[2007年7月25日検索]、インターネット＜URL: http://www.freescale.com/files/32bit/doc/app_note/AN2114.pdf＞
【特許文献１】特表２００２−５２７８０８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
ＦＦＴ計算の対象となる複素数データは、データメモリ（不図示）に格納され、データメモリからマイクロプロセッサ内のレジスタに読み出されて複素乗算ユニット７０等の複素演算ユニットに供給される。なお、ＦＦＴ計算の対象となる複素数データは、マイクロプロセッサ外部の他の装置、例えば撮像素子、マイクロフォン等の各種センサや画像処理装置などによって生成されることも多い。通常、これらの装置によって生成される複素数データの実部及び虚部の格納順序は、装置によって様々である。
【０００９】
本願の発明者等は、上述した複素乗算ユニット７０のような複素乗算を実行する複素演算ユニットをマイクロプロセッサに設ける場合、入力される複素数データの実部及び虚部の格納順序に対するハードウェアの制約が大きく、ソフトウェアに冗長さをもたらす問題があることを見出した。
【００１０】
一例として、図１８に示した複素乗算ユニット７０において、レジスタＲ３及びＲ４に格納される複素数データＸ及びＹの実部及び虚部の格納順序が図１８と反対である場合を考える。つまり、レジスタＲ３及びＲ４の上位ビット側に実部ＸＲ及びＹＲが格納され、下位ビット側に虚部ＸＩ及びＹＩが格納される場合である。
【００１１】
通常、加算器７２０及び減算器７２１の加算機能及び減算機能は、減算の向きを含めてモード設定や命令種別によって選択可能である。しかし、実部及び虚部の格納順序が反転しているレジスタＲ３及びＲ４の保持データを複素乗算ユニット７０に入力して演算を行うと、実部及び虚部の格納順序を反転する前のケースと同様に、丸め回路７３１の出力にＺの実部ＺＲ現れ、丸め回路７３０の出力にＺの虚部ＺＩが現れる。
【００１２】
よって、出力レジスタＲ５における実部ＺＲと虚部ＺＩの格納順序を、入力レジスタＲ３及びＲ４の格納順序と整合させるためには、複素乗算ユニット７０による演算前に予め、レジスタＲ３及びＲ４に保持された複素数データの実部と虚部のデータ配置を入れ替える処理を行うか、複素乗算ユニット７０による演算後に、レジスタＲ５の保持データの実部及び虚部のデータ配置を入れ替える処理を行う必要がある。または、レジスタＲ３及びＲ４に複素数データを読み込む前に、データメモリ（不図示）上に保持された複素数データの実部と虚部のデータ配置を入れ替える処理が必要である。これらのレジスタ上又はデータメモリ上でのデータ配置を入れ替える処理を行うためには、冗長な命令を実行する必要がある。
【課題を解決するための手段】
【００１３】
本発明の第１の態様にかかるマイクロプロセッサは、命令デコード部、レジスタファイル、複素演算ユニット、及びデータ格納位置決定手段を備える。前記複素演算ユニットは、前記命令デコード部によってデコードされる命令に基づいて、前記レジスタファイルから供給される第１及び第２の複素数データを用いて複素乗算を含む複素演算を実行し、当該複素演算の結果を前記レジスタファイルに向けて出力する。さらに、前記データ格納位置決定手段は、前記複素演算ユニットの出力データの実部及び虚部の前記レジスタファイル内における格納順序が、前記第１及び第２の複素数データの実部及び虚部の格納順序と一致するように、前記出力データの実部及び虚部の前記レジスタファイル内での格納位置を決定する。
【００１４】
なお、前記データ格納位置決定手段に相当する具体的構成の一例は、後述する発明の実施の形態１におけるセレクタ１４９０及び１４９１である。また、前記データ格納位置決定手段に相当する具体的構成の他の例は、後述する発明の実施の形態２におけるデータ選択回路２６である。
【００１５】
このように、前記第１の態様にかかるマイクロプロセッサでは、前記データ格納位置決定手段が、前記第１及び第２の複素数データの実部及び虚部の格納順序と一致するように、前記出力データの実部及び虚部の前記レジスタファイル内での格納位置を決定する。つまり、前記第１の態様にかかるマイクロプロセッサは、前記レジスタファイル内での前記第１及び第２の複素数データの実部及び虚部の格納順序が入れ替わっても、これら第１及び第２の複素数データの格納順序に応じて、前記複素演算ユニットが出力する複素数データの実部及び虚部の前記レジスタファイル内での格納順序を変更できる。したがって、前記第１の態様にかかるマイクロプロセッサは、入力される複素数データの実部及び虚部の格納順序に対するハードウェアの制約が小さく、実部及び虚部の格納順序を入れ替えるための冗長な処理を必要としない。
【００１６】
本発明の第２の態様にかかるマイクロプロセッサは、命令デコード部、レジスタファイル、及び複素演算ユニットを備える。前記レジスタファイルは、第１乃至第３のレジスタを有し、前記第１のレジスタは第１の複素数データの実部及び虚部を格納可能であり、前記第２のレジスタは第２の複素数データの実部及び虚部を前記第１のレジスタと同じ順序で格納可能である。前記複素演算ユニットは、前記命令デコード部によってデコードされる命令に基づいて、前記レジスタファイルから供給される複素数データを用いて複素演算を実行し、当該複素演算の結果を前記第３のレジスタに向けて出力する。さらに、前記複素演算ユニットは、それぞれが１系統の積和演算を行うことができる第1及び第２の積和演算回路によって複素乗算を実行する複素乗算器と、前記第１及び第２の積和演算回路の各々の出力先を、前記第３のレジスタの第１の領域及び前記第１の領域に隣接する第２の領域との間で入れ替える第１の選択回路とを有する。
【００１７】
このように構成された前記第２の態様にかかるマイクロプロセッサは、複素乗算を実行する前記第１及び第２の積和演算回路の各々の出力先を、前記第３のレジスタの第１の領域及び前記第２の領域との間で入れ替え可能である。つまり、前記第２の態様にかかるマイクロプロセッサは、前記第１及び第２のレジスタの実部及び虚部の格納順序に応じて、前記第３のレジスタにおける複素乗算後の複素数データの実部及び虚部の配列順序を入れ替えることが容易である。
【００１８】
本発明の第３の態様にかかるマイクロプロセッサは、命令デコード部、レジスタファイル、複素演算ユニット、格納領域選択回路、及び制御回路を備える。前記レジスタファイルは、第１乃至第３のレジスタを有し、前記第１のレジスタは第１の複素数データの実部及び虚部を格納可能であり、前記第２のレジスタは第２の複素数データの実部及び虚部を前記第１のレジスタと同じ順序で格納可能である。前記複素演算ユニットは、前記命令デコード部によってデコードされる命令に基づいて、前記レジスタファイルから供給される複素数データを用いて複素演算を実行し、当該複素演算の結果を前記第３のレジスタに向けて出力する。前記格納領域選択回路は、前記複素演算ユニットの出力データの格納先を、前記第３のレジスタの第１の領域又は前記第１の領域に隣接する第２の領域との間で切り替える。また、前記制御回路は、前記第３の前記格納領域選択回路の動作を制御する。
【００１９】
さらに、前記第３の態様において、前記複素演算ユニットは、積和演算回路と、前記積和演算回路に入力されるデータの組み合わせを切り替える第３の選択回路とを有する。前記積和演算回路は、前記第３の選択回路の切り替え動作によって、第１の動作状態と第２の動作状態のいずれかを選択可能である。ここで、第１の動作状態は、前記第１のレジスタから供給される前記第１の複素数データの前半部分と前記第２のレジスタから供給される前記第２の複素数データの後半部分の乗算、前記第１の複素数データの後半部分と前記第２の複素数データの前半部分の乗算、及び当該２つの乗算結果の加算又は減算を実行する動作状態である。一方、第２の動作状態は、前記第１及び第２の複素数データの前半部分同士の乗算、前記第１及び第２の複素数データの後半部分同士の乗算、及び当該２つの乗算結果の加算又は減算を実行する動作状態である。そして、前記制御回路は、前記命令デコード部にてデコードされた命令に応じて、前記第３の選択回路と前記格納領域選択回路を同調させて切り替える。
【００２０】
このように構成された前記第３の態様にかかるマイクロプロセッサは、前記第１の動作状態とされた積和演算回路によって、前記第１及び第２の複素数データの積の虚部を演算可能であり、得られた前記第１及び第２の複素数データの積の虚部の出力先を前記格納領域選択回路によって選択可能である。また、前記第３の態様にかかるマイクロプロセッサは、前記第２の動作状態とされた積和演算回路によって、前記第１及び第２の複素数データの積の実部を演算可能であり、得られた前記第１及び第２の複素数データの積の実部の出力先を前記格納領域選択回路によって選択可能である。つまり、前記第３の態様にかかるマイクロプロセッサは、前記第１及び第２のレジスタの実部及び虚部の格納順序に応じて、前記第３のレジスタにおける複素乗算後の複素数データの実部及び虚部の配列順序を入れ替えることが容易である。
【発明の効果】
【００２１】
本発明により、複素乗算を含む複素演算を実行する複素演算ユニットを有するマイクロプロセッサにおいて、入力される複素数データの実部及び虚部の格納順序に対する制約を緩和し、実部及び虚部の配列順序の入れ替え処理を実行することに伴うソフトウェアの冗長性の増大を抑制することができる。
【発明を実施するための最良の形態】
【００２２】
以下では、本発明を適用した具体的な実施の形態について、図面を参照しながら詳細に説明する。各図面において、同一要素には同一の符号が付されており、説明の明確化のため、必要に応じて重複説明は省略される。
【００２３】
発明の実施の形態１．
本実施の形態にかかるマイクロプロセッサ１を図１に示す。図１は、マイクロプロセッサ１の全体構成を示すブロック図である。図１において、命令バッファ１０は、命令メモリ５０からフェッチされた命令を格納する一時記憶領域である。命令デコード部１１は、命令バッファ１０に格納された命令を読み出し、当該命令の命令種別を判定し、命令オペランドを取得する。制御部１２は、命令デコードによって得られた命令種別と命令オペランドに応じて、後述するレジスタファイル１３及び命令実行部１４に対してデータ若しくは制御信号又はこれら両方を出力する。
【００２４】
レジスタファイル１３は、複数のレジスタの集合である。本実施の形態では、レジスタファイル１３が少なくとも５本のレジスタＲ０〜Ｒ５を有するものとして説明する。また、レジスタファイル１３内の各レジスタのレジスタ長は、それぞれ６４ビットとする。なお、ここでのレジスタファイル１３が有するレジスタ数及びこれらのレジスタ長が一例にすぎないことはもちろんである。レジスタＲ０〜Ｒ５を含むレジスタファイル１３内のレジスタは、命令実行部１４の入力データ及び出力データを格納するアキュムレータ、あるいはデータメモリ５１へアクセスする時のアドレス指定を行うためのアドレスレジスタなど、様々な用途に使用可能である。
【００２５】
命令実行部１４は、命令デコード部１１によりデコードされた命令に対応する処理を実行する。具体的には、命令実行部１４は、複数の演算ユニットを有し、制御部１２の制御に従って、デコードされた命令を各命令に適した演算ユニットにて実行する。例えば、加算命令、積和演算命令等の演算処理の実行を指示する命令がデコードされた場合、命令実行部１４は、レジスタファイル１３から供給されるデータを用いて指定された演算処理を実行する。また、例えば、ロード命令又はストア命令がデコードされた場合、命令実行部１４は、データメモリ５１のアクセス先アドレスを生成してデータメモリ５１にアクセスする。命令実行部１４は、浮動小数点演算ユニット、整数演算ユニット、ロード／ストアユニット等のほか、例えば、ＦＦＴ処理などの特定の演算処理に特化した専用の実行ユニットを有してもよい。
【００２６】
本実施の形態の命令実行部１４は、図２に示すように、少なくとも２つの複素演算ユニット１４０及び１５０を有する。図２において、ＩＮ１［０］〜ＩＮ１［３］は、レジスタファイル１３から命令実行部１４のＩＮ１端子に供給される６４ビットデータであり、ＩＮ１［０］〜ＩＮ１［３］の各々は１６ビット長である。同様に、ＩＮ２［０］〜ＩＮ２［３］は、レジスタファイル１３から命令実行部１４のＩＮ２端子に供給される６４ビットデータであり、ＩＮ２［０］〜ＩＮ２［３］の各々は１６ビット長である。ＯＵＴ［０］〜ＯＵＴ［３］は、命令実行部１４からレジスタファイル１３に出力される６４ビットデータであり、ＯＵＴ［０］〜ＯＵＴ［３］の各々は１６ビット長である。複素演算ユニット１４０及び１５０が実行する複素演算の内容及び複素演算ユニット１４０及び１５０の具体的な構成例については後述する。
【００２７】
なお、図１では、論理的な構成単位である命令メモリ５０及びデータメモリ５１を示しているが、これらはそれぞれ、ＲＯＭ（Read Only Memory）、ＳＲＡＭ（Static Random Access Memory）、ＤＲＡＭ（Dynamic Random Access Memory）若しくはフラッシュメモリ、又はこれらの組合せ等により構成される。
【００２８】
続いて以下では、命令実行部１４に含まれる複素演算ユニット１４０及び１５０が実行する複素演算の内容及びこれらの具体的な構成例について説明する。本実施の形態では、４点複素ＦＦＴに関する基数２のバタフライ演算を、複素演算ユニット１４０及び１５０に実行させる場合について説明する。
【００２９】
４点複素ＦＦＴに関する基数２のバタフライ演算のフローグラフを図３に示す。なお、図３は、周波数間引き型（ＤＩＦ：Decimation In Frequency）のバタフライ演算の例である。つまり、４個の入力複素数データをＸ０〜Ｘ３とした場合、Ｘ０及びＸ２をデータ対とするバタフライ演算を実行することで出力データＹ０及びＹ２が得られる。同様に、Ｘ１及びＸ３をデータ対とするバタフライ演算を実行することで出力データＹ１及びＹ３が得られる。出力データＹ０〜Ｙ３は、以下の（１）〜（４）式により表される。なお、Ｗ０及びＷ１は、回転因子（twiddle factor）である。
Ｙ０＝Ｘ０＋Ｘ２  ・・・・・・・（１）
Ｙ１＝Ｘ１＋Ｘ３  ・・・・・・・（２）
Ｙ２＝（Ｘ０−Ｘ２）Ｗ０  ・・・（３）
Ｙ３＝（Ｘ１−Ｘ３）Ｗ１  ・・・（４）
【００３０】
図３に示したバタフライ演算を２つの複素演算ユニット１４０及び１５０により実行する実行手順について図４を用いて説明する。まず、ＳＴＥＰ１では、命令デコード部１１において加算命令がデコードされたことに応じて、複素演算ユニット１４０及び１５０が（１）及び（２）式に相当する複素加算を実行し、Ｙ０及びＹ１を出力する。次に、ＳＴＥＰ２では、減算命令がデコードされたことに応じて、複素演算ユニット１４０及び１５０が、（３）及び（４）式の一部に当たる複素減算を実行し、Ｔ０及びＴ１を出力する。ここで、Ｔ０及びＴ１は、以下の（５）及び（６）式により表される。ＳＴＥＰ３では、複素乗算命令がデコードされたことに応じて、複素演算ユニット１４０及び１５０が、ＳＴＥＰ２で得られたＴ０及びＴ１と回転因子Ｗ０及びＷ１との複素乗算を実行し、Ｙ２及びＹ３を出力する。
Ｔ０＝Ｘ０−Ｘ２  ・・・・・・・（５）
Ｔ１＝Ｘ１−Ｘ３  ・・・・・・・（６）
【００３１】
次に、図４に示した複素加算、複素減算及び複素乗算の各処理を選択的に実行する複素演算ユニット１４０及び１５０の具体的な構成例について説明する。図５は、複素演算ユニット１４０の構成例を示すブロック図である。複素演算ユニット１５０についても複素演算ユニット１４０と同一構成とすればよい。図５の構成例は、パイプライン構造を採用しており、複素加算、複素減算及び複素乗算の各処理を３ステージパイプラインによって実行する。なお、図５に示す複素演算ユニット１４０の構成が一例に過ぎないことはもちろんあり、当業者であれば、図５及び後述する説明並びに技術常識に基づいて様々な変形が可能である。
【００３２】
図５において、加減算器１４００は、ＩＮ２端子に供給される１６ビットデータＩＮ２［１］と、ＩＮ１端子に供給される１６ビットデータＩＮ１［１］を加算又は減算する。加減算器１４００の演算内容は、制御部１２から供給される２ビット制御信号ＡＤＤ＿ＦＮＣＬ［１：０］によって制御される。加減算器１４００の動作ロジックを図６（ａ）及び（ｂ）に示す。加減算器１４００は、図６（ｂ）のテーブルに従って、Ａ＋Ｂ、Ａ−Ｂ、Ｂ−Ａの３通りの計算を実行する。
【００３３】
加減算器１４０１は、ＩＮ２端子に供給される１６ビットデータＩＮ２［０］と、ＩＮ１端子に供給される１６ビットデータＩＮ１［０］を加算又は減算する。加減算器１４０１の演算内容は、上述した加減算器１４００と同様に、制御部１２から供給される２ビット制御信号ＡＤＤ＿ＦＮＣＲ［１：０］によって制御される。
【００３４】
シフト回路１４１０は、加減算器１４００の出力を１／２倍するスケーリング処理を行う回路であり、加減算器１４００の出力データの下位１５ビットを右に１ビットシフトさせて出力する。シフト回路１４１１は、加減算器１４０１の出力に対してシフト回路１４１０と同様のビットシフトを行う。
【００３５】
セレクタ１４２０は、加減算器１４００の出力データ及びシフト回路１４１０の出力データを入力し、制御部１２から供給される１ビット制御信号Ｓ＿ＳＣＡＬＥが"０"であるときに加減算器１４００の出力データを選択して出力し、Ｓ＿ＳＣＡＬＥが"１"であるときにシフト回路１４１０の出力データを選択して出力する。
【００３６】
セレクタ１４２１は、加減算器１４０１の出力データ及びシフト回路１４１１の出力データに対して、セレクタ１４２０と同様の選択動作を実行する。セレクタ１４２０及び１４２１の出力は、パイプラインラッチ１４４０及び１４４５にそれぞれ保持される。
【００３７】
乗算器１４３０は、ＩＮ２端子に供給される１６ビットデータＩＮ２［０］と、ＩＮ１端子に供給される１６ビットデータＩＮ１［１］を乗算する。乗算器１４３１は、ＩＮ２端子に供給される１６ビットデータＩＮ２［１］と、ＩＮ１端子に供給される１６ビットデータＩＮ１［０］を乗算する。乗算器１４３２は、ＩＮ２端子に供給される１６ビットデータＩＮ２［１］と、ＩＮ１端子に供給される１６ビットデータＩＮ１［１］を乗算する。乗算器１４３３は、ＩＮ２端子に供給される１６ビットデータＩＮ２［０］と、ＩＮ１端子に供給される１６ビットデータＩＮ１［０］を乗算する。
【００３８】
乗算器１４３０〜１４３３の出力は、パイプラインラッチ１４４１〜１４４４にそれぞれ保持される。なお、計算精度を維持するために、乗算器１４３０〜１４３３の出力は３２ビット長とされるため、パイプラインラッチ１４４１〜１４４４のレジスタ長はそれぞれ３２ビットである。
【００３９】
次に、第２パイプラインステージにおいて、加減算器１４５０は、パイプラインラッチ１４４１及び１４４２から２つの３２ビットデータを入力して加算又は減算を行う。加減算器１４５０の演算内容は、上述した加減算器１４００と同様に、制御部１２から供給される２ビット制御信号ＭＡＤ＿ＦＮＣＬ［１：０］によって制御される。
【００４０】
また、加減算器１４５１は、パイプラインラッチ１４４３及び１４４４から２つの３２ビットデータを入力して加算又は減算を行う。加減算器１４５１の演算内容は、上述した加減算器１４００と同様に、制御部１２から供給される２ビット制御信号ＭＡＤ＿ＦＮＣＲ［１：０］によって制御される。
【００４１】
丸め回路１４６０は、加減算器１４５０の出力データを３２ビットから１６ビットに丸め、１６ビット長のパイプラインラッチ１４７１に出力する。同様に、丸め回路１４６１は、加減算器１４５１の出力データを３２ビットから１６ビットに丸め、１６ビット長のパイプラインラッチ１４７２に出力する。
【００４２】
パイプラインラッチ１４７０〜１４７３は、パイプラインラッチ１４４０、丸め回路１４６０、丸め回路１４６１、及びパイプラインラッチ１４４５の出力データをラッチする。
【００４３】
なお、図５及び上述した説明から分かるように、乗算器１４３０及び１４３１並びに加減算器１４６０は、１系統の積和演算を実行する第１の積和演算回路を構成している。乗算器１４３２及び１４３３並びに加減算器１４６１もまた、１系統の積和演算を実行する第２の積和演算回路を構成している。そして、これら２つの積和演算回路によって２つの複素数データの乗算を行うことができる。
【００４４】
最後に、第３パイプラインステージにおいて、セレクタ１４８０は、パイプラインラッチ１４７０及び１４７１の出力データを入力し、制御部１２から供給される１ビット制御信号Ｓ＿ＭＡＤが"０"であるときにパイプラインラッチ１４７０の出力データを選択して出力し、Ｓ＿ＭＡＤが"１"であるときにパイプラインラッチ１４７１の出力データを選択して出力する。つまり、セレクタ１４８０は、複素加減算の結果（厳密には、複素加減算の結果の実部又は虚部のいずれか）及び複素乗算の結果（厳密には、複素乗算の結果の虚部）のどちらを後段の回路に出力するかを選択する。
【００４５】
また、セレクタ１４８１は、パイプラインラッチ１４７２及び１４７３の出力データを入力し、制御部１２から供給される１ビット制御信号Ｓ＿ＭＡＤが"０"であるときにパイプラインラッチ１４７３の出力データを選択して出力し、Ｓ＿ＭＡＤが"１"であるときにパイプラインラッチ１４７２の出力データを選択して出力する。つまり、セレクタ１４８１は、複素加減算の結果（厳密には、複素加減算の結果の実部又は虚部のいずれか）及び複素乗算の結果（厳密には、複素乗算の結果の実部）のどちらを後段の回路に出力するかを選択する。
【００４６】
セレクタ１４９０は、セレクタ１４８０及び１４８１の出力データを入力し、制御部１２から供給される１ビット制御信号Ｓ＿ＯＳＷＰが"０"であるときにセレクタ１４８０の出力データを選択して出力し、Ｓ＿ＯＳＷＰが"１"であるときにセレクタ１４８１の出力データを選択して出力する。
【００４７】
セレクタ１４９１も、セレクタ１４８０及び１４８１の出力データを入力し、セレクタ１４９０と同様の動作を実行する。ただし、セレクタ１４９０と１４９１の動作は、相補的である。つまり、セレクタ１４９０が複素乗算結果の虚部を出力する場合に、セレクタ１４９１が複素乗算結果の実部を出力する。また、セレクタ１４９０が複素乗算結果の実部を出力する場合に、セレクタ１４９１が複素乗算結果の虚部を出力する。
【００４８】
つまり、セレクタ１４９０及び１４９１は、セレクタ１４８０から複素乗算結果の虚部が出力され、セレクタ１４８１から複素乗算結果の実部が出力される場合に、ＯＵＴ［０］及びＯＵＴ［１］に出力される複素演算結果の実部及び虚部のデータ順序を入れ替える回路である。
【００４９】
上述したように、図５の構成例では、加減算器１４００が１６ビット長の２つの入力データの加算又は減算を行った後に、１７ビット長の加減算結果を１／２倍にスケーリングすることで１６ビット長の加減算結果を得る構成としている。これにより、加減算器１４００に対する２つの入力データを予め１／２倍にスケーリングした後に加算又は減算を行う場合に比べて、計算精度の低下を抑えることができる。加減算器１４０１も同様である。
【００５０】
また、図５の構成例では、加減算器１４５０が、乗算器１４３０及び１４３１によって得られた２つの３２ビット長の乗算結果データ同士を加算又は減算した後に、丸め回路１４６０が３２ビット長から１６ビット長への丸め処理を行う構成としている。これにより、乗算器１４３０及び１４３１によって得られた２つの３２ビット長の乗算結果データを予め１６ビットに丸めた後に、これら２つの乗算結果データの加減算を行う場合に比べて、計算精度の低下を抑えることができる。加減算器１４５１及び丸め回路１４６１も同様である。
【００５１】
続いて以下では、図５に示した複素演算ユニット１４０及びこれと同一の構成を有する複素演算ユニット１５０に、図４に示したバタフライ演算の実行手順（ＳＴＥＰ１〜３）を実行させる手順について説明する。図７は、図４に示したＳＴＥＰ１〜３を、複素演算ユニット１４０及び１５０の具体的な構成要素を用いて書き改めたものである。
【００５２】
まず、ＳＴＥＰ１では、命令デコード部１１において加算命令（ＶＡＤＤＳ命令）がデコードされたことに応じて、加減算器１４００及び１４０１並びに加減算器１５００及び１５０１が、（１）及び（２）式に相当する複素加算を実行し、Ｙ０及びＹ１の実部及び虚部を出力する。加減算器１５００及び１５０１は、複素演算ユニット１４０と同一構成である複素演算ユニット１５０に含まれている演算器であって、それぞれ加減算器１４００及び１４０１に対応する。また、加算命令であるＶＡＤＤＳ命令の第１及び第２オペランドに指定されたレジスタＲ０及びＲ１は、加算対象となる４つの複素数データＸ０〜Ｘ３の供給元となるレジスタである。また、ＶＡＤＤＳ命令の第３オペランドに指定されたレジスタＲ２は、複素演算ユニット１４０及び１５０による加算結果Ｙ０及びＹ１が出力されるレジスタである。
【００５３】
ＳＴＥＰ２では、命令デコード部１１において減算命令（ＶＳＵＢＳ命令）がデコードされたことに応じて、加減算器１４００及び１４０１並びに加減算器１５００及び１５０１が、（３）及び（４）式の一部に当たる複素減算を実行し、Ｔ０及びＴ１を出力する。減算命令であるＶＳＵＢＳ命令の第１及び第２オペランドに指定されたレジスタＲ０及びＲ１は、減算対象となる４つの複素数データＸ０〜Ｘ３の供給元となるレジスタである。また、ＶＳＵＢＳ命令の第３オペランドに指定されたレジスタＲ３は、複素演算ユニット１４０及び１５０による減算結果Ｔ０及びＴ１が出力されるレジスタである。
【００５４】
ＳＴＥＰ３では、命令デコード部１１において複素乗算命令（ＶＣＭＵＬ命令）がデコードされたことに応じて、複素演算ユニット１４０及び１５０が、ＳＴＥＰ２で得られたＴ０及びＴ１と回転因子Ｗ０及びＷ１との複素乗算を実行し、Ｙ２及びＹ３を出力する。なお、乗算器１５３０〜１５３３と加減算器１５５０及び１５５１は、複素演算ユニット１５０に含まれている演算器であって、それぞれ乗算器１４３０〜１４３３と加減算器１４５０及び１４５１に対応する。また、複素乗算命令であるＶＣＭＵＬ命令の第１及び第２オペランドに指定されたレジスタＲ３及びＲ４は、複素乗算の対象となる４つの複素数データＴ０、Ｔ１、Ｗ０及びＷ１の供給元となるレジスタである。また、ＶＣＭＵＬ命令の第３オペランドに指定されたレジスタＲ５は、複素演算ユニット１４０及び１５０による複素乗算結果Ｙ２及びＹ３が出力されるレジスタである。
【００５５】
図７のＳＴＥＰ１〜３の実行過程において、複素演算ユニット１４０及び１５０に含まれる複数の加減算器及び複数のセレクタの動作は、制御部１２から命令実行部１４に供給される制御信号群によって制御される。図８（ａ）のテーブルは、図７に示したＶＡＤＤＳ命令、ＶＳＵＢＳ命令及びＶＣＭＵＬ命令がデコードされたことに応じて制御部１２から命令実行部１４に供給される制御信号群の組合せを示している。
【００５６】
例えば、ＳＴＥＰ３でＶＣＭＵＬ命令がデコードされた場合には、加減算器１４５１に対する制御信号ＭＡＤ＿ＦＮＣＲ［１：０］が"０１"に設定され、セレクタ１４９０及び１４９１に対する制御信号Ｓ＿ＯＳＷＰが"０"に設定される。なお、加減算器１４５１の動作ロジックは、図６（ｂ）に示した加減算器１４００と同一である。上述したようにセレクタ１４９０及び１４９１は、複素乗算結果の実部及び虚部の出力順序を切り替える回路である。つまり、制御部１２が、セレクタ１４９０及び１４９１、及びこれらに対応する複素演算ユニット１５０内の２つのセレクタの動作を制御することで、レジスタＲ５における複素乗算結果Ｙ２及びＹ３の実部及び虚部の格納順序を、レジスタＲ０及びＲ１におけるバタフライ演算の対象データＸ０〜Ｘ３の実部及び虚部の格納順序と同一にすることができる。
【００５７】
セレクタ１４９０、１４９１、１５９０及び１５９１によって複素乗算結果Ｙ２及びＹ３の実部及び虚部の出力順序を切り替えることの効果を説明するため、レジスタＲ０及びＲ１におけるＸ０〜Ｘ３の実部及び虚部の格納順序が図７と比べて反対である場合のＳＴＥＰ１〜３の実行手順を図９に示す。
【００５８】
図７と図９とでは、ＳＴＥＰ３の複素乗算命令（ＶＣＭＵＬ命令）を実行する際に、加減算器１４５０、１４５１、１５５０及び１５５１の減算の向きが異なる。さらに、図７と図９とでは、ＳＴＥＰ３を実行する際に、図示していないセレクタ１４９０、１４９１、１５９０及び１５９１の選択先が異なる。すなわち、図７では、加減算器１４５１の出力（厳密には丸め回路１４６１の出力）がレジスタＲ５の最下位の１６ビット領域５１０に格納され、加減算器１４５０の出力（厳密には丸め回路１４６１の出力）がレジスタＲ５の領域５１０に隣接する１６ビット領域５１１に格納される。これに対して、図９では、加減算器１４５０の出力がレジスタＲ５の最下位の１６ビット領域５１０に格納され、加減算器１４５１の出力が領域５１１に格納される。同様に、図７では、加減算器１５５１の出力がレジスタＲ５の１６ビット領域５１１に格納され、加減算器１５５０の出力がレジスタＲ５の最上位の１６ビット領域５１２に格納される。これに対して、図９では、加減算器１５５０の出力がレジスタＲ５の１６ビット領域５１１に格納され、加減算器１５５１の出力が領域５１２に格納される。
【００５９】
図９に示したＶＡＤＤＳ命令、ＶＳＵＢＳ命令及びＶＣＭＵＬ命令がデコードされたことに応じて制御部１２から命令実行部１４に供給される制御信号群の組合せを図８（ｂ）に示す。ＳＴＥＰ３でＶＣＭＵＬ命令がデコードされた場合には、加減算器１４５１に対する制御信号ＭＡＤ＿ＦＮＣＲ［１：０］が"１０"又は"１１"に設定され、セレクタ１４９０及び１４９１に対する制御信号Ｓ＿ＯＳＷＰが"１"に設定される。
【００６０】
なお、図７乃至９では、複素乗算命令の命令コードは、入力データの実部及び虚部の格納順序に関わらず同一としている。この場合、制御部１２に対する動作モード設定によって制御信号ＭＡＤ＿ＦＮＣＲ［１：０］及びＳ＿ＯＳＷＰの値を切り替えればよい。しかしながら、演算対象の複素数データの実部及び虚部の格納順序に応じて、セレクタ１４９０、１４９１、１５９０及び１５９１の選択先を変更する方法は、特に限定されない。例えば、２つの複素乗算命令−０及び複素乗算命令−１を定義し、２つの複素乗算命令のどちらがデコードされたかに応じて、制御部１２が、制御信号ＭＡＤ＿ＦＮＣＲ［１：０］及びＳ＿ＯＳＷＰの値を切り替えてもよい。
【００６１】
上述したように、本実施の形態にかかるマイクロプロセッサ１は、複素乗算を含む複素演算を実行する複素演算ユニット１４０及び１５０を有している。さらに、複素演算ユニット１４０及び１５０は、１４９０、１４９１、１５９０及び１５９１の動作によって、複素演算結果の実部及び虚部の出力順序を変更できる。これにより、マイクロプロセッサ１は、データメモリ５１内又はレジスタファイル１３内における複素演算対象データＸ０〜Ｘ３の実部及び虚部の格納順序が入れ替わっても、複素演算対象データＸ０〜Ｘ３の実部及び虚部の格納順序に一致するように、複素演算結果データＹ１〜Ｙ４の実部及び虚部のデータ格納位置を決定することができる。
【００６２】
したがって、マイクロプロセッサ１は、入力される複素数データの実部及び虚部の格納順序に対するハードウェアの制約が小さく、実部及び虚部の格納順序を入れ替えるための冗長な処理を必要とせず、実部及び虚部の配列順序の入れ替え処理を実行することに伴うソフトウェアの冗長性の増大を抑制することができる。
【００６３】
発明の実施の形態２．
本実施の形態にかかるマイクロプロセッサ２の構成を図１０に示す。上述したマイクロプロセッサ１と比べると、マイクロプロセッサ２は、命令実行部２４に含まれる複素演算ユニットの構成が命令実行部１４と相違する。また、マイクロプロセッサ２は、命令実行部２４の出力とレジスタファイル１３との間にデータ選択回路２６を有している。データ選択回路２６の動作は、制御部２２によって制御される。
【００６４】
命令実行部２４は、図１１に示すように、少なくとも２つの複素演算ユニット２４０及び２５０を有する。複素演算ユニット２４０の構成例を図１２に示す。なお、複素演算ユニット２５０も複素演算ユニット２４０と同様に構成すればよい。図１２の複素演算ユニット２４０の構成例は、図５に示した複素演算ユニット１４０の構例と比べて、乗算器１４３２、１４３３及び加減算器１４５０から構成される第２の積和演算回路、丸め回路１４６１、並びにこれらの前後に配置されたパイプラインラッチ１４４３、１４４４及び１４７２が撤廃されている。また、図１２の複素演算ユニット２４０の構成例では、出力データの順序を入れ替えるためのセレクタ１４９０及び１４９１も撤廃されている。
【００６５】
一方、複素演算ユニット２４０は、乗算器１４３０及び１４３１に対する入力データを切り替えるセレクタ２４００及び２４０１を有する。セレクタ２４００は、ＩＮ１端子に供給される１６ビットデータＩＮ１［０］及びＩＮ１［１］を入力し、制御回路２２から供給される１ビット制御信号Ｓ＿ＩＳＥＬが"０"であるときにＩＮ１［１］を選択して出力し、Ｓ＿ＩＳＥＬが"１"であるときにＩＮ１［０］を選択して出力する。セレクタ２４０１は、１６ビットデータＩＮ１［０］及びＩＮ１［１］を入力し、制御回路２２から供給される１ビット制御信号Ｓ＿ＩＳＥＬが"０"であるときにＩＮ１［０］を選択して出力し、Ｓ＿ＩＳＥＬが"１"であるときにＩＮ１［１］を選択して出力する。
【００６６】
つまり、セレクタ２４００及び２４０１は、互いに相補的に動作し、一方がＩＮ１［０］を選択する場合にもう一方がＩＮ［０］を選択する。セレクタ２４００及び２４０１を設けることによって、複素演算ユニット２４０は、図５に示した複素演算ユニット１４０内が並行して実行していた２つの積和演算を、乗算器１４３０及び１４３１並びに加減算器１４５０から構成される第１の積和演算回路によって選択的に実行することができる。
【００６７】
次に、データ選択回路２６は、命令実行部２４の６４ビット長の出力データを入力すると共に、命令実行部２４の出力データの格納先に指定されたレジスタに保持されていた６４ビットデータをレジスタファイル１３から入力する。そして、データ選択回路２６は、これら２つのデータをマージして得られる６４ビットデータを、命令実行部２４の出力データの格納先に指定されたレジスタに格納する。データ選択回路２６によるデータマージは、制御部２２から供給される制御信号に応じて行われる。
【００６８】
データ選択回路２６の構成例を図１３に示す。図１３において、ＩＮ１［０］〜ＩＮ１［３］は、データ選択回路２６のＩＮ１端子に供給される命令実行部２４から出力された６４ビットデータであり、ＩＮ１［０］〜ＩＮ１［３］の各々は１６ビット長である。ＩＮ２［０］〜ＩＮ２［３］は、レジスタファイル１３からデータ選択回路２６のＩＮ２端子に供給される６４ビットデータであり、ＩＮ２［０］〜ＩＮ２［３］の各々は１６ビット長である。
【００６９】
セレクタ２６０は、１６ビットデータであるＩＮ１［０］及びＩＮ２［０］を入力し、制御回路２２から供給される制御信号ＷＳ＿ＥＶＥＮが"０"であるときにＩＮ２［０］を選択して出力し、ＷＳ＿ＥＶＥＮが"１"であるときにＩＮ１［０］を選択して出力する。セレクタ２６１は、１６ビットデータであるＩＮ１［１］及びＩＮ２［１］を入力し、制御回路２２から供給される制御信号ＷＳ＿ＯＤＤが"０"であるときにＩＮ２［１］を選択して出力し、ＷＳ＿ＯＤＤが"１"であるときにＩＮ１［１］を選択して出力する。セレクタ２６２は、セレクタ２６０と同様に制御信号ＷＳ＿ＥＶＥＮに応じて動作し、ＩＮ１［２］又はＩＮ２［２］を選択的に出力する。また、セレクタ２６３は、セレクタ２６１と同様に制御信号ＷＳ＿ＯＤＤに応じて動作し、ＩＮ１［３］又はＩＮ２［３］を選択的に出力する。制御信号ＷＳ＿ＥＶＥＮ及びＷＳ＿ＯＤＤを異なる値に設定されると、データ選択回路２６は、レジスタファイル１３に保持されていたデータと、命令実行部２４の出力データのマージを実行する。
【００７０】
続いて以下では、図１２に示した複素演算ユニット２４０及びこれと同一の構成を有する複素演算ユニット２５０に、図４に示したバタフライ演算の実行手順（ＳＴＥＰ１〜３）を実行させる手順について説明する。図１４及び１５は、図４に示したＳＴＥＰ１〜３を、複素演算ユニット２４０及び２５０の具体的な構成要素を用いて書き改めたものである。
【００７１】
図１４に示した加算命令（ＶＡＤＤＳ命令）によるＳＴＥＰ１の実行及び減算命令（ＶＳＵＢＳ命令）によるＳＴＥＰ２の実行は、図７に示した発明の実施の形態１にかかる命令実行部１４によるものと同様である。
【００７２】
一方、図１５に示した２つの命令、つまりＶＣＭＵＬＲＥ命令及びＶＣＭＵＬＩＭ命令によるＳＴＥＰ３の実行は、図７に示した命令実行部１４によるものとは異なる。ＶＣＭＵＬＲＥ命令は、複素乗算結果Ｙ２及びＹ３の実部を求める積和演算の実行を指示する命令であり、ＶＣＭＵＬＩＭ命令は、複素乗算結果Ｙ２及びＹ３の虚部を求める積和演算の実行を指示する命令である。つまり、命令実行部２４は、２つの積和演算命令、つまりＶＣＭＵＬＲＥ命令及びＶＣＭＵＬＩＭ命令に応じて、２つの積和演算を逐次実行することで、２つの複素乗算を実行する。図１５の例の場合、命令実行部２４は、ＳＴＥＰ３−１において、ＶＣＭＵＬＲＥ命令に応じて積和演算を実行し、Ｙ２及びＹ３の実部を生成する。また、命令実行部２４は、ＳＴＥＰ３−２において、ＶＣＭＵＬＩＭ命令に応じて積和演算を実行し、Ｙ２及びＹ３の虚部を生成する。
【００７３】
図１４及び１５に示したＳＴＥＰ１〜３の実行過程において、複素演算ユニット２４０及び２５０に含まれる複数の加減算器及び複数のセレクタの動作は、制御部２２から命令実行部２４に供給される制御信号群によって制御される。また、データ選択回路２６の動作も制御部２２によって制御される。図１６（ａ）のテーブルは、図１４及び１５に示したＶＡＤＤＳ命令、ＶＳＵＢＳ命令、ＶＣＭＵＬＲＥ命令、及びＶＣＭＵＬＩＭ命令がそれぞれデコードされた場合に、制御部２２から命令実行部２４及びデータ選択回路２６に供給される制御信号群の組合せを示している。
【００７４】
例えば、ＳＴＥＰ１でＶＡＤＤＳ命令がデコードされた場合、加減算器１４００及び１５００に対する制御信号ＡＤ＿ＦＮＣＬ［１：０］と、加減算器１４０１及び１５０１に対する制御信号ＡＤ＿ＦＮＣＲ［１：０］が、ともに"００"に設定される。併せて、加算結果のスケーリングを指示する制御信号Ｓ＿ＳＣＡＬＥが"１"に設定される。さらに、命令実行部２４から出力される６４ビットデータＯＵＴ［０］〜［３］を全てレジスタＲ２に格納するため、データ選択回路２６に対する制御信号Ｓ＿ＯＤＤ及びＳ＿ＥＶＥＮは共に"１"に設定される。
【００７５】
また、ＳＴＥＰ３−１でＶＣＭＵＬＲＥ命令がデコードされた場合、セレクタ２４００及び２４０１に対する制御信号Ｉ＿ＳＥＬが"０"に設定され、Ｙ２の実部Ｙ２Ｒの計算に必要なデータが乗算器１４３０及び１４３１に供給される。なお、セレクタ２４００及び２４０１に対応する複素演算ユニット２５０内の２つのセレクタも、セレクタ２４００及び２４０１と同様に制御信号Ｉ＿ＳＥＬに応じて動作し、Ｙ３の実部Ｙ３Ｒの計算に必要なデータを乗算器１５３０及び１５３１に供給する。
【００７６】
さらに、ＳＴＥＰ３−１では、制御信号Ｓ＿ＭＡＤが"１"に設定されることにより、ＯＵＴ［０］及び［１］は共にＹ２の実部Ｙ２Ｒとなる。同様に、ＯＵＴ［２］及び［３］は共にＹ３の実部Ｙ３Ｒとなる。さらに、データ選択回路２６に対する制御信号Ｓ＿ＯＤＤが"０"、Ｓ＿ＥＶＥＮが"１"に設定されることにより、レジスタＲ５の最下位の１６ビット領域５１０にＹ２の実部Ｙ２Ｒが格納され、レジスタＲ５の１６ビット領域５１２にＹ３の実部Ｙ３Ｒが格納される。
【００７７】
一方、ＳＴＥＰ３−２では、制御信号Ｓ＿ＭＡＤが"１"に設定されることにより、ＯＵＴ［０］及び［１］は共にＹ２の虚部Ｙ２Ｉとなる。同様に、ＯＵＴ［２］及び［３］は共にＹ３の虚部Ｙ３Ｉとなる。さらに、データ選択回路２６に対する制御信号Ｓ＿ＯＤＤが"１"、Ｓ＿ＥＶＥＮが"０"に設定されることにより、レジスタＲ５の１６ビット領域５１１にＹ２の虚部Ｙ２Ｉが格納され、レジスタＲ５の最上位の１６ビット領域５１３にＹ３の虚部Ｙ３Ｉが格納される。つまり、レジスタＲ５に格納された複素乗算結果Ｙ２及びＹ３の実部及ぶ虚部の格納順序は、レジスタＲ３及びＲ４に格納された複素乗算の対象データＴ０、Ｔ１、Ｗ０及びＷ１の実部及び虚部の格納順序と同一になる。
【００７８】
次に、レジスタＲ０及びＲ１におけるＸ０〜Ｘ３の実部及び虚部の格納順序が図７と比べて反対である場合のＳＴＥＰ３−１及び３−２の実行手順を図１７に示す。
【００７９】
図１５と図１７とでは、ＳＴＥＰ３−１の複素乗算命令（ＶＣＭＵＬＲＥ命令）を実行する際に、加減算器１４５０及び１５５０の減算の向きが異なる。また、図１５と図１７とでは、図示していないデータ選択回路２６によるＹ２の実部Ｙ２Ｒ及びＹ３の実部Ｙ３Ｒの出力先が異なる。すなわち、図１７では、Ｙ２の実部Ｙ２ＲがレジスタＲ５の１６ビット領域５１１に格納され、Ｙ３の実部Ｙ３ＲがレジスタＲ５の最上位の１６ビット領域５１３に格納される。
【００８０】
さらに、図１５と図１７とでは、ＳＴＥＰ３−２の複素乗算命令（ＶＣＭＵＬＩＭ命令）を実行する際に、図示していないデータ選択回路２６によるＹ２の虚部Ｙ２Ｉ及びＹ３の虚部Ｙ３Ｉの出力先が異なる。すなわち、図１７では、Ｙ２の虚部Ｙ２ＩがレジスタＲ５の最下位の１６ビット領域５１０に格納され、Ｙ３の虚部Ｙ３ＩがレジスタＲ５の１６ビット領域５１２に格納される。
【００８１】
図１７に示したＶＣＭＵＬＲＥ命令及びＶＣＭＵＬＩＭ命令がそれぞれデコードされた場合に、制御部２２から命令実行部２４及びデータ選択回路２６に供給される制御信号群の組合せを図１６（ｂ）に示す。ＳＴＥＰ３−１でＶＣＭＵＬＲＥ命令がデコードされた場合には、加減算器１４５０に対する制御信号ＭＡＤ＿ＦＮＣ［１：０］が"１０"又は"１１"に設定され、データ選択回路２６に対する制御信号Ｓ＿ＯＤＤが"１"に設定され、Ｓ＿ＥＶＥＮが"０"に設定される。一方、ＳＴＥＰ３−２でＶＣＭＵＬＩＭ命令がデコードされた場合には、セレクタ２４００及び２４０１に対する制御信号Ｓ＿ＩＳＥＬが"１"に設定され、データ選択回路２６に対する制御信号Ｓ＿ＯＤＤが"０"に設定され、Ｓ＿ＥＶＥＮが"１"に設定される。
【００８２】
このように、制御部２２が、データ選択回路２６の動作を制御することで、レジスタＲ５における複素乗算結果Ｙ２及びＹ３の実部及び虚部の格納順序を、レジスタＲ０及びＲ１におけるバタフライ演算の対象データＸ０〜Ｘ３の実部及び虚部の格納順序と同一にすることができる。つまり、マイクロプロセッサ２は、上述したマイクロプロセッサ１と同様に、データメモリ５１内又はレジスタファイル１３内における複素演算対象データＸ０〜Ｘ３の実部及び虚部の格納順序が入れ替わっても、複素演算対象データＸ０〜Ｘ３の実部及び虚部の格納順序に一致するように、複素演算結果データＹ１〜Ｙ４の実部及び虚部のデータ格納位置を決定することができる。
【００８３】
したがって、マイクロプロセッサ２も、入力される複素数データの実部及び虚部の格納順序に対するハードウェアの制約が小さく、実部及び虚部の格納順序を入れ替えるための冗長な処理を必要とせず、実部及び虚部の配列順序の入れ替え処理を実行することに伴うソフトウェアの冗長性の増大を抑制することができる。
【００８４】
なお、発明の実施の形態１及び２では、ＤＩＦ型のバタフライ演算をマイクロプロセッサ１及び２に実行させる具体例について説明した。しかしながら、ＤＩＦ型のバタフライ演算は、複素乗算を含む複素演算の具体例の１つに過ぎないことはもちろんである。例えば、時間間引き（ＤＩＴ：Decimation In Time）型のバタフライ演算をマイクロプロセッサ１及び２に実行させてもよい。
【００８５】
また、発明の実施の形態１及び２では、マイクロプロセッサ１及び２の外部に命令メモリ５０及びデータメモリ５１が存在する構成を示した。しかしながら、例えば、マイクロプロセッサ１及び２は、命令メモリ５０若しくはデータメモリ５１又はこれら両方を含めて１チップに集積されたマイクロプロセッサとしてもよい。つまり、本発明は、図１に示した具体的な実装に限られず、様々な実装形態のマイクロプロセッサに適用可能である。
【００８６】
さらに、本発明は上述した実施の形態のみに限定されるものではなく、既に述べた本発明の要旨を逸脱しない範囲において種々の変更が可能であることは勿論である。
【図面の簡単な説明】
【００８７】
【図１】発明の実施の形態１のマイクロプロセッサのブロック図である。
【図２】発明の実施の形態１のマイクロプロセッサが有する命令実行部のブロック図である。
【図３】４点ＦＦＴのバタフライ演算を示す図である。
【図４】４点ＦＦＴのバタフライ演算の実行手順を説明するための概念図である。
【図５】発明の実施の形態１にかかる命令実行部が有する複素演算ユニットの構成例を示図である。
【図６】発明の実施の形態１にかかる複素演算ユニットが有する加減算器の動作ロジックを示す図である。
【図７】発明の実施の形態１にかかる複素演算ユニットによるバタフライ演算の実行手順を説明するための概念図である。
【図８】発明の実施の形態１にかかる複素演算ユニットによってバタフライ演算を実行する際の制御信号の状態を示すテーブルである。
【図９】発明の実施の形態１にかかる複素演算ユニットによるバタフライ演算の実行手順を説明するための概念図である。
【図１０】発明の実施の形態２のマイクロプロセッサのブロック図である。
【図１１】発明の実施の形態２のマイクロプロセッサが有する命令実行部のブロック図である。
【図１２】発明の実施の形態２にかかる命令実行部が有する複素演算ユニットの構成例を示図である。
【図１３】発明の実施の形態２のマイクロプロセッサが有するデータ選択回路のブロック図である。
【図１４】発明の実施の形態１にかかる複素演算ユニットによるバタフライ演算の実行手順を説明するための概念図である。
【図１５】発明の実施の形態１にかかる複素演算ユニットによるバタフライ演算の実行手順を説明するための概念図である。
【図１６】発明の実施の形態２にかかる複素演算ユニットによってバタフライ演算を実行する際の制御信号の状態を示すテーブルである。
【図１７】発明の実施の形態１にかかる複素演算ユニットによるバタフライ演算の実行手順を説明するための概念図である。
【図１８】背景技術に示す複素乗算ユニットのブロック図である。
【符号の説明】
【００８８】
１、２  マイクロプロセッサ
１０  命令バッファ
１１  命令デコード部
１２  制御部
１３  レジスタファイル
１４  命令実行部
２６  データ選択回路
１４０、１５０  複素演算ユニット
２４０、２５０  複素演算ユニット
２６０〜２６３  セレクタ
１４００、１４０１  加減算器
１４１０、１４１１  シフト回路
１４２０、１４２１  セレクタ
１４３０〜１４３３  乗算器
１４４０〜１４４５  パイプラインラッチ
１４５０、１４５１  加減算器
１４６０、１４６１  丸め回路
１４７０〜１４７３  パイプラインラッチ
１４８０〜１４８１  セレクタ
１４９０〜１４９１  セレクタ
１５００、１５０１  加減算器
１５３０〜１５３３  乗算器
１５５０、１５５１  加減算器
【図１】
2009048532.tif 000003
【図２】
2009048532.tif 000004
【図３】
2009048532.tif 000005
【図４】
2009048532.tif 000006
【図５】
2009048532.tif 000007
【図６】
2009048532.tif 000008
【図７】
2009048532.tif 000009
【図８】
2009048532.tif 000010
【図９】
2009048532.tif 000011
【図１０】
2009048532.tif 000012
【図１１】
2009048532.tif 000013
【図１２】
2009048532.tif 000014
【図１３】
2009048532.tif 000015
【図１４】
2009048532.tif 000016
【図１５】
2009048532.tif 000017
【図１６】
2009048532.tif 000018
【図１７】
2009048532.tif 000019
【図１８】
2009048532.tif 000020