(57)【要約】【課題】命令メモリに格納するプログラムのサイズを小さくすることができるプロセッサを提供することを課題とする。【解決手段】プロセッサは、複数データを記憶するレジスタ（ｖｄ０）と、ループ処理内の単一命令複数データ処理命令により、前記レジスタに対して、マスク値に対応する位置のデータの処理を行い、前記ループ処理の繰り越し時に前記マスク値を更新するコントローラ（１１１）とを有する。【選択図】図１
2015219823.tif 000002
【特許請求の範囲】
【請求項１】
複数データを記憶するレジスタと、
ループ処理内の単一命令複数データ処理命令により、前記レジスタに対して、マスク値に対応する位置のデータの処理を行い、前記ループ処理の繰り越し時に前記マスク値を更新するコントローラと
を有することを特徴とするプロセッサ。
【請求項２】
前記コントローラは、前記マスク値に対応する位置のデータを前記レジスタに書き込むように制御することを特徴とする請求項１記載のプロセッサ。
【請求項３】
前記コントローラは、ストア命令に対し、前記マスク値に応じて、前記レジスタのデータをメモリにストアするか否かを制御することを特徴とする請求項１又は２記載のプロセッサ。
【請求項４】
前記コントローラは、前記ループ処理の繰り越し毎に、前記レジスタ内の異なる位置にデータを書き込み、ストア命令に対し、前記レジスタ内のすべての位置にデータが書き込まれていない場合には、前記レジスタのデータを前記メモリにストアせず、ストア命令に対し、前記レジスタ内のすべての位置にデータが書き込まれている場合には、前記レジスタのデータを前記メモリにストアするように制御することを特徴とする請求項１〜３のいずれか１項に記載のプロセッサ。
【請求項５】
前記コントローラは、前記ループ処理の終了後に、前記レジスタに書き込まれかつストアされていないデータがある場合には、前記レジスタに書き込まれかつストアされていないデータを前記メモリにストアするように制御することを特徴とする請求項４記載のプロセッサ。
【請求項６】
前記コントローラは、前記レジスタ内の前記マスク値に対応する位置のデータを用いて演算するように制御することを特徴とする請求項１記載のプロセッサ。
【請求項７】
前記マスク値は、前記単一命令複数データ処理命令が処理するデータ数に応じて異なることを特徴とする請求項１〜６のいずれか１項に記載のプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサに関する。
【背景技術】
【０００２】
１つのベクトル命令により配列データに対して複数の演算を実行する演算処理装置が知られている（特許文献１参照）。第１マスク格納部は、複数の演算に対して、それぞれ有効又は無効な演算を指定する第１マスクデータを格納する。第２マスク格納部は、複数の演算に対して、連続して有効になる数を指定する第２マスクデータを格納する。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１３−１８６５４７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
プロセッサは、プログラムを実行することにより処理を行う。ループ処理内において、１サイクルの演算により、レジスタ内の一部のデータのみが格納された場合、次回のサイクルの演算により、レジスタ内の他部のデータを書き込む。レジスタ内のすべてのデータが格納された状態で、レジスタのデータをメモリにストアする。この場合、各ループ処理において、レジスタのデータをストアするには、２サイクル分の演算が必要になるため、命令メモリに格納するプログラムのサイズが大きくなってしまう。
本発明の目的は、命令メモリに格納するプログラムのサイズを小さくすることができるプロセッサを提供することである。
【課題を解決するための手段】
【０００５】
プロセッサは、複数データを記憶するレジスタと、ループ処理内の単一命令複数データ処理命令により、前記レジスタに対して、マスク値に対応する位置のデータの処理を行い、前記ループ処理の繰り越し時に前記マスク値を更新するコントローラとを有する。
【発明の効果】
【０００６】
マスク値を用いることにより、ループ処理内の命令数を減らすことができるので、命令メモリに格納するプログラムのサイズを小さくすることができる。
【図面の簡単な説明】
【０００７】
【図１】図１は、本実施形態による処理システムの構成例を示す図である。
【図２】図２（Ａ）〜（Ｄ）は、レジスタのデータフォーマットを示す図である。
【図３】図３（Ａ）及び（Ｂ）は、プロセッサがＳＩＭＤ加算命令を実行する例を示す図である。
【図４】図４（Ａ）〜（Ｃ）は、プロセッサがＳＩＭＤ命令を処理する例を示す図である。
【図５】図５（Ａ）及び（Ｂ）は、プロセッサがＳＩＭＤ命令を処理する例を示す図である。
【図６】図６（Ａ）〜（Ｃ）は、本実施形態によるプロセッサがＳＩＭＤ命令を処理する例を示す図である。
【図７】図７（Ａ）〜（Ｈ）は、マスクレジスタのマスク値を示す図である。
【図８】図８（Ａ）及び（Ｂ）は、マスク値を生成するための回路の構成例を示す図である。
【図９】図９（Ａ）〜（Ｃ）は、マスクレジスタの値を更新するための回路の構成例を示す図である。
【図１０】図１０（Ａ）〜（Ｃ）は、マスク値を生成するための他の回路の構成例を示す図である。
【図１１】図１１は、データ位置レジスタの値を更新するための回路の構成例を示す図である。
【図１２】図１２（Ａ）及び（Ｂ）は、本実施形態によるプロセッサがＳＩＭＤ命令を処理する他の例を示す図である。
【図１３】図１３は、本実施形態によるプロセッサがＳＩＭＤ命令を処理する他の例を示す図である。
【発明を実施するための形態】
【０００８】
図１は、本実施形態による処理システムの構成例を示す図である。処理システムは、プロセッサ１０１、命令ランダムアクセスメモリ（命令ＲＡＭ）１０２及びデータランダムアクセスメモリ（データＲＡＭ）１０３を有する。プロセッサ１０１は、単一命令複数データ処理（ＳＩＭＤ：Single Instruction Multiple Data）プロセッサであり、１命令で複数のデータを処理することができる。処理システムは、無線通信処理又は動画像のデコードなど、大量のデータを高速に処理することができる。命令ＲＡＭ１０２は、命令（プログラム）を記憶する。データＲＡＭ１０３は、データを記憶する。プロセッサ１０１は、命令ＲＡＭ１０２内の命令を読み出し、読み出した命令に従った処理を行い、データＲＡＭ１０３に対してデータのロード又はストアを行う。
【０００９】
プロセッサ１０１は、命令フェッチユニット１０４、デコーダ１０７、アドレスレジスタファイルユニット１０８、コントローラ１１１、ベクトルレジスタファイルユニット１１３、算術論理演算ユニット（ＡＬＵ：Arithmetic and Logic Unit）１１４、バス１１５及びレジスタｖｓ０，ｖｓ１，ｖｔ０，ｖｔ１，ｖｄ０，ｖｄ１を有する。命令フェッチユニット１０４は、ループバッファ１０５及びプログラムカウンタ値記憶部１０６を有する。アドレスレジスタファイルユニット１０８は、アドレスレジスタファイル１０９を有する。アドレスレジスタファイル１０９は、複数のインデックスのアドレスレジスタを有する。コントローラ１１１は、マスクレジスタファイル１１２を有する。マスクレジスタファイル１１２は、複数のインデックスのマスクレジスタを有する。ベクトルレジスタファイルユニット１１３は、ベクトルレジスタファイル１１６を有する。ベクトルレジスタファイル１１６は、複数のインデックスのベクトルレジスタを有する。各ベクトルレジスタは、例えば１２８ビット長のレジスタである。
【００１０】
プログラムカウンタ値記憶部１０６は、プログラムカウンタ値を記憶する。命令フェッチユニット１０４は、プログラムカウンタ値記憶部１０６に記憶されているプログラムカウンタ値が示すアドレスの命令を命令ＲＡＭ１０２から読み出し、読み出した命令をデコーダ１０７に出力する。命令フェッチユニット１０４は、読み出した命令がループ命令である場合には、その読み出した命令をループバッファ１０５に書き込む。ループ命令は、複数回繰り返し実行される命令である。命令フェッチユニット１０４は、２回目以降のループ処理では、命令ＲＡＭ１０２から命令を読み出さず、ループバッファ１０５に記憶されている命令をデコーダ１０７に出力する。ループバッファ１０５を用いることにより、命令ＲＡＭ１０２に対するアクセス数が減り、消費電力を削減することができる。なお、ループバッファ１０５は、なくてもよい。
【００１１】
デコーダ１０７は、命令をデコードし、制御信号をアドレスレジスタファイルユニット１０８、コントローラ１１１、ベクトルレジスタファイルユニット１１３及びＡＬＵ１１４に出力する。
【００１２】
アドレスレジスタファイルユニット１０８は、デコーダ１０７の制御により、アドレスレジスタファイル１０９の指定インデックスのアドレスレジスタに記憶されているアドレスＡＤＲをデータＲＡＭ１０３に出力する。また、アドレスレジスタファイルユニット１０８は、デコーダ１０７の制御により、アドレスレジスタファイル１０９の２個の指定インデックスのアドレスレジスタに記憶されている値ａｓ及びａｔをコントローラ１１１に出力する。コントローラ１１０は、値ａｓ及びａｔを比較する。
【００１３】
コントローラ１１１は、デコーダ１０７の制御により、マスクレジスタファイル１１２の指定インデックスのマスクレジスタに記憶されているマスク値を基に、書き込み制御信号ｖｄ０＿ｗｅｎ及びｖｄ１＿ｗｅｎをベクトルレジスタファイルユニット１１３に出力し、ロードイネーブル信号ＥＮＬ及びストアイネーブル信号ＥＮＳをデータＲＡＭ１０３に出力する。書き込み制御信号ｖｄ０＿ｗｅｎは、レジスタｖｄ０に対する書き込み制御信号である。書き込み制御信号ｖｄ１＿ｗｅｎは、レジスタｖｄ１に対する書き込み制御信号である。
【００１４】
ベクトルレジスタファイルユニット１１３は、デコーダ１０７の制御により、ベクトルレジスタファイル１１６の指定インデックスのベクトルレジスタに記憶されているデータをレジスタｖｓ０，ｖｓ１，ｖｔ０及び／又はｖｔ１に書き込み、レジスタｖｄ０及び／又はｖｄ１に記憶されているデータをベクトルレジスタファイル１１６の指定インデックスのベクトルレジスタに書き込む。
【００１５】
複数のＡＬＵ１１４は、それぞれ、レジスタｖｓ０，ｖｓ１，ｖｔ０又はｖｔ１に記憶されているデータを選択的に入力し、入力したデータに対して算術演算又は論理演算を行い、バス１１５を介して、データＲＡＭ１０３又はレジスタｖｄ０，ｖｄ１に出力する。
【００１６】
データＲＡＭ１０３のサイズの制約が厳しく、必要最小限のビット精度でデータを取り扱うことが多い。そのため、１６ビット精度のデータや３２ビット精度のデータが混在するケースも多い。例えば、ＡＬＵ１１４は、２個の１６ビットのデータの乗算を行い、３２ビットの乗算結果を出力することがある。また、信号処理では、複素数データを扱うことも多く、１６ビット複素数データと１６ビット実数データが混在することもある。
【００１７】
プロセッサ１０１では、並列処理できるデータ数は、ベクトルレジスタファイル１１６内の各ベクトルレジスタのビット幅によって決まる。例えば、ベクトルレジスタのビット幅が１２８ビットの場合、並列処理できるデータ数は、図２（Ａ）のように１６ビット精度であれば８データとなり、図２（Ｂ）のように３２ビット精度であれば４データとなる。また、並列処理できるデータ数は、図２（Ｃ）のように、１６ビット精度の実数部及び１６ビット精度の虚数部を有する複素数であれば４データとなる。また、並列処理できるデータ数は、図２（Ｄ）のように、３２ビット精度の実数部及び３２ビット精度の虚数部を有する複素数であれば２データとなる。
【００１８】
図３（Ａ）は、プロセッサ１０１が１６ビットデータのＳＩＭＤ加算命令ADD8X16を実行する例を示す図である。レジスタｖｓ０は、１６ビット×８個のデータを記憶する。レジスタｖｔ０は、１６ビット×８個のデータを記憶する。ＡＬＵ１１４は、レジスタｖｓ０の１６ビット×８個のデータとレジスタｖｔ０の１６ビット×８個のデータを並列に加算し、加算結果の１６ビット×８個のデータをレジスタｖｄ０に出力する。
【００１９】
図３（Ｂ）は、プロセッサ１０１が３２ビットデータのＳＩＭＤ加算命令ADD4X32を実行する例を示す図である。レジスタｖｓ０は、３２ビット×４個のデータを記憶する。レジスタｖｔ０は、３２ビット×４個のデータを記憶する。ＡＬＵ１１４は、レジスタｖｓ０の３２ビット×４個のデータとレジスタｖｔ０の３２ビット×４個のデータを並列に加算し、加算結果の３２ビット×４個のデータをレジスタｖｄ０に出力する。
【００２０】
図４（Ａ）はＳＩＭＤ化されていないプログラムを示す図であり、図４（Ｂ）は図４（Ａ）のプログラムをＳＩＭＤ命令のプログラムに変換したプログラムを示す図である。図４（Ｂ）のプログラムが命令ＲＡＭ１０２に記憶され、プロセッサ１０１により実行される。図４（Ｃ）は、プロセッサ１０１が図４（Ｂ）のプログラムを処理する例を示す図である。プロセッサ１０１は、データＲＡＭ１０３からデータｘ０〜ｘ３，ｙ０〜ｙ３をロードし、データｖａ０〜ｖａ３，ｖｂ０〜ｖｂ３として入力する。ＡＬＵ１１４は、３２ビット×４個のデータｖａ０〜ｖａ３と３２ビット×４個のデータｖｂ０〜ｖｂ３のデータに対して所定のオペレーションを行い、３２ビット×４個のデータｖｗ０〜ｖｗ３を出力する。次に、ＡＬＵ１１４は、３２ビット×４個のデータｖｗ０〜ｖｗ３を１６ビット×４個のデータｖｃ０〜ｖｃ３に変換する。プロセッサ１０１は、データＲＡＭ１０３に対して、ベクトルレジスタファイル１１６内のベクトルレジスタのビット幅の１２８ビット単位でデータをストアする。しかし、１６ビット×４個（＝６４ビット）のデータｖｃ０〜ｖｃ３は、１２８ビットに満たないので、ストア命令４０１において効率的なストアができない。
【００２１】
図５（Ａ）は、図４（Ｂ）に対応し、１２８ビット長のデータをストアするためのＳＩＭＤ命令のプログラムを示す図である。図５（Ｂ）は、プロセッサ１０１が図５（Ａ）のプログラムを処理する例を示す図である。命令群５０１では、プロセッサ１０１は、データＲＡＭ１０３からデータｘ０〜ｘ３，ｙ０〜ｙ３をロードし、データｖａ０〜ｖａ３，ｖｂ０〜ｖｂ３として入力する。そして、ＡＬＵ１１４は、３２ビット×４個のデータｘ０〜ｘ３と３２ビット×４個のデータｙ０〜ｙ３に対して所定のオペレーションを行い、３２ビット×４個のデータｖｗ０〜ｖｗ３を出力する。次に、命令群５０２では、プロセッサ１０１は、データＲＡＭ１０３からデータｘ４〜ｘ７，ｙ４〜ｙ７をロードし、データｖａ０〜ｖａ３，ｖｂ０〜ｖｂ３として入力する。そして、ＡＬＵ１１４は、３２ビット×４個のデータｘ４〜ｘ７と３２ビット×４個のデータｙ４〜ｙ７に対して所定のオペレーションを行い、３２ビット×４個のデータｖｕ０〜ｖｕ３を出力する。次に、命令５０３では、ＡＬＵ１１４は、３２ビット×８個のデータｖｗ０〜ｖｗ３及びｖｕ０〜ｖｕ３を１６ビット×８個のデータｖｃ０〜ｖｃ７に変換する。次に、ストア命令５０４では、１６ビット×８個（＝１２８ビット）のデータｖｃ０〜ｖｃ７をデータＲＡＭ１０３にストアする。図５（Ａ）のプログラムは、図４（Ｂ）のプログラムに対して、命令群５０２が追加されるため、プログラムのサイズが大きくなる。そのため、プログラムのサイズが命令ＲＡＭ１０２の容量を超えてしまったり、大容量の命令ＲＡＭ１０２が必要になる課題が生じる。そこで、プログラムのサイズを小さくすることが望まれている。
【００２２】
図６（Ａ）は、本実施形態によるＳＩＭＤ命令のプログラムを示す図であり、図６（Ｂ）及び（Ｃ）は、プロセッサ１０１が図６（Ａ）のプログラムを処理する例を示す図である。ループ命令６０１は、変数ｉが０からＮまで複数回のループ処理を行う。図６（Ｂ）はループ処理が奇数回目の処理を示す図であり、図６（Ｃ）はループ処理が偶数回目の処理を示す図である。なお、図６（Ａ）のプログラム中の「ｍ」は、マスクレジスタファイルのインデックス番号を示す。８ＳＩＭＤ命令は、１６ビット×８個のデータのＳＩＭＤ命令である。４ＳＩＭＤ命令は、３２ビット×４個のデータのＳＩＭＤ命令である。
【００２３】
１回目のループ処理では、図６（Ｂ）に示すように、８ＳＩＭＤ命令用マスク値は「００００１１１１」に設定され、４ＳＩＭＤ命令用マスク値は「１１１１」に設定される。これらのマスク値は、図１のマスクレジスタファイル１１２に記憶される。命令６０２では、プロセッサ１０１は、データＲＡＭ１０３からデータｘ０〜ｘ３をロードし、データｖａ０〜ｖａ３として入力する。命令６０３では、プロセッサ１０１は、データＲＡＭ１０３からデータｙ０〜ｙ３をロードし、データｖｂ０〜ｖｂ３として入力する。命令６０４では、ＡＬＵ１１４は、３２ビット×４個のデータｖａ０〜ｖａ３と３２ビット×４個のデータｖｂ０〜ｖｂ３に対して所定のオペレーションを行う。そして、ＡＬＵ１１４は、８ＳＩＭＤ命令用マスク値が「００００１１１１」に設定されているので、オペレーション結果の３２ビット×４個のデータを１６ビット×４個のデータに変換し、下位半分の１６ビット×４個のデータｖｃ０〜ｖｃ３として設定する。次に、ストア命令６０５では、８ＳＩＭＤ命令用マスク値「００００１１１１」の左端ビットが０であるので、データｖｃ０〜ｖｃ３のストアを行わない。
【００２４】
次に、ループ処理は、１回目から２回目に繰り越す。この際、図６（Ｃ）に示すように、８ＳＩＭＤ命令用マスク値は「１１１１００００」に更新され、４ＳＩＭＤ命令用マスク値は「１１１１」に更新される。
【００２５】
２回目のループ処理では、図６（Ｃ）に示す処理を行う。命令６０２では、プロセッサ１０１は、データＲＡＭ１０３からデータｘ０〜ｘ３をロードし、データｖａ０〜ｖａ３として入力する。命令６０３では、プロセッサ１０１は、データＲＡＭ１０３からデータｙ０〜ｙ３をロードし、データｖｂ０〜ｖｂ３として入力する。命令６０４では、ＡＬＵ１１４は、３２ビット×４個のデータｖａ０〜ｖａ３と３２ビット×４個のデータｖｂ０〜ｖｂ３に対して所定のオペレーションを行う。そして、ＡＬＵ１１４は、８ＳＩＭＤ命令用マスク値が「１１１１００００」に設定されているので、オペレーション結果の３２ビット×４個のデータを１６ビット×４個のデータに変換し、上位半分の１６ビット×４個のデータｖｃ４〜ｖｃ７として設定する。次に、ストア命令６０５では、８ＳＩＭＤ命令用マスク値「１１１１００００」の左端ビットが１であるので、１２８ビットのデータｖｃ０〜ｖｃ７をデータＲＡＭ１０３にストアする。
【００２６】
次に、ループ処理は、２回目から３回目に繰り越す。この際、図６（Ｂ）に示すように、８ＳＩＭＤ命令用マスク値は「００００１１１１」に更新され、４ＳＩＭＤ命令用マスク値は「１１１１」に更新される。
【００２７】
同様に、３回目のループ処理では、図６（Ｂ）の処理を行い、４回目のループ処理では、図６（Ｃ）の処理を行う。以上のように、奇数回目のループ処理では図６（Ｂ）の処理を行い、偶数回目のループ処理では図６（Ｃ）の処理を行う。図６（Ｂ）の奇数回目のループ処理では、６４ビットデータｖｃ０〜ｖｃ３が１２８ビットに満たないので、ストアを行わない。これに対し、図６（Ｃ）の偶数回目のループ処理では、１２８ビットデータｖｃ０〜ｖｃ７が揃ったので、ストアを行う。これにより、プロセッサ１０１がデータＲＡＭ１０３にアクセスする回数を減らし、消費電力を低減することができる。
【００２８】
なお、ループ回数が偶数回数である場合には、図６（Ｃ）の処理でループ処理が終了するので、すべてのデータｖｃ０〜ｖｃ７をストアして、終了する。これに対し、ループ回数が奇数回数である場合には、図６（Ｂ）の処理でループ処理が終了するので、データｖｃ０〜ｖｃ３がストアされずに、ループ命令の処理が終了してしまう。そこで、ループ命令６０１の後、ストア命令６０６では、ループ回数が奇数回数である場合には、未ストアデータｖｃ０〜ｖｃ３をデータＲＡＭ１０３にストアする。
【００２９】
以上の処理により、図６（Ａ）のプログラムは、図５（Ａ）のプログラムに対して、サイズが小さくなる。そのため、本実施形態によれば、プログラムを命令ＲＡＭ１０２に格納することが可能になる。また、命令ＲＡＭ１０２の容量を小さくすることができる。また、ループバッファ１０５が存在するプロセッサ１０１では、ループ内の命令数が少なくなると、ループバッファ１０５にヒットしやすくなり、プロセッサ１０１が命令ＲＡＭ１０２へアクセスする回数が減るので、消費電力を低減することができる。
【００３０】
図７（Ａ）〜（Ｈ）は、上記のマスクレジスタのマスク値の更新方法を示す図である。図７（Ａ）〜（Ｃ）は並列処理データ数ＳＩＭＤ＿ＷＩＤＴＨが２の場合を示す図であり、図７（Ｄ）及び（Ｅ）は並列処理データ数ＳＩＭＤ＿ＷＩＤＴＨが４の場合を示す図であり、図７（Ｆ）〜（Ｈ）は並列処理データ数ＳＩＭＤ＿ＷＩＤＴＨが１の場合を示す図である。
【００３１】
図６（Ａ）の命令６００では、図７（Ｄ）及び（Ｅ）に示すように、ループ処理内で処理するデータ数（並列処理データ数）ＳＩＭＤ＿ＷＩＤＴＨが４であることを指定している。
【００３２】
図７（Ｄ）は、図６（Ｂ）及び（Ｃ）に示した８ＳＩＭＤ命令用マスク値の更新例を示す。奇数回目のループ処理（図６（Ｂ））では、８ＳＩＭＤ命令用マスク値は、「００００１１１１」に設定される。偶数回目のループ処理（図６（Ｃ））では、８ＳＩＭＤ命令用マスク値は、「１１１１００００」に設定される。上記の２種類のマスク値の間を交互に遷移する。
【００３３】
図７（Ｅ）は、図６（Ｂ）及び（Ｃ）に示した４ＳＩＭＤ命令用マスク値の更新例を示す。奇数回目のループ処理（図６（Ｂ））では、４ＳＩＭＤ命令用マスク値は、「１１１１」に設定される。偶数回目のループ処理（図６（Ｃ））では、４ＳＩＭＤ命令用マスク値は、「１１１１」に設定される。すなわち、マスク値は変わらない。
【００３４】
図７（Ａ）〜（Ｃ）は、並列処理データ数ＳＩＭＤ＿ＷＩＤＴＨが２の場合を示す図である。図７（Ａ）は、８ＳＩＭＤ命令用マスク値の更新例を示す。１回目のループ処理では、８ＳＩＭＤ命令用マスク値は、「００００００１１」に設定される。２回目のループ処理では、８ＳＩＭＤ命令用マスク値は、「００００１１００」に設定される。３回目のループ処理では、８ＳＩＭＤ命令用マスク値は、「００１１００００」に設定される。４回目のループ処理では、８ＳＩＭＤ命令用マスク値は、「１１００００００」に設定される。上記の４種類のマスク値の間を巡回して遷移する。
【００３５】
図７（Ｂ）は、４ＳＩＭＤ命令用マスク値の更新例を示す。１回目のループ処理では、４ＳＩＭＤ命令用マスク値は、「００１１」に設定される。２回目のループ処理では、４ＳＩＭＤ命令用マスク値は、「１１００」に設定される。３回目のループ処理では、４ＳＩＭＤ命令用マスク値は、「００１１」に設定される。４回目のループ処理では、４ＳＩＭＤ命令用マスク値は、「１１００」に設定される。上記の２種類のマスク値の間を交互に遷移する。
【００３６】
図７（Ｃ）は、２ＳＩＭＤ命令用マスク値の更新例を示す。２ＳＩＭＤ命令は、６４ビット×２個のデータのＳＩＭＤ命令である。２ＳＩＭＤ命令用マスク値は、常に「１１」であり、変わらない。
【００３７】
図７（Ｆ）〜（Ｈ）は、並列処理データ数ＳＩＭＤ＿ＷＩＤＴＨが１の場合を示す図である。図７（Ｆ）は、８ＳＩＭＤ命令用マスク値の更新例を示す。８ＳＩＭＤ命令用マスク値は、「０００００００１」、「００００００１０」、「０００００１００」、「００００１０００」、「０００１００００」、「００１０００００」、「０１００００００」、「１０００００００」の間を巡回して遷移する。
【００３８】
図７（Ｇ）は、４ＳＩＭＤ命令用マスク値の更新例を示す。４ＳＩＭＤ命令用マスク値は、「０００１」、「００１０」、「０１００」、「１０００」の間を巡回して遷移する。
【００３９】
図７（Ｈ）は、２ＳＩＭＤ命令用マスク値の更新例を示す。２ＳＩＭＤ命令用マスク値は、「０１」、「１０」の間を巡回して遷移する。
【００４０】
以上のように、マスクレジスタには、最下位ビット側から指定した並列処理データ数だけ１を格納し、残りに０を格納する。ループ命令にて、ループ処理を繰り越す際に、指定された並列処理データ数だけ左側(最上位ビット側）にローテーションする。
【００４１】
なお、ループ命令６０１は、ループ処理開始時に、開始アドレス、終了アドレス、ループ回数を専用レジスタに保存し、終了アドレスに到達すると、ループ回数が１以上の場合は、ループ回数を１つ減らし、開始アドレスに分岐する命令である。ループ回数が０になると、ループ処理が終了する。
【００４２】
本実施形態では、ループ処理内で処理するデータ数を指定する命令６００を用いる。命令６００は、「set_loop_simd_width(n)」である。ｎは、データ数を表す。命令６００では、ｎが４である。この命令により、８ＳＩＭＤ命令用のマスクレジスタMR_8SIMDm、４ＳＩＭＤ命令用のマスクレジスタMR_4SIMDm、２ＳＩＭＤ命令用のマスクレジスタMR_2SIMDmには、それぞれ次式の値がセットされる。ここでは、データ数ｎは、１，２，４のいずれかである。
【００４３】
MR_8SIMDm = (n == 1)? 8'b00000001 : (n==2)? 8'b00000011 : 8'b00001111; 
MR_4SIMDm = (n == 1)? 4'b0001 : (n==2)? 4'b0011 : 4'b1111; 
MR_2SIMDm = (n == 1)? 2'b01 : 2'b11; 
LOOP_SIMD_NUMm = n;
【００４４】
すなわち、マスクレジスタMR_8SIMDmの値は、ｎが１の場合には「00000001」になり、ｎが２の場合には「00000011」になり、ｎが４の場合には「00001111」になる。マスクレジスタMR_4SIMDmの値は、ｎが１の場合には「0001」になり、ｎが２の場合には「0011」になり、ｎが４の場合には「1111」になる。マスクレジスタMR_2SIMDmの値は、ｎが１の場合には「01」になり、ｎが２の場合には「11」になる。また、レジスタLOOP_SIMD_NUMmには、ｎがセットされる。なお、レジスタLOOP_SIMD_NUMmを使用せず、マスクレジスタMR_8SIMDmの値が「1」であるビット数をカウントし、ｎの値を得るようにしてもよい。
【００４５】
また、４ＳＩＭＤ用のマスクレジスタMR_4SIMDmのマスク値、及び２ＳＩＭＤ用のマスクレジスタMR_2SIMDmのマスク値は、８ＳＩＭＤ用のマスクレジスタMR_8SIMDmのマスク値を基に求めることもできる。その場合、マスクレジスタMR_4SIMDm及びMR_2SIMDmは使用せず、４ＳＩＭＤのマスク値及び２ＳＩＭＤのマスク値は、次式のように、８ＳＩＭＤ用のマスクレジスタMR_8SIMDのマスク値を用いて求めることができる。以下、ｍを省略して示す。なお、「｜」の記号は、論理和（ＯＲ）を示す。
【００４６】
4SIMDのマスク値 ＝
[ (MR_8SIMD[0] | MR_8SIMD[4]), (MR_8SIMD[1] | MR_8SIMD[5]), 
(MR_8SIMD[2] | MR_8SIMD[6]), (MR_8SIMD[3] | MR_8SIMD[7]) ]
2SIMDのマスク値 ＝
[ (MR_8SIMD[0] | MR_8SIMD[2] | MR_8SIMD[4] | MR_8SIMD[6] ), 
(MR_8SIMD[1] | MR_8SIMD[3] | MR_8SIMD[5] | MR_8SIMD[7] )]
【００４７】
図８（Ａ）は、上式の４ＳＩＭＤのマスク値を生成するための回路の構成例を示す図である。MR_8SIMD[0]〜MR_8SIMD[7]は、８ビットのマスクレジスタMR_8SIMDの各ビット値を示す。論理和（ＯＲ）回路８０１は、ビット値MR_8SIMD[7]及びMR_8SIMD[3]の論理和を４ＳＩＭＤのマスク値の３ビット目の値として出力する。論理和回路８０２は、ビット値MR_8SIMD[6]及びMR_8SIMD[2]の論理和を４ＳＩＭＤのマスク値の２ビット目の値として出力する。論理和回路８０３は、ビット値MR_8SIMD[5]及びMR_8SIMD[1]の論理和を４ＳＩＭＤのマスク値の１ビット目の値として出力する。論理和回路８０４は、ビット値MR_8SIMD[4]及びMR_8SIMD[0]の論理和を４ＳＩＭＤのマスク値の０ビット目の値として出力する。
【００４８】
図８（Ｂ）は、上式の２ＳＩＭＤのマスク値を生成するための回路の構成例を示す図である。論理和回路８１１は、ビット値MR_8SIMD[7]、MR_8SIMD[5]、MR_8SIMD[3]及びMR_8SIMD[1]の論理和を２ＳＩＭＤのマスク値の１ビット目の値として出力する。論理和回路８１２は、ビット値MR_8SIMD[6]、MR_8SIMD[4]、MR_8SIMD[2]及びMR_8SIMD[0]の論理和を２ＳＩＭＤのマスク値の０ビット目の値として出力する。
【００４９】
次に、ループ命令６０１に対して、ループ処理の繰り越し時にマスク値を更新する方法を説明する。ループ命令は、ループ命令６０１に限定されず、例えば、「loop cnt, addr」のように、ループ制御レジスタに値を格納する命令である。ループ制御レジスタは、ループ開始アドレスレジスタLOOP_START、ループ終了アドレスレジスタLOOP_END及びループ回数レジスタLOOP_COUNTを有する。ループ終了アドレスレジスタLOOP_ENDには、ループ終了アドレスaddrが格納される。ループ回数レジスタLOOP_COUNTには、ループ回数cntが格納される。
【００５０】
プロセッサ１０１は、次のプログラムカウンタ値がループ終了アドレスレジスタLOOP_ENDと同じになる場合、ループ回数レジスタLOOP_COUNTの値が０より大きければ、ループ回数レジスタLOOP_COUNTの値を１つ減らし、ループ開始アドレスレジスタLOOP_STARTに格納されているアドレスに分岐する。
【００５１】
本実施形態では、プロセッサ１０１は、ループ終了アドレスレジスタLOOP_ENDに格納されているアドレスからループ開始アドレスレジスタLOOP_STARTに格納されているアドレスに分岐するときに、マスクレジスタMR_8SIMDm、MR_4SIMDm及びMR_2SIMDmの値を次式のように更新する。
【００５２】
MR_8SIMDm = (LOOP_SIMD_NUMm == 1)? [ MR_8SIMDm [6:0], MR_8SIMDm [7] ] :
(LOOP_SIMD_NUM m==2)? [ MR_8SIMDm [5:0], MR_8SIMDm [7:6] ] :
[ MR_8SIMDm [3:0], MR_8SIMDm [7:4] ]; 
MR_4SIMDm = (LOOP_SIMD_NUMm == 1)? [ MR_4SIMDm [2:0], MR_8SIMDm [3] ]: 
(LOOP_SIMD_NUMm ==2)? [ MR_4SIMDm [1:0], MR_8SIMDm [3:2] ]:
MR_4SIMDm; 
MR_2SIMDm = (LOOP_SIMD_NUMm == 1)? [ MR_2SIMDm [0], MR_2SIMDm [1] ]:
MR_2SIMDm;
【００５３】
図９（Ａ）は、上式のマスクレジスタMR_8SIMDの値を更新するための回路の構成例を示す図である。セレクタ９０１は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値MR_8SIMD[7]の値を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値MR_8SIMD[6]の値を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値MR_8SIMD[4]の値を選択し、選択した値を新たなビット値MR_8SIMD[0]として更新する。
【００５４】
セレクタ９０２は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値MR_8SIMD[0]の値を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値MR_8SIMD[7]の値を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値MR_8SIMD[5]の値を選択し、選択した値を新たなビット値MR_8SIMD[1]として更新する。
【００５５】
セレクタ９０３は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値MR_8SIMD[1]の値を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値MR_8SIMD[0]の値を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値MR_8SIMD[6]の値を選択し、選択した値を新たなビット値MR_8SIMD[2]として更新する。
【００５６】
セレクタ９０４は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値MR_8SIMD[2]の値を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値MR_8SIMD[1]の値を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値MR_8SIMD[7]の値を選択し、選択した値を新たなビット値MR_8SIMD[3]として更新する。
【００５７】
セレクタ９０５は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値MR_8SIMD[3]の値を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値MR_8SIMD[2]の値を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値MR_8SIMD[0]の値を選択し、選択した値を新たなビット値MR_8SIMD[4]として更新する。
【００５８】
セレクタ９０６は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値MR_8SIMD[4]の値を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値MR_8SIMD[3]の値を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値MR_8SIMD[1]の値を選択し、選択した値を新たなビット値MR_8SIMD[5]として更新する。
【００５９】
セレクタ９０７は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値MR_8SIMD[5]の値を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値MR_8SIMD[4]の値を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値MR_8SIMD[2]の値を選択し、選択した値を新たなビット値MR_8SIMD[6]として更新する。
【００６０】
セレクタ９０８は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値MR_8SIMD[6]の値を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値MR_8SIMD[5]の値を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値MR_8SIMD[3]の値を選択し、選択した値を新たなビット値MR_8SIMD[7]として更新する。
【００６１】
図９（Ｂ）は、上式のマスクレジスタMR_4SIMDの値を更新するための回路の構成例を示す図である。MR_4SIMD[0]〜MR_4SIMD[3]は、４ビットのマスクレジスタMR_4SIMDの各ビット値を示す。
【００６２】
セレクタ９１１は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値MR_4SIMD[3]の値を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値MR_4SIMD[2]の値を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値MR_4SIMD[0]の値を選択し、選択した値を新たなビット値MR_4SIMD[0]として更新する。
【００６３】
セレクタ９１２は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値MR_4SIMD[0]の値を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値MR_4SIMD[3]の値を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値MR_4SIMD[1]の値を選択し、選択した値を新たなビット値MR_4SIMD[1]として更新する。
【００６４】
セレクタ９１３は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値MR_4SIMD[1]の値を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値MR_4SIMD[0]の値を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値MR_4SIMD[2]の値を選択し、選択した値を新たなビット値MR_4SIMD[2]として更新する。
【００６５】
セレクタ９１４は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値MR_4SIMD[2]の値を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値MR_4SIMD[1]の値を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値MR_4SIMD[3]の値を選択し、選択した値を新たなビット値MR_4SIMD[3]として更新する。
【００６６】
図９（Ｃ）は、上式のマスクレジスタMR_2SIMDの値を更新するための回路の構成例を示す図である。MR_2SIMD[0]〜MR_2SIMD[1]は、２ビットのマスクレジスタMR_2SIMDの各ビット値を示す。LOOP_SIMD_NUM[0]は、レジスタLOOP_SIMD_NUMの０ビット目（最下位ビット）のビット値を示す。
【００６７】
セレクタ９２１は、ビット値LOOP_SIMD_NUM[0]が０の場合にはビット値MR_2SIMD[0]の値を選択し、ビット値LOOP_SIMD_NUM[0]が１の場合にはビット値MR_2SIMD[1]の値を選択し、選択した値を新たなビット値MR_2SIMD[0]として更新する。
【００６８】
セレクタ９２２は、ビット値レジスタLOOP_SIMD_NUM[0]が０の場合にはビット値MR_2SIMD[1]の値を選択し、ビット値LOOP_SIMD_NUM[0]が１の場合にはビット値MR_2SIMD[0]の値を選択し、選択した値を新たなビット値MR_2SIMD[1]として更新する。
【００６９】
なお、マスクレジスタ値を更新する命令を追加し、その命令をループ処理の最後に記述するようにしてもよい。マスク値更新命令は、例えば「update_simd_mask(m)」であり、現在のループ回数レジスタLOOP_COUNTの値が０より大きい場合に、上記のようにマスクレジスタ値を更新する。
【００７０】
また、ループ回数レジスタLOOP_COUNTの値を参照せずに、マスク値更新命令の引数として終了条件を渡すようにしてもよい。その場合、マスク値更新命令は、例えば、「update_simd_mask_cond(m, as, at)であり、引数の２つのレジスタ値ａｓ及びａｔが異なる場合に、上記のようにマスクレジスタ値を更新する。コントローラ１１１は、レジスタ値ａｓ及びａｔが異なる場合に、マスクレジスタ値を更新する。例えば、マスク値更新命令は、update_simd_mask_cond(m, i+1, cnt)のように表記される。この場合、変数ｉ＋１がループ回数ｃｎｔと異なる場合に、マスクレジスタ値を更新する。
【００７１】
上記では、マスクレジスタを用いてマスク値を設定する方法を説明した。次に、他のレジスタを用いてマスク値を設定する方法を説明する。データ数レジスタLOOP_SIMD_NUMとデータ位置レジスタSIMD_DATA_LOCを用意し、処理対象のデータ位置を指定するマスク値を生成する。
【００７２】
上記と同様に、ループ処理内で処理するデータ数を指定する命令６００として、「set_loop_simd_width(n)」を使用する。この命令により、データ数レジスタLOOP_SIMD_NUMとデータ位置レジスタSIMD_DATA_LOCに、それぞれ次式の値がセットされる。
【００７３】
LOOP_SIMD_NUMm = n;
SIMD_DATA_LOCm = 8'b00000001;
【００７４】
すなわち、データ数レジスタLOOP_SIMD_NUMmにはｎがセットされ、８ビットのデータ位置レジスタSIMD_DATA_LOCmには「00000001」がセットされる。
【００７５】
上記の２つのレジスタLOOP_SIMD_NUMm及びSIMD_DATA_LOCmの値を基に、次式のマスク値MR_8SIMDm、MR_4SIMDm及びMR_2SIMDmを生成する。マスク値MR_8SIMDm、MR_4SIMDm及びMR_2SIMDmは、それぞれ、上記の８ＳＩＭＤのマスク値、４ＳＩＭＤのマスク値及び２ＳＩＭＤのマスク値である。
【００７６】
loc = SIMD_DATA_LOCm;
MR_8SIMDm = (LOOP_SIMD_NUMm== 1)? loc :
(LOOP_SIMD_NUMm==2)? [ 2[loc[3]], 2[loc[2]], 2[loc[1]], 2[loc[0]]] :
[4 [loc[1]], 4[loc[0] ];
MR_4SIMDm = (LOOP_SIMD_NUMm == 1)? loc[3:0] :
(LOOP_SIMD_NUMm==2)? [ 2[loc[1]], 2[loc[0]]] :
0b1111;
MR_2SIMDm = (LOOP_SIMD_NUMm == 1)? loc[1:0] :
0b11;
【００７７】
図１０（Ａ）は、上式のマスク値MR_8SIMDを生成するための回路の構成例を示す図である。MR_8SIMD[0]〜MR_8SIMD[7]は、８ビットのマスク値MR_8SIMDの各ビット値を示す。SIMD_DATA_LOC[0]〜SIMD_DATA_LOC[7]は、８ビットのデータ位置レジスタSIMD_DATA_LOCの各ビット値を示す。ビット値MR_8SIMD[0]は、ビット値SIMD_DATA_LOC[0]と同じ値として出力される。
【００７８】
セレクタ１００１は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値SIMD_DATA_LOC[0]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値SIMD_DATA_LOC[0]を選択し、選択した値をビット値MR_8SIMD[1]として出力する。
【００７９】
セレクタ１００２は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[2]を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値SIMD_DATA_LOC[0]を選択し、選択した値をビット値MR_8SIMD[2]として出力する。
【００８０】
セレクタ１００３は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[3]を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値SIMD_DATA_LOC[0]を選択し、選択した値をビット値MR_8SIMD[3]として出力する。
【００８１】
セレクタ１００４は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[4]を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値SIMD_DATA_LOC[2]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値SIMD_DATA_LOC[1]を選択し、選択した値をビット値MR_8SIMD[4]として出力する。
【００８２】
セレクタ１００５は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[5]を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値SIMD_DATA_LOC[2]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値SIMD_DATA_LOC[1]を選択し、選択した値をビット値MR_8SIMD[5]として出力する。
【００８３】
セレクタ１００６は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[6]を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値SIMD_DATA_LOC[3]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値SIMD_DATA_LOC[1]を選択し、選択した値をビット値MR_8SIMD[6]として出力する。
【００８４】
セレクタ１００７は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[7]を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値SIMD_DATA_LOC[3]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値SIMD_DATA_LOC[1]を選択し、選択した値をビット値MR_8SIMD[7]として出力する。
【００８５】
図１０（Ｂ）は、上式のマスク値MR_4SIMDを生成するための回路の構成例を示す図である。MR_4SIMD[0]〜MR_4SIMD[3]は、４ビットのマスク値MR_4SIMDの各ビット値を示す。
【００８６】
セレクタ１０１１は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[0]を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値SIMD_DATA_LOC[0]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合には「１」の値を選択し、選択した値をビット値MR_4SIMD[0]として出力する。
【００８７】
セレクタ１０１２は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値SIMD_DATA_LOC[0]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合には「１」の値を選択し、選択した値をビット値MR_4SIMD[1]として出力する。
【００８８】
セレクタ１０１３は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[2]を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合には「１」の値を選択し、選択した値をビット値MR_4SIMD[2]として出力する。
【００８９】
セレクタ１０１４は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[3]を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合には「１」の値を選択し、選択した値をビット値MR_4SIMD[3]として出力する。
【００９０】
図１０（Ｃ）は、上式のマスク値MR_2SIMDを生成するための回路の構成例を示す図である。MR_2SIMD[0]〜MR_2SIMD[1]は、２ビットのマスク値MR_2SIMDの各ビット値を示す。
【００９１】
セレクタ１０２１は、ビット値LOOP_SIMD_NUM[0]が０の場合には「１」の値を選択し、ビット値LOOP_SIMD_NUM[0]が１の場合にはビット値SIMD_DATA_LOC[0]を選択し、選択した値をビット値MR_2SIMD[0]として出力する。
【００９２】
セレクタ１０２２は、ビット値LOOP_SIMD_NUM[0]が０の場合には「１」の値を選択し、ビット値LOOP_SIMD_NUM[0]が１の場合にはビット値SIMD_DATA_LOC[1]を選択し、選択した値をビット値MR_2SIMD[1]として出力する。
【００９３】
次に、ループ処理の繰り越し時にデータ位置レジスタSIMD_DATA_LOCを更新する方法を説明する。ループ終了アドレスレジスタLOOP_ENDに格納されているアドレスからループ開始アドレスLOOP_STARTに格納されているアドレスに分岐するときに、データ位置レジスタSIMD_DATA_LOCの値は、次式のように更新される。
【００９４】
SIMD_DATA_LOCm =
(LOOP_SIMD_NUMm == 1)? [ SIMD_DATA_LOCm [6:0], SIMD_DATA_LOCm [7] ] :
(LOOP_SIMD_NUMm==2)? [ 4'b0000, SIMD_DATA_LOCm [2:0], SIMD_DATA_LOCm [3] ]:
[ 6'b000000, SIMD_DATA_LOCm [0], SIMD_DATA_LOCm [1] ];
【００９５】
図１１は、上式のデータ位置レジスタSIMD_DATA_LOCの値を更新するための回路の構成例を示す図である。
【００９６】
セレクタ１１０１は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[7]を選択し、レジスタLOOP_SIMD_NUMの値が２の場合にはビット値SIMD_DATA_LOC[3]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合にはビット値SIMD_DATA_LOC[1]を選択し、選択した値を新たなビット値SIMD_DATA_LOC[0]として更新する。
【００９７】
ビット値SIMD_DATA_LOC[0]は、新たなビット値SIMD_DATA_LOC[1]として更新される。
セレクタ１１０２は、レジスタLOOP_SIMD_NUMの値が１又は２の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合には「０」の値を選択し、選択した値を新たなビット値SIMD_DATA_LOC[2]として更新する。
【００９８】
セレクタ１１０３は、レジスタLOOP_SIMD_NUMの値が１又は２の場合にはビット値SIMD_DATA_LOC[2]を選択し、レジスタLOOP_SIMD_NUMの値が４の場合には「０」の値を選択し、選択した値を新たなビット値SIMD_DATA_LOC[3]として更新する。
【００９９】
セレクタ１１０４は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[3]を選択し、レジスタLOOP_SIMD_NUMの値が２又は４の場合には「０」の値を選択し、選択した値を新たなビット値SIMD_DATA_LOC[4]として更新する。
【０１００】
セレクタ１１０５は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[4]を選択し、レジスタLOOP_SIMD_NUMの値が２又は４の場合には「０」の値を選択し、選択した値を新たなビット値SIMD_DATA_LOC[5]として更新する。
【０１０１】
セレクタ１１０６は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[5]を選択し、レジスタLOOP_SIMD_NUMの値が２又は４の場合には「０」の値を選択し、選択した値を新たなビット値SIMD_DATA_LOC[6]として更新する。
【０１０２】
セレクタ１１０７は、レジスタLOOP_SIMD_NUMの値が１の場合にはビット値SIMD_DATA_LOC[6]を選択し、レジスタLOOP_SIMD_NUMの値が２又は４の場合には「０」の値を選択し、選択した値を新たなビット値SIMD_DATA_LOC[7]として更新する。
【０１０３】
なお、データ位置レジスタSIMD_DATA_LOCの値及びマスク値を更新する命令を追加し、その命令をループ処理の最後に記述してもよい。マスク値更新命令は、例えば、「update_simd_mask(m)」であり、現在のループ回数レジスタLOOP_COUNTの値が０より大きい場合に、上記のようにマスク値を更新する。
【０１０４】
また、ループ回数レジスタLOOP_COUNTの値を参照せずに、マスク値更新命令の引数として終了条件を渡すようにしてもよい。その場合、マスク値更新命令は、例えば、「update_simd_mask_cond(m, as, at)」であり、引数の２つのレジスタ値ａｓ及びａｔが異なる場合に、上記のようにマスク値を更新する。例えば、マスク値更新命令は、上記と同様に、「update_simd_mask_cond(m, i+1, cnt)」である。
【０１０５】
次に、指定されたデータ位置のデータを処理する命令を説明する。ただし、ロード命令６０２，６０３及びストア命令６０５においては、ベクトルレジスタファイル１１６内のベクトルレジスタのビット幅分のデータをまとめてロード及びストアする。これにより、データＲＡＭ１０３に対するアクセス回数を低減し、消費電力を低減することができる。
【０１０６】
プロセッサ１０１は、ＳＩＭＤ命令に対して、上記のマスク値に応じて演算を行う。具体的には、プロセッサ１０１は、ベクトルレジスタファイル１１６内のベクトルレジスタから入力データを読み出し、ＡＬＵ１１４を用いて演算し、マスク値に対応するデータ位置のみ演算結果をレジスタｖｄ０又はｖｄ１に書き込む。
【０１０７】
図２（Ａ）の１６ビット×８個のデータを対象とするＳＩＭＤ命令は、以下のように動作する。
【０１０８】
命令: op8x16(vd0, vs0, vt0, m):
vd0 = [ op16(vs0[127:112],vt0[127:112]), op16(vs0[111:96], vt0[111:96]), op16(vs0[95:80], vt0[95:80]),
op16(vs0[79:64], vt0[79:64]), op16(vs0[63:48], vt0[63:48]), op16(vs0[47:32], vt0[47:32]),
op16(vs0[31:16], vt0[31:16]), op16(vs0[15:0], vt0[15:0]) ]
vd0_wen = MR_8SIMDm
【０１０９】
ここで、レジスタｖｓ０及びｖｔ０は入力レジスタ、レジスタｖｄ０は出力レジスタである。書き込み制御信号ｖｄ０＿ｗｅｎは、レジスタｖｄ０への２バイト単位の書き込み制御信号である。１バイトは８ビットである。ｏｐ１６は、２個の１６ビットの入力データを入力し、１６ビットの出力データを出力する演算である。レジスタｖｓ０及びｖｔ０には、それぞれ、１６ビット×８個の入力データが記憶される。レジスタｖｄ０には、１６ビット×８個の演算結果が書き込まれる。書き込み制御信号ｖｄ０＿ｗｅｎは、マスクレジスタＭＲ＿８ＳＩＭＤmの値と同じである。レジスタｖｄ０には、書き込み制御信号ｖｄ０＿ｗｅｎが「１」であるデータ位置のバイトのみが書き込まれる。
【０１１０】
図２（Ｂ）の３２ビット×４個のデータを対象とするＳＩＭＤ命令は、以下のように動作する。
【０１１１】
命令: op4x32(vd0, vs0, vt0, m): 
vd0 = [ op32(vs0[127:96], vt0[127:96]), op32(vs0[95:64], vt0[95:64]), 
op32(vs0[63:32], vt0[63:32]), op32(vs0[31:0], vt0[31:0]) ];
vd0_wen = [MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [2], MR_4SIMDm [2], MR_4SIMDm [1], MR_4SIMDm [1], MR_4SIMDm [0], MR_4SIMDm [0]];
【０１１２】
ここで、レジスタｖｓ０及びｖｔ０は入力レジスタ、レジスタｖｄ０は出力レジスタである。ｏｐ３２は、２個の３２ビットの入力データを入力し、３２ビットの出力データを出力する演算である。レジスタｖｓ０及びｖｔ０には、それぞれ、３２ビット×４個の入力データが記憶される。レジスタｖｄ０には、３２ビット×４個の演算結果が書き込まれる。書き込み制御信号ｖｄ０＿ｗｅｎは、上式のように、マスクレジスタＭＲ＿４ＳＩＭＤm の値を基に設定される。レジスタｖｄ０には、書き込み制御信号ｖｄ０＿ｗｅｎが「１」であるデータ位置のバイトのみが書き込まれる。
【０１１３】
図２（Ｄ）の６４ビット×２個のデータを対象とするＳＩＭＤ命令は、以下のように動作する。
【０１１４】
命令: op2x64(vd0, vs0, vt0, m): 
vd0 = [ op64(vs0[127:64], vt0[127:64]), op64(vs0[63:0], vt0[63:0]) ];
vd0_wen = [MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0]];
【０１１５】
ここで、レジスタｖｓ０及びｖｔ０は入力レジスタ、レジスタｖｄ０は出力レジスタである。ｏｐ６４は、２個の６４ビットの入力データを入力し、６４ビットの出力データを出力する演算である。レジスタｖｓ０及びｖｔ０には、それぞれ、６４ビット×２個のデータが記憶される。レジスタｖｄ０には、６４ビット×２個のデータの演算結果が書き込まれる。書き込み制御信号ｖｄ０＿ｗｅｎは、上式のように、マスクレジスタＭＲ＿２ＳＩＭＤm の値を基に設定される。レジスタｖｄ０には、書き込み制御信号ｖｄ０＿ｗｅｎが「１」であるデータ位置のバイトのみが書き込まれる。
【０１１６】
また、１６ビット×８個のデータを入力し、３２ビット×４個の２組みのデータを出力するＳＩＭＤ命令は、以下のように動作する。
【０１１７】
命令: op8x16_8x32(vd1, vd0, vs0, vt0, m): 
vd1 = [op16_32(vs0[127:112], vt0[127:112]), op16_32(vs0[111:96], vt0[111:96]),
op16_32(vs0[95:80], vt0[95:80]), op16_32(vs0[79:64], vt0[79:64])]
vd0 = [op16_32(vs0[63:48], vt0[63:48]), op16_32(vs0[47:32], vt0[47:32]),
op16_32(vs0[31:16], vt0[31:16]), op16_32(vs0[15:0], vt0[15:0])]
vd1_wen = [MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [6], MR_8SIMDm [6], MR_8SIMDm [5], MR_8SIMDm [5], MR_8SIMDm [4], MR_8SIMDm [4]];
vd0_wen = [MR_8SIMDm [3], MR_8SIMDm [3], MR_8SIMDm [2], MR_8SIMDm [2], MR_8SIMDm [1], MR_8SIMDm [1], MR_8SIMDm [0], MR_8SIMDm [0]];
【０１１８】
ここで、レジスタｖｓ０及びｖｔ０は入力レジスタ、レジスタｖｄ０及びｖｄ１は出力レジスタである。ｏｐ１６＿３２は、２個の１６ビットの入力データを入力し、３２ビットの出力データを出力する演算であり、例えば乗算である。レジスタｖｓ０及びｖｔ０には、それぞれ、１６ビット×８個の入力データが記憶される。レジスタｖｄ０及びｖｄ１には、それぞれ、３２ビット×４個の演算結果が書き込まれる。書き込み制御信号ｖｄ０＿ｗｅｎ及びｖｄ１＿ｗｅｎは、上式のように、マスクレジスタMR_8SIMDm の値を基に設定される。レジスタｖｄ０には、書き込み制御信号ｖｄ０＿ｗｅｎが「１」であるデータ位置のバイトのみが書き込まれる。レジスタｖｄ１には、書き込み制御信号ｖｄ１＿ｗｅｎが「１」であるデータ位置のバイトのみが書き込まれる。
【０１１９】
次に、処理するデータ数を４以下に限定するＳＩＭＤ命令を説明する。このＳＩＭＤ命令は、図１２（Ａ）のＳＩＭＤ命令１２０４に対応し、以下のように動作する。
【０１２０】
命令: op8x16_4x32(vd0, vs0, vt0, m):
t = [ op16_32(vs0[127:112], vt0[127:112]), op16_32(vs0[111:96], vt0[111:96]),
op16_32(vs0[95:80], vt0[95:80]), op16_32(vs0[79:64], vt0[79:64])]
u = [ op16_32(vs0[63:48], vt0[63:48]), op16_32(vs0[47:32], vt0[47:32]),
op16_32(vs0[31:16], vt0[31:16]), op16_32(vs0[15:0], vt0[15:0]) ]
x = MR_8SIMDm [3] | MR_8SIMDm [2] | MR_8SIMDm [1] | MR_8SIMDm [0];
vd0 = (x == 1'b1)? u : t;
t_wen = [MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [6], MR_8SIMDm [6], MR_8SIMDm [5], MR_8SIMDm [5], MR_8SIMDm [4], MR_8SIMDm [4]];
u_wen = [MR_8SIMDm [3], MR_8SIMDm [3], MR_8SIMDm [2], MR_8SIMDm [2], MR_8SIMDm [1], MR_8SIMDm [1], MR_8SIMDm [0], MR_8SIMDm [0]];
vd0_wen = (x == 1'b1)? u_wen : t_wen;
【０１２１】
ここで、レジスタｖｓ０及びｖｔ０は入力レジスタ、レジスタｖｄ０は出力レジスタである。ＯＰ１６＿３２は、２個の１６ビットの入力データを入力し、３２ビットの出力データを出力する演算であり、例えば乗算である。レジスタｖｓ０及びｖｔ０には、それぞれ、１６ビット×８個の入力データが記憶される。レジスタｖｄ０には、３２ビット×４個の演算結果が書き込まれる。変数ｘは、ビット値ＭＲ＿８ＳＩＭＤm ［３］、ＭＲ＿８ＳＩＭＤm ［２］、ＭＲ＿８ＳＩＭＤm ［１］及び ＭＲ＿８ＳＩＭＤm ［０］の論理和である。レジスタｖｄ０は、変数ｘが１の場合には変数ｕの値が格納され、変数ｘが０の場合には変数ｔの値が格納される。書き込み制御変数ｔ＿ｗｅｎ及びｕ＿ｗｅｎは、上式のように、マスクレジスタＭＲ＿８ＳＩＭＤm の値を基に設定される。書き込み制御信号ｖｄ０＿ｗｅｎは、変数ｘが１の場合には書き込み制御変数ｕ＿ｗｅｎの値になり、変数ｘが０の場合には書き込み制御変数ｔ＿ｗｅｎの値になる。レジスタｖｄ０には、書き込み制御信号ｖｄ０＿ｗｅｎが「１」であるデータ位置のバイトのみが書き込まれる。
【０１２２】
次に、３２ビット×８個のデータを入力し、１６ビット×８個のデータを出力するＳＩＭＤ命令を説明する。このＳＩＭＤ命令は、以下のように動作する。
【０１２３】
命令: op8x32_8x16(vd0, vs1, vs0, vt1, vt0, m):
vd0 = [ op32_16(vs1[127:96], vt1[127:96]), op32_16(vs1[95:64], vt1[95:64]),
op32_16(vs1[63:32], vt1[63:32]), op32_16(vs1[31:0], vt1[31:0])],
op32_16(vs0[127:96], vt0[127:96]), op32_16(vs0[95:64], vt0[95:64]),
op32_16(vs0[63:32], vt0[63:32]), op32_16(vs0[31:0], vt0[31:0])]];
vd0_wen = MR_8SIMDm;
【０１２４】
ここで、レジスタｖｓ０、ｖｓ１、ｖｔ０及びｖｔ１は入力レジスタ、レジスタｖｄ０は出力レジスタである。レジスタｖｓ０及びｖｓ１には、３２ビット×８個の入力データが記憶される。レジスタｖｔ０及びｖｔ１には、３２ビット×８個の入力データが記憶される。ＯＰ３２＿１６は、２個の３２ビットの入力データを入力し、１６ビットの出力データを出力する演算である。レジスタｖｄ０には、１６ビット×８個の演算結果が書き込まれる。書き込み制御信号ｖｄ０＿ｗｅｎは、上式のように、マスクレジスタＭＲ＿８ＳＩＭＤm の値が設定される。レジスタｖｄ０には、書き込み制御信号ｖｄ０＿ｗｅｎが「１」であるデータ位置のバイトのみが書き込まれる。
【０１２５】
次に、処理するデータ数を４以下に限定するＳＩＭＤ命令を説明する。このＳＩＭＤ命令は、図６のＳＩＭＤ命令６０４に対応し、以下のように動作する。
【０１２６】
命令: op4x32_8x16(vd0, vs0, vt0, m):
t = [ op32_16(vs0[127:96], vs0[127:96]), op32_16(vs0[95:64], vs0[95:64]),
op32_16(vs0[63:32], vs0[63:32]), op32_16(vs0[31:0], vs0[31:0])] ];
vd0 = [t, t];
vd0_wen = MR_8SIMDm;
【０１２７】
ここで、レジスタｖｓ０及びｖｔ０は入力レジスタ、レジスタｖｄ０は出力レジスタである。レジスタｖｓ０及びｖｔ０には、それぞれ、３２ビット×４個の入力データが記憶される。ＯＰ３２＿１６は、２個の３２ビットの入力データを入力し、１６ビットの出力データを出力する演算である。レジスタｖｄ０には、１６ビット×４個の同じ演算結果が２組み書き込まれる。書き込み制御信号ｖｄ０＿ｗｅｎは、上式のように、マスクレジスタＭＲ＿８ＳＩＭＤm の値が設定される。レジスタｖｄ０には、書き込み制御信号ｖｄ０＿ｗｅｎが「１」であるデータ位置のバイトのみが書き込まれる。マスクレジスタＭＲ＿８ＳＩＭＤm の値は、例えば、図７（Ｄ）のように、「００００１１１１」又は「１１１１００００」であるので、レジスタｖｄ０の下位半分のデータ位置及び上位半分のデータ位置のいずれかに、１６ビット×４個のデータｔが書き込まれる。
【０１２８】
次に、３２ビット×４個のデータを入力し、６４ビット×４個のデータを出力するＳＩＭＤ命令を説明する。このＳＩＭＤ命令は、以下のように動作する。
【０１２９】
命令: op4x32_4x64(vd1, vd0, vs0, vt0, m): 
vd1 = [ op32_64(vs0[127:96], vt0[127:96]), op32_64(vs0[95:64], vt0[95:64]) ]
vd0 = [ op32_64(vs0[63:32], vt0[63:32]), op32_64(vs0[31:0], vt0[31:0]) ]
vd1_wen = [MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [2], MR_4SIMDm [2], MR_4SIMDm [2], MR_4SIMDm [2]];
vd0_wen = [MR_4SIMDm [1], MR_4SIMDm [1], MR_4SIMDm [1], MR_4SIMDm [1], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0]];
【０１３０】
ここで、レジスタｖｓ０及びｖｔ０は入力レジスタ、レジスタｖｄ０及びｖｄ１は出力レジスタである。レジスタｖｓ０及びｖｔ０には、それぞれ、３２ビット×４個の入力データが記憶される。ＯＰ３２＿６４は、２個の３２ビットの入力データを入力し、６４ビットの出力データを出力する演算である。レジスタｖｄ０及びｖｄ１には、６４ビット×４個の演算結果が書き込まれる。書き込み制御信号ｖｄ１＿ｗｅｎは、上式のように、ビット値ＭＲ＿４ＳＩＭＤm［２］及びＭＲ＿４ＳＩＭＤm［３］を基に設定される。書き込み制御信号ｖｄ０＿ｗｅｎは、上式のように、ビット値ＭＲ＿４ＳＩＭＤm［０］及びＭＲ＿４ＳＩＭＤm［１］を基に設定される。レジスタｖｄ０には、書き込み制御信号ｖｄ０＿ｗｅｎが「１」であるデータ位置のバイトのみが書き込まれる。レジスタｖｄ１には、書き込み制御信号ｖｄ１＿ｗｅｎが「１」であるデータ位置のバイトのみが書き込まれる。
【０１３１】
次に、６４ビット×４個のデータを入力し、３２ビット×４個のデータを出力するＳＩＭＤ命令を説明する。このＳＩＭＤ命令は、以下のように動作する。
【０１３２】
命令: op4x64_4x32(vd0, vs1, vs0, vt1, vt0, m):
vd0 = [ op64_32(vs1[127:64], vt1[127:64]), op64_32(vs1[63:0], vt1[63:0]), 
op64_32(vs0[127:64], vt0[127:64]), op64_32(vs0[63:0], vt0[63:0]) ]
vd0_wen = [MR_4SIMD[3], MR_4SIMD[3], MR_4SIMD[2], MR_4SIMD[2], MR_4SIMD[1], MR_4SIMD[1], MR_4SIMD[0], MR_4SIMD[0]];
【０１３３】
ここで、レジスタｖｓ０、ｖｓ１、ｖｔ０及びｖｔ１は入力レジスタ、レジスタｖｄ０は出力レジスタである。レジスタｖｓ０及びｖｓ１には、６４ビット×４個の入力データが記憶される。レジスタｖｔ０及びｖｔ１には、６４ビット×４個の入力データが記憶される。ＯＰ６４＿３２は、２個の６４ビットの入力データを入力し、３２ビットの出力データを出力する演算である。レジスタｖｄ０には、３２ビット×４個の演算結果が書き込まれる。書き込み制御信号ｖｄ０＿ｗｅｎは、上式のように、ビット値ＭＲ＿４ＳＩＭＤm［０］〜ＭＲ＿４ＳＩＭＤm［３］を基に設定される。レジスタｖｄ０には、書き込み制御信号ｖｄ０＿ｗｅｎが「１」であるデータ位置のバイトのみが書き込まれる。
【０１３４】
なお、上記と同様に、１６ビット×４個のデータを入力し、６４ビット×４個のデータを演算する命令、及び、６４ビット×４個のデータを入力し、１６ビット×４個のデータを演算する命令を使用することができる。
【０１３５】
次に、プロセッサ１０１がロードイネーブル信号ＥＮＬ又はストアイネーブル信号ＥＮＳを用いてデータＲＡＭ１０３に対してロード又はストアする方法を説明する。プロセッサ１０１は、ベクトルレジスタファイル１１６内のベクトルレジスタのビット幅（１２８ビット）分のデータをまとめてロード又はストアする。これにより、プロセッサ１０１はデータＲＡＭ１０３に対するアクセス数を低減し、消費電力を低減することができる。ロードイネーブル信号ＥＮＬは、データＲＡＭ１０３に対するロードの可否をバイト（８ビット）単位で制御するための信号である。ストアイネーブル信号ＥＮＬは、データＲＡＭ１０３に対するストアの可否をバイト（８ビット）単位で制御するための信号である。
【０１３６】
図２（Ａ）の１６ビット×８個のデータをロードする場合、ロードイネーブル信号ＥＮＬは、次式のように、ビット値ＭＲ＿８ＳＩＭＤm［０］を基に設定される。
【０１３７】
命令: load8x16(ptr, m)
ENL = [MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0]]
【０１３８】
命令: load4x32(ptr, m)
また、図２（Ｂ）の３２ビット×４個のデータをロードする場合、ロードイネーブル信号ＥＮＬは、次式のように、ビット値ＭＲ＿４ＳＩＭＤm［０］を基に設定される。これは、図６（Ａ）のロード命令６０２及び６０３に対応する。
【０１３９】
ENL = [MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0]]
【０１４０】
また、６４ビット×２個のデータをロードする場合、ロードイネーブル信号ＥＮＬは、次式のように、ビット値ＭＲ＿２ＳＩＭＤm［０］を基に設定される。
【０１４１】
命令: load2x64(ptr, m)
ENL = [MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0]]
【０１４２】
また、図２（Ａ）の１６ビット×８個のデータをストアする場合、ストアイネーブル信号ＥＮＳは、次式のように、ビット値ＭＲ＿８ＳＩＭＤm［７］を基に設定される。
【０１４３】
命令: store8x16(ptr, m)
ENS = [MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7]]
【０１４４】
また、図２（Ｂ）の３２ビット×４個のデータをストアする場合、ストアイネーブル信号ＥＮＳは、次式のように、ビット値ＭＲ＿４ＳＩＭＤm［３］を基に設定される。
【０１４５】
命令: store4x32(ptr, m)
ENS = [MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3]]
【０１４６】
また、６４ビット×２個のデータをストアする場合、ストアイネーブル信号ＥＮＳは、次式のように、ビット値ＭＲ＿２ＳＩＭＤm［１］を基に設定される。
【０１４７】
命令: store2x64(ptr, m)
ENS = [MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1]]
【０１４８】
なお、図６（Ａ）〜（Ｃ）のループ回数が奇数回数の場合のように、ストアするデータがベクトルレジスタのビット幅に到達する前にループ処理を終了する場合がある。そのような場合、ベクトルレジスタのビット幅に達しないデータがストアされずに、ループ処理が終了してしまう。その場合、ループ処理後のストア命令６０６により、未ストアのデータをストアする。
【０１４９】
また、図２（Ａ）の１６ビット×８個のデータ形式の未ストアデータをストア命令６０６によりストアする場合、ストアイネーブル信号ＥＮＳは、次式のように、ビット値ＭＲ＿８ＳＩＭＤm［０］〜ＭＲ＿８ＳＩＭＤm［７］を基に設定される。なお、「｜」の記号は、論理和（ＯＲ）を示す。
【０１５０】
命令: store8x16_f(ptr, m)
ENS = [0, 0,
MR_8SIMDm [6], MR_8SIMDm [6],
[MR_8SIMDm [6]|MR_8SIMDm [5]], [MR_8SIMDm [6]|MR_8SIMDm [5]],
[MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]], [MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]],
[MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]], [MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]],
MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]|MR_8SIMDm [2]], MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]|MR_8SIMDm [2]],
MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]|MR_8SIMDm [2]|MR_8SIMDm [1]], MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]|MR_8SIMDm [2]|MR_8SIMDm [1]],
MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]|MR_8SIMDm [2]|MR_8SIMDm [1]|MR_8SIMDm [0]], MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]|MR_8SIMDm [2]|MR_8SIMDm [1]|MR_8SIMDm [0]]]
【０１５１】
また、図２（Ｂ）及び（Ｃ）の３２ビット×４個のデータ形式の未ストアデータをストアする場合、ストアイネーブル信号ＥＮＳは、次式のように、ビット値ＭＲ＿４ＳＩＭＤm［０］〜ＭＲ＿４ＳＩＭＤm［２］を基に設定される。
【０１５２】
命令: store4x32_f(ptr, m)
ENS = [0, 0, 0, 0,
MR_4SIMDm [2], MR_4SIMDm [2], MR_4SIMDm [2], MR_4SIMDm [2],
[MR_4SIMDm [2]|MR_4SIMDm [1]], [MR_4SIMDm [2]|MR_4SIMDm [1]], [MR_4SIMDm [2]|MR_4SIMDm [1]], [MR_4SIMDm [2]|MR_4SIMDm [1]],
[MR_4SIMDm [2]|MR_4SIMDm [1]|MR_4SIMDm [0]], [MR_4SIMDm [2]|MR_4SIMDm [1]|MR_4SIMDm [0]], [MR_4SIMDm [2]|MR_4SIMDm [1]|MR_4SIMDm [0]], [MR_4SIMDm [2]|MR_4SIMDm [1]|MR_4SIMDm [0]]]
【０１５３】
また、図２（Ｄ）の６４ビット×２個のデータ形式の未ストアデータをストアする場合、ストアイネーブル信号ＥＮＳは、次式のように、ビット値ＭＲ＿２ＳＩＭＤm［０］を基に設定される。
【０１５４】
命令: store2x64_f(ptr, m)
ENS = [0, 0, 0, 0, 0, 0, 0, 0,
MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0] ]
【０１５５】
次に、図６（Ａ）〜（Ｃ）の処理を説明する。命令６００は、図７（Ｄ）及び（Ｅ）に示すように、ループ処理内で処理するデータ数（並列処理データ数）ＳＩＭＤ＿ＷＩＤＴＨが４であることを指定している。ループ命令６０１は、変数ｉが０からＮまで複数回のループ処理を行う。図６（Ｂ）はループ処理が奇数回目の処理を示す図であり、図６（Ｃ）はループ処理が偶数回目の処理を示す図である。
【０１５６】
１回目のループ処理では、図６（Ｂ）に示すように、８ＳＩＭＤ命令用マスクレジスタＭＲ＿８ＳＩＭＤmは「００００１１１１」に設定され、４ＳＩＭＤ命令用マスクレジスタＭＲ＿４ＳＩＭＤmは「１１１１」に設定される。これらのマスクレジスタは、図１のマスクレジスタファイル１１２内のマスクレジスタである。ロード命令６０２では、プロセッサ１０１は、データＲＡＭ１０３から３２ビット×４個のデータｖａ０〜ｖａ３をロードする。次に、ロード命令６０３では、プロセッサ１０１は、データＲＡＭ１０３から３２ビット×４個のデータｖｂ０〜ｖｂ３をロードする。次に、命令６０４では、プロセッサ１０１は、上記のように、３２ビット×４個のデータｖａ０〜ｖａ３及び３２ビット×４個のデータｖｂ０〜ｖｂ３を基に演算し、８ＳＩＭＤ命令用マスクレジスタＭＲ＿８ＳＩＭＤmの値「００００１１１１」を用い、１６ビット×４個のデータｖｃ０〜ｖｃ３を出力する。次に、ストア命令６０５では、ビット値ＭＲ＿８ＳＩＭＤm［７］が０であるので、ストアイネーブル信号ＥＮＳの全ビットが０になり、プロセッサ１０１は、データＲＡＭ１０３に１６ビット×４個のデータｖｃ０〜ｖｃ３をストアしない。
【０１５７】
次に、ループ処理は、１回目から２回目に繰り越す。この際、図６（Ｃ）に示すように、８ＳＩＭＤ命令用マスクレジスタＭＲ＿８ＳＩＭＤmは「１１１１００００」に更新され、４ＳＩＭＤ命令用マスクレジスタＭＲ＿４ＳＩＭＤmは「１１１１」に更新される。
【０１５８】
２回目のループ処理では、図６（Ｃ）の処理が行われる。ロード命令６０２では、プロセッサ１０１は、データＲＡＭ１０３から３２ビット×４個のデータｖａ０〜ｖａ３をロードする。次に、ロード命令６０３では、プロセッサ１０１は、データＲＡＭ１０３から３２ビット×４個のデータｖｂ０〜ｖｂ３をロードする。次に、命令６０４では、プロセッサ１０１は、上記のように、３２ビット×４個のデータｖａ０〜ｖａ３及び３２ビット×４個のデータｖｂ０〜ｖｂ３を基に演算し、８ＳＩＭＤ命令用マスクレジスタＭＲ＿８ＳＩＭＤmの値「１１１１００００」を用いて、１６ビット×４個のデータｖｃ４〜ｖｃ７を出力する。次に、ストア命令６０５では、ビット値ＭＲ＿８ＳＩＭＤm［７］が１であるので、ストアイネーブル信号ＥＮＳの全ビットが１になり、プロセッサ１０１は、データＲＡＭ１０３に１６ビット×８個のデータｖｃ０〜ｖｃ７をストアする。
【０１５９】
以上のように、奇数回目のループ処理では図６（Ｂ）の処理を行い、偶数回目のループ処理では図６（Ｃ）の処理を行う。図６（Ｂ）の奇数回目のループ処理では、６４ビットデータｖｃ０〜ｖｃ３が１２８ビットに満たないので、ストアを行わない。これに対し、図６（Ｃ）の偶数回目のループ処理では、１２８ビットデータｖｃ０〜ｖｃ７が揃ったので、ストアを行う。これにより、プロセッサ１０１がデータＲＡＭ１０３にアクセスする回数を減らし、消費電力を低減することができる。
【０１６０】
本実施形態によれば、図６（Ａ）のプログラムは、図５（Ａ）のプログラムに対して、サイズが小さくなる。そのため、本実施形態によれば、プログラムを命令ＲＡＭ１０２に格納することが可能になる。また、命令ＲＡＭ１０２の容量を小さくすることができる。また、ループバッファ１０５が存在するプロセッサ１０１では、ループ内の命令数が少なくなると、ループバッファ１０５にヒットしやすくなり、プロセッサ１０１が命令ＲＡＭ１０２へアクセスする回数が減るので、消費電力を低減することができる。
【０１６１】
図１２（Ａ）は、本実施形態によるＳＩＭＤ命令の他のプログラムを示す図であり、図１２（Ｂ）及び図１３は、プロセッサ１０１が図１２（Ａ）のプログラムを処理する例を示す図である。
【０１６２】
命令１２００は、図６（Ａ）の命令６００と同様に、図７（Ｄ）及び（Ｅ）に示すように、ループ処理内で処理するデータ数（並列処理データ数）ＳＩＭＤ＿ＷＩＤＴＨが４であることを指定している。
【０１６３】
ループ命令１２０１は、図６（Ａ）のループ命令６０１と同様に、変数ｉが０からＮまで複数回のループ処理を行う。図１２（Ｂ）はループ処理が奇数回目の処理を示す図であり、図１３はループ処理が偶数回目の処理を示す図である。
【０１６４】
１回目のループ処理では、図１２（Ｂ）に示すように、８ＳＩＭＤ命令用マスクレジスタＭＲ＿８ＳＩＭＤmは「００００１１１１」に設定され、４ＳＩＭＤ命令用マスクレジスタＭＲ＿４ＳＩＭＤmは「１１１１」に設定される。これらのマスクレジスタは、図１のマスクレジスタファイル１１２内のマスクレジスタである。ロード命令１２０２では、プロセッサ１０１は、データＲＡＭ１０３から１６ビット×８個のデータｖａ０〜ｖａ７をロードする。次に、ロード命令１２０３では、プロセッサ１０１は、データＲＡＭ１０３から１６ビット×８個のデータｖｂ０〜ｖｂ７をロードする。次に、命令１２０４では、プロセッサ１０１は、上記のように、１６ビット×８個のデータｖａ０〜ｖａ７及び１６ビット×８個のデータｖｂ０〜ｖｂ７を入力し、８ＳＩＭＤ命令用マスクレジスタＭＲ＿８ＳＩＭＤmの値「００００１１１１」を用いて、１６ビット×４個のデータｖａ０〜ｖａ３及び１６ビット×４個のデータｖｂ０〜ｖｂ３を基に演算し、３２ビット×４個のデータｖｗ０〜ｖｗ３を出力する。次に、ロード命令１２０５では、プロセッサ１０１は、データＲＡＭ１０３から３２ビット×４個のデータｖｄ０〜ｖｄ３をロードする。次に、加算命令１２０６では、プロセッサ１０１は、３２ビット×４個のデータｖｄ０〜ｖｄ３及び３２ビット×４個のデータｖｗ０〜ｖｗ３を加算し、３２ビット×４個のデータｖｃ０〜ｖｃ３を出力する。次に、ストア命令１２０７では、ビット値ＭＲ＿４ＳＩＭＤm［３］が１であるので、ストアイネーブル信号ＥＮＳの全ビットが１になり、プロセッサ１０１は、データＲＡＭ１０３に３２ビット×４個のデータｖｃ０〜ｖｃ３をストアする。
【０１６５】
次に、ループ処理は、１回目から２回目に繰り越す。この際、図１３に示すように、８ＳＩＭＤ命令用マスクレジスタＭＲ＿８ＳＩＭＤmは「１１１１００００」に更新され、４ＳＩＭＤ命令用マスクレジスタＭＲ＿４ＳＩＭＤmは「１１１１」に更新される。
【０１６６】
２回目のループ処理では、図１３の処理が行われる。ロード命令１２０２では、ビット値ＭＲ＿８ＳＩＭＤm［０］が０であるので、ロードイネーブル信号ＥＮＬの全ビットが０になり、プロセッサ１０１は、データＲＡＭ１０３から１６ビット×８個のデータｖａ０〜ｖａ７をロードしない。次に、ロード命令１２０３では、ビット値ＭＲ＿８ＳＩＭＤm［０］が０であるので、ロードイネーブル信号ＥＮＬの全ビットが０になり、プロセッサ１０１は、データＲＡＭ１０３から１６ビット×８個のデータｖｂ０〜ｖｂ７をロードしない。次に、命令１２０４では、プロセッサ１０１は、上記のように、１６ビット×８個のデータｖａ０〜ｖａ７及び１６ビット×８個のデータｖｂ０〜ｖｂ７を入力し、８ＳＩＭＤ命令用マスクＭＲ＿８ＳＩＭＤmの値「１１１１００００」を用いて、１６ビット×４個のデータｖａ４〜ｖａ７及び１６ビット×４個のデータｖｂ４〜ｖｂ７を基に演算し、３２ビット×４個のデータｖｗ０〜ｖｗ３を出力する。次に、ロード命令１２０５では、プロセッサ１０１は、データＲＡＭ１０３から３２ビット×４個のデータｖｄ０〜ｖｄ３をロードする。次に、加算命令１２０６では、プロセッサ１０１は、３２ビット×４個のデータｖｄ０〜ｖｄ３及び３２ビット×４個のデータｖｗ０〜ｖｗ３を加算し、３２ビット×４個のデータｖｃ０〜ｖｃ３を出力する。次に、ストア命令１２０７では、ビット値ＭＲ＿４ＳＩＭＤm［３］が１であるので、ストアイネーブル信号ＥＮＳの全ビットが１になり、プロセッサ１０１は、データＲＡＭ１０３に３２ビット×４個のデータｖｃ０〜ｖｃ３をストアする。
【０１６７】
次に、ループ処理は、２回目から３回目に繰り越す。この際、図１２（Ｂ）に示すように、８ＳＩＭＤ命令用マスクレジスタＭＲ＿８ＳＩＭＤmは「００００１１１１」に更新され、４ＳＩＭＤ命令用マスクレジスタＭＲ＿４ＳＩＭＤmは「１１１１」に更新される。
【０１６８】
同様に、３回目のループ処理では、図１２（Ｂ）の処理を行い、４回目のループ処理では、図１３の処理を行う。以上のように、奇数回目のループ処理では図１２（Ｂ）の処理を行い、偶数回目のループ処理では図１３の処理を行う。
【０１６９】
仮に図１２（Ｂ）の処理と図１３の処理の両方の命令を１回のループ処理内に記述すると、命令ＲＡＭ１０２に記憶されるプログラムのサイズが大きくなってしまう。本実施形態では、１個の命令１２０４で図１２（Ｂ）の処理及び図１３の処理の両方を行うことができるので、図１２（Ａ）のプログラムのサイズが小さくなる。そのため、本実施形態によれば、プログラムを命令ＲＡＭ１０２に格納することが可能になる。また、命令ＲＡＭ１０２の容量を小さくすることができる。また、ループバッファ１０５が存在するプロセッサ１０１では、ループ内の命令数が少なくなると、ループバッファ１０５にヒットしやすくなり、プロセッサ１０１が命令ＲＡＭ１０２へアクセスする回数が減るので、消費電力を低減することができる。
【０１７０】
本実施形態によれば、入力レジスタｖｓ０、ｖｓ１、ｖｔ０及びｖｔ１は、それぞれ、複数の入力データを記憶する。出力レジスタｖｄ０及びｖｄ１は、それぞれ、複数の出力データを記憶する。コントローラ１１１は、ループ処理内の単一命令複数データ処理（ＳＩＭＤ）命令６０４，１２０４により、レジスタに対して、マスク値に対応する位置のデータの処理を行い、ループ処理の繰り越し時にマスク値を更新する。
【０１７１】
図６（Ａ）〜（Ｃ）の場合、コントローラ１１１は、書き込み制御信号ｖｄ０＿ｗｅｎ及び／又はｖｄ１＿ｗｅｎに応じて、マスク値に対応する位置のデータをレジスタｖｄ０及び／又はｖｄ１に書き込むように制御する。また、コントローラ１１１は、ストア命令６０５に対し、マスク値に応じて、レジスタｖｄ０のデータをデータＲＡＭ１０３にストアするか否かを制御する。
【０１７２】
具体的には、コントローラ１１１は、ループ処理の繰り越し毎に、レジスタｖｄ内の異なる位置にデータを書き込み、ストア命令６０５に対し、レジスタｖｄ０内のすべての位置にデータが書き込まれていない場合には、レジスタｖｄ０のデータをデータＲＡＭ１０３にストアせず、ストア命令６０５に対し、レジスタｖｄ０内のすべての位置にデータが書き込まれている場合には、レジスタｖｄ０のデータをデータＲＡＭ１０３にストアするように制御する。
【０１７３】
また、コントローラ１１１は、ストア命令６０６に対し、ループ処理の終了後に、レジスタｖｄ０に書き込まれかつストアされていないデータがある場合には、レジスタｖｄ０に書き込まれかつストアされていないデータをデータＲＡＭ１０３にストアするように制御する。
【０１７４】
図１２（Ａ）、（Ｂ）及び図１３の場合、コントローラ１１１は、ＳＩＭＤ命令１２０４に対し、レジスタｖｓ０及びｖｔ０内のマスク値に対応する位置のデータを用いて演算するように制御する。
【０１７５】
なお、マスク値は、ＳＩＭＤ命令６０４，１２０４が処理するデータ数に応じて異なる。例えば、ＳＩＭＤ命令６０４の出力データ数は８であるので、ＳＩＭＤ命令６０４に使用するマスク値はマスクレジスタＭＲ＿８ＳＩＭＤmの値になる。また、ＳＩＭＤ命令１２０４の入力データ数は８であるので、ＳＩＭＤ命令１２０４に使用するマスク値はマスクレジスタＭＲ＿８ＳＩＭＤmの値になる。
【０１７６】
本実施形態によれば、マスク値を用いることにより、ループ処理内の命令数を減らすことができるので、命令ＲＡＭ１０２に格納するプログラムのサイズを小さくすることができる。
【０１７７】
なお、上記実施形態は、何れも本発明を実施するにあたっての具体化の例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、又はその主要な特徴から逸脱することなく、様々な形で実施することができる。
【符号の説明】
【０１７８】
１０１  プロセッサ
１０２  命令ＲＡＭ
１０３  データＲＡＭ
１０４  命令フェッチユニット
１０５  ループバッファ
１０６  プログラムカウンタ値記憶部
１０７  デコーダ
１０８  アドレスレジスタファイルユニット
１０９  アドレスレジスタファイル
１１１  コントローラ
１１２  マスクレジスタファイル
１１３  ベクトルレジスタファイルユニット
１１４  算術論理演算ユニット（ＡＬＵ）
１１５  バス
１１６  ベクトルレジスタファイル
【図１】
2015219823.tif 000003
【図２】
2015219823.tif 000004
【図３】
2015219823.tif 000005
【図４】
2015219823.tif 000006
【図５】
2015219823.tif 000007
【図６】
2015219823.tif 000008
【図７】
2015219823.tif 000009
【図８】
2015219823.tif 000010
【図９】
2015219823.tif 000011
【図１０】
2015219823.tif 000012
【図１１】
2015219823.tif 000013
【図１２】
2015219823.tif 000014
【図１３】
2015219823.tif 000015