(57)【要約】【課題】短い命令長で多くのレジスタを扱うことにより、短い命令長で多くの命令を実装し、コード効率のよい高性能で低コストなデータ処理装置を実現する。【解決手段】入力ポインタ更新回路５１４は、ＲＭラッチ５０１の値が“１”の場合には、ＲＢＣラッチ５１１の値、ＢＩＰラッチ５１３の入力ポインタ、及び命令デコード部２１３（第１デコーダ２１４）からの入力ポインタ更新情報に従い入力ポインタを更新する。出力ポインタ更新回路５１８は、ＲＢＣラッチ５１１の値、ＢＯＰラッチ５１７の出力ポインタ、及び命令デコード部２１３（第１デコーダ２１４あるいは第２デコーダ２１５）からの出力ポインタ更新情報に従い出力ポインタを更新する。レジスタマッピング回路５３１は入力ポインタ更新回路５１４，出力ポインタ更新回路５１８等の出力情報に基づき論理レジスタ番号を物理レジスタ番号にマッピングする。【選択図】図２６ 
2006004042.tif 000002
【特許請求の範囲】
【請求項１】
命令のオペランド格納位置として指定される特定論理レジスタに格納されたデータに対してデータ処理を行うデータ処理装置であって、
前記命令を解析するデコード部と、
前記特定論理レジスタに対応づけ可能な複数の可変用物理レジスタと、
前記特定論理レジスタとして、前記複数の可変用物理レジスタのうち少なくとも２つのレジスタから構成される指定対象物理レジスタ群内の前記可変用物理レジスタを、先入れ先出し（ＦＩＦＯ）方式で順次指定可能な論理レジスタ指定手段とを備える、
データ処理装置。
【請求項２】
請求項１記載のデータ処理装置であって、
前記論理レジスタ指定手段は、
前記特定論理レジスタの動作モードを指定する動作モード情報を受け、該動作モード情報に基づき、前記特定論理レジスタとして、一の固定用物理レジスタを指定する物理レジスタ固定動作と、前記特定論理レジスタとして、前記指定対象物理レジスタ群内の前記可変用物理レジスタをＦＩＦＯ方式で順次指定する物理レジスタ可変動作を実行する、
データ処理装置。
【請求項３】
請求項２記載のデータ処理装置であって、
前記特定論理レジスタは２以上の所定数の特定論理レジスタを含み、
前記指定対象物理レジスタ群は前記所定数の特定論理レジスタに対応した所定数の指定対象物理レジスタ群を含み、
前記動作モード情報は前記所定数の特定論理レジスタそれぞれに対応した所定数の特定論理レジスタ対応動作モード情報を含み、
前記論理レジスタ指定手段は、
前記所定数の特定論理レジスタ対応動作モード情報に基づき、前記所定数の特定論理レジスタ単位に、前記特定論理レジスタとして一の固定用物理レジスタを指定する物理レジスタ固定動作、及び前記特定論理レジスタとして対応する前記指定対象物理レジスタ群内の前記可変用物理レジスタをＦＩＦＯ方式で順次指定する物理レジスタ可変動作のうち、一方の動作を実行する、
データ処理装置。
【請求項４】
請求項２記載のデータ処理装置であって、
前記特定論理レジスタは２以上の所定数の特定論理レジスタを含み、
前記指定対象物理レジスタ群は前記所定数の特定論理レジスタに対応した所定数の指定対象物理レジスタ群を含み、
前記動作モード情報は、前記所定数の特定論理レジスタ全体について通常動作モードあるいはＦＩＦＯバッファモードを指定する全体動作モード情報と、前記所定数の特定論理レジスタに対応して設けられ、対応する前記特定論理レジスタについて前記通常動作モードあるいは前記ＦＩＦＯバッファモードを指示する所定数の特定論理レジスタ対応動作モード情報とを含み、
前記論理レジスタ指定手段は、
前記全体動作モード情報及び前記所定数の特定論理レジスタ対応動作モード情報に基づき、前記全体動作モード情報及び前記特定論理レジスタ対応動作モード情報が共に前記ＦＩＦＯバッファモードを指示したとき、対応する前記特定論理レジスタである選択特定論理レジスタとして、対応する前記指定対象物理レジスタ群内の前記可変用物理レジスタをＦＩＦＯ方式で順次指定する物理レジスタ可変動作を実行し、それ以外のとき、前記所定数の特定論理レジスタのうち前記選択特定論理レジスタ以外の特定論理レジスタとして、一の固定用物理レジスタを指定する物理レジスタ固定動作を実行する、
データ処理装置。
【請求項５】
請求項２ないし請求項４のうち、いずれか１項に記載のデータ処理装置であって、
前記指定対象物理レジスタ群は前記固定用物理レジスタとは独立したレジスタで構成される、
データ処理装置。
【請求項６】
請求項２ないし請求項４のうち、いずれか１項に記載のデータ処理装置であって、
前記指定対象物理レジスタ群は少なくとも一部に前記固定用物理レジスタを含む、
データ処理装置。
【請求項７】
請求項１記載のデータ処理装置であって、
前記論理レジスタ指定手段は、
可変用物理レジスタ構成情報に基づき、前記指定対象物理レジスタ群のレジスタ構成内容を決定する、
データ処理装置。
【請求項８】
請求項１記載のデータ処理装置であって、
前記論理レジスタ指定手段は、
入力ポインタによって前記指定対象物理レジスタ群のうち入力データを格納するレジスタを指示し、出力ポインタによって前記指定対象物理レジスタ群のうち格納データを出力するレジスタを指示し、
前記入力ポインタ及び前記出力ポインタの値を、前記指定対象物理レジスタ群内の前記可変用物理レジスタ間を循環するように変更する、
データ処理装置。
【請求項９】
請求項８記載のデータ処理装置であって、
前記指定対象物理レジスタ群は、２のべき乗個の前記可変用物理レジスタより構成される、
データ処理装置。
【請求項１０】
請求項８記載のデータ処理装置であって、
前記命令は前記特定論理レジスタに対しｋ（≧２）個のデータ更新を指示する複数データ更新命令を含み、
前記論理レジスタ指定手段は、
前記データ更新命令に応答して、前記入力ポインタをｋ個分変更させる、
データ処理装置。
【請求項１１】
請求項８記載のデータ処理装置であって、
前記命令は前記特定論理レジスタの格納データを参照するレジスタ値参照命令を含み、
前記論理レジスタ指定手段は、
前記レジスタ値参照命令に応答して、前記出力ポインタを変更させる、
データ処理装置。
【請求項１２】
請求項８記載のデータ処理装置であって、
前記論理レジスタ指定手段は、
前記命令が所定の条件成立時に前記出力ポインタを変更させる、
データ処理装置。
【請求項１３】
請求項１２記載のデータ処理装置であって、
前記データ処理装置は複数の繰り返し用命令を繰り返し実行するブロックリピート機能を有し、
前記所定の条件は、前記命令が前記複数の繰り返し用命令の最終命令に該当する場合を含む、
データ処理装置。
【請求項１４】
請求項１２記載のデータ処理装置であって
前記命令は分岐命令を含み、
前記所定の条件は、前記命令が前記分岐命令に該当する場合を含む、
データ処理装置。
【請求項１５】
請求項８記載のデータ処理装置であって
前記命令は出力ポインタ更新命令を含み、
前記論理レジスタ指定手段は、前記出力ポインタ更新命令に応答して前記出力ポインタを変更する、
データ処理装置。
【請求項１６】
請求項１５記載のデータ処理装置であって、
前記特定論理レジスタは２以上の所定数の特定論理レジスタを含み、
前記指定対象物理レジスタ群は前記所定数の特定論理レジスタに対応した所定数の指定対象物理レジスタ群を含み、
前記出力ポインタは、前記所定数の特定論理レジスタに対応した所定数の出力ポインタを含み、
前記出力ポインタ更新命令は前記所定数の特定論理レジスタそれぞれの更新の有無をさらに指示し、
前記論理レジスタ指定手段は、前記出力ポインタ更新命令に応答して、前記所定数の出力ポインタのうち、更新が指示された出力ポインタを選択的に変更する、
データ処理装置。
【請求項１７】
請求項８記載のデータ処理装置であって、
前記論理レジスタ指定手段は、出力ポインタ更新モード情報に基づき出力ポインタの変更方法を設定可能である、
データ処理装置。
【請求項１８】
請求項１７記載のデータ処理装置であって、
前記特定論理レジスタは２以上の所定数の特定論理レジスタを含み、
前記指定対象物理レジスタ群は前記所定数の特定論理レジスタに対応した所定数の指定対象物理レジスタ群を含み、
前記出力ポインタは、前記所定数の特定論理レジスタに対応した所定数の出力ポインタを含み、
前記出力ポインタ更新モード情報は、前記所定数の特定論理レジスタに対応した所定数の出力ポインタ更新モード情報を含み、
前記論理レジスタ指定手段は、前記所定数の出力ポインタ更新モード情報に基づき、前記所定数の出力ポインタ毎に、出力ポインタの変更方法を設定可能である、
データ処理装置。
【請求項１９】
請求項８記載のデータ処理装置であって、
前記命令は前記特定論理レジスタに対してｋ（≧２）個の格納データの参照を指示する複数データ参照命令を含み、
前記論理レジスタ指定手段は、
前記複数データ参照命令に応答して、前記出力ポインタを１個分変更させる、
データ処理装置。
【請求項２０】
請求項１記載のデータ処理装置であって、
前記命令は、前記特定論理レジスタの格納データを所定のメモリに格納するメモリ格納命令を含み、
前記指定対象物理レジスタ群とは独立したメモリ格納命令用物理レジスタをさらに備え、
前記論理レジスタ指定手段は、
前記メモリ格納命令に応答して、前記特定論理レジスタとして前記メモリ格納命令用物理レジスタを指定する、
データ処理装置。
【請求項２１】
請求項１記載のデータ処理装置であって、
前記命令は、前記特定論理レジスタの格納データを所定のメモリに格納するメモリ格納命令を含み、
前記論理レジスタ指定手段は、
前記メモリ格納命令に応答して、前記特定論理レジスタとして前記指定対象物理レジスタ群内の前記可変用物理レジスタを指定する、
データ処理装置。
【請求項２２】
請求項１記載のデータ処理装置であって、
前記命令は、前記特定論理レジスタの格納データを所定のメモリに格納するメモリ格納命令を含み、
前記指定対象物理レジスタ群とは独立したメモリ格納命令用物理レジスタをさらに備え、
前記論理レジスタ指定手段は、
前記メモリ格納命令に応答し、モード設定情報に基づき、前記特定論理レジスタとして前記メモリ格納命令用物理レジスタを指定する第１のレジスタ指定動作と、前記特定論理レジスタとして前記指定対象物理レジスタ群内の前記可変用物理レジスタを指定する第２のレジスタ指定動作とを選択的に実行する、
データ処理装置。
【請求項２３】
請求項２２記載のデータ処理装置であって、
前記特定論理レジスタは２以上の所定数の特定論理レジスタを含み、
前記指定対象物理レジスタ群は前記所定数の特定論理レジスタに対応した所定数の指定対象物理レジスタ群を含み、
前記モード設定情報は、前記所定数の特定論理レジスタに対応した所定数のモード設定情報を含み、
前記論理レジスタ指定手段は、前記所定数のモード設定情報に基づき、前記所定数の特定論理レジスタ毎に、前記第１及び第２のレジスタ指定動作を選択的に実行する、
データ処理装置。
【請求項２４】
請求項２０記載のデータ処理装置であって、
前記特定論理レジスタとして指定される固定用物理レジスタは前記指定対象物理レジスタ群から独立したレジスタを含み、
前記メモリ格納命令用物理レジスタは前記固定用物理レジスタを含む、
データ処理装置。
【請求項２５】
請求項１記載のデータ処理装置であって、
前記命令は前記特定論理レジスタに対するデータ更新を指示するデータ更新命令を含み、
前記指定対象物理レジスタ群とは独立したデータ更新用物理レジスタをさらに備え、
前記論理レジスタ指定手段は、
前記データ更新命令に応答して、前記特定論理レジスタとして前記データ更新用物理レジスタを指定する、
データ処理装置。
【請求項２６】
請求項８記載のデータ処理装置であって、
前記命令は前記特定論理レジスタに対するデータ更新を指示するデータ更新命令を含み、
前記論理レジスタ指定手段は、
前記データ更新命令に応答して、前記特定論理レジスタとして、前記指定対象物理レジスタ群のうち前記出力ポインタによって指示される前記可変用物理レジスタを指定する、
データ処理装置。
【請求項２７】
請求項８記載のデータ処理装置であって、
前記命令は前記特定論理レジスタに対するデータ更新を指示するデータ更新命令を含み、
前記指定対象物理レジスタ群とは独立したデータ更新用物理レジスタをさらに備え、
前記論理レジスタ指定手段は、
前記データ更新命令に応答して、前記特定論理レジスタとして、前記指定対象物理レジスタ群のうち前記出力ポインタによって指示される前記可変用物理レジスタ及び前記データ更新用物理レジスタを共に指定する、
データ処理装置。
【請求項２８】
請求項２６記載のデータ処理装置であって、
前記指定対象物理レジスタ群とは独立したデータ更新用物理レジスタをさらに備え、
前記論理レジスタ指定手段は、
前記データ更新命令に応答して、レジスタ選択情報に基づき、前記特定論理レジスタとして前記データ更新用物理レジスタを指定する第１のレジスタ指定動作、あるいは前記特定論理レジスタとして前記指定対象物理レジスタ群のうち前記出力ポインタによって指示される前記可変用物理レジスタを少なくとも指定する第２のレジスタ指定動作が実行可能である、
データ処理装置。
【請求項２９】
請求項２８記載のデータ処理装置であって、
前記特定論理レジスタは２以上の所定数の特定論理レジスタを含み、
前記指定対象物理レジスタ群は前記所定数の特定論理レジスタに対応した所定数の指定対象物理レジスタ群を含み、
前記レジスタ選択情報は、前記所定数の特定論理レジスタに対応した所定数のレジスタ選択情報を含み、
前記論理レジスタ指定手段は、前記所定数のレジスタ選択情報に基づき、前記所定数の特定論理レジスタ毎に、前記第１及び第２のレジスタ指定を選択的に実行する、
データ処理装置。
【請求項３０】
請求項２９記載のデータ処理装置であって、
前記第２のレジスタ指定動作は、
前記特定論理レジスタとして、前記指定対象物理レジスタ群のうち前記出力ポインタによって指示される前記可変用物理レジスタのみを指定する第３のレジスタ指定動作と、
前記特定論理レジスタとして、前記指定対象物理レジスタ群のうち前記出力ポインタによって指示される前記可変用物理レジスタ及び前記データ更新用物理レジスタを共に指定する第４のレジスタ指定動作とを含む、
データ処理装置。
【請求項３１】
請求項２５あるいは請求項２７記載のデータ処理装置であって、
前記特定論理レジスタとして指定される固定用物理レジスタは、前記指定対象物理レジスタ群から独立したレジスタを含み、
前記データ更新用物理レジスタは前記固定用物理レジスタを含む、
データ処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明はメモリからロードしたデータをバッファリングするバッファレジスタを有するデータ処理装置に関するものである。
【背景技術】
【０００２】
近年、ディジタル信号処理を効率よく処理するマルチメディア対応のプロセッサの開発が盛んである。このようなプロセッサでは、積和演算等メモリからロードしたデータに対し繰り返し演算／転送処理を行う頻度が非常に高い。例えば、VLIW(Very Long Instruction Word)技術を用いたプロセッサとして、特許文献１で開示されたプロセッサがある。
【０００３】
このようなプロセッサでは、繰り返し処理の高速化を行うためには、ロードのレイテンシ、レジスタ値に格納されたデータのライフタイム等のパイプライン処理を考慮し、ある程度ソフトウェアでループ処理を展開し最適化（ソフトウェアパイプライニング）を行う必要がある。
【０００４】
ソフトウェアパイプライニングを行う場合には、データのバッファとして多くのレジスタが必要になる。並列に動作する複数のデータメモリアクセス経路を持たない単純な構成のプロセッサでは、係数とデータの積和演算を行う際にデータメモリにおける２カ所の異なる配列データをロードする必要があるため、バッファとしてより多くのレジスタが必要となる。
【０００５】
さらに、動作周波数向上のため多段のパイプライン処理を行う場合には、ロードのレイテンシが増え、データの保持に必要なレジスタ本数が増加する。また、ＳＩＭＤ（Single Instruction Multiple Data Stream）技術を用いて、性能向上を図ろうとする場合も、一度に扱うデータの量が増加するため、さらに多くのレジスタが必要となる。
【０００６】
このような高速化を実現するためにはレジスタ本数を増やす必要があるが、単純にレジスタ本数を増加させると命令ビット割り付けにおけるレジスタ番号指定フィールドに多くのビットを費やし、短い命令長に多くの命令を割り振れない。実行可能な命令数が少ないと性能を向上させることは困難である。また、多くの命令を割り当てようとすると基本命令長が長くなってしまうため、コード効率が低下しプログラムサイズが大きくなる。
【０００７】
また、ソフトウェアパイプライニングを用いて高速積和処理等を実現する場合、ロード時の書き込みレジスタ番号や演算時の参照レジスタ番号が異なるため単純なループを用いた短いプログラムが書けず、プログラムサイズが大きくなる。
【０００８】
例えば、特許文献１で開示されているデータ処理装置では、１クロックサイクルに１回の積和演算を行う場合には、最低でも１回のループで６回の積和を行う必要があり、コードサイズは６命令必要となる。この場合、１２本のデータ保持用のレジスタが必要となる。
【０００９】
１回のループで処理するデータ数が多くなると、ループで処理できない端数処理のためのコードサイズや処理サイクル数のオーバーヘッドが大きくなる場合がある。特に、繰り返し回数がダイナミックに変化する場合や、任意の繰り返し回数で同一サブルーチンを呼び出そうとする場合には、繰り返し回数を条件判定するためのオーバーヘッドが大きくなり、処理サイクル数が増大する。さらに、繰り返し回数の条件判定および繰り返し回数に応じたコードが必要となるため、処理を実現するためのプログラムサイズが大きくなる。
【００１０】
また、多くのレジスタを使用するため、積和演算等ロードデータの参照の多い繰り返し処理の前後では、レジスタ値の待避や復帰のための処理が必要となり、コードサイズが大きくなるほか、待避や復帰のためのオーバーヘッドにより処理サイクル数が増大する。
【００１１】
ソフトウェアをＲＯＭ化する場合には、プログラムサイズが大きくなると実装命令ＲＯＭサイズが大きくなり、ハードウェアのコストが高くなる。
【００１２】
また、処理サイクル数が大きくなるということは高い性能が得られないと言うことであり、実装すべき機能を実現するための必要動作周波数が高くなるとともに、消費電力も増大する。
【００１３】
さらに、高速処理を行うために単純な繰り返し処理でも複雑なプログラムとなるため、プログラム開発負荷が大きく、バグ混入の可能性も高い。
【００１４】
【特許文献１】米国特許５，９０１，３０１号明細書
【発明の開示】
【発明が解決しようとする課題】
【００１５】
従来のデータ処理装置は以上のように構成されているので、ディジタル信号処理等繰り返し処理の多いプログラムをソフトウェアにより実現する場合、多くのレジスタを使用し比較的大きな単位でループを展開する必要があるため、コードサイズが大きくなり製品コストが上がったり、処理サイクル数が増え高い性能が得られず消費電力も増大するなどの問題点があった。さらに、プログラムが複雑になるため、ソフトウェアの開発効率が低下し、バグ混入の可能性も高くなるという問題点もあった。
【００１６】
この発明は上記のような問題点を解消するためになされたもので、短い命令長で多くのレジスタを扱うことにより、短い命令長で多くの命令を実装し、コード効率のよい高性能で低コストなデータ処理装置を実現することを目的とする。また、繰り返し処理を短いコードサイズで実現しさまざまなオーバーヘッドを削減することにより、コード効率のよい高性能で低コストなデータ処理装置を実現するとともに、繰り返し処理のプログラムの開発効率を向上することを目的とする。さらに、繰り返し処理前後のレジスタの待避や復帰処理のオーバーヘッドを削減し、コード効率のよい高性能で低コストなデータ処理装置を実現することを目的とする。
【課題を解決するための手段】
【００１７】
この発明に係る請求項１記載のデータ処理装置は、命令のオペランド格納位置として指定される特定論理レジスタに格納されたデータに対してデータ処理を行う装置であって、前記命令を解析するデコード部と、前記特定論理レジスタに対応づけ可能な複数の可変用物理レジスタと、前記特定論理レジスタとして、前記複数の可変用物理レジスタのうち少なくとも２つのレジスタから構成される指定対象物理レジスタ群内の前記可変用物理レジスタを、ＦＩＦＯ方式で順次指定可能な論理レジスタ指定手段とを備える。
【発明の効果】
【００１８】
この発明におけるデータ処理装置の論理レジスタ指定手段は複数の可変用物理レジスタのうち少なくとも２つのレジスタから構成される指定対象物理レジスタ群内の可変用物理レジスタを、前記特定論理レジスタとして先入れ先出し（ＦＩＦＯ）方式で順次指定可能であるため、少ない特定論理レジスタ数で多くの物理レジスタを扱うことにより、基本命令長を短くすることができる。その結果、短い基本命令長で多くの命令を実装することにより、コード効率のよい高性能で低コストなデータ処理装置を得ることができる。
【発明を実施するための最良の形態】
【００１９】
本発明の実施の形態１のデータ処理装置について説明する。本実施の形態における本データ処理装置は、１６ビットプロセッサであり、アドレス及びデータのビット長は１６ビットである。また、本データ処理装置は、ビット順、バイト順に関してビッグエンディアンを採用しており、ビット位置としてはＭＳＢがビット０になる。
【００２０】
図１から図４は本データ処理装置のレジスタセットを示す説明図である。図１は汎用レジスタを示しており、１６本の汎用レジスタＧＲ０〜ＧＲ１５はデータやアドレス値を格納する。汎用レジスタＧＲ１４は、サブルーチンジャンプ時の戻り先アドレスを格納するためのリンク（ＬＩＮＫ）レジスタとして割り当てられている。汎用レジスタＧＲ１５（ＧＲ１５ａ，ＧＲ１５ｂ）はスタックポインタ（ＳＰ）であり、汎用レジスタＧＲ１５ａは割り込み用のスタックポインタ（ＳＰＩ）、汎用レジスタＧＲ１５ｂはユーザ用のスタックポインタ（ＳＰＵ）を格納し、汎用レジスタＧＲ１５ａ，１５ｂとが後で説明するプロセッサ・ステータス・ワード（ＰＳＷ）によって切り替えられる。以後、ＳＰＩとＳＰＵを総称して、スタックポインタ（ＳＰ）と呼ぶ。特別な場合を除き、４ビットのレジスタ指定フィールドでオペランドとなる各レジスタの番号が指定される。本データ処理装置では、例えば汎用レジスタＧＲ０，ＧＲ１のように２つのレジスタをペアにして、処理する命令を備えている。この場合、偶数番号のレジスタを指定する。ペアのレジスタとして、指定したレジスタ番号に“１”を加えた奇数番号のレジスタが暗に指定される。
【００２１】
図２は、アキュムレータを示しており、各々５６ビットのアキュムレータＡ０、Ａ１である。各アキュムレータＡ０，Ａ１は、便宜上１６ビット毎にＡ０Ｈ２１ｂ、Ａ１Ｈ２２ｂ、Ａ０Ｌ２１ｃ、Ａ１Ｌ２２ｃ、Ａ０ＬＬ２１ｄ、Ａ１ＬＬ２２ｄと名前を付けている。また、積和演算結果の上位からあふれたビットを保持する８ビットのガードビットＡ０Ｇ２１ａ、Ａ１Ｇ２２ａを備えている。
【００２２】
図３の各々１６ビットの制御レジスタＣＲ０〜ＣＲ１１を示す説明図である。各制御レジスタＣＲ０〜ＣＲ１１も、汎用レジスタＧＲと同様、通常レジスタの番号が４ビットで示される。制御レジスタＣＲ０は、プロセッサ・ステータス・ワード（ＰＳＷ）を格納し、ＰＳＷはデータ処理装置の動作モードを指定するビットや演算結果を示すフラグからなる。図５は制御レジスタＣＲ０に格納されるＰＳＷの構成を示す説明図である。
【００２３】
ＳＭビット６１（ビット０）はスタックモードを示すビットである。ＳＭビット６１が“０”の場合は割り込みモードであることを示し、汎用レジスタＧＲ１５としてＳＰＩが用いられる。“１”の場合はユーザーモードであることを示し、汎用レジスタＧＲ１５としてＳＰＵが用いられる。
【００２４】
ＩＥビット６２（ビット４）は割り込みイネーブルを指定するビットであり、“０”の場合は割り込みをマスク（アサートされても無視）し、“１”の場合は割り込みを受け付ける。
【００２５】
本データ処理装置では、ゼロオーバーヘッドのループ処理を実現するためのブロックリピート機能、及び、単一命令リピート機能が実装されている。ＲＰビット６３（ビット５）はブロックリピート状態を示すビットであり、“０”の場合はブロックリピート中でないことを、“１”の場合はブロックリピート中であることを示す。ＳＲＰビット６４（ビット６）は単一命令リピート状態を示すビットであり、“０”の場合は単一命令リピート中でないことを、“１”の場合は単一命令リピート中であることを示す。
【００２６】
また、本データ処理装置では、サーキュラーバッファをアクセスするためのアドレッシングであるモジュロアドレッシング機能が実装されている。ＭＤビット６５（ビット７）はモジュロイネーブルを指定するビットであり、“０”の場合はモジュロアドレッシングをディスエーブル状態にし、“１”の場合はモジュロアドレッシングをイネーブル状態にする。
【００２７】
ＦＸビット６６（ビット８）は、アキュムレータのデータフォーマットを指定するビットであり、“０”の場合は乗算結果を整数フォーマットでアキュムレータに格納し、“１”の場合は乗算結果を固定小数点フォーマットとして１ビット左にシフトしてアキュムレータに格納する。
【００２８】
ＳＴビット６７（ビット９）はサチュレーションモードを指定するビットである。“０”の場合はアキュムレータに演算結果を格納する際、演算結果を５６ビットとして書き込む。“１”の場合はアキュムレータに演算結果を格納する際、４８ビットで表現できる値（ガードビットが符号のみの値）にリミット処理して書き込む。”ｈ’”を１６進表記とすると、演算結果がh'007fffffffffffより大きい値の場合には、アキュムレータにh'007fffffffffffを書き込み、演算結果がh'ff800000000000より小さい値の場合には、アキュムレータにh'ff800000000000を書き込む。
【００２９】
（全体）動作モード情報であるＲＭビット６８（ビット１０）はレジスタモードを指定するＲＭビットである。“０”の場合は命令で指定される１つの論理レジスタが物理的に１つの汎用レジスタ（固定用物理レジスタ）に対応する通常のモード（汎用レジスタモード（物理レジスタ固定動作モード））であることを示し、“１”の場合は命令で指定される論理レジスタの一部である特定論理レジスタ（Ｒ０〜Ｒ４の一部もしくは全部）が先入れ先出し（ＦＩＦＯ）方式のバッファとして動作するリングバッファモード（物理レジスタ可変動作モード）であることを示す。リングバッファモードの動作の詳細については、後述する。
【００３０】
ＦＯフラグ６９（ビット１２）は実行制御フラグであり、比較命令の比較結果などがこのフラグにセットされる。Ｆ１フラグ７０（ビット１３）も実行制御フラグであり、比較命令等によりＦ０フラグ６９を更新する際に、更新前のＦ０フラグ６９の値が、Ｆ１フラグ７０にコピーされる。Ｃフラグ７１（ビット１５）はキャリー・フラグであり、加減算命令実行時のキャリーがこのフラグにセットされる。
【００３１】
図３の制御レジスタＣＲ２は、プログラムカウンタ（ＰＣ）を格納し、実行中の命令アドレスを示す。本データ処理装置が処理する命令は、基本的に３２ビット固定長であり、制御レジスタＣＲ２（ＰＣ）は、３２ビットを１ワードとした命令ワードアドレスを保持する。本レジスタは、読み出しのみ可能である。
【００３２】
制御レジスタＣＲ１は、バックアップ・プロセッサ・ステータス・ワード（ＢＰＳＷ）、制御レジスタＣＲ３は、バックアップ・プログラム・カウンタ（ＢＰＣ）をそれぞれ格納し、各々例外や割り込みが検出された場合に実行中の制御レジスタＣＲ０（ＰＳＷ）の値と制御レジスタＣＲ２（ＰＣ）の値を待避・保持するためのレジスタである。
【００３３】
制御レジスタＣＲ４はリングバッファモード時のリングバッファ制御情報（ＲＢＣ）を格納し、制御レジスタＣＲ５はリングバッファモードでの処理途中で例外や割り込みが検出された場合に、リングバッファの入出力ポインタを待避／復帰するためのリングバッファポインタＲＢＰを格納する。詳細は後述する。
【００３４】
制御レジスタＣＲ６，ＣＲ７は、モジュロ・アドレッシングを行うための制御レジスタである。制御レジスタＣＲ６は、モジュロ・スタート・アドレス（ＭＯＤＳ）を、制御レジスタＣＲ７は、モジュロ・エンド・アドレス（ＭＯＤＥ）を保持する。共に、最初と最終のデータ・ワード（１６ビット）・アドレスを保持する。インクリメントでモジュロアドレッシングを利用する場合には、制御レジスタＣＲ６（ＭＯＤＳ）に小さい方のアドレスが、制御レジスタＣＲ７（ＭＯＤＥ）に大きい方のアドレスがセットされ、インクリメントするレジスタ値が制御レジスタＣＲ７（ＭＯＤＥ）に保持されているアドレスと一致した場合、アドレスの更新値として制御レジスタＣＲ６（ＭＯＤＳ）に保持されている値が、レジスタに書き戻される。
【００３５】
制御レジスタＣＲ８は、単一命令リピート動作時のリピート・カウンタ（ＳＲＰＴＣ）を、リピート回数を示すカウント値として保持する。単一命令リピート中であっても割り込みを受け付けられるように、ユーザーが値を読み書きできるようになっている。
【００３６】
制御レジスタＣＲ９〜ＣＲ１１は、ブロックリピート関連のレジスタであり、リピート中であっても割り込みを受け付けられるように、ユーザーが値を読み書きできるようになっている。制御レジスタＣＲ９は、リピート・カウンタ（ＲＰＴＣ）を、リピート回数を示すカウント値をとして保持する。制御レジスタＣＲ１０は、リピート・ブロック・スタート・アドレス（ＲＰＴＳ）を、リピートを行うブロックの先頭の命令アドレスとして保持する。制御レジスタＣＲ１１は、リピート・ブロック・エンド・アドレス（ＲＰＴＥ）を、リピートを行うブロックの最後の命令のアドレスとして保持する。
【００３７】
図４は各々１６ビットの制御レジスタＣＲ１６〜ＣＲ２３を示す説明図である。制御レジスタＣＲ１６〜ＣＲ２３は、リングバッファモード時にＦＩＦＯバッファとして動作するバッファレジスタＢＲ０〜ＢＲ７として機能する。本実施の形態では、８本のレジスタをＧＲ０〜ＧＲ１５までの汎用レジスタとは独立に実装している。
【００３８】
命令ニーモニックで指定されるレジスタ番号Ｒ０〜Ｒ１５のレジスタの割り当てについて詳細に説明する（以降、命令ニーモニックで指定される論理レジスタをＲ０〜Ｒ１５と呼ぶ。）。制御レジスタＣＲ０（ＰＳＷ）のＲＭビット６８に“０”が指定されている場合、通常の汎用レジスタモードとして動作し、制御レジスタＣＲ０（ＰＳＷ）のＲＭビット６８に“１”が指定されている場合に、レジスタの一部がリングバッファとして動作する。
【００３９】
リングバッファモード時のレジスタ割り当て、及び、動作仕様について説明する。本実施の形態では、リングバッファは２もしくは４本の物理的なレジスタで構成され、後述する入出力ポインタの管理により、ＦＩＦＯバッファとしての機能が実現される。すなわち、本実施の形態では、データを実際に転送してＦＩＦＯバッファを実現しているわけではない。２本の物理的なレジスタでリングバッファを構成する場合には、１ビットの入出力ポインタで入出力制御が行われ、４本の物理的なレジスタでリングバッファを構成する場合には、２ビットの入出力ポインタで入出力制御が行われる。
【００４０】
入力ポインタは、対象となるレジスタへのロードを行うロード命令が実行されることにより、＋１もしくは＋２更新される。１つのリングバッファに１つのデータをロードするロード命令実行時には＋１更新され、１つのリングバッファに２つのデータを同時にロードするロード命令実行時には＋２更新される。出力ポインタは、後述するモード設定によりいくつかの更新制御方法を設定することが可能である。
【００４１】
各ポインタはリングバッファとして動作させるために、循環制御が行われる。例えば、４エントリ（入力ポインタの値“０”〜“３”で４エントリを識別）のリングバッファを使用している場合、入力ポインタの値が“３”の状態で１だけインクリメントすると、ポインタの更新後の値は“０”となり、入力ポインタの値が“２”の状態で２だけインクリメントすると、ポインタの更新後の値は“０”となる。また、入力ポインタの値が“３”の状態で２だけインクリメントすると、ポインタの更新後の値は“１”となる。この場合、ポインタが“３”のエントリ（レジスタ）とポインタが“０”のエントリ（レジスタ）にロードした値が書き込まれる。
【００４２】
図６は制御レジスタＣＲ４に格納されるリングバッファ制御情報（ＲＢＣ）の構成を示す説明図である。本実施の形態では、命令ニーモニックで指定される１６本の論理レジスタＲ０〜Ｒ１５のうちＲ０〜Ｒ３の４本のレジスタがリングバッファとして動作可能である特定論理レジスタとして機能する。
【００４３】
可変用物理レジスタ構成情報であるＲＢＣＮＦビット８０は、リングバッファの構成を指定するリングバッファ構成制御ビット（２ビット構成）である。本実施の形態では、３つの構成を選択的に指定できる。各構成の詳細説明は、後述する。
【００４４】
モード設定情報であるＳＴＭビット８１は、リングバッファとして動作しているレジスタの値をストアするストア命令処理時において、ストアするデータを選択するストアデータ選択モードビットである。ＳＴＭビット８１が“０”の場合ストアするデータをリングバッファを構成するバッファレジスタの出力ポインタが指し示すレジスタから読み出し（第２のモード指定）、“１”の場合ストアするデータを通常の汎用レジスタから読み出す（第１のモード指定）。
【００４５】
レジスタ選択情報であるＷＭビット８２は、命令の実行に伴うロード以外のレジスタへの書き込み時に、どのレジスタに値を書き込むかを選択するレジスタ値書き込み対象選択ビットである。ＷＭビット８２が“０”の場合、対応する汎用レジスタに値を書き込み（第１のレジスタ指定）、“１”の場合、汎用レジスタ、及び、リングバッファを構成するバッファの出力ポインタが指し示すレジスタの両方に値を書き込む（第２のレジスタ指定）。入力ポインタが指し示すレジスタではない。
【００４６】
特定論理レジスタ対応動作モード情報であるＲＢＥ０ビット８３、ＲＢＥ１ビット８５、ＲＢＥ２ビット８７、ＲＢＥ３ビット８９のは、リングバッファイネーブル制御ビットである。リングバッファとして動作可能な論理レジスタＲ０〜Ｒ３の４本の各レジスタ毎にリングバッファとして動作（物理レジスタ可変動作）を実行するか、汎用レジスタとして動作（物理レジスタ固定動作）を実行するかを制御できる。ＲＢＥ０〜ＲＢＥ３ビット８３，８５，８７，８９は各々論理レジスタＲ０，Ｒ１，Ｒ２，Ｒ３のレジスタに対応し、“０”の場合通常の汎用レジスタとして動作し、“１”の場合リングバッファとして動作することを示す。すなわち、リングバッファモード（制御レジスタＣＲ０（ＰＳＷ）のＲＭビット６８が“１”）であり、ＲＢＣＮＦビット８０により指定された構成でリングバッファとして動作が可能なレジスタも、プログラムの都合によりリングバッファとして動作させるか、通常の汎用レジスタとして動作させるかをレジスタ毎に指定できる。
【００４７】
出力ポインタ更新モード情報であるＯＰＭ０〜ＯＰＭ３ビット８４，８６，８８，９０は、リングバッファの出力ポインタ更新モードビット（２ビット構成）である。本実施の形態では、リングバッファとして動作可能な論理レジスタＲ０〜Ｒ３の４本の各レジスタ毎に４種類のポインタ更新方法の指定が可能である。ＯＰＭ０〜ＯＰＭ３は各々Ｒ０〜Ｒ３のレジスタに対してポインタ更新方法を指定する。以降説明を簡単にするため、ＯＰＭ０〜ＯＰＭ３ビット８４，８６，８８，９０をＯＰＭｉビットと総称して呼ぶ。
【００４８】
ＯＰＭｉビットが“００”の場合、リングバッファの出力ポインタ更新命令が実行されたことにより明示的に出力ポインタの更新が指定された場合のみ、命令により指定された出力ポインタを＋１だけ更新する。出力ポインタ更新命令についての詳細は、後述する。
【００４９】
ＯＰＭｉビットが“０１”の場合、命令の実行によりレジスタ値が参照されたことにより参照されたレジスタのポインタが自動的に＋１更新される。
【００５０】
ＯＰＭｉビットが“１０”の場合は、ブロックリピート処理中のリピートブロックの最終命令実行時に自動的にリングバッファとして動作しているレジスタの出力ポインタが＋１更新される。
【００５１】
ＯＰＭｉビットが“１１”の場合は、分岐命令実行時に自動的にリングバッファとして動作しているレジスタの出力ポインタが＋１更新される。
【００５２】
なお、ＯＰＭｉビットが“０１”、“１０”、もしくは、“１１”の場合も、出力ポインタ更新命令によるポインタの更新は行われる。
【００５３】
図７は制御レジスタＣＲ５に格納されるリングバッファポインタ（ＲＢＰ）の構成を示す説明図である。ＢＩＰ０〜ＢＩＰ３ビット９１，９３，９５，９７は各々論理レジスタＲ０〜Ｒ３に対応するリングバッファの入力ポインタを示すビット（２ビット構成）、ＢＯＰ０〜ＢＯＰ３ビット９２，９４，９６，９８は各々論理レジスタＲ０〜Ｒ３に対応するリングバッファの出力ポインタを示すビット（２ビット構成）である。例外や割り込み時の待避、復帰のために、命令で参照、更新できるようになっている。それ以外は、参照したり更新する必要はない。各ビット９１〜９８は２ビットで構成されているが、物理的なレジスタ２本でリングバッファが構成される場合には、各ポインタ値は“０”と“１”しかとりえない。
【００５４】
図８は汎用レジスタモードにおける論理レジスタ構成を示す説明図である。汎用レジスタモードでは、図８に示すように、命令ニーモニックで指定される論理レジスタ番号Ｒ０〜Ｒ１５が、各々汎用レジスタＧＲ０〜ＧＲ１５に１対１に対応する。このように、複数の可変用物理レジスタ（バッファレジスタＢＲ０〜ＢＲ７等）と対応づけ可能な特定論理レジスタＲ０〜Ｒ３に対しても一の固定用物理レジスタ（汎用レジスタＧＲ０〜ＧＲ３）が対応づけられる。
【００５５】
リングバッファモード時にはＲＢＣＮＦビット８０の指定により３通りのバッファ構成が選択できる  図９はリングバッファモード時における論理レジスタ構成（その１）を示す説明図である。
【００５６】
図９は、制御レジスタＣＲ４に格納されるＲＢＣにおいて、ＲＢＣＮＦビット８０が“００”であり、かつ、ＳＴＭビット８１が“０”、ＷＭビット８２が“０”、ＲＢＥ０ビット８３及びＲＢＥ１ビット８５１が“１”の場合の構成を示している。図９において、Ｒ０［０］”の[]内はポインタの値を示す。論理レジスタＲ０、Ｒ１が特定論理レジスタとして各々４エントリのリングバッファ構成となる。したがって、入力ポインタ及び出力ポインタの上限値は“３”となる。
【００５７】
同図に示すように、ロード／参照時において、論理レジスタＲ０に対応づけられて４つの可変用物理レジスタであるバッファレジスタＢＲ０，ＢＲ４，ＢＲ２，ＢＲ６により指定対象物理レジスタ群が決定する。上記指定対象物理レジスタ群において、ＦＩＦＯ方式であるＢＲ０，ＢＲ４，ＢＲ２，ＢＲ６の順で順次指定され、バッファレジスタＢＲ６の指定後はバッファレジスタＢＲ０に指定を戻すループ構成を採用している。一方、書き込み時（ロード命令以外のデータ更新時）において、論理レジスタＲ０に対応して一の固定用物理レジスタである汎用レジスタＧＲ０が対応付けられる。
【００５８】
同様にして、ロード／参照時において、論理レジスタＲ１に対応づけられて４つの可変用物理レジスタであるバッファレジスタＢＲ１，ＢＲ５，ＢＲ３，ＢＲ７により指定対象物理レジスタ群が決定する。一方、書き込み時において、論理レジスタＲ１に対応して一の固定用物理レジスタである汎用レジスタＧＲ１が対応付けられる。
【００５９】
また、論理レジスタＲ２〜Ｒ１５に対応しては、常時汎用レジスタＧＲ２〜ＧＲ１５が対応付けられる。
【００６０】
入出力ポインタは、各々２ビットとして管理される。この場合、論理レジスタＲ２、Ｒ３はリングバッファモードでは動作できないため、ＲＢＥ２ビット８７，ＲＢＥ３ビット８９は“１”に設定してはならない。
【００６１】
図１０はリングバッファモード時における論理レジスタ構成（その２）を示す説明図である。
【００６２】
図１０は、ＲＢＣにおいて、ＲＢＣＮＦビット８０が“０１”であり、かつ、ＳＴＭビット８１が“０”、ＷＭビット８２が“０”、ＲＢＥ０〜ＲＢＥ３ビット８３，８５，８７，８９が“１”の場合の構成を示している。
【００６３】
図１０に示すように、論理レジスタＲ０〜Ｒ３のレジスタが特定論理レジスタとして各々２エントリのリングバッファ構成となる。入出力ポインタは、各々１ビットとして管理される。すなわち、入力ポインタ及び出力ポインタの上限値は“１”となる。
【００６４】
同図に示すように、ロード／参照時において、論理レジスタＲ０に対応づけられて２つの可変用物理レジスタであるバッファレジスタＢＲ０，ＢＲ４により指定対象物理レジスタ群が決定する。上記指定対象物理レジスタ群において、ＦＩＦＯ方式であるＢＲ０，ＢＲ４の順で順次指定され、バッファレジスタＢＲ４の指定後はバッファレジスタＢＲ０に指定を戻すループ構成を採用している。一方、書き込み時において、論理レジスタＲ０に対応して一の固定用物理レジスタである汎用レジスタＧＲ０が対応付けられる。
【００６５】
同様にして、ロード／参照時において、論理レジスタＲ１に対応づけられて２つの可変用物理レジスタであるバッファレジスタＢＲ１，ＢＲ５により指定対象物理レジスタ群が決定し、書き込み時において、論理レジスタＲ１に対応して一の固定用物理レジスタである汎用レジスタＧＲ１が対応付けられる。
【００６６】
同様にして、ロード／参照時において、論理レジスタＲ２に対応づけられて２つの可変用物理レジスタであるバッファレジスタＢＲ２，ＢＲ６により指定対象物理レジスタ群が決定し、書き込み時において、論理レジスタＲ２に対応して一の固定用物理レジスタである汎用レジスタＧＲ２が対応付けられる。
【００６７】
同様にして、ロード／参照時において、論理レジスタＲ３に対応づけられて２つの可変用物理レジスタであるバッファレジスタＢＲ３，ＢＲ７により指定対象物理レジスタ群が決定し、書き込み時において、論理レジスタＲ３に対応して一の固定用物理レジスタである汎用レジスタＧＲ３が対応付けられる。
【００６８】
また、論理レジスタＲ４〜Ｒ１５に対応しては、常時汎用レジスタＧＲ４〜ＧＲ１５が対応付けられる。
【００６９】
図１１はリングバッファモード時における論理レジスタ構成（その３）を示す説明図である。
【００７０】
図１１は、ＲＢＣにおいて、ＲＢＣＮＦビット８０が“１０”であり、かつ、ＳＴＭビット８１が“０”、ＷＭビット８２が“０”、ＲＢＥ０〜ＲＢＥ３ビット８３，８５，８７，８９が“１”の場合の構成を示している。
【００７１】
図１１に示すように、論理レジスタＲ０〜Ｒ３のレジスタが特定論理レジスタとして各々４エントリのリングバッファとなる。したがって、入力ポインタ及び出力ポインタの上限値は“３”となる。
【００７２】
同図に示すように、ロード／参照時において、論理レジスタＲ０に対応づけられて４つの可変用物理レジスタであるバッファレジスタＢＲ０，ＢＲ４及び汎用レジスタＧＲ０，ＧＲ４により指定対象物理レジスタ群が決定する。上記指定対象物理レジスタ群において、ＦＩＦＯ方式であるＢＲ０，ＢＲ４，ＧＲ０，ＧＲ４の順で順次指定され、汎用レジスタＧＲ４の指定後はバッファレジスタＢＲ０に指定を戻すループ構成を採用している。一方、書き込み時において、論理レジスタＲ０に対応する物理レジスタは存在しない。
【００７３】
同様にして、ロード／参照時において、論理レジスタＲ１に対応づけられて４つの可変用物理レジスタであるバッファレジスタＢＲ１，ＢＲ５及び汎用レジスタＧＲ１，ＧＲ５により指定対象物理レジスタ群が決定する。
【００７４】
同様にして、ロード／参照時において、論理レジスタＲ２に対応づけられて４つの可変用物理レジスタであるバッファレジスタＢＲ２，ＢＲ６及び汎用レジスタＧＲ２，ＧＲ５により指定対象物理レジスタ群が決定する。
【００７５】
同様にして、ロード／参照時において、論理レジスタＲ３に対応づけられて４つの可変用物理レジスタであるバッファレジスタＢＲ３，ＢＲ７及び汎用レジスタＧＲ３，ＧＲ７により指定対象物理レジスタ群が決定する。
【００７６】
また、論理レジスタＲ８〜Ｒ１５に対応しては、常時汎用レジスタＧＲ８〜ＧＲ１５が対応付けられる。
【００７７】
入出力ポインタは、各々２ビットとして管理される。この場合、リングバッファを構成するために１６本のレジスタが必要となるが、本実施の形態ではハードウェア量削減のため８本だけしかバッファレジスタを実装していないため、８本の汎用レジスタＧＲ０〜ＧＲ７もバッファレジスタの構成要素として使用される。このモードで動作する場合論理レジスタＲ４〜Ｒ７は使用不可であり、リングバッファモードで動作した後の論理レジスタＲ０〜Ｒ７の値は保証されない。このモードでの処理前後で汎用レジスタＧＲ０〜ＧＲ７のレジスタ値を保持しておく必要がある場合には、レジスタ値の待避／復帰を行う必要がある。また、このモードでの処理中に論理レジスタＲ０〜Ｒ７に対してプログラムで書き込みを行ってはいけない。
【００７８】
ＲＢＣＮＦビット８０が“００”の場合には、論理レジスタＲ０，Ｒ１へのロード命令によって値が更新されず、元の値を保持し、“０１”の場合には、論理レジスタＲ０〜Ｒ３へのロード命令によって値が更新されず、元の値を保持する。従って、命令で論理レジスタＲ０，Ｒ１（Ｒ２，Ｒ３）に対してロード以外の書き込みを行わない場合には、論理レジスタＲ０，Ｒ１（Ｒ２，Ｒ３）の処理前後の待避、復帰は不要である。なお、リングバッファモード時の処理例については後ほど詳述する。
【００７９】
本データ処理装置は２ウェイのＶＬＩＷ（Very Long Instruction Word）命令セットを処理する。図１２は、本データ処理装置の命令フォーマットを示す説明図である。同図に示すように、基本命令長は３２ビット固定であり、３２ビット境界に整置されている。各３２ビットの命令コードは、命令のフォーマットを示す２ビットのフォーマット指定ビット（ＦＭビット）１０１と、１５ビットの左コンテナ１０２と右コンテナ１０３から構成される。各コンテナ１０２、１０３はそれぞれ１５ビットからなるショートフォーマットのサブ命令を格納できるほか、２つで１つの３０ビットのロングフォーマットのサブ命令を格納できる。今後、簡単のため、ショートフォーマットのサブ命令をショート命令、ロングフォーマットのサブ命令をロング命令と呼ぶ。
【００８０】
図１３はＦＭビット１０１のフォーマット及び実行順序指定の詳細を示す説明図である。ＦＭビット１０１は命令のフォーマット及び２つのショート命令の実行順序を指定する。図１３に示すように、命令実行順序において、「第１」は先に実行される命令を、「第２」は後で実行される命令であることを示す。ＦＭビット１０１が“１１”の場合は、コンテナ１０２、１０３の３０ビットで１つのロング命令を保持することを示し、それ以外の場合は各コンテナ１０２、１０３がそれぞれショート命令を保持することを示す。さらに、２つのショート命令を保持する場合、ＦＭビット１０１で実行順序を指定する。“００”のときは、２つのショート命令を並列に実行することを示す。“０１”のときは、左コンテナ１０２に保持されているショート命令を実行した後に、右コンテナ１０３に保持されているショート命令を実行することを示す。“１０”のときは、右コンテナ１０３に保持されているショート命令を実行した後に、左コンテナ１０２に保持されているショート命令を実行することを示す。このように、シーケンシャルに実行する２つのショート命令も含めて１つの３２ビット命令にエンコード出来るようにして、コード効率の向上を図っている。
【００８１】
図１４〜図１７は典型的な命令のビット割り付けの例を示す説明図である。図１４は２つのオペランドを持つショート命令のビット割り付けを示す。フィールド１１１，１１４は、オペレーションコードフィールドである。フィールド１１４は、アキュムレータ番号を指定する場合もある。フィールド１１２，１１３はオペランドとして参照あるいは更新されるデータの格納位置を、レジスタ番号やアキュムレータ番号で指定する。フィールド１１３は、４ビットの小さな即値を指定する場合もある。
【００８２】
図１５は、ショートフォーマットの分岐命令の割り付けを示しており、オペレーションコードフィールド１２１と８ビットの分岐変位フィールド１２２からなる。分岐変位は、ＰＣ値と同様、命令ワード（３２ビット）のオフセットで指定される。
【００８３】
図１６は、１６ビットの変位や即値を持つ３オペランド命令やロード／ストア命令のフォーマットを示しており、オペレーションコードフィールド１３１、ショートフォーマットと同様レジスタ番号等を指定するフィールド１３２、１３３、と１６ビットの変位や即値等を指定する拡張データフィールド１３４からなる。
【００８４】
図１７は、右コンテナ１０３側にオペレーションコードを持つロングフォーマットの命令のフォーマットを示しており、２ビットのフィールド１４１が“０１”になっている。フィールド１４３，１４６はオペレーションコードフィールドであり、フィールド１４４，１４５はレジスタ番号等を指定するフィールドである。フィールド１４２は予約フィールドであり必要に応じてオペレーションコードやレジスタ番号等の指定に使用される。
【００８５】
上述以外に、ＮＯＰ（ノー・オペレーション）のように、１５ビットすべてがオペレーションコードとなる命令や、１オペランド命令等、特殊な命令のビット割り付けを持つものもある。
【００８６】
本データ処理装置の各サブ命令は、ＲＩＳＣライクな命令セットとなっている。メモリデータのアクセスを行う命令はロード／ストア命令のみであり、演算命令はレジスタ／アキュムレータ中のオペランドや即値オペランドに対して演算を行う。オペランドデータのアドレッシングモードとしては、レジスタ間接モード、ポストインクリメント付きレジスタ間接モード、ポストデクリメント付きレジスタ間接モード、プッシュモード、レジスタ相対間接モードの５種類ある。各々のニーモニックは、”  Ｒｓｒｃ”、”  Ｒｓｒｃ＋”、”  Ｒｓｒｃ−”、”  −ＳＰ”、”  （ｄｉｓｐ１６、Ｒｓｒｃ）”で示される。Ｒｓｒｃはベースアドレスを指定するレジスタ番号を、ｄｉｓｐ１６は１６ビットの変位値を示す。オペランドのアドレスはバイトアドレスで指定される。
【００８７】
レジスタ相対間接モード以外のロード／ストア命令は、図１４に示す命令フォーマットとなる。フィールド１１３でベースレジスタ番号が指定され、フィールド１１２でメモリからロードしてきた値を書き込むレジスタの番号もしくはストアする値を保持するレジスタの番号が指定される。レジスタ間接モードは、ベースレジスタとして指定されたレジスタの値がオペランドアドレスとなる。ポストインクリメント付きレジスタ間接モードは、ベースレジスタとして指定されたレジスタの値がオペランドアドレスとなり、このベースレジスタの値がオペランドのサイズ（バイト数）分ポストインクリメントされて、書き戻される。ポストデクリメント付きレジスタ間接モードは、ベースレジスタとして指定されたレジスタの値がオペランドアドレスとなり、このベースレジスタの値がオペランドのサイズ（バイト数）分ポストデクリメントされて、書き戻される。プッシュモードは、ストア命令で、かつ、ベースレジスタがＲ１５の場合にのみ使用可能であり、スタックポインタ（ＳＰ）値がオペランドのサイズ（バイト数）分プリデクリメントされた値が、オペランドアドレスとなり、デクリメントされた値がＳＰに書き戻される。
【００８８】
レジスタ相対間接モードのロード／ストア命令は図１６に示す命令フォーマットとなる。フィールド１３３でベースレジスタ番号が指定され、フィールド１３２でメモリからロードしてきた値を書き込むレジスタの番号もしくはストアする値を保持するレジスタの番号が指定される。フィールド１３４はオペランド格納位置のベースアドレスからの変位値を指定する。レジスタ相対間接モードは、ベースレジスタとして指定されたレジスタの値に１６ビットの変位値を加算した値がオペランドアドレスとなる。
【００８９】
ポストインクリメント付きレジスタ間接モードとポストデクリメント付きレジスタ間接モードでは、制御レジスタＣＲ０（ＰＳＷ）中のＭＤビット６５を“１”にする事により、モジュロアドレッシングモードが使用できる。
【００９０】
ジャンプ命令のジャンプ先アドレス指定には、ジャンプ先アドレスをレジスタ値で指定するレジスタ間接モードと、ジャンプ命令のＰＣからの分岐変位で指定するＰＣ相対間接モードとがある。ＰＣ相対間接モードについては、分岐変位を８ビットで指定するショートフォーマットと、分岐変位を１６ビットで指定するロングフォーマットの２種類ある。また、オーバーヘッドなしにループ処理を実現するリピート機能を起動するためのブロックリピート命令も備える。
【００９１】
図１８は本実施の形態のデータ処理装置２００の機能ブロック構成を示すブロック図である。データ処理装置２００は、ＭＰＵコア部２０１、ＭＰＵコア部２０１からの要求により命令データのアクセスを行う命令フェッチ部２０２、内蔵命令メモリ２０３、ＭＰＵコア部２０１からの要求によりオペランドデータのアクセスを行うオペランドアクセス部２０４、内蔵データメモリ２０５、命令フェッチ部２０２とオペランドアクセス部２０４からの要求を調停し、データ処理装置２００の外部のメモリアクセスを行う外部バスインターフェイス部２０６からなる。
【００９２】
ＭＰＵコア部２０１は、制御部２１１、レジスタファイル２２１、第１演算部２２２、第２演算部２２３、ＰＣ部２２４からなる。
【００９３】
命令フェッチ部２０２はＰＣ部２２４より命令アドレスＩＡを受け、内蔵命令メモリ２０３もしくは外部バスインターフェイス部２０６に対し命令アドレスＩＡを出力する。また、命令フェッチ部２０２は内蔵命令メモリ２０３と命令データＩＤの授受を行い、外部バスインターフェイス部２０６より命令データＩＤを受け、命令キュー２１２に命令データＩＤを出力する。
【００９４】
オペランドアクセス部２０４は第１演算部２２２よりオペランドアドレスＯＡを受け、内蔵データメモリ２０５や外部バスインターフェイス部２０６に対しオペランドアドレスＯＡを出力する。また、オペランドアクセス部２０４は、レジスタファイル２２１，第１演算部２２２、内蔵データメモリ２０５、及び外部バスインターフェイス部２０６それぞれに対しオペランドデータＯＤの授受を行う。
【００９５】
制御部２１１は、パイプライン処理制御、命令の実行制御、命令フェッチ部２０２やオペランドアクセス部２０４とのインターフェイス制御など、ＭＰＵコア部２０１のすべての制御を行う。
【００９６】
制御部２１１内の命令キュー２１２は、２エントリの３２ビット命令バッファと有効ビット、及び入出力ポインタ等からなり、ＦＩＦＯ（先入れ先出し）方式で制御される。命令フェッチ部２０２でフェッチされた命令データを一時保持し、命令デコード部２１３に送る。
【００９７】
命令デコード部２１３は、主として２つのデコーダを含み、命令キュー２１２から送られる命令コードをデコードする。第１デコーダ２１４は、第１演算部２２２で実行する命令をデコードし、第２デコーダ２１５は、第２演算部２２３で実行する命令をデコードする。３２ビットの命令のデコードの第１サイクルでは、必ず左コンテナ１０２の命令コードが第１デコーダ２１４で解析され、右コンテナ１０３の命令コードが第２デコーダ２１５で解析される。ただし、ＦＭビット１０１及び左コンテナのビット０とビット１のデータは両方のデコーダで解析される。また、拡張データの切り出しを行うために、右コンテナ１０３のデータが第１デコーダ２１４に送られるが、解析は行われない。従って、最初に実行する命令はその命令を実行する演算器に対応した位置に置かれなければならない。２つのショート命令をシーケンシャルに実行する場合、先行して実行される命令のデコード中に後で実行する側の命令が図示していないプリデコーダでデコードされ、どちらのデコーダでデコードすべきかを判定する。先行する命令のデコード後、後で実行する命令の命令コードが選択されたデコーダに取り込まれ、解析される。後で実行される命令がどちらのデコーダでも処理できる命令の場合は第１デコーダ２１４でデコードする。
【００９８】
図１９はレジスタファイル２２１の内部構成の詳細を示すブロック図である。同図に示すように、レジスタファイル２２１は、汎用レジスタＧＲ０〜ＧＲ１５が格納する汎用レジスタ値、及び、バッファレジスタＢＲ０〜ＢＲ７のバッファレジスタ値を物理的に保持するレジスタからなり、第１演算部２２２、第２演算部２２３、ＰＣ部２２４、オペランドアクセス部２０４に対し複数のバス（Ｓ１バス２５１〜Ｓ７バス２５７，ＯＤバス２７１、Ｗバス２７２、Ｄ１バス２６１，Ｄ２バス２６２）で結合されている。
【００９９】
図２０は第１演算部２２２の内部構成の詳細を示すブロック図である。同図に示すように、第１演算部２２２は、レジスタファイル２２１と、各々Ｓ１バス２５１、Ｓ２バス２５２、Ｓ３バス２５３で結合されており、この３つのバス２５１〜２５３でレジスタファイル２２１から対応のレジスタに格納されたデータを読み出し、演算器等にリードオペランドとなるデータやストアデータを転送する。Ｓ１バス２５１、Ｓ２バス２５２は各々３２ビットバスであり、それぞれレジスタペアの２ワードを並列に転送することもできる。Ｓ３バス２５３は１６ビットバスである。
【０１００】
また、第１演算部２２２は、レジスタファイル２２１と、３２ビット幅のＤ１バス２６１、１６ビット幅のＷバス２７２で結合されており、Ｄ１バス２６１で演算結果や転送データを、Ｗバス２７２でロードしたバイトデータをレジスタファイル２２１に転送する。３２ビット幅のＤ１バス２６１でレジスタペアの２ワードを並列に転送することもできる。さらに、第１演算部２２２、及び、レジスタファイル２２１は、オペランドアクセス部２０４と６４ビットのＯＤバス２７１で結合されており、１バイト、１ワード、２ワード、もしくは、４ワードのデータを転送することが可能である。
【０１０１】
ＡＡラッチ３０２、ＡＢラッチ３０３は、ＡＬＵ３０１の入力ラッチである。ＡＡラッチ３０２は、Ｓ１バス２５１もしくはＳ３バス２５３を介して読み出されたレジスタ値を取り込む。ＡＡラッチ３０２はゼロクリアする機能も備えている。ＡＢラッチ３０３は、Ｓ３バス２５３を介して読み出されたレジスタ値もしくは第１デコーダ２１４でデコードの結果生成された１６ビットの即値を取り込む。ＡＢラッチ３０３はゼロクリアする機能も備えている。
【０１０２】
ＡＬＵ３０１では、主として比較、算術論理演算、オペランドアドレスの計算／転送、オペランドアドレス値のインクリメント／デクリメント、ジャンプ先アドレスの計算／転送等が行われる。演算結果やアドレスモディファイの結果はセレクタ３０５、Ｄ１バス２６１を介して、レジスタファイル２２１中の命令で指定されたレジスタに書き戻される。ＯＡラッチ３０６は、オペランドのアドレスを保持するラッチであり、ＡＬＵ３０１でのアドレス計算結果もしくはＡＡラッチ３０２に保持されたベースアドレスの値を選択的に保持し、ＯＡバス２７３を介してオペランドアクセス部２０４に出力する。また、ジャンプ先アドレスやリピートブロックエンドアドレスなどを計算した場合には、ＡＬＵ３０１の出力が、ＪＡバス２７４を介してＰＣ部２２４に転送される。ラッチ３０４は、制御レジスタ値や汎用レジスタ値の転送時に転送する値を保持するラッチであり、Ｓ１バス２５１もしくはＳ３バス２５３を介して転送された値をセレクタ３０５に出力する。転送時にはラッチ３０４の値が、Ｄ１バス２６１を介して、レジスタファイル２２１中の命令で指定されたレジスタや、第１演算部２２２もしくはＰＣ部２２４内の制御レジスタに書き込まれる。
【０１０３】
ＭＯＤＳレジスタ３０７とＭＯＤＥレジスタ３０９は、それぞれ図３の制御レジスタＣＲ６、制御レジスタＣＲ７に相当する制御レジスタの値を物理的に保持するレジスタである。比較器３１０は、ＭＯＤＥレジスタ３０９の値とＳ３バス２５３上のベースアドレスの値とを比較する。ＭＯＤＳレジスタ３０７は、ラッチ３０８を介してセレクタ３０５に結合されている。ＭＯＤＳレジスタ３０７とＭＯＤＥレジスタ３０９は各々、Ｓ３バス２５３への出力経路、及び、Ｄ１バス２６１からの入力経路を備える。
【０１０４】
ストアデータ（ＳＤ）レジスタ３１１は、６４ビットのレジスタであり、Ｓ１バス２５１もしくはＳ２バス２５２の一方、もしくは、Ｓ１バス２５１とＳ２バス２５２の両方に出力されたストアデータを一時保持する。ＳＤレジスタ３１１に保持されたデータは、ラッチ３１２を介して整置回路３１３に転送される。整置回路３１３では、オペランドのアドレスに従ってストアデータが６４ビット境界に整置され、整置後のストアデータがラッチ３１４、ＯＤバス２７１を介してオペランドアクセス部２０４に出力される。
【０１０５】
また、オペランドアクセス部２０４でロードされたバイトデータは、ＯＤバス２７１を介して、１６ビットのロードデータ（ＬＤ）レジスタ３１５に取り込まれる。ＬＤレジスタ３１５の値は、整置回路３１６に転送される。整置回路３１６では、バイト整置及びバイトデータのゼロ／符号拡張を行う。整置、拡張後のデータが、ラッチ３１７、Ｗバス２７２を介してレジスタファイル２２１中の指定されたレジスタに書き込まれる。１ワード（１６ビット）、２ワード（３２ビット）、あるいは４ワード（６４ビット）ロードの場合には、ＬＤレジスタ３１５を介さず、ＯＤバス２７１からレジスタファイル２２１にロードした値が直接書き込まれる。
【０１０６】
制御部２１１中のＰＳＷ部２６０は図３の制御レジスタＣＲ０（ＰＳＷ）の値を物理的に保持するラッチや、ＰＳＷ更新回路等からなり、演算結果や命令の実行によりＰＳＷの値を更新する。また、制御部２１１中のリングバッファ制御部２５０は図３の制御レジスタＣＲ４（ＲＢＣ）や制御レジスタＣＲ５（ＲＢＰ）の値を物理的に保持するラッチや、入出力ポインタ更新回路等からなり、命令の実行によりＲＢＣやＲＢＰの値を更新する。制御部２１１中の制御レジスタに値を転送する場合、Ｓ３バス２５３に出力されたデータがＣＮＴＩＦラッチ３２１を介して、ＰＳＷ部２６０やリングバッファ制御部２５０に転送される。また、制御部２１１中の制御レジスタの値を読み出す場合には、ＰＳＷ部２６０やリングバッファ制御部２５０から読み出し対象となる制御レジスタの値がＤ１バス２６１に出力され、レジスタファイル２２１に書き込まれる。ＢＰＳＷレジスタ３２２は図３の制御レジスタＣＲ１の値を物理的に保持するレジスタである。例外処理等の起動にともなうＰＳＷ値の待避時には、Ｄ１バス２６１に出力された制御レジスタＣＲ０（ＰＳＷ）の値がＢＰＳＷレジスタ３２２に書き込まれる。例外処理等からの復帰時には、ＢＰＳＷ１６８の値は、直接ＣＮＴＩＦラッチ３２１を介して、ＰＳＷ部２６０に転送される。また、ＢＰＳＷレジスタ３２２はＳ３バス２５３への出力経路、及び、Ｄ１バス２６１からの入力経路を備える。
【０１０７】
ＳＲＰＴＣラッチ３２３は図３の制御レジスタＣＲ８（ＳＲＰＴＣ）の値を物理的に保持するラッチである。単一命令のリピート命令実行によるＳＲＰＴＣラッチ３２３の初期値設定時には、ラッチ３２４は、Ｓ３バス２５３を介して読み出されたレジスタ値もしくは第１デコーダ２１４でデコードの結果生成された即値を取り込み、ＳＲＰＴＣラッチ３２３はラッチ３２４の値を取り込む。ＳＲＰＴＣラッチ３２３の値は、単一命令リピート処理中、１命令の実行が完了するたびに、デクリメンタ３２６、ラッチ３２４を介してデクリメントされる。１検出回路（ＯＮＥ）３２５は、１を検出する回路であり、次命令実行後単一命令リピート処理が終了することを制御部２１１に通知する。また、ＳＲＰＴＣラッチ３２３はＳ３バス２５３への出力経路、及び、Ｄ１バス２６１からの入力経路を備える。
【０１０８】
図２１はＰＣ部２２４の内部構成の詳細を示すブロック図である。同図に示すように、命令アドレス（ＩＡ）レジスタ３３７は、次にフェッチする命令のアドレスを保持し、次にフェッチする命令のアドレスを命令フェッチ部２０２に出力する。引き続き後続の命令をフェッチする場合には、ＩＡレジスタ３３７からラッチ３３８を介して転送されたアドレス値がインクリメンタ３３９で１インクリメントされて、ＩＡレジスタ３３７に書き戻される。ジャンプやブロックリピート等によりシーケンスが切り替わる場合には、ＩＡレジスタ３３７はＪＡバス２７４を介して転送されるジャンプ先アドレスや、リピートブロックスタートアドレスを取り込む。
【０１０９】
ＲＰＴＳレジスタ３４１、ＲＰＴＥレジスタ３４３、ＲＰＴＣレジスタ３４５はブロックリピート制御用の制御レジスタであり、それぞれ図３の制御レジスタＣＲ１０、制御レジスタＣＲ１１、制御レジスタＣＲ９に対応する値を物理的に保持する。ＲＰＴＳレジスタ３４１、ＲＰＴＥレジスタ３４３、ＲＰＴＣレジスタ３４５は、Ｄ１バス２６１からの入力ポートとＳ３バス２５３への出力ポートを持ち、必要に応じてブロックリピート時の初期設定や待避、復帰が行なわれる。
【０１１０】
ＲＰＴＳレジスタ３４１はリピートブロックの開始命令アドレスを保持する。ＲＰＴＳレジスタ３４１は初期設定直後には、ラッチ３４２も更新される。ブロックリピート処理中で、リピートブロックの先頭命令に戻る場合は、ラッチ３４２の値が、ＪＡバス２７４を介して、ＩＡレジスタ３３７に転送される。
【０１１１】
ＲＰＴＥレジスタ３４３はリピートブロックの最終命令のアドレスを保持する。この最終アドレスは、ブロックリピート命令処理時に第１演算部２２２で計算され、ＪＡバス２７４を介してＲＰＴＥレジスタ３４３に取り込まれる。比較器３４４は、ＲＰＴＥレジスタ３４３の値と、命令フェッチアドレスを保持しているＩＡレジスタ３３７の値とを比較し、一致情報を制御部２１１へ出力する。
【０１１２】
ＲＰＴＣレジスタ３４５、ＴＲＰＴＣレジスタ３４８は、リピートブロックの実行回数を管理するためのカウント値を保持する。ＴＲＰＴＣレジスタ３４８は、パイプライン処理における命令フェッチ段階での先行更新情報を保持する。ＴＲＰＴＣレジスタ３４８はＤ１バス２６１からの入力ポートを備えており、ＲＰＴＣレジスタ３４５の初期設定時に、同時に初期化される。リピートブロック最終命令のフェッチを行った場合、ＴＲＰＴＣレジスタ３４８の値がラッチ３５０を介してデクリメンタ３５１に転送され、デクリメントされてＴＲＰＴＣレジスタ３４８に書き戻される。１検出回路（ＯＮＥ）３４９は、ＴＲＰＴＣレジスタ３４８が“１”である事を検出し、検出結果を制御部２１１へ出力する。ＲＰＴＣレジスタ３４５は、マスタとなる実行段階でのカウント値を保持する。リピートブロック最終命令が実行されると、ＲＰＴＣレジスタ３４５の値がラッチ３４６を介してデクリメンタ３４７に転送され、デクリメントされてＲＰＴＣレジスタ３４５に書き戻される。また、ジャンプが起こった場合にＴＲＰＴＣレジスタ３４８の値を初期化するために、ＲＰＴＣレジスタ３４５から、ラッチ３５２を介し、ＴＲＰＴＣレジスタ３４８へ転送する経路がある。
【０１１３】
実行ステージＰＣ（ＥＰＣ）レジスタ３３４は実行中の命令のＰＣ値を保持し、次命令ＰＣ（ＮＰＣ）レジスタ３３１は次に実行する命令のＰＣ値を保持する。ＮＰＣレジスタ３３１は、実行段階でジャンプが起こった場合、ＪＡバス２７４上のジャンプ先アドレス値を取り込む。リピートブロックの処理を繰り返す場合には、ラッチ３４２からリピートを行うブロックの先頭アドレスを取り込む。処理シーケンスの変更なく命令の実行が進むの場合には、１命令の実行が終了する毎にラッチ３３２を介して転送されたＮＰＣレジスタ３３１の値が、インクリメンタ３３３でインクリメントされ、ＮＰＣレジスタ３３１に書き戻される。サブルーチンジャンプ命令の場合には、ラッチ３３２の値が戻り先アドレスとしてＤ１バス２６１に出力され、レジスタファイル２２１中のリンクレジスタとして定義されている論理レジスタＲ１４に書き込まれる。次に実行する命令のＰＣを参照する場合には、ＮＰＣレジスタ３３１の値がＳ３バス２５３に出力され、第１演算部２２２に転送される。また、次の命令が実行状態に入る場合には、ラッチ３３２の値がＥＰＣレジスタ３３４に転送される。実行中の命令のＰＣ値を参照する場合には、ＥＰＣレジスタ３３４の値がＳ３バス２５３に出力され、第１演算部２２２に転送される。ＢＰＣレジスタ３３６は、図３の制御レジスタＣＲ３に対応する値を物理的に保持する。例外や割り込み等が検出された場合には、ＥＰＣレジスタ３３４の値がラッチ３３５を介してＢＰＣレジスタ３３６に転送される。ＢＰＣレジスタ３３６は、Ｄ１バス２６１からの入力ポートとＳ３バス２５３への出力ポートを持ち、必要に応じて待避、復帰が行なわれる。
【０１１４】
図２２は第２演算部２２３の内部構成の詳細を示すブロック図である。第２演算部２２３は、レジスタファイル２２１と、各々１６ビット幅のＳ４バス２５４、Ｓ５バス２５５、Ｓ６バス２５６、Ｓ７バス２５７で結合されており、この４つのバスでレジスタファイル２２１内のレジスタからデータを読み出す。Ｓ４バス２５４、Ｓ５バス２５５でレジスタペアの２ワードを並列に転送することもできる。また、第２演算部２２３は、レジスタファイル２２１と、３２ビット幅のＤ２バス２６２で結合されており、演算結果をレジスタに書き込む。Ｄ２バス２６２でレジスタペアの２ワードを並列に転送することもできる。第２演算部２２３は、ＳＩＭＤ演算を行うために２セットの積和演算を行うための乗算器、及び、加算器を備えている。
【０１１５】
アキュムレータ３６１は、図２のアキュムレータＡ０，Ａ１の２本の５６ビットアキュムレータを物理的に保持する。アキュムレータ３６１は、ＳＡ１バス２８１とＳＡ２バス２８２への２つの読み出し経路と、ＤＡ１バス２８３とＤＡ２バス２８４の２つの書き込み経路がある。
【０１１６】
加算器３６２は５６ビットの３値加算器であり、ガードビットを含め５６ビットまでの加減算を行う。ＳＩＭＤ演算や倍精度演算のためのアキュムレータ値への２つの乗算結果の加算も可能である。１６ビット演算を行う場合には、ビット８からビット２３までの１６ビットが使用され、３２ビット演算を行う場合には、ビット８からビット３９までの３２ビットが使用される。
【０１１７】
Ａラッチ３６３、Ｂラッチ３６４、Ｃラッチ３６５は、加算器３６２の５６ビット入力ラッチである。Ａラッチ３６３は、Ｓ４バス２５４からレジスタ値をビット８からビット２３の位置に取り込むか、ＳＡ１バス２８１上のアキュムレータ値を取り込む。シフタ３６６は、ＳＡ２バス２８２上のアキュムレータ値を取り込み、左３ビットから右２ビットの任意のシフト量、もしくは、右１６ビットの算術シフトを行い、結果を出力する。Ｂラッチ３６４は、Ｓ５バス２５５からビット８からビット２３の位置に１６ビットのデータを取り込むか、Ｓ４バス２５４とＳ５バス２５５上の３２ビットのデータを符号拡張しビット０からビット３９の位置に取り込むか、シフタ３６６の出力、もしくは、乗算器の出力ラッチ（Ｐラッチ）３７９の値を取り込む。Ｃラッチ３６５は、シフタ３６７を介して乗算器の出力ラッチ（ＸＰラッチ）３９４の値をそのまま、もしくは、１６ビット算術右シフトして取り込む。Ａラッチ３６３、Ｂラッチ３６４、Ｃラッチ３６５は、各々ゼロクリアしたり定数の値に設定する機能も備えている。
【０１１８】
加算器３６２の出力は、サチュレーション回路３６８に出力される。サチュレーション回路３６８は、上位１６ビット、もしくは、上位下位あわせた３２ビットにする際に、ガードビットを見て、各々１６ビットもしくは３２ビットで表現できる最大値もしくは最小値にクリッピングする機能を備える。もちろんそのまま出力する機能もある。サチュレーション回路３６８の出力はマルチプレクサ３６９に結合されている。
【０１１９】
デスティネーションオペランドがアキュムレータの場合には、マルチプレクサ３６９の値がＤＡ１バス２８３を介して、アキュムレータ３６１に書き込まれる。デスティネーションオペランドがレジスタの場合は、マルチプレクサ３６９の値が、Ｄ２バス２６２を介して、レジスタファイル２２１に書き込まれる。また、転送命令、絶対値の計算、最大値設定命令や、最小値設定命令を実行するために、Ａラッチ３６３とＢラッチ３６４の出力が、マルチプレクサ３６９に結合されており、Ａラッチ３６３やＢラッチ３６４の値をアキュムレータ３６１やレジスタファイル２２１に転送することが可能である。
【０１２０】
プライオリティエンコーダ（ＰＥＮＣ）３７０は、Ｂラッチ３６４の値を取り込み、固定小数点フォーマットの数を正規化するのに必要なシフト量を計算し、レジスタファイル２２１へ書き戻すために結果をＤ２バス２６２に出力する。
【０１２１】
バレルシフタ３７１は、５６ビットもしくは１６ビットのデータに対して、左右３２ビットまでの算術／論理シフトが可能である。シフトデータは、ＳＡ１バス２８１上のアキュムレータ値もしくはＳ４バス２５４を介してレジスタの値がシフトデータ（ＳＤ）ラッチ３７３に取り込まれる。シフト量は、即値もしくはレジスタ値がＳ５バス２５５を介してシフト量（ＳＣ）ラッチ３７２に取り込まれる。バレルシフタ３７１はＳＤラッチ３７３のデータをＳＣラッチ３７２で指定されるシフト量だけ、オペレーションコードで指定されたシフトを行う。シフト結果は、サチュレーション回路３７４に出力され、必要に応じてサチュレーションが行われ、ＤＡ１バス２８３を介してアキュムレータ３６１に、もしくは、Ｄ２バス２６２を介してレジスタファイル２２１に書き戻される。
【０１２２】
算術論理演算部（ＡＬＵ）３８０は、１６ビットの算術論理演算、転送等を行う。ＬＡラッチ３８１、ＬＢラッチ３８２は、ＡＬＵ３８０の１６ビット入力ラッチであり、各々Ｓ４バス２５４、Ｓ５バス２５５に接続されている。ＡＬＵ３８０での演算結果は、Ｄ２バス２６２に出力される。積和演算との演算器の干渉を避けるため、１６ビットの算術演算は、加算器３６２ではなく、ＡＬＵ３８０で極力行うように制御している。
【０１２３】
Ｘラッチ３７７、Ｙラッチ３７８は乗算器３７６の入力レジスタであり、各々、Ｓ４バス２５４、Ｓ５バス２５５の１６ビットの値を取り込み、１７ビットにゼロ拡張もしくは符号拡張する機能を備える。乗算器３７６は、１７ビットｘ１７ビットの乗算器であり、Ｘラッチ３７７に格納された値とＹラッチ３７８に格納された値との乗算を行う。積和命令や積差命令の場合には、乗算結果はＰラッチ３７９に取り込まれ、Ｂラッチ３６４に送られる。乗算命令の場合、乗算結果はＤＡ１バス２８３を介してアキュムレータ３６１に、もしくは、Ｄ２バス２６２を介してレジスタファイル２２１に書き戻される。
【０１２４】
乗算器３９１、加算器３９５はＳＩＭＤ演算を行うために、乗算器３７６、加算器３６２と独立して動作可能な演算器である。
【０１２５】
ＸＸラッチ３９２、ＸＹラッチ３９３は乗算器３９１の入力レジスタであり、各々、Ｓ６バス２５６、Ｓ７バス２５７の１６ビットの値を取り込み、１７ビットにゼロ拡張もしくは符号拡張する機能を備える。乗算器３９１は、１７ビットｘ１７ビットの乗算器であり、ＸＸラッチ３９２に格納された値とＸＹラッチ３９３に格納された値との乗算を行う。積和命令や積差命令の場合には、乗算結果はＸＰラッチ３９４に取り込まれ、ＸＢラッチ３９７に送られる。また、同一のアキュムレータ値に２つの乗算結果を加算したり、倍精度演算を行う場合などのために、ＸＰラッチ３９４の出力はシフタ３６７にも接続されている。乗算命令の場合、乗算結果はＤＡ２バス２８４を介してアキュムレータ３６１に、もしくは、Ｄ２バス２６２を介してレジスタファイル２２１に書き戻される。アキュムレータ３６１に書き込む場合には、５６ビットのＬＳＭ側１６ビットにはゼロを書き込む。
【０１２６】
加算器３９５は、１６ビットもしくは４０ビットの加減算を行う。ＸＡラッチ３９６、ＸＢラッチ３９７は、加算器３９５の４０ビット入力ラッチである。ＸＡラッチ３９６は、Ｓ６バス２５６上の１６ビットの値をビット８〜２３に、もしくは、ＳＡ２バス上の上位４０ビットの値を取り込む。ＸＢラッチ３９７は、Ｓ７バス２５７上の１６ビットの値をビット８〜２３に、もしくは、ＸＰラッチ３９４の値を取り込む。加減算結果は、サチュレーション回路３９８に出力され、必要に応じてサチュレーションが行われ、ＤＡ２バス２８４を介してアキュムレータ３６１に、もしくは、Ｄ２バス２６２を介してレジスタファイル２２１に書き戻される。
【０１２７】
即値ラッチ３８３は、第２デコーダ２１５で生成された６ビットの即値を１６ビットに拡張して保持し、Ｓ５バス２５５を介して演算器に転送する。ビット操作命令のビットマスクもここで生成される。
【０１２８】
次に本実施の形態のデータ処理装置におけるパイプライン処理について説明する。図２３はパイプライン処理を示す説明図である。同図に示すように、本データ処理装置は、命令データのフェッチを行う命令フェッチ（ＩＦ）ステージ４０１、命令の解析を行う命令デコード（Ｄ）ステージ４０２、演算実行を行う命令実行（Ｅ）ステージ４０３、データメモリのアクセスを行うメモリアクセス（Ｍ）ステージ４０４、メモリからロードしたバイトオペランドをレジスタへ書き込むライトバック（Ｗ）ステージ４０５の５段のパイプライン処理を行う。Ｅステージ４０３での演算結果のレジスタへの書き込みはＥステージ４０３、ワード（２バイト）、２ワード（４バイト）、４ワード（８バイト）ロード時のレジスタへの書き込みはＭステージ４０４で完了する。積和／積差演算、倍精度演算に関しては、更に乗算と加算の２段のパイプラインで命令の実行を行う。後段の処理を命令実行２（Ｅ２）ステージ４０６と呼ぶ。連続する積和／積差演算を１回／１クロックサイクルのスループットで実行できる。
【０１２９】
ＩＦステージ４０１では、主として命令のフェッチ、命令キュー２１２の管理、ブロックリピート制御が行われる。命令フェッチ部２０２、内蔵命令メモリ２０３、外部バスインターフェイス部２０６、ＰＣ部２２４（以上、図１８参照）のＩＡレジスタ３３７、ラッチ３３８、インクリメンタ３３９、ＴＲＰＴＣレジスタ３４８、ラッチ３５０、デクリメンタ３５１、１検出回路３４９、比較器３４４等や制御部２１１のＩＦステージステージ制御、命令フェッチ制御、命令キュー２１２、ＰＣ部２２４（以上、図２１参照）の制御等を行う部分が、このＩＦステージ４０１の制御で動作する。ＩＦステージ４０１は、Ｅステージ４０３のジャンプで初期化される。
【０１３０】
命令フェッチアドレスは、ＩＡレジスタ３３７で保持される。Ｅステージ４０３でジャンプが起こるとＪＡバス２７４を介してジャンプ先アドレスを取り込み、初期化を行う。シーケンシャルに命令データをフェッチする場合には、インクリメンタ３３９でアドレスをインクリメントする。ブロックリピート処理中で、リピートブロックの最終命令処理後リピートブロックの先頭に戻る場合、ＩＦステージ４０１で命令処理シーケンスの切り替え制御が行われる。前者の場合、ＲＰＴＳレジスタ３４１に保持されているアドレスが、ラッチ３４２、ＪＡバス２７４を介してＩＡレジスタ３３７に転送される。
【０１３１】
ＩＡレジスタ３３７の値は命令フェッチ部２０２に送られ、命令フェッチ部２０２が命令データのフェッチを行う。対応する命令データが内蔵命令メモリ２０３にある場合には、内蔵命令メモリ２０３から命令コードを読み出す。この場合、１クロックサイクルで３２ビットの命令のフェッチを完了する。対応する命令データが内蔵命令メモリ２０３にない場合には、外部バスインターフェイス部２０６に命令フェッチ要求を出す。外部バスインターフェイス部２０６は、オペランドアクセス部２０４からの要求とを調停し、命令の取り込みが可能になったら、外部のメモリから命令データを取り込み、命令フェッチ部２０２に送る。外部バスインターフェイス部２０６は、最小２クロックサイクルで外部メモリのアクセスを行うことが可能である。命令フェッチ部２０２は取り込まれた命令を、命令キュー２１２に転送する。
【０１３２】
命令キュー２１２は２エントリのキューになっており、ＦＩＦＯ制御で取り込まれた命令コードを、命令デコード部２１３に出力する。ブロックリピート処理中で命令フェッチアドレスがＲＰＴＥレジスタ３４３と一致した事を示すリピートブロック最終命令情報と、ブロックリピート処理中で、命令フェッチアドレスがＲＰＴＥレジスタ３４３の値と一致し、かつ、更新前のＴＲＰＴＣレジスタ３４８の値が“１”であった事を示すブロックリピート処理終了情報が、命令キューに対応する命令コードとともに保持され、対応する命令コードとともに命令デコード部２１３に出力される。以降のステージでは、この情報の基づき、ブロックリピート処理に関する命令非依存のハードウェア制御が行われる。
【０１３３】
Ｄステージ４０２では、命令デコード部２１３でオペレーションコードの解析を行い、第１演算部２２２、第２演算部２２３、ＰＣ部２２４等で命令の実行を行うための制御信号群を生成する。Ｄステージ４０２は、Ｅステージ４０３のジャンプで初期化される。命令キュー２１２から送られてくる命令コードが無効な場合には、アイドルサイクルとなり、有効な命令コードが取り込まれるまで待つ。Ｅステージ４０３が次の処理を開始できない場合には、演算器等に送る制御信号を無効化し、Ｅステージ４０３での先行命令の処理の終了を待つ。例えば、Ｅステージ４０３で実行中の命令がメモリアクセスを行う命令であり、Ｍステージ４０４でのメモリアクセスが終了していない場合にこのような状態になる。
【０１３４】
Ｄステージ４０２では、シーケンシャル実行を行う２命令の分割や、２サイクル実行命令のシーケンス制御も行う。さらに、Ｅステージ４０３で参照もしくは更新するレジスタ値のロードが完了しているかどうかを判定するロードオペランドの干渉チェックや第２演算部２２３の演算器のＥ２ステージ４０６とＥステージ４０３との干渉チェック等も行い、干渉が検出された場合には、干渉が解消されるまで制御信号の出力を抑止する。
【０１３５】
図２４は、ロードオペランド干渉の例を示す説明図である。ワード、２ワードもしくは４ワードのロード命令の直後にロードするオペランドを参照する積和演算命令がある場合、レジスタへのロードが完了するまで、積和演算命令の実行開始を抑止する。この場合、メモリアクセスが１クロックサイクルで終了する場合でも、１クロックサイクルストールが起こる。バイトデータをロードする場合には、更にＷステージ４０５でレジスタファイルへの書き込みが完了するため、更に１サイクルストール期間が延びる。
【０１３６】
図２５は、演算ハードウェア干渉の例を示す説明図である。例えば、積和演算命令の直後に加算器を使用する丸め命令がある場合、先行の積和演算命令の演算が終了するまで丸め命令の実行開始を抑止する。この場合、１クロックサイクルストールが起こる。積和演算命令が連続する場合には、ストールは起こらない。
【０１３７】
第１デコーダ２１４は、主として第１演算部２２２のすべて、ＰＣ部２２４のＩＦステージ４０１で制御される部分以外、レジスタファイル２２１のＳ１バス２５１、Ｓ２バス２５２、Ｓ３バス２５３への読み出し制御とＤ１バス２６１からの書き込み制御に関する実行制御信号を生成する。命令に依存するＭステージ４０４やＷステージ４０５での処理に必要な制御信号もここで生成され、パイプラインの処理の流れに付随して転送される。第２デコーダ２１５は、主として第２演算部２２３での実行制御、レジスタファイル２２１のＳ４バス２５４、Ｓ５バス２５５、Ｓ６バス２５６、Ｓ７バス２５７への読み出し制御とＤ２バス２６２からの書き込み制御に関する実行制御信号を生成する。
【０１３８】
命令キュー２１２から取り込まれたリピートブロック最終命令情報とブロックリピート処理終了情報をもとに、命令に依存しないブロックリピート処理に関するＮＰＣレジスタ３３１の更新制御信号、ＲＰＴＣレジスタ３４５の更新制御信号や、制御レジスタＣＲ０（ＰＳＷ）のＲＰビット６３のクリアに関する更新制御信号などが生成される。
【０１３９】
また、Ｄステージ４０２では、単一命令リピートの制御を行う。単一命令リピート中は、命令キュー２１２の出力ポインタ更新は行わず、同じ命令の処理を命令で指定された回数だけ繰り返す。ＳＲＰＴＣラッチ３２３が“１”になることが通知された場合、現在デコード中の命令の処理が終了したら単一命令リピートを完了することを示しており、命令キュー２１２の出力ポインタ更新を行い、次サイクルで後続命令の処理を開始する。単一命令リピート処理中のＳＲＰＴＣラッチ３２３のデクリメント制御信号や、単一命令リピート処理終了時の制御レジスタＣＲ０（ＰＳＷ）のＳＲＰビット６４のクリア制御に関する制御信号もＤステージ４０２で生成される。
【０１４０】
Ｅステージ４０３では、演算、比較、制御レジスタを含むレジスタ間転送、ロード／ストア命令のオペランドアドレス計算、ジャンプ命令のジャンプ先アドレスの計算、ジャンプ処理、ＥＩＴ（例外、割り込み、トラップの総称）検出と各ＥＩＴのベクタアドレスへのジャンプ等、メモリアクセスと積和／積差演算命令の加算処理を除く命令実行に関するほとんどすべての処理を行う。
【０１４１】
割り込みイネーブルの場合の割り込みの検出は、必ず３２ビット命令の切れ目で行われる。３２ビット命令の中にシーケンシャルに実行する２つのショート命令がある場合も、この２つのショート命令間で割り込みを受け付けることはない。
【０１４２】
Ｅステージ４０３で処理中の命令がオペランドアクセスを行う命令であり、Ｍステージ４０４でメモリアクセスが完了しない場合には、Ｅステージ４０３での完了は待たされる。ステージ制御は制御部２１１で行われる。
【０１４３】
Ｅステージ４０３において、第１演算部２２２内のＡＬＵ３０１で、算術論理演算、比較、転送、モジュロの制御を含むメモリオペランドのアドレスや、分岐先のアドレス計算等が行われる。オペランドとして指定されたレジスタの値が、Ｓ１バス２５１、Ｓ２バス２５２、Ｓ３バス２５３に読み出され、必要に応じて別途取り込まれる即値、変位等の拡張データを使用して、ＡＬＵ３０１で演算が行われ、演算結果がセレクタ３０５及びＤ１バス２６１を介してレジスタファイル２２１に書き戻される。ロード／ストア命令の場合には、演算結果はＯＡラッチ３０６、ＯＡバス２７３を介して、オペランドアクセス部２０４に送られる。ジャンプ命令の場合には、ジャンプ先アドレスがＪＡバス２７４を介して、ＰＣ部２２４に送られる。ストアデータはＳ１バス２５１、Ｓ２バス２５２を介して、レジスタファイル２２１から読み出され、ＳＤレジスタ３１１、ラッチ３１２を介して転送後、整置回路３１３で整置が行われる。また、ＰＣ部２２４では、実行中の命令のＰＣ値の管理、次に実行する命令のアドレスの生成が行われる。第１演算部２２２、ＰＣ部２２４に含まれる制御レジスタ（アキュムレータを除く）とレジスタファイル２２１との間の転送は、Ｓ３バス２５３、Ｄ１バス２６１を介して行われる。
【０１４４】
Ｅステージ４０３において、第２演算部２２３では、算術論理演算、比較、転送、シフト他、積和演算の加算以外のすべての演算実行が行われる。オペランドの値が、レジスタファイル２２１や即値レジスタ３８３、アキュムレータ３６１等から、Ｓ４バス２５４、Ｓ５バス２５５、Ｓ６バス２５６、Ｓ７バス２５７、ＳＡ１バス２８１、ＳＡ２バス２８２を介して各演算器に転送され、指定された演算を行い、ＤＡ１バス２８３、ＤＡ２バス２８４を介してアキュムレータ３６１に、あるいは、Ｄ２バス２６２を介してレジスタファイル２２１に書き戻される。
【０１４５】
第１演算部２２２及び第２演算部２２３での演算結果によるＰＳＷ中のフラグ値の更新制御も、Ｅステージ４０３で行われる。しかし、演算結果の確定がＥステージ４０３の遅い時期になるため、実際のＰＳＷ値の更新は、次サイクルで行われる。データ転送によるＰＳＷの更新は、対応するサイクルで完了する。
【０１４６】
Ｅステージ４０３では、実行する命令に依存しないＰＣ値の更新、ブロックリピート制御や、単一命令リピート制御も行われる。新しい３２ビット命令の処理を開始するたびに、ラッチ３３２の値をＥＰＣレジスタ３３４に転送する。ＮＰＣレジスタ３３１は次に処理する命令のアドレスを保持する。Ｅステージ４０３でジャンプが起こった場合には、ＡＬＵ３０１で生成されるジャンプ先アドレスがＪＡバス２７４を介してＮＰＣレジスタ３３１に書き込まれ、初期化される。シーケンシャルに命令の処理が継続する場合には、３２ビット命令の処理を開始するたびに、インクリメンタ３３３で１インクリメントされた値がＮＰＣレジスタ３３１に書き戻される。ブロックリピート継続でリピートブロック最終命令の処理を開始する際には、ラッチ３４２からリピートブロックの先頭アドレスを取り込む。リピートブロック最終命令の処理を終了するサイクルで、ＲＰＴＣレジスタ３４５の値がラッチ３４６を介してデクリメンタ３４７でデクリメントして書き戻される。ブロックリピート処理を終了する場合、リピートブロック最終命令の処理を終了するサイクルで、ＰＳＷのＲＰビット６３を０クリアする。単一命令リピート中は、１つの３２ビット命令の処理を開始するたびに、第１演算部２２２のＳＲＰＴＣラッチ３２３の値がデクリメンタ３２６でデクリメントされ、ラッチ３２４を介して書き戻される。単一命令リピート処理を終了する場合、命令の処理を終了するサイクルで、ＰＳＷのＳＲＰビット６４を０クリアする。
【０１４７】
第１デコーダ２１４で生成されたロード／ストア命令のメモリアクセス関連情報、ロードレジスタ情報は、Ｅステージ４０３制御のもとに保持され、Ｍステージ４０４に送られる。また、第２デコーダ２１５で生成された倍精度乗算／積和／積差演算の加減算実行のための演算制御信号は、Ｅステージ４０３の制御のもとに保持され、Ｅ２ステージ４０６に送られる。Ｅステージ４０３のステージ制御も制御部２１１で行われる。
【０１４８】
Ｍステージ４０４では、第１演算部２２２から送られたアドレスでオペランドのアクセスが行われる。オペランドアクセス部２０４は、オペランドが内蔵データメモリ２０５やチップ内ＩＯ（図示せず）にある場合には、内蔵データメモリ２０５やチップ内ＩＯに対し、１クロックサイクルに１回のオペランドのリードもしくはライトを行う。オペランドが内蔵データメモリ２０５やチップ内ＩＯでない場合には、外部バスインターフェイス部２０６にデータアクセス要求を出す。外部バスインターフェイス部２０６は、外部のメモリに対してデータアクセスを行い、ロードの場合には読み出されたデータをオペランドアクセス部２０４に転送する。外部バスインターフェイス部２０６は、最小２クロックサイクルで外部メモリのアクセスを行うことが可能である。ロードの場合には、オペランドアクセス部２０４は読み出されたデータを、ＯＤバス２７１を介して転送する。バイトデータの場合はＬＤレジスタ３１５に、ワード、２ワード、もしくは、４ワードデータの場合にはレジスタファイル２２１に直接書き込む。ストアの場合には、整置されたストアデータの値が、整置回路３１３からラッチ３１４、ＯＤバス２７１を介してオペランドアクセス部２０４に転送され、対象となるメモリへの書き込みが行われる。Ｍステージ４０４のステージ制御も制御部２１１で行われる。
【０１４９】
Ｗステージ４０５において、ＬＤレジスタ３１５に保持されたロードオペランド（バイト）は、整置回路３１６で整置、ゼロ／符号拡張された後に、ラッチ３１７へ転送され、Ｗバス２７２を介してレジスタファイル２２１へ書き込まれる。
【０１５０】
Ｅ２ステージ４０６では、倍精度乗算／積和／積差演算の加減算処理を第２演算部２２３の加算器３６２や加算器３９５で行い、加減算結果をアキュムレータ３６１に書き戻す。
【０１５１】
本データ処理装置は、入力クロックに基づいて内部制御を行う。最短の場合、各パイプラインステージは、内部の１クロックサイクルで処理を終了する。ここでは、クロック制御の詳細については、本発明に直接関係ないので説明を省略する。
【０１５２】
各サブ命令の処理例について説明する。加減算、論理演算、比較等の演算命令やレジスタ間の転送命令は、ＩＦステージ４０１、Ｄステージ４０２、Ｅステージ４０３の３段で処理を終了する。演算やデータ転送をＥステージ４０３で行う。
【０１５３】
倍精度乗算／積和／積差命令は、乗算を行うＥステージ４０３と加減算を行うＥ２ステージ４０６の２クロックサイクルで演算実行を行うため、４段の処理となる。
【０１５４】
バイトロード命令は、ＩＦステージ４０１、Ｄステージ４０２、Ｅステージ４０３、Ｍステージ４０４、Ｗステージ４０５の５段で処理を終了する。ワード／２ワード／４ワードロードやストア命令は、ＩＦステージ４０１、Ｄステージ４０２、Ｅステージ４０３、Ｍステージ４０４の４段で処理を終了する。
【０１５５】
非整置アクセスの場合には、オペランドアクセス部２０４でＭステージ４０４の制御のもと整置された２回のアクセスに分割され、メモリアクセスが行われる。
【０１５６】
実行に２サイクルかかかる命令では、第１、第２命令デコーダ２１４、２１５で、２サイクルかけて処理し、各サイクル毎に各々実行制御信号を出力し、２サイクルかけて演算実行を行う。
【０１５７】
ロング命令は、１つの３２ビット命令が１つのロング命令で構成されており、この１つのロング命令の処理で３２ビット命令の実行が完了する。パラレル実行する２つの命令は、２つのショート命令で処理サイクルの大きい方の命令の処理に律速される。例えば、２サイクル実行の命令と１サイクル実行の命令の組み合わせの場合には、２サイクルかかる。
【０１５８】
シーケンシャル実行の２つのショート命令の場合には、各サブ命令の組み合わせになり、デコード段階で各命令がシーケンシャルにデコードされ、実行される。例えば、Ｅステージ４０３で１サイクルで実行が完了する加算命令が２つの場合には、Ｄステージ４０２、Ｅステージ４０３とも各命令に１サイクル、計２サイクルかけて処理する。Ｅステージ４０３における先行命令の実行と並列して、Ｄステージ４０２で後続命令のデコードが行われる。
【０１５９】
＜リングバッファ制御関連＞
（構成）
次に、リングバッファの制御方法概略を説明する。図２６は制御部２１１におけるリングバッファ制御関連部分の構成を示すブロック図である。主な信号のみを示しており、詳細な制御信号等は、簡単のため省略している。セレクタ５０２，５１５，５１９，５３３の選択制御は命令デコード部２１３（正確には第１デコーダ２１４）の出力に基づいて行われる。
【０１６０】
ＰＳＷ部２６０内のＲＭ（ＲＭ＿１，ＲＭ＿２）ラッチ５０１、５０３は、制御レジスタＣＲ０（ＰＳＷ）のＲＭビット６８を物理的に保持するラッチである。ＲＭビット６８の設定を行う場合、命令デコード部２１３の出力もしくはＣＮＴＩＦラッチ３２１の出力がセレクタ５０２で選択され、ＲＭ＿２ラッチ５０３、ＲＭ＿１ラッチ５０１の値が更新される。本データ処理装置は、リングバッファオン命令、リングバッファオフ命令を備える。リングバッファオン命令が実行されると、命令デコード部２１３（正確には第１デコーダ２１４）の出力（ＲＭ更新値）に従いＲＭビット５０１，５０３が“１”にセットされ、リングバッファオフ命令が実行されたり、ＥＩＴ（例外、割り込み、トラップ）が検出されＥＩＴ処理が起動される場合には、命令デコード部２１３の出力（ＲＭ更新値）に従いＲＭラッチ５０１、５０３の値が“０”にクリアされる。
【０１６１】
制御レジスタへの転送命令により制御レジスタＣＲ０（ＰＳＷ）へ書き込みを行う場合や、ＥＩＴ処理からの復帰時に制御レジスタＣＲ１（ＢＰＳＷ）の値を制御レジスタＣＲ０（ＰＳＷ）に復帰する場合には、第１演算部２２２内のＣＮＴＩＦラッチ３２１の出力値に基づき、ＲＭラッチ５０１、５０３が設定される。
【０１６２】
リングバッファ制御部２５０は、ラッチ５１１〜５１３，５１６，５１７，５２０，セレクタ５１５，５１９、入力ポインタ更新回路５１４及び出力ポインタ更新回路５１８により構成される。
【０１６３】
ラッチ５１１、５１２は、制御レジスタＣＲ４（ＲＢＣ）の値を物理的に保持するラッチである。制御レジスタへの転送命令により制御レジスタＣＲ４（ＲＢＣ）に書き込みを行う場合に、第１演算部２２２内のＣＮＴＩＦラッチ３２１の出力値に基づき、ＲＢＣ＿２ラッチ５１２、ＲＢＣ＿１ラッチ５１１の値が設定される。
【０１６４】
ラッチ５１３、５１６は、制御レジスタＣＲ５（ＲＢＰ）の入力ポインタＢＩＰ０〜ＢＩＰ３（９１、９３、９５、９７）の値を物理的に保持するラッチである。簡単のため、４つのポインタのうち一のポインタに対応するラッチを代表して示している。実際には、ＢＩＰ＿１ラッチ５１３、入力ポインタ更新回路５１４、セレクタ５１５及びＢＩＰ＿２ラッチ５１６に相当する構成が論理レジスタＲ０〜Ｒ３にそれぞれに対応して設けられる。
【０１６５】
入力ポインタ更新回路５１４は入力ポインタ値の更新を行う。すなわち、入力ポインタ更新回路５１４は、リングバッファがイネーブル状態（ＲＭ＿１ラッチ５０１の値が“１”）の場合には、ＲＢＣ＿１ラッチ５１１の値と、ＢＩＰ＿１ラッチ５１３に保持されている更新前のポインタ値と、命令デコード部２１３（正確には第１デコーダ２１４）から出力される入力ポインタ更新情報とに従い入力ポインタ値を更新する。入力ポインタ更新情報には、ポインタをインクリメントする際のインクリメントする数を示すインクリメント情報に加え、ロード対象のレジスタ情報やリングバッファオン命令情報が含まれる。ロード対象のレジスタがリングバッファモードで動作している場合には、ロードするデータの数に対応する入力ポインタのインクリメントが行われる。
【０１６６】
なお、入力ポインタにおいて、ポインタ値の最大値と“０”は循環する。リングバッファオン命令実行時はすべてのラッチ５１３，５１６に格納される入力ポインタ値が強制的にゼロクリアされる。
【０１６７】
セレクタ５１５では、制御レジスタへの転送命令により制御レジスタＣＲ５（ＲＢＰ）に書き込みを行う場合、第１演算部２２２内のＣＮＴＩＦラッチ３２１の出力値が選択され、それ以外の場合には入力ポインタ更新回路５１４の出力値が選択される。更新が必要な各ポインタ毎に、セレクタ５１５の出力値に基づき、ＢＩＰ＿２ラッチ５１６、ＢＩＰ＿１ラッチ５１３の値が設定される。
【０１６８】
このような構成において、入力ポインタ更新回路５１４は、入力ポインタ更新情報に含まれるインクリメント情報とＲＢＣ＿１ラッチ５１１の値に基づき、対応する論理レジスタがリングバッファモードで動作しているロード対象のレジスタに該当する場合、ＢＩＰ＿１ラッチ５１３より取得した入力ポインタを上記インクリメント情報が示す数でインクリメントして更新し、更新後の入力ポインタをセレクタ５１５を介してＢＩＰ＿２ラッチ５１６に書き込むことにより、入力ポインタ更新動作を行うことができる。
【０１６９】
ラッチ５１７、５２０は、制御レジスタＣＲ５（ＲＢＰ）の出力ポインタＢＯＰ０〜ＢＯＰ３（９２、９４、９６、９８）の値を物理的に保持するラッチである。簡単のため、４つのポインタのうちの一のポインタに対応するラッチを代表して示している。実際には、ＢＯＰ＿１ラッチ５１７、出力ポインタ更新回路５１８、セレクタ５１９及びＢＯＰ＿２ラッチ５２０に相当する構成が論理レジスタＲ０〜Ｒ３それぞれに対応して設けられる。
【０１７０】
出力ポインタ更新回路５１８は、出力ポインタ値の更新を行う。すなわち、出力ポインタ更新回路５１８は、リングバッファがイネーブル状態（ＲＭ＿１ラッチ５０１の値が１）の場合には、ＲＢＣ＿１ラッチ５１１の値と、ＢＯＰ＿１ラッチ５１７に保持されている更新前のポインタ値と、命令デコード部２１３（正確には第１デコーダ２１４あるいは第２デコーダ２１５）から出力される出力ポインタ更新情報とに従い出力ポインタ値を更新する。更新が必要な各出力ポインタ毎に、セレクタ５１９の出力値に基づき、ＢＯＰ＿２ラッチ５２０、ＢＯＰ＿１ラッチ５１７の値が設定される。
【０１７１】
出力ポインタ更新情報には、レジスタ値の参照情報、リピートブロック最終命令情報、分岐命令情報、リングバッファオン命令情報、出力ポインタ更新命令情報等が含まれる。なお、本実施の形態では出力ポインタのインクリメント量は“１”のみであるため、入力ポインタ更新情報に含まれるインクリメント情報は不要である。
【０１７２】
リングバッファオン命令実行時以外の場合は、ＲＢＣ＿１ラッチ５１１の設定値に基づき、必要な情報を参照して、リングバッファモードで動作しているレジスタに対応する出力ポインタのインクリメントが行われる。本実施の形態では、上述したように更新サイズは＋１のみである。ポインタ値の最大値と“０”は循環する。リングバッファオン命令実行時はすべての出力ポインタ値が強制的にゼロクリアされる。
【０１７３】
このような構成において、出力ポインタ更新回路５１８は、出力ポインタ更新情報とＲＢＣ＿１ラッチ５１１の値に基づき、対応する論理レジスタがリングバッファモードで動作し参照されるレジスタに該当する場合、ＢＯＰ＿１ラッチ５１７より取得した出力ポインタを１インクリメントして更新し、更新後の出力ポインタをセレクタ５１９を介してＢＯＰ＿２ラッチ５２０に書き込むことにより、出力ポインタ更新動作を行うことができる。
【０１７４】
転送命令により、制御レジスタＣＲ０（ＰＳＷ）、制御レジスタＣＲ４（ＲＢＣ）、制御レジスタＣＲ５（ＲＢＰ）の値を読み出したり、ＥＩＴ処理の起動に伴い制御レジスタＣＲ０（ＰＳＷ）値を待避する場合には、ＲＭ＿１ラッチ５０１、ＲＢＣ＿１ラッチ５１１、ＢＩＰ＿１ラッチ５１３、ＢＯＰ＿１ラッチ５１７等の値がセレクタ５３３を介してＤ１バス２６１に出力される。
【０１７５】
上述のポインタ値の更新や、命令実行もしくはＥＩＴ処理に伴うポインタ値の参照は、Ｅステージ４０３で行われる。
【０１７６】
レジスタマッピング回路５３１は、制御情報として、ＲＢＣラッチ５１１の値、セレクタ５０２の出力、入力ポインタ更新回路５１４の出力、出力ポインタ更新回路５１８の出力を受け、命令で指定されるレジスタ番号（Ｒ０〜Ｒ１５、論理レジスタ番号と呼ぶ）の内、リングバッファモード時にリングバッファとなりうる論理レジスタＲ０〜Ｒ３を、バッファレジスタも含めてデータ処理装置内部で管理するレジスタ番号（物理レジスタ番号と呼ぶ）に変換する。レジスタマッピング回路５３１は、命令デコード部２１３と独立したブロックと捉えてもよいが、ここでは命令デコード部２１３の一部として捉えて図示している。そして、図２６では図示しない第１デコーダ２１４，第２デコーダ２１５間でレジスタマッピング回路５３１は共用される。
【０１７７】
上述したＰＳＷ部２６０，リングバッファ制御部２５０及びレジスタマッピング回路５３１からなる論理レジスタ指定手段によって、特定論理レジスタＲ０，Ｒ１（Ｒ２，Ｒ３）に対応する指定対象物理レジスタ群内の可変用物理レジスタ（ＢＲ０〜ＢＲ７等）を、先入れ先出し（ＦＩＦＯ）方式で順次指定することができる。
【０１７８】
図２７は命令ニーモニックで指定されるレジスタ名とオペレーションコードで指定される４ビットの論理レジスタ番号との対応関係を表形式で示す説明図である。また、図２８はレジスタセットとしてのレジスタ名と５ビットの物理レジスタ番号の対応関係を表形式で示す説明図である。
【０１７９】
レジスタマッピング回路５３１は、Ｄステージ４０２で動作する。Ｅステージ４０３で処理中の先行命令実行に伴う入出力ポインタやＲＭビットの更新後の値や制御レジスタＣＲ４（ＲＢＣ）の値を反映して、Ｄステージ４０２でデコード中の後続命令の論理レジスタ番号の物理レジスタ番号への変換を行う。制御部２１１では、変換後の物理レジスタ番号に基づいて、レジスタファイル２２１のバスへの読み出し／更新制御信号生成や、Ｅステージ４０３で参照もしくは更新するレジスタ値の先行命令によるロードが完了しているかどうかを判定するロードオペランドの干渉チェック（図示せず）等のハードウェアの制御が行われる。
【０１８０】
（基本動作）
（リングバッファ操作専用命令）
以下のリングバッファ操作用命令は、いずれも命令デコード部２１３内の第１デコーダ２１４の出力に基づいて処理される。
【０１８１】
・リングバッファオン命令（ＲＢＯＮ）
・リングバッファオフ（ＲＢＯＦＦ）命令
・出力ポインタ更新（ＵＰＤＢＯＰ）命令
・汎用レジスタから制御レジスタ（ＲＢＣ、ＲＢＰ）への転送命令
・制御レジスタ（ＲＢＣ、ＲＢＰ）から汎用レジスタへの転送命令
・リングバッファモードで動作するレジスタへの専用ロード命令（ＬＤ２、ＬＤ２Ｗ２等）。
【０１８２】
第１デコーダ２１４によりリングバッファオン命令（ＲＢＯＮ）がデコードされると、第１デコーダ２１４の出力に基づいてＰＳＷ部２６０内のＲＭビット５０３，５０１が“１”にセットされるとともに、第１デコーダ２１４の制御下による入力ポインタ更新回路５１４及び出力ポインタ更新回路５１８によって、制御レジスタＣＲ５（ＲＢＰ）（論理レジスタＲ０〜Ｒ３それぞれに対応するラッチ５１３，５１６，５１７，５１９の値）がゼロクリアされ、全入出力ポインタが“０”に初期化される。
【０１８３】
また、第１デコーダ２１４の出力に基づいてリングバッファオフ命令（ＲＢＯＦＦ）がデコードされると、第１デコーダ２１４の出力に基づいてＰＳＷ部２６０のＲＭビット５０３，５０１が“０”にクリアされる。
【０１８４】
（入力ポインタ更新制御）
入力ポインタ更新回路５１４に入力される、入力ポインタの更新のため参照される情報は以下の通りである。
【０１８５】
・ＰＳＷ部２６０のＲＭビット５０１の値（“１”の場合イネーブル）
・ＲＢＣラッチ５１１の値（ＲＢＥ０〜ＲＢＥ３の値（“１”の場合イネーブル），ＲＢＣＮＦの値（リングバッファモードとして動作するレジスタ、ポインタの上限値））
・ＢＩＰラッチ５１３に保持されている更新前の入力ポインタの値
・命令デコード部２１３（第１デコーダ２１４）からの入力ポインタ更新情報（命令デコード結果）。
【０１８６】
なお、第１デコーダ２１４から出力される入力ポインタ更新情報の具体例は以下の通りである。
・ロードレジスタ番号（ポインタ更新する論理レジスタ番号と更新要否、最大４つ）
・各番号のレジスタのポインタ更新値（＋１もしくは＋２）
・リングバッファオン命令情報（ＲＢＯＮ命令）。
【０１８７】
入力ポインタ更新回路５１４によって入力ポインタが更新される具体例を以下に示す。
(1).リングバッファオン（ＲＢＯＮ）命令実行時
全入力ポインタ値を強制的にゼロクリアする。
【０１８８】
(2).ロード命令実行時
後述する示す条件１１〜１３を満足する更新対象レジスタに対して行われ、ポインタ更新値はロード命令に依存して、＋１あるいは＋２が指定される。
【０１８９】
上述した条件１１〜条件１３は以下の通りである。
条件１１：ＰＳＷ部２６０のＲＭビット５０１が“１”（イネーブル）［共通］
条件１２：ＲＢＣラッチ５１１のＲＢＥｉが“１”（イネーブル）［対象レジスタ］
条件１３：ＲＢＣラッチ５１１のＲＢＣＮＦの値によりリングバッファモードとして動作するレジスタ構成が設定されている［対象レジスタ］。
【０１９０】
（出力ポインタ更新制御）
出力ポインタ更新回路５１８に入力される、出力ポインタの値の更新のために参照される情報は以下の通りである。なお、出力ポインタの更新サイズは＋１のみである。
・ＰＳＷ部２６０のＲＭビット５０１の値（“１”の場合イネーブル）
・ＲＢＣラッチ５１１の値（ＲＢＥ０〜ＲＢＥ３の値（“１”の場合イネーブル），ＲＢＣＮＦの値（リングバッファモードとして動作するレジスタ、ポインタの上限値），ＳＴＭの値（ストアデータのレジスタ値参照に関するポインタ更新を行うかの情報），ＯＰＭ０〜ＯＰＭ３の値（どの条件でポインタ更新を行うかの情報））
・ＢＯＰラッチ５１７に保持されている更新前の出力ポインタの値
・命令デコード部２１３（第１デコーダ２１４あるいは第２デコーダ２１５）からの出力ポインタ更新情報（命令デコード結果）。
【０１９１】
なお、第１デコーダ２１４あるいは第２デコーダ２１５から出力される出力ポインタ更新情報の具体例は以下の通りである。
・参照レジスタ番号（ポインタ更新する論理レジスタ番号と更新要否、最大４つ）
・ストア情報（参照レジスタ番号の付属情報）
・リピートブロック最終命令情報（命令キューから取り込まれた値であり、実際は純粋な命令デコード結果ではない）
・分岐命令情報
・リングバッファオン命令（ＲＢＯＮ命令）情報
・出力ポインタ更新命令（ＵＰＤＢＯＰ命令）情報（この命令での指定により各レジスタ毎に＋１更新制御可能）。
【０１９２】
上述した出力ポインタ更新情報において、参照レジスタ番号は第１デコーダ２１４あるいは第２デコーダ２１５から出力され、ストア情報、リピートブロック最終命令情報、分岐命令情報、リングバッファオン命令情報、出力ポインタ更新命令情報は第１デコーダ２１４のみから出力される。
【０１９３】
出力ポインタが更新される具体例を以下に示す。
(1).ＲＢＯＮ命令実行時
全出力ポインタの値を強制的にゼロクリアする。
【０１９４】
(2).ＵＰＤＢＯＰ命令実行時
命令で指定されるレジスタの出力ポインタのみ更新する（ポインタ更新対象レジスタは、後述する条件２１〜２３を満足する想定）。
【０１９５】
(3).レジスタ値参照命令（ストア命令のストア対象レジスタ以外）実行時
参照レジスタに対応するＯＰＭｉが“０１”であれば、当該参照レジスタの出力ポインタを更新する（後述する条件２１〜２３を満足する参照レジスタが対象）。
【０１９６】
(4).レジスタ値参照命令（ストア命令のストア対象レジスタ）実行時
ＳＴＭの値が“０”で、参照レジスタに対応するＯＰＭｉが“０１”であれば、当該参照レジスタの出力ポインタを更新する。また、このとき、ＳＴＭが“０”であれば、リングバッファからストアデータ読みだしが行われる（後述する条件２１〜２３を満足する参照レジスタが対象）。
【０１９７】
(5).リピートブロック最終命令実行時（最終実行サイクル）
後述する条件２１〜２３を満足し、対応するＯＰＭｉが“１０”に設定されたレジスタの出力ポインタを更新する。
【０１９８】
(6).分岐命令実行時
後述する条件２１〜２３を満足し、対応するＯＰＭｉが“１１”に設定されたレジスタの出力ポインタを更新する。
【０１９９】
上述した条件２１〜条件２３は以下の通りである。
条件２１：ＰＳＷ部２６０のＲＭビット５０１が“１”（イネーブル）［共通］
条件２２：ＲＢＣラッチ５１１のＲＢＥｉが“１”（イネーブル）［対象レジスタ］
条件２３：ＲＢＣラッチ５１１のＲＢＣＮＦによりリングバッファモードとして動作するレジスタ構成が設定されている［対象レジスタ］。
【０２００】
（その他の更新）
第１デコーダ２１４の制御下で、ＣＮＴＩＦラッチ３２１の出力がセレクタ５１５，５１９により選択され、ＣＮＴＩＦラッチ３２１の内容が、論理レジスタＲ０〜Ｒ３それぞれに対応するラッチ５１３，５１５，５１７，５１９に設定される。
【０２０１】
＜プログラム例１〜プログラム例１０＞
次にプログラム処理例をいくつか挙げ、本実施の形態のデータ処理装置の具体的な動作を詳細に説明する。
【０２０２】
＜プログラム例１：単精度積和１＞
まず、積和演算の例について説明する。Ｃ言語表記で、以下の処理を行う場合について説明する。
【０２０３】
for (i = 0, sum = 0; i < N; ++i) sum += C[i] * D[i];。
【０２０４】
１６ビットの固定小数点数配列であるＣとＤの積和をＮ回繰り返す。Ｎは２の倍数であるとする。Ｃ［ｉ］、Ｄ［ｉ］は、ｉの順番にアドレスの増加方向に順に内蔵データメモリ上に配置されており、Ｃ［０］、および、Ｄ［０］は、３２ビット（４バイト）整置されているものとする。積和演算結果（ｓｕｍ）は１６ビットに丸められ、ｒ０に保持されるものとする。
【０２０５】
図２９は積和演算を行うアセンブラでのプログラム例１を示す説明図である。“；”以降はコメントである事を示す。また、“｜｜”は２つのショート命令を並列に実行する事を示す。Ｉ１、Ｉ２等は、３２ビット命令としての便宜上の呼び名とする。また、便宜上２命令を並列に実行する際、各命令について“｜｜”の左側の命令の末尾に“ａ”、“｜｜”の左側の命令の末尾に“ｂ”付して参照するものとする。例えば、コマンド行６０９のＩ１で、ＬＤ２命令を６０９ａまたはＩ１ａ、ＭＡＣ命令を６０９ｂまたはＩ１ｂとして参照するものとする。以降の処理例でも同様である。
【０２０６】
コマンド行６０１〜６０７はブロックリピート処理を行うための前処理に相当し、コマンド行６０８はブロックリピート命令、コマンド行６０９〜６１０が積和演算を行うためのリピートブロック、コマンド行６１１がブロックリピート処理後の後処理を行う部分である。
【０２０７】
ＬＤＩ命令は１６ビットの即値をレジスタに転送するロング命令である。ＬＤＩ命令６０１で論理レジスタＲ８にＤ［０］のアドレスが、ＬＤＩ命令６０２で論理レジスタＲ９にＣ［０］のアドレスが各々設定される。ＬＤＴＣＩ命令は制御レジスタに１６ビット即値を転送するロング命令である。ＬＤＴＣＩ命令６０３は制御レジスタＣＲ４（ＲＢＣ）の初期設定を行う。この命令により、ＲＢＣＮＦビット８０が“００”に、ＳＴＭビット８１が“０”に、ＷＭビット８２が“０”に、ＲＢＥ０ビット８３とＲＢＥ１ビット８５が“１”に、ＯＰＭ０ビット８４とＯＰＭ１ビット８６が“０１”に設定される。すなわち、論理レジスタＲ０とＲ１が各々４エントリからなるリングバッファ構成（図９参照）となり、ともにレジスタ値の参照により出力ポインタを更新する設定となる。
【０２０８】
ＲＢＯＮ命令６０４ａは、リングバッファオン命令であり、制御レジスタＣＲ０（ＰＳＷ）のＲＭビット６８が“１”に設定されると共に、制御レジスタＣＲ５（ＲＢＰ）がゼロクリアされ、入出力ポインタが“０”に初期化される。ＣＬＲＡＣ命令６０４ｂは２１のアキュムレータＡ０をゼロクリアする命令である。
【０２０９】
リングバッファモード専用の複数データ更新命令である“ＬＤ２  Ｒａ，  Ｒｂ＋”命令（更新ポイントサイズ＋２）は、メモリのＲｂ値のアドレス領域から２ワードのデータをロードしリングバッファモードで動作するＲａに書き込むとともに、Ｒｂの値をオペランドサイズに相当する４だけポストインクリメントするポストインクリメント付きレジスタ間接モードの２ワードロード命令である。
【０２１０】
図３０はロード命令ＬＤ２の命令コードの割り付けを示す説明図である。ロード命令ＬＤ２は図１４に示す命令フォーマットの命令であり、Ｒａフィールド６２２、Ｒｂフィールド６２３とも、４ビットの論理レジスタ番号が指定される。ＬＤ２命令６０５〜６０７で、ループ処理に入る前のデータのプリロードを行う。
【０２１１】
本データ処理装置では、２つの異なる領域に割り当てられた配列データをロードする場合、異なるロード命令で読み出す必要がある。また、Ｍステージ４０４でロードが行われるため、パイプラインストールなしに積和演算を実行するためには、積和命令で参照するオペランドデータは、内蔵データメモリにある場合でも２サイクル以上前に実行される命令でロードしておく必要がある。論理レジスタＲ０の４つのレジスタをＤ［ｉ］のバッファ、論理レジスタＲ１の４つのレジスタをＣ［ｉ］のバッファとして使用している。
【０２１２】
ＲＥＰＩ命令６０８は繰り返し回数が即値で指定されるブロックリピート命令であり、コマンド行６０９，６１０の２命令を、Ｎ／２回繰り返す。プログラムを単純にするため、ループのエピローグ処理で余分なロードの抑止を行っていないため、６ワード分不要なデータのロードを行う。このコマンド行６０９，６１０のＬＤ２命令とＭＡＣ命令を繰り返し実行することにより、１クロックサイクルに１回のスループットで積和演算処理が実現されている。ブロックリピート処理の詳細は、本発明とは直接関連はないので、リピート命令処理の詳細説明は省略する。
【０２１３】
ストア命令以外でレジスタ値参照命令である“ＭＡＣ  Ａｄ，Ｒａ，Ｒｂ”命令は積和演算命令であり、Ｒａ値とＲｂ値を乗算し、乗算結果をＡｄ値に加算する。図３１は積和演算命令ＭＡＣの命令コードの割り付けを示す説明図である。積和演算命令ＭＡＣは図１４に示す命令フォーマットの命令であり、Ｒａフィールド６２６、Ｒｂフィールド６２７とも、４ビットの論理レジスタ番号が指定され、Ａｄフィールド６２８で、デスティネーションとなるアキュムレータ番号が指定される。
【０２１４】
命令６１１は、ブロックリピート処理後の後処理を行う部分である。ＲＢＯＦＦ命令６１１ａは、リングバッファオフ命令であり、制御レジスタＣＲ０（ＰＳＷ）のＲＭビット６８を“０”にクリアする。ＲＡＣＨＩ命令６１１ｂは２１のアキュムレータＡ０の値を１６ビット固定小数点フォーマットとして丸め演算を行い、１６ビットにサチュレーションして、論理レジスタＲ０（ＧＲ０）に書き込む命令である。
【０２１５】
図３２はコマンド行６０９、６１０の命令のブロックリピート処理時のパイプライン処理の詳細を説明図である。図３３は図３２のパイプライン処理時におけるリングバッファの様子を示す説明図である。
【０２１６】
図３２，図３３において、ブロックリピート処理中のある期間Ｔ１でＥステージ４０３においてＩ１命令６０９を実行しており、その際Ｄ［ｎ］とＣ［ｎ］の乗算を行っている場合の処理の様子を示している。命令の処理としては、２クロックサイクル毎に処理を繰り返す。リングバッファの動作としては、４クロックサイクル毎に入出力ポインタが同じ状態に戻る。
【０２１７】
図３３は、各クロックサイクルの完了時点でのリングバッファの状態を示している。リングバッファのポインタの更新はＥステージ４０３で、バイト以外のロードデータのレジスタへの書き込みはＭステージ４０４で行われる。図３３では、時間を基準にリングバッファの状態を示しているため、実際ロードしたデータが書き込まれる１クロックサイクル前に入力ポインタの更新が完了しており、その状態が示されている。すなわち、命令基準で考えると１命令ずれて変化しているように見えるが、これはパイプライン処理のためである。Ｔ０はＴ１の１クロックサイクル前の状態（Ｔ１実行開始時の初期状態）を示す。
【０２１８】
図３３において、変数名を表記しているが、ライフタイムの切れたもの（その後有効なデータとして参照されないもの）は空白としているレジスタ値に関し、レジスタ値の参照と更新が同一クロックサイクルで行われる場合は、更新前のレジスタ値が参照される。
【０２１９】
Ｔ１期間にＥステージ４０３で処理６３２（Ｉ１命令６０９の実行）が行われる。第１演算部２２２では、ＬＤ２命令６０９ａのアドレス出力とアドレスの更新が行われる。汎用レジスタＧＲ９の値がアドレスとしてオペランドアクセス部２０４に出力され、ポストインクリメントされて汎用レジスタＧＲ９に書き戻される。
【０２２０】
また、第２演算部２２３では、ＭＡＣ命令６０９ｂの乗算が行われる。Ｒ０［０］として割り当てられているバッファレジスタＢＲ０から既にロードが完了しているＤ［ｎ］の値が、Ｒ１［０］として割り当てられているバッファレジスタＢＲ１から既にロードが完了しているＣ［ｎ］の値が読み出され、第２演算部２２３の乗算器３７６で両者の乗算が行われ、乗算結果がＰラッチ３７９に書き込まれる。
【０２２１】
また、ＬＤ２命令６０９ａの実行に伴い、論理レジスタＲ１に２ワードのデータがロードされるので、論理レジスタＲ１の入力ポインタＢＩＰ１の値が、２インクリメントされ、循環して“０”に更新される。すなわち、論理レジスタＲ１に対応するＢＩＰ＿２ラッチ５１６及びＢＩＰ＿１ラッチ５１３に対し、入力ポインタ更新回路５１４からセレクタ５１５を介して“０”が設定される。
【０２２２】
さらに、ＭＡＣ命令６０９ｂの実行に伴い、論理レジスタＲ０，Ｒ１が参照されるので、論理レジスタＲ０，Ｒ１それぞれの出力ポインタＢＯＰ０、ＢＯＰ１が１インクリメントされて、“１”に更新される。すなわち、論理レジスタＲ０，Ｒ１に対応するＢＯＰ＿２ラッチ５２０及びＢＯＰ＿１ラッチ５１７に対し、出力ポインタ更新回路５１８からＢＯＰ＿２ラッチ５２０を介して“１”が設定される。
【０２２３】
Ｔ２期間のＭステージ４０４、Ｅ２ステージ４０６で、処理６３６（Ｉ１命令６０９の処理）が行われる。Ｍステージ４０４では、Ｒ１［２］として割り当てられているバッファレジスタＢＲ３にＣ［ｎ＋２］の値が、Ｒ１［３］として割り当てられているバッファレジスタＢＲ７にＣ［ｎ＋３］の値が各々書き込まれる。なお、Ｔ２期間のＭステージ４０４における入力ポインタは、Ｔ０期間のデコード時の論理レジスタＲ１に対応する入力ポインタ“２”となっている。
【０２２４】
処理６３６におけるＥ２ステージ４０６では、Ｅステージ４０３での乗算結果であるＰラッチ３７９の値とアキュムレータＡ０の値が加算され、アキュムレータＡ０に書き戻される。
【０２２５】
Ｔ１期間にＤステージ４０２では、処理６３１（Ｉ２命令６１０のデコード）が行われる。ここでは、処理６３２のＩ１命令の実行に伴うリングバッファの入出力ポインタの更新後の状態に基づいて、レジスタマッピング回路５３１によるリングバッファとして動作するレジスタの物理レジスタ番号へのマッピングが行われる。
【０２２６】
Ｔ２期間にＥステージ４０３で処理６３５（Ｉ２命令６１０の実行）が行われる。第１演算部２２２では、ＬＤ２命令６１０ａのアドレス出力とアドレスの更新が行われる。汎用レジスタＧＲ８の値がアドレスとしてオペランドアクセス部２０４に出力され、ポストインクリメントされて汎用レジスタＧＲ８に書き戻される。
【０２２７】
また、第２演算部２２３では、ＭＡＣ命令６１０ｂの乗算が行われる。Ｒ０［１］として割り当てられているＢＲ４から既にロードが完了しているＤ［ｎ＋１］の値が、Ｒ１［１］として割り当てられているＢＲ５から既にロードが完了しているＣ［ｎ＋１］の値が読み出され、乗算器３７６で両者の乗算が行われ、乗算結果がＰラッチ３７９に書き込まれる。なお、期間Ｔ２のＥステージ４０３における出力ポインタは、Ｔ１期間の処理６３１のデコード時における論理レジスタＲ０，Ｒ１に対応する出力ポインタ“１”となっている。
【０２２８】
また、処理６３５におけるＬＤ２命令６１０ａの実行に伴い、論理レジスタＲ０に２ワードのデータがロードされるので、論理レジスタＲ０の入力ポインタＢＩＰ０の値が、入力ポインタ更新回路５１４等により２インクリメントされ、“２”に更新される。さらに、ＭＡＣ命令６１０ｂの実行に伴い、論理レジスタＲ０，Ｒ１が参照されるので、論理レジスタＲ０，Ｒ１の出力ポインタＢＯＰ０，ＢＯＰ１が出力ポインタ更新回路５１８等により１インクリメントされて、“２”に更新される。
【０２２９】
Ｔ３期間のＭステージ４０４、Ｅ２ステージ４０６で、処理６３９（Ｉ２命令６１０の処理）が行われる。Ｍステージ４０４では、Ｒ０［０］として割り当てられているバッファレジスタＢＲ０にＤ［ｎ＋４］の値が、Ｒ０［１］として割り当てられているバッファレジスタＢＲ４にＤ［ｎ＋５］の値が各々書き込まれる。Ｅ２ステージ４０６では、Ｅステージ４０３での乗算結果であるＰラッチ３７９の値とアキュムレータＡ０の値が加算され、Ａ０に書き戻される。
【０２３０】
Ｔ２期間にＤステージ４０２では、処理６３４（Ｉ１命令６０９のデコード）が行われる。ここでは、処理６３５のＩ２命令の実行に伴うリングバッファの入出力ポインタの更新後の状態に基づいて、レジスタマッピング回路５３１によりリングバッファとして動作するレジスタの物理レジスタ番号へのマッピングが行われる。
【０２３１】
上述のような処理を繰り返すことにより、ロードオペランドに関するストールを起こすことなく、オーバーヘッドなしに１クロックサイクルに１回のスループットで積和演算を実行することが可能である。このようなオーバーヘッドのない積和演算処理を実行するためには、ロードデータのバッファとして８本のレジスタが必須となる。しかし、リングバッファを使用することにより、物理的には８本のレジスタを使用するが、命令として使用する論理レジスタ本数としては論理レジスタＲ０，Ｒ１の２本で処理が実現でき、論理レジスタＲ２〜Ｒ７は、他の目的で自由に使用することが可能である。
【０２３２】
また、この処理例では、論理レジスタＲ２〜Ｒ７の値を破壊せず元の値を保持するので、論理レジスタＲ２〜Ｒ７の値を保持しておく必要がある場合でも、図２９の処理前後で論理レジスタＲ２〜Ｒ７の値を待避、復帰するための処理は不要である。従って、コードサイズ及び処理サイクル数が削減でき、低コスト（ROM容量削減）で高性能なデータ処理装置を得ることが出来る。
【０２３３】
また、レジスタ番号を指定するフィールドを増やさなくても物理的に多くのレジスタを扱うことができるため、基本命令長を大きくすることなく、同じ基本命令長に多くの命令を割り当てることが出来る。従って、コード効率を上げることができ、かつ、多くの命令を短い命令に割り当てることが可能となるため、低コストで高性能なデータ処理装置を得ることが出来る。
【０２３４】
リングバッファを用いないとデータバッファとして使用するレジスタ番号がすべて異なるため、ループの構成するのに最低４命令必要となるが、上記のプログラム例では２命令でループが構成できる。上述のプログラム例では繰り返し回数が静的に決まっている例を示しているが、同一のサブルーチンをコールしたりする場合など、繰り返し回数が動的に変化する場合は、リングバッファを用いないと最低でも４エレメントの処理でループが構成されるので、繰り返し回数が、”４×Ｍ”、”４×（Ｍ＋１）”、”４×（Ｍ＋２）”、”４×（Ｍ＋３）”（Ｍは整数）の場合を判定し各々独立したプログラムを実行するか、１回の処理を残りの回数分繰り返す端数処理が必要になる。
【０２３５】
これに対し、本実施の形態では繰り返し回数Ｎが奇数の場合は、ループの後処理で“ＭＡＣ  Ａ０、Ｒ０、Ｒ１”命令を実行するようにするだけでよい。従って、リングバッファを用いることにより、より小さな単位でループが構成でき、かつ、同じレジスタ番号が使用できるため、端数処理のためのコードサイズ、及び、処理サイクル数のオーバーヘッドが大幅に削減でき、低コストで高性能なデータ処理装置を得ることが出来る。
【０２３６】
また、出力ポインタの更新は、命令実行に伴うレジスタ値の参照の基づき、命令で明示的に指定することなく暗黙的に行われるため、出力ポインタの更新に伴うオーバーヘッドが生じることなく、低コストで高性能なデータ処理装置を実現できる。
【０２３７】
また、処理サイクル数の削減により、同一の処理を行う場合の消費電力を削減できる効果もある。
【０２３８】
さらに、プログラムが単純になるため、ソフトウェアの開発効率を向上出来ると共に、バグ混入の可能性を低減出来る効果もある。
【０２３９】
＜プログラム例２：単精度積和２＞
図３４は積和演算を行うアセンブラでのプログラム例２を示す説明図である。図３４で示すプログラム例は、図２９で示したプログラム例１と全く同じ処理を異なるプログラムで実現した例を示している。基本的な処理フローは同じであるが、データのバッファとして４本の論理レジスタ番号を使用する点が図２９のプログラム例１とは異なる。図２９と異なる点に特に着目し、説明を行う。
【０２４０】
コマンド行６５１〜６５７はブロックリピート処理を行うための前処理、コマンド行６５８はブロックリピート命令、コマンド行６５９〜６６０が積和演算を行うためのリピートブロック、コマンド行６６１がブロックリピート処理後の後処理を行う部分である。
【０２４１】
ＬＤＴＣＩ命令６５３により、ＲＢＣＮＦビット８０が“０１”に、ＳＴＭビット８１が“０”に、ＷＭビット８２が“０”に、ＲＢＥ０ビット８３、ＲＢＥ１ビット８５、ＲＢＥ２ビット８７、ＲＢＥ３ビット８９が“１”に、ＯＰＭ０ビット８４、ＯＰＭ１ビット８６、ＯＰＭ２ビット８８、ＯＰＭ４ビット９０が“０１”に設定される。すなわち、論理レジスタＲ０〜Ｒ３が各々２エントリからなるリングバッファ構成（図１０参照）となり、ともにレジスタ値の参照により出力ポインタを更新する設定となる。
【０２４２】
図２９のプログラム例１のＬＤ２命令の代わりに、プログラム例２ではＬＤ２Ｗ命令が使用される。汎用レジスタモード／リングバッファモード共通のデータ更新命令である“ＬＤ２Ｗ  Ｒａ，  Ｒｂ＋”命令（更新ポイントサイズ＋１）は、メモリのＲｂ値のアドレス領域から２ワードのデータをロードしＲａとＲａのレジスタ番号に１足したレジスタ番号のレジスタＲ（ａ＋１）（以降も、この表記方法を用いる。）に書き込むとともに、Ｒｂの値をオペランドサイズに相当する４だけポストインクリメントするポストインクリメント付きレジスタ間接モードの２ワードロード命令である。ロード命令ＬＤ２同様、図１３に示す命令フォーマットの命令であり、ロード命令ＬＤ２とはオペレーションコードが異なる。
【０２４３】
プログラム例２では、論理レジスタＲ０，Ｒ１用の４つのレジスタをＤ［ｉ］のバッファ、論理レジスタＲ２，Ｒ３様の４つのレジスタをＣ［ｉ］のバッファとして使用する。
【０２４４】
図３５はプログラム例２におけるブロックリピート処理時のパイプライン処理の詳細を説明図である。図３６は図３５のパイプライン処理時におけるリングバッファの様子を示す説明図である。
【０２４５】
すなわち、図３５は、コマンド行６５９，６６０の命令のブロックリピート処理中のパイプライン処理の詳細を、図３６にその際のリングバッファの様子を示している。ブロックリピート処理中のある期間Ｔ１でＥステージ４０３においてＩ１命令６５９を実行しており、その際Ｄ［ｎ］とＣ［ｎ］の乗算を行っている場合の処理の様子を示している。命令の処理としては、２クロックサイクル毎に処理を繰り返す。リングバッファの動作は、４クロックサイクル毎に入出力ポインタが同じ状態に戻る。
【０２４６】
Ｔ１期間にＥステージ４０３で処理６７２（Ｉ１命令６５９の実行）が行われる。第１演算部２２２では、ＬＤ２Ｗ命令６５９ａのアドレス出力とアドレスの更新が行われる。汎用レジスタＧＲ９の値がアドレスとしてオペランドアクセス部２０４に出力され、ポストインクリメントされて汎用レジスタＧＲ９に書き戻される。
【０２４７】
また、第２演算部２２３では、ＭＡＣ命令６５９ｂの乗算が行われる。Ｒ０［０］として割り当てられているＢＲ０から既にロードが完了しているＤ［ｎ］の値が、Ｒ２［０］として割り当てられているＢＲ２から既にロードが完了しているＣ［ｎ］の値が読み出され、乗算器３７６で両者の乗算が行われ、乗算結果がＰラッチ３７９に書き込まれる。
【０２４８】
また、ＬＤ２Ｗ命令６５９ａの実行に伴い、論理レジスタＲ２，Ｒ３に各々１ワードのデータがロードされるので、論理レジスタＲ２の入力ポインタＢＩＰ２の値と論理レジスタＲ３の入力ポインタＢＩＰ３の値とが、入力ポインタ更新回路５１４等によりそれぞれ１インクリメントされ、循環して“０”に更新される。
【０２４９】
さらに、ＭＡＣ命令６５９ｂの実行に伴い、論理レジスタＲ０，Ｒ２がそれぞれ参照されるので、論理レジスタＲ０，Ｒ２の出力ポインタＢＯＰ０、ＢＯＰ２が、それぞれ１インクリメントされて、“１”に更新される。
【０２５０】
Ｔ２期間のＭステージ４０４、Ｅ２ステージ４０６で、処理６７６（Ｉ１命令６５９の処理）が行われる。Ｍステージ４０４では、Ｒ２［１］として割り当てられているバッファレジスタＢＲ６にＣ［ｎ＋２］の値が、Ｒ３［１］として割り当てられているバッファレジスタＢＲ７にＣ［ｎ＋３］の値が各々書き込まれる。
【０２５１】
Ｅ２ステージ４０６では、Ｅステージ４０３での乗算結果であるＰラッチ３７９の値とアキュムレータＡ０の値が加算され、アキュムレータＡ０に書き戻される。
【０２５２】
Ｔ１期間にＤステージ４０２では、処理６７１（Ｉ２命令６６０のデコード）が行われる。ここでは、処理６７２のＩ１命令の実行に伴うリングバッファの入出力ポインタの更新後の状態に基づいて、レジスタマッピング回路５３１によりリングバッファとして動作するレジスタの物理レジスタ番号へのマッピングが行われる。
【０２５３】
Ｔ２期間にＥステージ４０３で処理６７５（Ｉ２命令６６０の実行）が行われる。第１演算部２２２では、ＬＤ２Ｗ命令６６０ａのアドレス出力とアドレスの更新が行われる。汎用レジスタＧＲ８の値がアドレスとしてオペランドアクセス部２０４に出力され、ポストインクリメントされて汎用レジスタＧＲ８に書き戻される。
【０２５４】
また、第２演算部２２３では、ＭＡＣ命令６６０ｂの乗算が行われる。Ｒ１［０］として割り当てられているＢＲ１から既にロードが完了しているＤ［ｎ＋１］の値が、Ｒ３［０］として割り当てられているＢＲ３から既にロードが完了しているＣ［ｎ＋１］の値が読み出され、乗算器３７６で両者の乗算が行われ、乗算結果がＰラッチ３７９に書き込まれる。
【０２５５】
また、ＬＤ２Ｗ命令６６０ａの実行に伴い、論理レジスタＲ０，Ｒ１に各々１ワードのデータがロードされるので、論理レジスタＲ０の入力ポインタＢＩＰ０の値と論理レジスタＲ１の入力ポインタＢＩＰ１の値が、入力ポインタ更新回路５１４等によりそれぞれ１インクリメントされ、“１”に更新される。
【０２５６】
さらに、ＭＡＣ命令６６０ｂの実行に伴い、論理レジスタＲ１，Ｒ３が参照されるので、論理レジスタＲ１，Ｒ３の出力ポインタＢＯＰ１、ＢＯＰ３が、出力ポインタ更新回路５１８等により１インクリメントされて、“１”に更新される。
【０２５７】
Ｔ３期間のＭステージ４０４、Ｅ２ステージ４０６で、処理６７９（Ｉ２命令６６０の処理）が行われる。Ｍステージ４０４では、Ｒ０［０］として割り当てられているバッファレジスタＢＲ０にＤ［ｎ＋４］の値が、Ｒ１［０］として割り当てられているバッファレジスタＢＲ１にＤ［ｎ＋５］の値が各々書き込まれる。
【０２５８】
Ｅ２ステージ４０６では、Ｅステージ４０３での乗算結果であるＰラッチ３７９の値とアキュムレータＡ０の値が加算され、アキュムレータＡ０に書き戻される。
【０２５９】
Ｔ２期間にＤステージ４０２では、処理６７４（Ｉ１命令６５９のデコード）が行われる。ここでは、処理６７５のＩ２命令の実行に伴うリングバッファの入出力ポインタの更新後の状態に基づいて、レジスタマッピング回路５３１によりリングバッファとして動作するレジスタの物理レジスタ番号へのマッピングが行われる。
【０２６０】
ＬＤ２Ｗ命令はリングバッファがなくても実装する命令である。リングバッファ専用のＬＤ２命令がなくても、同様の効果が実現できる。このようにすると、追加する命令数を削減でき、基本命令長を短くできる、もしくは、他の命令を追加することが可能となる。ただし、データのバッファとして使用するレジスタは、論理レジスタＲ０〜Ｒ３の４本となり、図２９のプログラム例１の場合と比べると、使用する論理レジスタ本数が２本増加する。逆に言えば、１つの論理レジスタに複数のデータを同時にロードするＬＤ２命令を実装することにより、より使用する論理レジスタ本数が削減であり、繰り返し処理前後のオーバーヘッドを削減できる場合があり、より低コストで高性能なデータ処理装置を得られる効果がある。実際に命令セットを決定する際に、全体としてのトレードオフを考慮し、いずれのアプローチをとるかを判断すればよい。
【０２６１】
＜プログラム例３：単精度積和３（ＳＩＭＤ）＞
本データ処理装置は、１命令で２つの積和演算を実行するＳＩＭＤ演算機能を有している。図３７は積和演算を行うアセンブラでのプログラム例３を示す説明図である。すなわち、図３７で示すプログラム例３は、ＳＩＭＤ演算を行い、１クロックサイクルに２回のスループットで積和演算を実行する場合のプログラム例である。
【０２６２】
処理の内容は図２９で示すプログラム例１と同じであるが、Ｎは４の倍数であり、Ｃ［０］、および、Ｄ［０］は、６４ビット（８バイト）整置されているものとする。図２９で示したプログラム例１や図３４で示したプログラム例２と異なる点に特に着目し、説明を行う。
【０２６３】
コマンド行６９１〜６９７はブロックリピート処理を行うための前処理、コマンド行６９８はブロックリピート命令、コマンド行６９９〜７００が積和演算を行うためのリピートブロック、コマンド行７０１がブロックリピート処理後の後処理を行う部分である。
【０２６４】
ＬＤＴＣＩ命令６９３により、ＲＢＣＮＦビット８０が“１０”に、ＳＴＭビット８１が“０”に、ＷＭビット８２が“０”に、ＲＢＥ０ビット８３、ＲＢＥ１ビット８５、ＲＢＥ２ビット８７、ＲＢＥ３ビット８９が“１”に、ＯＰＭ０ビット８４、ＯＰＭ１ビット８６、ＯＰＭ２ビット８８、ＯＰＭ４ビット９０が“０１”に設定される。すなわち、論理レジスタＲ０〜Ｒ３が各々４エントリからなるリングバッファ構成（図１１参照）となり、ともにレジスタ値の参照により出力ポインタを更新する設定となる。
【０２６５】
ＳＩＭＤ演算によりオーバーヘッドなく最大のスループットで積和演算処理を行う場合、１６本のレジスタをデータバッファと使用する必要がある。論理レジスタＲ０，Ｒ１の８つのレジスタをＤ［ｉ］のバッファ、論理レジスタＲ２，Ｒ３の８つのレジスタをＣ［ｉ］のバッファとして使用する。ＲＥＰＩ命令６９８により、処理６９９，７００の２命令を、Ｎ／４回繰り返す。プログラムを単純にするため、ループのエピローグ処理で余分なロードの抑止を行っていないため、１２ワード分不要なデータのロードを行う。
【０２６６】
リングバッファモード専用の複数データ更新命令である“ＬＤ２Ｗ２  Ｒａ，  Ｒｂ＋”命令（更新ポイントサイズ＋１）は、メモリのＲｂ値のアドレス領域から４ワードのデータをロードしＲａとＲ（ａ＋１）それぞれに２組のデータ書き込み、Ｒｂの値をオペランドサイズに相当する８だけポストインクリメントするポストインクリメント付きレジスタ間接モードの４ワードロード命令である。ＬＤ２命令同様、図１４に示す命令フォーマットの命令であり、ＬＤ２命令とオペレーションコードが異なる。
【０２６７】
論理レジスタの格納データを参照するレジスタ値参照命令でもある“ＭＡＣ２Ａ  Ａｄ，Ｒａ，Ｒｂ”命令は積和演算命令であり、Ｒａ値とＲｂ値、及び、Ｒ（ａ＋１）値とＲ（ｂ＋１）値を各々乗算し、２つの乗算結果をＡｄ値に加算する。ＭＡＣ命令と同様、図１４に示す命令フォーマットの命令であり、ＭＡＣ命令とオペレーションコードが異なる。
【０２６８】
図３８はプログラム例３におけるブロックリピート処理時のパイプライン処理の詳細を説明図である。図３８はコマンド行６９９、７００の命令のブロックリピート処理中のパイプライン処理の詳細を示している。図３９は図３８のパイプライン処理時におけるリングバッファの様子を示す説明図である。以下、これらの図を参照して、プログラム例３におけるパイプライン処理の動作を説明する。
【０２６９】
ブロックリピート処理中のある期間Ｔ１でＥステージ４０３においてＩ１命令６９９を実行しており、その際、Ｄ［ｎ］とＣ［ｎ］、及び、Ｄ［ｎ＋１］とＣ［ｎ＋１］の乗算を行っている場合の処理の様子を示している。命令の処理としては、２クロックサイクル毎に処理を繰り返す。リングバッファの動作は、４クロックサイクル毎に入出力ポインタが同じ状態に戻る。
【０２７０】
Ｔ１期間にＥステージ４０３で処理７１２（Ｉ１命令６９９の実行）が行われる。第１演算部２２２では、ＬＤ２Ｗ２命令６９９ａのアドレス出力とアドレスの更新が行われる。汎用レジスタＧＲ９の値がアドレスとしてオペランドアクセス部２０４に出力され、ポストインクリメントされてＧＲ９に書き戻される。また、第２演算部２２３では、ＭＡＣ２Ａ命令６９９ｂの乗算が行われる。Ｒ０［０］として割り当てられているバッファレジスタＢＲ０からＤ［ｎ］の値が、Ｒ２［０］として割り当てられているバッファレジスタＢＲ２からＣ［ｎ］の値が、Ｒ１［０］として割り当てられているバッファレジスタＢＲ１からＤ［ｎ＋１］の値が、Ｒ３［０］として割り当てられているバッファレジスタＢＲ３からＣ［ｎ＋１］の値が、各々読み出され、乗算器３７６，３９１で２つの乗算が行われ、乗算結果がＰラッチ３７９、及びＰＸラッチ３９４に書き込まれる。
【０２７１】
また、ＬＤ２Ｗ２命令６９９ａの実行に伴い、論理レジスタＲ２，Ｒ３に各々２ワードのデータがロードされるので、論理レジスタＲ２の入力ポインタＢＩＰ２の値と論理レジスタＲ３の入力ポインタＢＩＰ３の値とが、入力ポインタ更新回路５１４等によりそれぞれ２インクリメントされ、循環して“０”に更新される。
【０２７２】
さらに、ＭＡＣ２Ａ命令６９９ｂの実行に伴い、論理レジスタＲ０、Ｒ１、Ｒ２、Ｒ３の値が参照されるので、論理レジスタＲ０〜Ｒ３の出力ポインタＢＯＰ０〜ＢＯＰ３が出力ポインタ更新回路５１８等により１インクリメントされて、“１”に更新される。
【０２７３】
Ｔ２期間のＭステージ４０４、Ｅ２ステージ４０６で、処理７１６（Ｉ１命令６９９の処理）が行われる。Ｍステージ４０４では、Ｒ２［２］として割り当てられているＧＲ２にＣ［ｎ＋４］の値が、Ｒ３［２］として割り当てられているＧＲ３にＣ［ｎ＋５］の値が、Ｒ２［３］として割り当てられているＧＲ６にＣ［ｎ＋６］の値が、Ｒ３［３］として割り当てられているＧＲ７にＣ［ｎ＋７］の値が、各々書き込まれる。Ｅ２ステージ４０６では、Ｅステージ４０３での乗算結果であるＰラッチ３７９の値、及び、ＰＸラッチ３９４の値と、アキュムレータＡ０の値が加算器３６２で３値加算され、アキュムレータＡ０に書き戻される。
【０２７４】
Ｔ１期間にＤステージ４０２では、処理７１１（Ｉ２命令７００のデコード）が行われる。
【０２７５】
同様に、Ｔ２期間にＥステージ４０３で処理７１５（Ｉ２命令７００の実行）が行われ、Ｔ３期間のＭステージ４０４、Ｅ２ステージ４０６で、処理７１９（Ｉ２命令７００の処理）が行われる。また、Ｔ２期間にＤステージ４０２では、処理７１４（Ｉ１命令６９９のデコード）が行われる。
【０２７６】
このようにオーバーヘッドのない積和演算処理を実行するためには、ロードデータのバッファとして１６本のレジスタが必須となる。しかし、リングバッファを使用することにより、物理的には１６本のレジスタを使用するが、命令として使用する論理レジスタ本数としてはＲ０〜Ｒ３の４本で処理が実現できる。リングバッファを用いなければ、アドレスを保持するレジスタも合わせ少なくとも１８本以上のレジスタが必要となり最低５ビットのレジスタ番号フィールドが必要となるが、リングバッファを用いることにより、レジスタ番号指定フィールドのビット数削減が可能であり、基本命令長を短くすることが可能である。
【０２７７】
また、８本の汎用レジスタをリングバッファの構成要素として使用しているので、８本の汎用レジスタの追加のみで１６本のバッファレジスタを構成できるようになっている。ただし、汎用レジスタＧＲ０〜ＧＲ７の値が破壊されるため、処理前後でＧＲ０〜ＧＲ７の値の待避、復帰が必要となる。
【０２７８】
本実施の形態では、追加ハードウェアの削減のため、８本のバッファレジスタを追加する構成としているが、１６本のバッファレジスタを追加実装するようにすれば、汎用レジスタＧＲ０〜ＧＲ７をリングバッファとして使用する必要がないため、汎用レジスタＧＲ０〜ＧＲ７がＲＢＣＮＦが“００”や“０１”の場合と同じように他の目的で使用できる。また、汎用レジスタＧＲ０〜ＧＲ７を更新しない場合、処理前後でＧＲ０〜ＧＲ７の値を待避、復帰する必要がなくなる。
【０２７９】
また、論理レジスタＲ０，Ｒ１をそれぞれ８エントリのリングバッファ構成とするような機能を追加すれば、データバッファとして使用する論理レジスタ本数は２本で済む。この場合、１つの論理レジスタ番号の４つのデータレジスタに一度にロードし、入力ポインタを４インクリメントする機能と、各々１つの論理レジスタ番号のデータを２つずつ参照しＳＩＭＤ演算を実行し、ポインタを２インクリメントする機能（命令）を追加実装すればよい。機能の追加は必要になるが、使用する論理レジスタ本数を更に削減することが出来る。また、同じ系列のデータに関して１つの論理レジスタ番号を使用する方が、端数処理やアドレスが非整置の場合の変則的な処理がより単純に実現できる利点がある。機能、命令追加のデメリットと実装による効果のトレードオフを考慮し、実装する機能を決定すればよい。
【０２８０】
＜プログラム例４：倍精度積和１＞
図４０は倍精度の乗算を伴う積和演算を行うプログラム例４を示す説明図である。プログラム例４では、倍精度の乗算（３２ビット×３２ビット）を伴う積和演算を行う。
【０２８１】
for (i = 0, sum = 0; i < N; ++i) sum += C[i] * D[i];。
【０２８２】
Ｃ［ｉ］、Ｄ［ｉ］はこれまでと異なり３２ビット（倍精度）であり、Ｃ［０］、および、Ｄ［０］は、３２ビット（４バイト）整置されているものとする。積和演算結果（ｓｕｍ）は１６ビットに丸められ、ｒ０に保持されるものとする。本実施の形態では、３２ビットｘ３２ビットの乗算を１クロックサイクルのスループットで処理する機能は実装しておらず、倍精度積和演算の最大スループットは１回／２クロックサイクルとなる。
【０２８３】
コマンド行７３１〜７３６はブロックリピート処理を行うための前処理、コマンド行７３７はブロックリピート命令、コマンド行７３８〜７３９が積和演算を行うためのリピートブロック、コマンド行７４０〜７４１がブロックリピート処理後の後処理を行う部分である。
【０２８４】
ＬＤＴＣＩ命令６５３により、ＲＢＣＮＦビット８０が“０１”に、ＳＴＭビット８１が“０”に、ＷＭビット８２が“０”に、ＲＢＥ０ビット８３、ＲＢＥ１ビット８５、ＲＢＥ２ビット８７、ＲＢＥ３ビット８９が“１”に、ＯＰＭ０ビット８４、ＯＰＭ１ビット８６が“１０”に、ＯＰＭ２ビット８８、ＯＰＭ４ビット９０が“０１”に設定される。すなわち、論理レジスタＲ０〜Ｒ３が各々２エントリからなるリングバッファ構成（図１０参照）となり、論理レジスタＲ０，Ｒ１はリピートブロックの最終命令で出力ポインタを更新し、論理レジスタＲ２，Ｒ３はレジスタ値の参照により出力ポインタを更新する設定となる。すなわち、リピートブロックの最終命令の実行を出力ポインタ更新の条件として設定できる。
【０２８５】
本実施の形態では、３２ビット×３２ビットの乗算を行う場合、２回の３２ビット×１６ビットの乗算に分割され処理される。この場合、３２ビット側のデータは２度参照される。図４０のプログラム例では、コマンド行７３８〜７３９のリピートブロックで１回の３２ビットの積和を行うが、Ｄ［ｉ］側を２度参照するようにしている。従って、ＯＰＭ０ビット８４，ＯＰＭ１ビット８６を“１０”に設定して、Ｄ［ｉ］を保持する側の論理レジスタＲ０，Ｒ１の出力ポインタの更新をリピートブロックの最終命令で実行するように設定している。
【０２８６】
ＣＬＲＡＣ２命令６９４ｂは、アキュムレータＡ０及びＡ１を共にゼロクリアする命令である。
【０２８７】
レジスタ値参照命令でもある“ＭＡＣＬＳ  Ａｄ，Ｒａ，Ｒｂ”命令は、上位１６ビットがＲａに、下位１６ビットがＲ（ａ＋１）に保持されている３２ビットの符号付き数と、Ｒｂに保持されている１６ビットの符号付き数を乗算し、乗算結果をアキュムレータＡｄに加算する命令である。“ＭＡＣＬＵ  Ａｄ，Ｒａ，Ｒｂ”命令は、上位１６ビットがＲａに、下位１６ビットがＲ（ａ＋１）に保持されている３２ビットの符号付き数と、Ｒｂに保持されている１６ビットの符号なし数を乗算し、乗算結果をアキュムレータＡｄに加算する命令である。
【０２８８】
図４０で示すプログラム例４では、Ｄ［ｉ］とＣ［ｉ］の上位１６ビットの積和演算結果をアキュムレータＡ０に、Ｄ［ｉ］とＣ［ｉ］の下位１６ビットの積和演算結果をアキュムレータＡ１に累積していく。
【０２８９】
図４１はコマンド行７３８、７３９の命令のブロックリピート処理中のパイプライン処理の詳細を示す説明図である。図４２は図４１のパイプライン処理時におけるリングバッファの様子を示す説明図である。以下、これらの図を参照してプログラム例４におけるパイプライン処理の動作を説明する。
【０２９０】
ブロックリピート処理中のある期間Ｔ１でＥステージ４０３においてＩ１命令７３８を実行しており、その際Ｄ［ｎ］とＣ［ｎ］の上位１６ビットの乗算を行っている場合の処理の様子を示している。命令の処理としては、２クロックサイクル毎に処理を繰り返す。リングバッファの動作は、４クロックサイクル毎に入出力ポインタが同じ状態に戻る。
【０２９１】
図中、“＿Ｈ”は３２ビットデータの上位１６ビットを、“＿Ｌ”は３２ビットデータの下位１６ビットを示すものとする。また、”．ｓ”は乗算する際に符号付き数として扱うことを、”．ｕ”は乗算する際に符号なし数として扱うことを示す。
【０２９２】
Ｔ１期間にＥステージ４０３で処理７５２（Ｉ１命令７３８の実行）が行われる。第１演算部２２２では、ＬＤ２Ｗ命令７３８ａのアドレス出力とアドレスの更新が行われる。第２演算部２２３では、ＭＡＣＬＳ命令７３８ｂの乗算が行われる。Ｒ０［０］として割り当てられているバッファレジスタＢＲ０からＤ［ｎ］の上位１６ビットが、Ｒ２［０］として割り当てられているバッファレジスタＢＲ２からＣ［ｎ］の上位１６ビットが、各々読み出され、両者を符号付き数として乗算器３７６で乗算が行われ、乗算結果がＰラッチ３７９に書き込まれる。
【０２９３】
また、Ｒ１［０］として割り当てられているバッファレジスタＢＲ１からＤ［ｎ］の下位１６ビットが、Ｒ２［０］として割り当てられているバッファレジスタＢＲ２からＣ［ｎ］の上位１６ビットが、各々読み出され、Ｒ１［０］値を符号なし数、Ｒ２［０］値を符号付き数として乗算器３９１で乗算が行われ、乗算結果がＰＸラッチ３９４に書き込まれる。また、ＬＤ２Ｗ命令７３８ａの実行に伴い、論理レジスタＲ２，Ｒ３に各々１ワードのデータがロードされるので、論理レジスタＲ２の入力ポインタＢＩＰ２の値と論理レジスタＲ３の入力ポインタＢＩＰ３の値とが、入力ポインタ更新回路５１４等によりそれぞれ１インクリメントされ、循環して“０”に更新される。
【０２９４】
さらに、ＭＡＣＬＳ命令７３８ｂの実行に伴い、論理レジスタＲ２が参照されるので、論理レジスタＲ２の出力ポインタＢＯＰ２が１インクリメントされて、“１”に更新される。
【０２９５】
一方、ＢＯＰ０、ＢＯＰ１の出力ポインタ更新モードは、リピートブロックの最終命令で更新する設定となっている。ＭＡＣＬＳ命令７３８ｂの実行に伴い、論理レジスタＲ０，Ｒ１も参照されるが、Ｉ１命令７３８はリピートブロックの最終命令ではないため、ＢＯＰ０、ＢＯＰ１は更新されない。
【０２９６】
Ｔ２期間のＭステージ４０４、Ｅ２ステージ４０６で、処理７５６（Ｉ１命令７３８の処理）が行われる。Ｍステージ４０４では、Ｒ２［１］として割り当てられているバッファレジスタＢＲ６にＣ［ｎ＋１］の上位１６ビットの値が、Ｒ３［１］として割り当てられているバッファレジスタＢＲ７にＣ［ｎ＋１］の下位１６ビットの値が各々書き込まれる。Ｅ２ステージ４０６では、加算器３６２においてＥステージ４０３での乗算結果であるＰラッチ３７９の値とＰＸラッチ３９４の値を１６ビット右シフトした値とがアキュムレータＡ０の値に加算され、アキュムレータＡ０に書き戻される。
【０２９７】
Ｔ１期間にＤステージ４０２では、処理７５１（Ｉ２命令７３９のデコード）が行われる。この際、処理７５２で行われたポインタ更新後の論理レジスタＲ０〜Ｒ３のうち、デコード対象の論理レジスタの入出力ポインタが認識される。
【０２９８】
Ｔ２期間にＥステージ４０３で処理７５５（Ｉ２命令７３９の実行）が行われる。第１演算部２２２では、ＬＤ２Ｗ命令７３９ａのアドレス出力とアドレスの更新が行われる。
【０２９９】
第２演算部２２３では、ＭＡＣＬＵ命令７３９ｂの乗算が行われる。Ｒ０［０］として割り当てられているバッファレジスタＢＲ０からＤ［ｎ］の上位１６ビットが、Ｒ３［０］として割り当てられているバッファレジスタＢＲ３からＣ［ｎ］の下位１６ビットが、各々読み出され、Ｒ０［０］値を符号付き数、Ｒ３［０］値を符号なし数として乗算器３７６で乗算が行われ、乗算結果がＰラッチ３７９に書き込まれる。また、Ｒ１［０］として割り当てられているバッファレジスタＢＲ１からＤ［ｎ］の下位１６ビットが、Ｒ３［０］として割り当てられているバッファレジスタＢＲ３からＣ［ｎ］の下位１６ビットが、各々読み出され、両者を符号なし数として乗算器３９１で乗算が行われ、乗算結果がＰＸラッチ３９４に書き込まれる。また、ＬＤ２Ｗ命令７３９ａの実行に伴い、論理レジスタＲ０，Ｒ１に各々１ワードのデータがロードされるので、論理レジスタＲ０の入力ポインタＢＩＰ０の値と論理レジスタＲ１の入力ポインタＢＩＰ１の値が、それぞれ入力ポインタ更新回路５１４等により１インクリメントされ、“１”に更新される。
【０３００】
さらに、ＭＡＣＬＵ命令７３９ｂの実行に伴い、論理レジスタＲ３が参照されるので、論理レジスタＲ３の出力ポインタＢＯＰ３が出力ポインタ更新回路５１８等により１インクリメントされて、“１”に更新される。
【０３０１】
そして、ＢＯＰ０、ＢＯＰ１の出力ポインタ更新モードは、リピートブロックの最終命令で更新する設定となっている。Ｉ２命令７３９はリピートブロックの最終命令であるため、出力ポインタ更新回路５１８等によりＢＯＰ０、ＢＯＰ１が１インクリメントされ、“１”に更新される。
【０３０２】
Ｔ３期間のＭステージ４０４、Ｅ２ステージ４０６で、処理７５９（Ｉ２命令７３９の処理）が行われる。Ｍステージ４０４では、Ｒ０［０］として割り当てられているバッファレジスタＢＲ０にＤ［ｎ＋２］の上位１６ビットの値が、Ｒ１［０］として割り当てられているバッファレジスタＢＲ１にＤ［ｎ＋２］の下位１６ビットの値が各々書き込まれる。Ｅ２ステージ４０６では、加算器３６２においてＥステージ４０３での乗算結果であるＰラッチ３７９の値とＰＸラッチ３９４の値を１６ビット右シフトした値とがアキュムレータＡ１の値に加算され、アキュムレータＡ１に書き戻される。
【０３０３】
Ｔ２期間にＤステージ４０２では、処理７５４（Ｉ１命令７３８のデコード）が行われる。この際、処理７５５で行われたポインタ更新後の論理レジスタＲ０〜Ｒ３のうち、デコード対象の論理レジスタの入出力ポインタが認識される。
【０３０４】
コマンド行７４０〜７４１は、ブロックリピート処理後の後処理を行う部分である。ＳＡＤＤ命令は７４０は、アキュムレータＡ０の値とアキュムレータＡ１を１６ビット右シフトした値を加算し、アキュムレータＡ０に書き戻す命令である。ＲＡＣ命令７４１はアキュムレータＡ０の値を３２ビット固定小数点フォーマットとして丸め演算を行い、３２ビットにサチュレーションして、上位１６ビットを論理レジスタＲ０（ＧＲ０）に、下位１６ビットを論理レジスタＲ１（ＧＲ１）に書き込む命令である。
【０３０５】
上述のプログラム例４では、論理レジスタＲ２と論理レジスタＲ３はレジスタ値の参照により出力ポインタを更新する設定となっているが、リピートブロックの最終命令で出力ポインタを更新する設定にしても、ＢＯＰ２の更新タイミングが変わるだけであり、処理内容は変わらない。いずれの設定を行ってもよい。
【０３０６】
上述のプログラム例のように、出力ポインタ更新モードとして、リピートブロックの最終命令で更新する設定とすることにより、ループ内で同一のデータが複数回参照されるデータに対しても、リングバッファが有効に作用する。また、同一のデータが複数回参照されている間に、次回のループ処理のためのロードの実行も当然可能である。プログラムの処理内容にも依存するが、ＩＩＲフィルタ処理のデータやＦＦＴ等複素数演算を行う場合など、倍精度演算以外にも同一のデータを複数回参照する場合も多く、このような制御は有効である。リピートブロックの最終命令で出力ポインタが自動的に更新されるため、命令として出力ポインタを更新する命令と更新しない命令を別々に持つ必要もなく、実装する命令数を削減することが可能である。出力ポインタ更新命令を用いて明示的に出力ポインタを更新する必要もないので、コードサイズやサイクル数のオーバーヘッドも生じない。
【０３０７】
条件分岐命令を使用してループを形成する場合、ループ内でカウンタ値の更新、終了条件判定を行い、ループを構成する繰り返しブロックの最後で条件分岐命令によりループ処理継続時にループの先頭に分岐するような構成が一般的である。このプログラム例では、リピートブロックの最終命令でポインタ更新を行う例を示したが、分岐命令を使用してループを実現する場合にはＯＰＭｉビット８４、８６、８８、９０を“１１”の設定を用い分岐命令実行時に自動的にリングバッファとして動作しているレジスタの出力ポインタが＋１更新されるようにすればよい。すなわち、分岐命令の実行時を出力ポインタ更新の条件として設定することができる。
【０３０８】
この場合も、実行する命令で明示的にポインタの更新を指定しなくても暗黙的に出力ポインタの更新が行われるため、コードサイズやサイクル数のオーバーヘッドは生じず、同様の効果を奏することが可能である。ただし、繰り返し処理の中で、条件分岐やサブルーチンコールを行う場合には、うまく適応できない場合もある。本実施の形態では、ブロックリピート命令を実装しているが、ブロックリピート命令を実装していない場合には非常に有効である。
【０３０９】
また、１レベルのブロックリピート機能のみを実装している場合で、最も内側のループにブロックリピート命令を用い、１つ上のループで条件分岐命令を用いてループを実現している多重ループ処理を行う際に、外側のループで出力ポインタの更新制御が可能となり、変数毎に用途に応じたポインタ更新が可能となるため、有効である。また、ループのプリミティブ命令（カウンタのデクリメント、カウント値の判定、条件分岐等を行う高機能な条件分岐命令）などを実装している場合には、ループのプリミティブ命令の実行に伴い、ポインタを更新するようにしてもよい。
【０３１０】
また、出力ポインタの更新モードを論理レジスタ番号毎に任意に設定できるので、各論理レジスタに割り当てている変数の用途に応じて、最適な設定を行うことが可能であり、コードサイズやサイクル数のオーバーヘッドを削減することが可能である。本実施の形態では、ＯＰＭｉビット８４、８６、８８、９０で“１０”と“１１”の機能を別に割り当てているが、設定するフィールドを節約するために、同じ設定値で、両者のいずれかが起こった場合に出力ポインタを更新するようなモードの割り当て方をしてもよい。
【０３１１】
また、本実施の形態では、リピートブロックの最終命令及び分岐命令実行時に暗黙的に出力ポインタの更新を行う機能を実装しているが、ポインタ更新を行う命令のアドレスを設定し、実行命令のＰＣ値と設定アドレスを比較する機能を実装し、設定アドレスと一致した命令を実行した際に出力ポインタを更新するようにしてもよい。この場合、ハードウェア量は多少増加し、またプログラムとしてもアドレス設定するオーバーヘッドは生じるが、繰り返し処理中は命令で明示的に出力ポインタの更新を指示しなくても暗黙的な更新がなされるので、繰り返し処理中のオーバーヘッドは生じない。繰り返し処理の処理単位の終了で出力ポインタを更新する場合が最も頻度が高いが、基本処理単位の複数単位でループを形成する場合もある。このような場合も含めて、対応が可能となる。
【０３１２】
また、ＯＰＭｉビット８４、８６、８８、９０が“１０”の設定は、ブロックリピートの場合のみでなく、単一命令リピート処理時も有効である。実装する命令セットに依存するが、１命令の実行に複数サイクルを要する場合等に効果がでる場合がある。また、本実施の形態のように、シーケンシャル実行２命令の単一命令リピートも可能であり、どのレベルまでを対象とするかを様々なトレードオフを考慮し決めればよい。
【０３１３】
＜プログラム例５：倍精度積和２（６４ビットロード）＞
図４３は倍精度の乗算を伴う積和演算を行うプログラム例５を示す説明図である。メモリの機能や構成によるが、バス幅を最大限に生かしメモリアクセス回数を減らした方が消費電力を低減できる場合も多い。ここでは、６４ビットロード命令を使用してプログラミングした例を示す。対象となる処理内容は図４０に示したプログラム例４と同じである。ただし、Ｃ［０］、および、Ｄ［０］は６４ビット整置されているものとする。また、Ｎは偶数とする。
【０３１４】
コマンド行７７１〜７７６はブロックリピート処理を行うための前処理、コマンド行７７７はブロックリピート命令、コマンド行７７８〜７８１が積和演算を行うためのリピートブロック、コマンド行７８２〜７８３がブロックリピート処理後の後処理を行う部分である。
【０３１５】
ＬＤＴＣＩ命令７７３により、ＲＢＣＮＦビット８０が“１０”に、ＳＴＭビット８１が“０”に、ＷＭビット８２が“０”に、ＲＢＥ０ビット８３、ＲＢＥ１ビット８５、ＲＢＥ２ビット８７、ＲＢＥ３ビット８９が“１”に、ＯＰＭ０ビット８４、ＯＰＭ１ビット８６が“１０”に、ＯＰＭ２ビット８８、ＯＰＭ４ビット９０が“０１”に設定される。すなわち、論理レジスタＲ０〜Ｒ３が各々４エントリからなるリングバッファ構成となり、論理レジスタＲ０，Ｒ１はリピートブロックの最終命令で出力ポインタを更新し、論理レジスタＲ２，Ｒ３はレジスタ値の参照により出力ポインタを更新する設定となる。いずれの出力ポインタも、出力ポインタ更新命令により、明示的に更新することは可能である。演算のスループットは変わらないが、一度にロードするデータ数が増えるため、図４０のプログラム例に比べ必要となるレジスタ数が増加する。
【０３１６】
図４４はリングバッファの出力ポインタ更新命令（ＵＰＤＢＯＰ）のビット割り付けを示す説明図である。フィールド７８４、７８５、７９０はオペレーションコードフィールド、フィールド７８６〜７８９は、各々論理レジスタＲ０〜Ｒ３のポインタ更新を示すビットであり、“１”のとき対応する出力ポインタを１インクリメントする。
【０３１７】
図４５はコマンド行７７８〜７８１の命令のブロックリピート処理中のパイプライン処理の詳細を示すブロック図である。図４６は図４５のパイプライン処理時におけるリングバッファの様子を示す説明図である。以下、これらの図を参照してプログラム例５におけるパイプライン動作について説明する。
【０３１８】
ブロックリピート処理中のある期間Ｔ１でＥステージ４０３においてＩ１命令７７８を実行しており、その際Ｄ［ｎ］とＣ［ｎ］の上位１６ビットの乗算を行っている場合の処理の様子を示している。命令の処理としては、４クロックサイクル毎に処理を繰り返す。リングバッファの動作は、８クロックサイクル毎に入出力ポインタが同じ状態に戻る。
【０３１９】
Ｔ１期間にＥステージ４０３で処理７９２（Ｉ１命令７７８の実行）が行われる。第１演算部２２２では、ＬＤ２Ｗ２命令７７８ａのアドレス出力とアドレスの更新が行われる。
【０３２０】
第２演算部２２３では、ＭＡＣＬＳ命令７７８ｂの乗算が行われる。Ｒ０［０］として割り当てられているバッファレジスタＢＲ０からＤ［ｎ］の上位１６ビットが、Ｒ２［０］として割り当てられているバッファレジスタＢＲ２からＣ［ｎ］の上位１６ビットが各々読み出され、乗算器３７６で乗算が行われ、乗算結果がＰラッチ３７９に書き込まれる。Ｒ１［０］として割り当てられているバッファレジスタＢＲ１からＤ［ｎ］の下位１６ビットが、Ｒ２［０］として割り当てられているバッファレジスタＢＲ２からＣ［ｎ］の上位１６ビットが各々読み出され、乗算器３９１で乗算が行われ、乗算結果がＰＸラッチ３９４に書き込まれる。
【０３２１】
また、ＬＤ２Ｗ２命令７７８ａの実行に伴い、論理レジスタＲ０とＲ１に各々２ワードのデータがロードされるので、論理レジスタＲ０の入力ポインタＢＩＰ０の値と論理レジスタＲ１の入力ポインタＢＩＰ１の値とが、入力ポインタ更新回路５１４等により２インクリメントされ、循環して“０”に更新される。
【０３２２】
さらに、ＭＡＣＬＳ命令７７８ｂの実行に伴い、論理レジスタＲ２が参照されるので、論理レジスタＲ２の出力ポインタＢＯＰ２が出力ポインタ更新回路５１８等により１インクリメントされて、“１”に更新される。
【０３２３】
一方、出力ポインタＢＯＰ０、ＢＯＰ１の出力ポインタ更新モードとして、リピートブロックの最終命令で更新する設定となっているが、Ｉ１命令７７８はリピートブロックの最終命令ではないため、出力ポインタＢＯＰ０、ＢＯＰ１は更新されない。
【０３２４】
Ｔ２期間のＭステージ４０４、Ｅ２ステージ４０６で、処理７９６（Ｉ１命令７７８の処理）が行われる。Ｍステージ４０４では、Ｒ０［２］として割り当てられているＧＲ０にＤ［ｎ＋２］の上位１６ビットの値が、Ｒ１［２］として割り当てられているＧＲ１にＤ［ｎ＋２］の下位１６ビットの値が、Ｒ０［３］として割り当てられているＧＲ４にＤ［ｎ＋３］の上位１６ビットの値が、Ｒ１［３］として割り当てられているＧＲ５にＤ［ｎ＋３］の下位１６ビットの値が、各々書き込まれる。Ｅ２ステージ４０６では、加算器３６２においてＥステージ４０３での乗算結果であるＰラッチ３７９の値とＰＸラッチ３９４の値を１６ビット右シフトした値とがアキュムレータＡ０の値に加算され、アキュムレータＡ０に書き戻される。
【０３２５】
Ｔ１期間にＤステージ４０２では、処理７９１（Ｉ２命令７７９のデコード）が行われる。この際、処理７９２で行われたポインタ更新後の論理レジスタＲ０〜Ｒ３のうち、デコード対象の論理レジスタの入出力ポインタが認識される。
【０３２６】
Ｔ２期間にＥステージ４０３で処理７９５（Ｉ２命令７７９の実行）が行われる。ＵＰＤＯＢＰ命令はポインタの更新のみ行い、演算処理等は行わないので、第１演算部２２２では、有効なオペレーションは行われない。第２演算部２２３では、ＭＡＣＬＵ命令７７９ｂの乗算が行われる。Ｒ０［０］として割り当てられているバッファレジスタＢＲ０からＤ［ｎ］の上位１６ビットが、Ｒ３［０］として割り当てられているバッファレジスタＢＲ３からＣ［ｎ］の下位１６ビットが各々読み出され、乗算器３７６で乗算が行われ、乗算結果がＰラッチ３７９に書き込まれる。Ｒ１［０］として割り当てられているバッファレジスタＢＲ１からＤ［ｎ］の下位１６ビットが、Ｒ３［０］として割り当てられているバッファレジスタＢＲ３からＣ［ｎ］の下位１６ビットが各々読み出され、乗算器３９１で乗算が行われ、乗算結果がＰＸラッチ３９４に書き込まれる。
【０３２７】
ＭＡＣＬＵ命令７７９ｂの実行に伴い、論理レジスタＲ３が参照されるので、Ｒ３の出力ポインタＢＯＰ３が出力ポインタ更新回路５１８等により１インクリメントされて、“１”に更新される。出力ポインタＢＯＰ０、ＢＯＰ１の出力ポインタ更新モードとして、リピートブロックの最終命令で更新する設定となっている。Ｉ２命令７７９はリピートブロックの最終命令ではないが、ＵＰＤＢＯＰ命令７７９ａの実行により、論理レジスタＲ０，Ｒ１の出力ポインタの更新が行われる。したがって、出力ポインタ更新回路５１８等により出力ポインタＢＯＰ０、ＢＯＰ１が１インクリメントされ、“１”に更新される。
【０３２８】
Ｔ３期間のＥ２ステージ４０６で、処理７９９（Ｉ２命令７７９の処理）が行われる。Ｅ２ステージ４０６では、加算器３６２においてＥステージ４０３での乗算結果であるＰラッチ３７９の値とＰＸラッチ３９４の値を１６ビット右シフトした値とがアキュムレータＡ１の値に加算され、Ａ１に書き戻される。Ｍステージ４０４では、有効なオペレーションは行われない。
【０３２９】
Ｔ２期間にＤステージ４０２では、処理７９４（Ｉ１命令７７８のデコード）が行われる。この際、処理７９５で行われたポインタ更新後の論理レジスタＲ０〜Ｒ３のうち、デコード対象の論理レジスタの入出力ポインタが認識される。
【０３３０】
Ｔ３期間のＥステージ４０３で処理７９８（Ｉ３命令７８０の実行）が行われる。第１演算部２２２では、ＬＤ２Ｗ２命令７８０ａのアドレス出力とアドレスの更新が行われる。第２演算部２２３では、処理７９２と同様に２つの乗算が行われる。また、ＬＤ２Ｗ２命令７８０ａの実行に伴い、論理レジスタＲ２，Ｒ３に各々２ワードのデータがロードされるので、論理レジスタＲ２の入力ポインタＢＩＰ２の値と論理レジスタＲ３の入力ポインタＢＩＰ３の値とが、入力ポインタ更新回路５１４等により２インクリメントされ、循環して“０”に更新される。さらに、ＭＡＣＬＳ命令７８０ｂの実行に伴い、論理レジスタＲ２が参照されるので、論理レジスタＲ２の出力ポインタＢＯＰ２が出力ポインタ更新回路５１８等により１インクリメントされて、“１”に更新される。
【０３３１】
一方、出力ポインタＢＯＰ０、ＢＯＰ１の出力ポインタ更新モードとして、リピートブロックの最終命令で更新する設定となっているが、Ｉ３命令７８０はリピートブロックの最終命令ではないため、出力ポインタＢＯＰ０、ＢＯＰ１は更新されない。
【０３３２】
Ｔ４期間のＭステージ４０４、Ｅ２ステージ４０６で、処理８０２（Ｉ１命令７８０の処理）が行われる。Ｍステージ４０４では、Ｒ２［２］として割り当てられている汎用レジスタＧＲ２にＣ［ｎ＋２］の上位１６ビットの値が、Ｒ３［２］として割り当てられている汎用レジスタＧＲ３にＣ［ｎ＋２］の下位１６ビットの値が、Ｒ２［３］として割り当てられている汎用レジスタＧＲ６にＣ［ｎ＋３］の上位１６ビットの値が、Ｒ３［３］として割り当てられている汎用レジスタＧＲ７にＣ［ｎ＋３］の下位１６ビットの値が、各々書き込まれる。
【０３３３】
Ｔ４期間にＥステージ４０３で処理８０１（Ｉ４命令７８１の実行）が行われる。ＮＯＰ命令はノーオペレーション命令であり、第１演算部２２２では有効なオペレーションは行われない。第２演算部２２３では、処理７９５と同様に２つの乗算が行われる。ＭＡＣＬＵ命令７８１ｂの実行に伴い、論理レジスタＲ３が参照されるので、論理レジスタＲ３の出力ポインタＢＯＰ３が出力ポインタ更新回路５１８等により１インクリメントされて、“１”に更新される。
【０３３４】
一方、出力ポインタＢＯＰ０、ＢＯＰ１の出力ポインタ更新モードとして、リピートブロックの最終命令で更新する設定となっている。Ｉ４命令７８１はリピートブロックの最終命令であるため、出力ポインタＢＯＰ０、ＢＯＰ１が出力ポインタ更新回路５１８等により１インクリメントされ、“１”に更新される。
【０３３５】
上述のプログラム例５では、論理レジスタＲ２と論理レジスタＲ３とはレジスタ値の参照により出力ポインタを更新する設定となっているが、リピートブロックの最終命令で出力ポインタを更新する設定にしても、出力ポインタＢＯＰ２の更新タイミングが変わるだけであり、処理内容も処理サイクル数も変わらない。ただし、ＵＰＤＢＯＰ命令７７９ａで、論理レジスタＲ２と論理レジスタＲ３の出力ポインタを更新する必要がある。
【０３３６】
また、この例では７８１ａはＮＯＰ命令であり有効な処理は行わないので、出力ポインタ更新モードとして命令のみでポインタの更新を行うモード（ＯＰＭｉビット＝“００”）にし、処理７８１ａとして出力ポインタ更新命令ＵＰＤＢＯＰを実行するようにしても、処理内容も処理サイクル数も変わらない。
【０３３７】
上述のプログラム例５のように、出力ポインタ更新命令ＵＰＤＢＯＰで明示的に出力ポインタを切り替える機能を実装することにより、リピートブロック内において複数回参照する値を保持するレジスタに対し、プログラムの処理の都合に依存したリピートブロック内の任意の位置で出力ポインタの更新を行うことが可能になる。複数の繰り返し単位を統合して処理サイクル数を削減したり、消費電力を低減する場合などでは、有効である。ただし、プログラムによってはポインタ更新のために処理サイクル／コードサイズにオーバーヘッドが生じることもある。
【０３３８】
また、リピートブロックの最終命令で更新する設定でもＵＰＤＢＯＰ命令による更新を有効にすることにより、リピートブロックの最終命令ではＵＰＤＢＯＰ命令を実行しなくてもポインタ更新が可能になるため、ＵＰＤＢＯＰ命令実行によるオーバーヘッドの削減が可能な場合がある。
【０３３９】
この処理例では、各レジスタ毎に出力ポインタを更新する機能を用いず、全ポインタを一括更新する機能があれば、有効である。すなわち、全ポインタを一括更新する命令機能のみを実装しても、有効な場合は多い。ただし、リングバッファモードとして動作するレジスタに割り当てる変数の用途によっては、個別に更新できるようにしておいた方が、より有効な場合もある。
【０３４０】
本実施の形態では、ポインタの更新は＋１のみに限定されているためポインタの更新サイズの指定は不要である。ただし、ＳＩＭＤ演算機能を実装する場合などで、１つの論理レジスタから一度に複数のデータを読み出し、ポインタを２以上更新することもある場合は、ポインタの更新サイズも出力ポインタ更新命令で指定できるようにしてもよい。
【０３４１】
＜プログラム例６：単精度積和４（２サンプル同時処理）＞
図４７は単精度積和演算で２サンプル分同時に処理する場合のプログラム例６を示す説明図である。プログラム例６は以下の処理を行う。
【０３４２】
for (i = 0, sum1 = 0, sum2 = 0; i < N; ++i) {
sum1 += C[i] * D[i];
sum2 += C[i] * D[i+1];
}。
【０３４３】
なお、Ｎは２の倍数であるとする。Ｃ［ｉ］、Ｄ［ｉ］は、ｉの順番にアドレスの増加方向に順に内蔵データメモリ上に配置されており、Ｃ［０］、および、Ｄ［０］は、３２ビット（４バイト）整置されているものとする。積和演算結果（ｓｕｍ１、ｓｕｍ２）は１６ビットに丸められ、各々ｒ０、ｒ１に保持されるものとする。
【０３４４】
自己相関をとったり、シングルサンプルのＦＩＲフィルタ処理を行う場合に、２サンプル分同時に処理することにより、データアクセス回数を半減することができ、消費電力を低減することが出来る。また、シングルサンプル処理では、処理のスループットをあげるためにメモリデータの整置を考慮して処理の最適化を図る必要があるが、２サンプル同時に処理することにより、整置に関する配慮を行わずに済む場合が多い。このプログラム例では、３２ビット非整置になった場合に対する配慮が不要になる。
【０３４５】
コマンド行８１１〜８１７はブロックリピート処理を行うための前処理、コマンド行８１８はブロックリピート命令、コマンド行８１９〜８２０が積和演算を行うためのリピートブロック、コマンド行８２１がブロックリピート処理後の後処理を行う部分である。
【０３４６】
ＬＤＴＣＩ命令８１３は制御レジスタＣＲ４（ＲＢＣ）の初期設定を行う。この命令により、ＲＢＣＮＦビット８０が“００”に、ＳＴＭビット８１が“０”に、ＷＭビット８２が“０”に、ＲＢＥ０ビット８３とＲＢＥ１ビット８５が“１”に、ＯＰＭ０ビット８４とＯＰＭ１ビット８６が“０１”に設定される。すなわち、論理レジスタＲ０とＲ１が各々４エントリからなるリングバッファ構成（図９参照）となり、ともにレジスタ値の参照により出力ポインタを更新する設定となる。
【０３４７】
論理レジスタＲ０の４つのレジスタをＤ［ｉ］のバッファ、論理レジスタＲ１の４つのレジスタをＣ［ｉ］のバッファとして使用する。ＲＥＰＩ命令８１８により、コマンド行８１９，８２０の２命令を、Ｎ／２回繰り返す。プログラムを単純にするため、ループのエピローグ処理で余分なロードの抑止を行っていないため、５ワード分不要なデータのロードを行う。
【０３４８】
“ＭＡＣ２Ｘ  Ａｄ，Ｒａ，Ｒｂ”命令は、２サンプル同時処理を行うための特殊なＳＩＭＤ積和演算命令である。Ｒａ値とＲｂ値を乗算し、乗算結果をＡｄ値に加算する。また、Ｒａの”（出力ポインタ値＋１）％４”が示すエントリの値とＲｂ値を乗算し、乗算結果をＡ（ｄ＋１）値に加算する。Ｒａについては、２つのデータを参照するが、出力ポインタは”＋１”だけ更新する。
【０３４９】
図４８はコマンド行８１９、８２０の命令のブロックリピート処理中のパイプライン処理の詳細を示す説明図である。図４９は図４８のパイプライン処理時におけるリングバッファの様子を示す説明図である。以下、これらの図を参照してプログラム例６におけるパイプライン動作について説明する。
【０３５０】
ブロックリピート処理中のある期間Ｔ１でＥステージ４０３においてＩ１命令８１９を実行しており、その際Ｄ［ｎ］とＣ［ｎ］、及び、Ｄ［ｎ＋１］とＣ［ｎ］の乗算を行っている場合の処理の様子を示している。命令の処理としては、２クロックサイクル毎に処理を繰り返す。リングバッファの動作は、４クロックサイクル毎に入出力ポインタが同じ状態に戻る。
【０３５１】
Ｔ１期間にＥステージ４０３で処理８３２（Ｉ１命令８１９の実行）が行われる。第１演算部２２２では、ＬＤ２命令８１９ａのアドレス出力とアドレスの更新が行われる。また、第２演算部２２３では、ＭＡＣ２Ｘ命令８１９ｂの乗算が行われる。Ｒ０［０］として割り当てられているバッファレジスタＢＲ０からＤ［ｎ］の値が、Ｒ０［１］として割り当てられているバッファレジスタＢＲ４からＤ［ｎ＋１］の値が、Ｒ１［０］として割り当てられているバッファレジスタＢＲ１からＣ［ｎ］の値が、各々読み出され、乗算器３７６と３９１で”Ｄ［ｎ］＊Ｃ［ｎ］”と”Ｄ［ｎ＋１］＊Ｃ［ｎ］”の２つの乗算が行われ、乗算結果がＰラッチ３７９、及び、ＰＸラッチ３９４に書き込まれる。論理レジスタＲ０の出力ポインタ値は“０”であるが、論理レジスタＲ０［（ＢＯＰ０＋１）％４］を参照することによりＤ［ｎ＋１］を参照している。
【０３５２】
また、ＬＤ２命令８１９ａの実行に伴い、論理レジスタＲ１に２ワードのデータがロードされるので、論理レジスタＲ１の入力ポインタＢＩＰ１の値が、入力ポインタ更新回路５１４等により２インクリメントされ、循環して“０”に更新される。
【０３５３】
さらに、ＭＡＣ２Ｘ命令８１９ｂの実行に伴い、論理レジスタＲ０、Ｒ１の値が参照されるので、論理レジスタＲ０、Ｒ１の出力ポインタＢＯＰ０、ＢＯＰ１がそれぞれ出力ポインタ更新回路５１８等により１インクリメントされて、“１”に更新される。論理レジスタＲ０に関して、Ｒ０［０］とＲ０［１］の２つの値が参照されるが、出力ポインタは”＋１”のみ更新される。
【０３５４】
Ｔ２期間のＭステージ４０４、Ｅ２ステージ４０６で、処理８３３（Ｉ１命令８１９の処理）が行われる。Ｍステージ４０４では、Ｒ１［２］として割り当てられているバッファレジスタＢＲ３にＣ［ｎ＋２］の値が、Ｒ１［３］として割り当てられているバッファレジスタＢＲ７にＣ［ｎ＋３］の値が、各々書き込まれる。Ｅ２ステージ４０６では、Ｅステージ４０３での乗算結果の加算処理が行われる。Ｐラッチ３７９の値とアキュムレータＡ０の値が加算器３６２で加算され、アキュムレータＡ０に書き戻される。ＰＸラッチ３９４の値と、アキュムレータＡ１の値が加算器３９５で加算され、Ａ１に書き戻される。
【０３５５】
Ｔ１期間にＤステージ４０２では、処理８３１（Ｉ２命令８２０のデコード）が行われる。この際、処理８３２で行われたポインタ更新後の論理レジスタＲ０〜Ｒ３のうち、デコード対象の論理レジスタの入出力ポインタが認識される。
【０３５６】
同様に、Ｔ２期間にＥステージ４０３で処理８３５（Ｉ２命令８２０の実行）が行われ、Ｔ３期間のＭステージ４０４、Ｅ２ステージ４０６で、処理８３９（Ｉ２命令８２０の処理）が行われる。また、Ｔ２期間にＤステージ４０２では、処理８３４（Ｉ１命令８１９のデコード）が行われる。
【０３５７】
このように、多少変則的なデータ参照、及び、ポインタ更新を行う機能を追加することにより、リングバッファを使用したシングルサンプル処理に関する２サンプル同時処理が容易に実現できる。１組のデータロードで２サンプル分の処理を行うため、メモリアクセス回数を削減できる。同じ係数（Ｃ［ｉ］）が同じサイクルで２回、同じデータ（Ｄ［ｉ＋１］）が次サイクルと合わせて２回参照される。また、シングルサンプル対応の処理を行う場合も３２ビット整置されている状態でのデータについて処理を行えばよいので、３２ビット非整置状態を考慮しないでプログラミングができ、プログラムを単純化できる。１サンプルずつ処理する場合には、データに関して３２ビット整置されている場合と、３２ビット非整置の場合とで異なる処理を行う必要がある。
【０３５８】
また、２サンプル以上の複数のデータについて処理する場合も、ハードウェア制御は複雑になるが、同様の技術が適用可能である。
【０３５９】
＜プログラム例７：メモリ−メモリ間転送＞
図５０はメモリ−メモリ間転送を行う場合のプログラム例７を示す説明図である。プログラム例７ではＣ言語で表記すると、以下の処理を行う。
【０３６０】
for (i = 0; i < N; ++i) D[i] = S[i];。
【０３６１】
プログラム例７では、Ｓ［ｉ］をＤ［ｉ］にＮワード分転送する。（ｉは０〜（Ｎ−１））Ｓ［ｉ］、Ｄ［ｉ］は１６ビットデータであり、Ｓ［０］、Ｄ［０］のアドレスは６４ビット整置されており、Ｎは４の倍数であるものとする。
【０３６２】
本データ処理装置は、１クロックサイクルに６４ビットの内蔵データメモリデータを読み書きできる。従って、１クロックサイクルに３２ビットのスループットでメモリ−メモリ間のデータ転送が実現できる。
【０３６３】
コマンド行８５１〜８５５はリピート処理を行うための前処理、コマンド行８５６は単一命令リピート命令、コマンド行８５７〜８５８がリピート対象命令、コマンド行８５９がリピート処理後の後処理を行う部分である。なお、命令ＳＲＥＰＩに続く命令がショート命令の場合、連続する２つのショート命令がリピート対象となる。図５０の例では、コマンド行８５７，８５８の命令は共にショート命令であるため、これら２つの命令がリピート対象となる。
【０３６４】
ＬＤＴＣＩ命令８５３により、ＲＢＣＮＦビット８０が“０１”に、ＳＴＭビット８１が“０”に、ＷＭビット８２が“０”に、ＲＢＥ０ビット８３、ＲＢＥ１ビット８５、ＲＢＥ２ビット８７、ＲＢＥ３ビット８９が“１”に、ＯＰＭ０ビット８４、ＯＰＭ１ビット８６、ＯＰＭ２ビット８８、ＯＰＭ４ビット９０が“０１”に設定される。すなわち、論理レジスタＲ０〜Ｒ３が各々２エントリからなるリングバッファ構成（図１０参照）となり、ともにレジスタ値の参照により出力ポインタを更新する設定となる。
【０３６５】
“ＬＤ４Ｗ  Ｒａ，  Ｒｂ＋”命令（更新ポインタサイズ＋１）は、Ｒｂ値のアドレスで指定されるメモリ領域から４ワードのデータをロードし、Ｒａ、Ｒ（ａ＋１）、Ｒ（ａ＋２）、Ｒ（ａ＋３）にデータ書き込み、Ｒｂの値をオペランドサイズに相当する８だけポストインクリメントするポストインクリメント付きレジスタ間接モードの４ワードロード命令である。
【０３６６】
ストア命令（メモリ格納命令）である“ＳＴ４Ｗ  Ｒａ，  Ｒｂ＋”命令は、Ｒａ、Ｒ（ａ＋１）、Ｒ（ａ＋２）、Ｒ（ａ＋３）の値をＲｂ値のアドレスで指定されるメモリ領域にストアし、Ｒｂの値をオペランドサイズに相当する８だけポストインクリメントするポストインクリメント付きレジスタ間接モードの４ワードストア命令である。
【０３６７】
レジスタ間接モードの４ワードロード命令と４ワードストア命令は、共にショートフォーマットの命令であり、シーケンシャルに実行する２つのサブ命令として１つの３２ビット命令となる。４ワードロード命令と４ワードストア命令を単一命令リピートにより繰り返し実行する。
【０３６８】
図５１はコマンド行８５７、８５８の命令のリピート処理中のパイプライン処理の詳細を示す説明図である。図５２はその際のリングバッファの様子を示す説明図である。以下、これらの図を参照してプログラム例７におけるパイプライン動作について説明する。
【０３６９】
リピート処理中のある期間Ｔ１でＥステージ４０３においてＩ１命令８５７を実行しており、その際Ｓ［ｎ＋４］〜Ｓ［ｎ＋７］のロード命令を処理している場合の処理の様子を示している。命令の処理としては、２クロックサイクル毎に処理を繰り返す。リングバッファの動作は、４クロックサイクル毎に入出力ポインタが同じ状態に戻る。
【０３７０】
Ｔ１期間にＥステージ４０３で処理８６２（Ｉ１命令８５７の実行）が行われる。第１演算部２２２では、ＬＤ４Ｗ命令８５７のアドレス出力とアドレスの更新が行われる。汎用レジスタＧＲ８の値がアドレスとしてオペランドアクセス部２０４に出力され、ポストインクリメントされて汎用レジスタＧＲ８に書き戻される。第２演算部２２３では、有効な処理は行われない。ＬＤ４Ｗ命令８５７の実行に伴い、論理レジスタＲ０〜Ｒ３に各々１ワードのデータがロードされるので、４つの入力ポインタＢＩＰ０〜ＢＩＰ３の値が、入力ポインタ更新回路５１４等によりそれぞれ１インクリメントされ、循環して“０”に更新される。
【０３７１】
Ｔ２期間のＭステージ４０４で、処理８６６（Ｉ１命令８５７の処理）が行われる。Ｍステージ４０４では、Ｓ［ｎ＋４］、Ｓ［ｎ＋５］、Ｓ［ｎ＋６］、Ｓ［ｎ＋７］の値がメモリから読み出され、Ｒ０［１］、Ｒ１［１］、Ｒ２［１］、Ｒ３［１］として割り当てられているバッファレジスタＢＲ４、ＢＲ５、ＢＲ６、ＢＲ７に、各々書き込まれる。
【０３７２】
Ｔ１期間にＤステージ４０２では、処理８６１（Ｉ２命令８５８のデコード）が行われる。この際、処理８６２で行われたポインタ更新後の論理レジスタＲ０〜Ｒ３の入力ポインタが認識される。
【０３７３】
Ｔ２期間にＥステージ４０３で処理８６５（Ｉ２命令８５８の実行）が行われる。第１演算部２２２では、ＳＴ４Ｗ命令８５８のアドレス出力、アドレスの更新、ストアデータの読み出しが行われる。汎用レジスタＧＲ９の値がアドレスとしてオペランドアクセス部２０４に出力され、ポストインクリメントされて汎用レジスタＧＲ９に書き戻される。Ｒ０［０］、Ｒ１［０］、Ｒ２［０］、Ｒ３［０］として割り当てられているバッファレジスタＢＲ０、ＢＲ１、ＢＲ２、ＢＲ３に各々保持されているＳ［ｎ］、Ｓ［ｎ＋１］、Ｓ［ｎ＋２］、Ｓ［ｎ＋３］の値がストアデータとして読み出される。第２演算部２２３では、有効な処理は行われない。ＳＴ４Ｗ命令８５８の実行に伴い、論理レジスタＲ０〜Ｒ３の値がストアデータとして参照されるので、４つの出力ポインタＢＯＰ０〜ＢＯＰ３の値が出力ポインタ更新回路５１８等によりそれぞれ１インクリメントされて、“１”に更新される。
【０３７４】
Ｔ３期間のＭステージ４０４で、処理８６９（Ｉ２命令８５８の処理）が行われる。Ｍステージ４０４では、Ｅステージ４０３でＲ０［０］、Ｒ１［０］、Ｒ２［０］、Ｒ３［０］から読み出されたＳ［ｎ］、Ｓ［ｎ＋１］、Ｓ［ｎ＋２］、Ｓ［ｎ＋３］の値がオペランドアクセス部２０４に出力され、メモリにストアされる。
【０３７５】
Ｔ２期間にＤステージ４０２では、処理８６４（Ｉ１命令８５７のデコード）が行われる。この際、処理８６５で行われたポインタ更新後の論理レジスタＲ０〜Ｒ３の出力ポインタが認識される。
【０３７６】
このように、ストアデータとしてリングバッファの値を参照することにより、少ない論理レジスタ本数で、効率のよいメモリ−メモリ間転送を実現している。
【０３７７】
ここでは、４つの論理レジスタ番号を使用する例を示しているが、１つの論理レジスタ番号の複数のレジスタに複数のデータをロードし、１つの論理レジスタ番号の複数のデータを参照し、ストアすると共に、参照したデータの数だけ出力ポインタを更新する機能を備えれば、使用する論理レジスタ番号の数を削減することが出来る。例えば、１つの論理レジスタ番号に８本の物理レジスタをリングバッファとして実装するようにすれば、データのバッファとしては１つの論理レジスタ番号のみ使用するようにも出来る。このような機能を追加することにより、制御は多少複雑になるが、より使用する論理レジスタ本数を削減することが可能である。当然、２本の論理レジスタを使用する選択もある。
【０３７８】
＜プログラム例８：配列データのブロックフローティング＞
図５３は、配列データのシフトを行うプログラム例８を示す説明図である。プログラム例８はＣ言語で表記すると、以下の処理を行う。
【０３７９】
for (i = 0; i < N; ++i) Y[i] = X[i] << shift_count;。
【０３８０】
Ｘ［ｉ］を論理レジスタＲ４で指定されるビット数分左シフトし、Ｙ［ｉ］として書き戻す処理を行う。（ｉは０〜（Ｎ−１））Ｘ［ｉ］は１６ビットデータであり、Ｘ［０］、Ｙ［０］のアドレスは３２ビット整置されており、Ｎは２の倍数であるものとする。図５３のプログラム実行前に、論理レジスタＲ４にはシフト量（ｓｈｉｆｔ＿ｃｏｕｎｔ）を設定しておく。
【０３８１】
本データ処理装置では、シフタを１つしか実装していないため、繰り返し処理中は１クロックに１回のスループットで１つのデータのシフトを行っている。
【０３８２】
コマンド行８８１〜８８７はリピート処理を行うための前処理、コマンド行８８８はブロックリピート命令、コマンド行８８９〜８９０がブロックリピート対象命令、コマンド行８９１〜８９２がリピート処理後の後処理を行う部分である。
【０３８３】
ＬＤＴＣＩ命令８８３により、ＲＢＣＮＦビット８０が“０１”に、ＳＴＭビット８１が“１”に、ＷＭビット８２が“０”に、ＲＢＥ０ビット８３、ＲＢＥ１ビット８５が“１”に、ＯＰＭ０ビット８４、ＯＰＭ１ビット８６が“０１”に設定される。すなわち、論理レジスタＲ０、Ｒ１が各々２エントリからなるリングバッファ構成となり、ともにレジスタ値の参照により出力ポインタを更新する設定となる。ロード以外の命令実行によるレジスタ値の更新は、汎用レジスタに対して行われる。また、ストア命令による論理レジスタＲ０、Ｒ１値のストア時には、バッファレジスタからではなく汎用レジスタからストアデータが読み出される。論理レジスタＲ２，Ｒ３はＲＢＥ２ビット８７、ＲＢＥ３ビット８９が“０”であるため、論理レジスタＲ２，Ｒ３は通常の汎用レジスタモードとして動作する。
【０３８４】
“ＳＬＬ  Ｒａ，Ｒｂ”命令は、Ｒａの値をＲｂで指定されるシフト量だけ左シフトし、シフト結果をＲａに書き戻すシフト命令である。ストア命令（メモリ格納命令）である“ＳＴ２Ｗ  Ｒａ，  Ｒｂ＋”命令は、Ｒａ、Ｒ（ａ＋１）の値をＲｂ値のアドレスで指定されるメモリ領域にストアし、Ｒｂの値をオペランドサイズに相当する４だけポストインクリメントするポストインクリメント付きレジスタ間接モードの２ワードストア命令である。
【０３８５】
図５４はコマンド行８８９、８９０の命令のリピート処理中のパイプライン処理の詳細を示す説明図である。図５５はその際のリングバッファの様子を示す説明図である。以下、これらの図を参照してプログラム例８におけるパイプライン動作について説明する。
【０３８６】
リピート処理中のある期間Ｔ１でＥステージ４０３においてＩ１命令８８９を実行しており、その際、Ｘ［ｎ］のシフトを行っている場合の処理の様子を示している。命令の処理としては、２クロックサイクル毎に処理を繰り返す。リングバッファの動作は、４クロックサイクル毎に入出力ポインタが同じ状態に戻る。
【０３８７】
Ｔ１期間にＥステージ４０３で処理９０２（Ｉ１命令８８９の実行）が行われる。第１演算部２２２では、ＳＴ２Ｗ命令８８９ａのアドレス出力、アドレスの更新、ストアデータの読み出しが行われる。汎用レジスタＧＲ９の値がアドレスとしてオペランドアクセス部２０４に出力され、４だけポストインクリメントされて汎用レジスタＧＲ９に書き戻される。ストアデータは、汎用レジスタから読み出される。
【０３８８】
ストア時の論理レジスタＲ０、Ｒ１として割り当てられている汎用レジスタＧＲ０、ＧＲ１に各々保持されているＹ［ｎ−２］、Ｙ［ｎ−１］の値が読み出される。第２演算部２２３では、ＳＬＬ命令８８９ｂのシフトが行われる。これら汎用レジスタＧＲ０，ＧＲ１がメモリ格納命令用物理レジスタとして機能する。
【０３８９】
シフト時の読み出し対象のＲ０［０］として割り当てられているバッファレジスタＢＲ０の値が読み出され、シフタ３７１で汎用レジスタＧＲ４に保持されているシフト量だけ左シフトされて、シフト時の書き込み対象である汎用レジスタＧＲ０に書き込まれる。このように、演算対象のデータはリングバッファから読み出され、演算結果であるシフト結果は汎用レジスタに書き込まれる。
【０３９０】
ＳＬＬ命令８８９ｂの実行に伴い、論理レジスタＲ０の値が参照されるので、論理レジスタＲ０の出力ポインタＢＯＰ０が出力ポインタ更新回路５１８等により１インクリメントされて、“１”に更新される。一方、ＳＴ２Ｗ命令８８９ａ実行時のストアデータの参照に関しては、汎用レジスタ値を参照するので、リングバッファの出力ポインタの更新は行わない。
【０３９１】
Ｔ２期間のＭステージ４０４で、処理９０６（Ｉ１ａ命令８８９ａの処理）が行われる。Ｍステージ４０４では、Ｅステージ４０３で汎用レジスタＧＲ０、ＧＲ１から読み出されたＹ［ｎ−２］、Ｙ［ｎ−１］の値がオペランドアクセス部２０４に出力され、メモリにストアされる。
【０３９２】
Ｔ１期間にＤステージ４０２では、処理９０１（Ｉ２命令８９０のデコード）が行われる。この際、処理９０２で行われたポインタ更新後の論理レジスタＲ０の出力ポインタが認識される。
【０３９３】
Ｔ２期間にＥステージ４０３で処理９０５（Ｉ２ａ命令８９０ａの実行）が行われる。第１演算部２２２では、ＬＤ２Ｗ命令８９０ａのアドレス出力と、アドレスの更新が行われる。汎用レジスタＧＲ８の値がアドレスとしてオペランドアクセス部２０４に出力され、４だけポストインクリメントされて汎用レジスタＧＲ８に書き戻される。第２演算部２２３では、ＳＬＬ命令８９０ｂのシフトが行われる。Ｒ１［０］として割り当てられているバッファレジスタＢＲ１の値が読み出され、シフタ３７１で汎用レジスタＧＲ４に保持されているシフト量だけ左シフトされて、汎用レジスタＧＲ１に書き込まれる。
【０３９４】
このように、演算対象のデータはリングバッファから読み出され、演算結果であるシフト結果は汎用レジスタに書き込まれる。また、ＬＤ２Ｗ命令８９０ａの実行に伴い、論理レジスタＲ０，Ｒ１に各々１ワードのデータがロードされるので、２つの入力ポインタＢＩＰ０、ＢＩＰ１の値が、入力ポインタ更新回路５１４等により１インクリメントされ、“１”に更新される。さらに、ＳＬＬ命令８９０ｂの実行に伴い、論理レジスタＲ１の値が参照されるので、論理レジスタＲ１の出力ポインタＢＯＰ１が出力ポインタ更新回路５１８等により１インクリメントされて、“１”に更新される。
【０３９５】
Ｔ３期間のＭステージ４０４で、処理９０９（Ｉ２ａ命令８９０ａの処理）が行われる。Ｍステージ４０４では、Ｘ［ｎ＋４］、Ｘ［ｎ＋５］の値がメモリから読み出され、Ｒ０［０］、Ｒ１［０］として割り当てられているバッファレジスタＢＲ０、ＢＲ１に、各々書き込まれる。
【０３９６】
Ｔ２期間にＤステージ４０２では、処理９０４（Ｉ１命令８８９のデコード）が行われる。この際、処理９０５で行われたポインタ更新後の論理レジスタＲ０，Ｒ１の入力ポインタ及び論理レジスタＲ１の出力ポインタが認識される。
【０３９７】
このように、演算結果を汎用レジスタに書き込み、ストアデータとして汎用レジスタの値を参照することにより、少ない論理レジスタ本数で、効率のよいリード−モディファイ−ライト演算の繰り返し処理を実現している。リングバッファがロードデータバッファとして、汎用レジスタがストアデータバッファとして機能しており、かつ、同じレジスタ番号で複数のロードデータバッファとストアデータバッファを矛盾なく指定している。
【０３９８】
この処理例では、２本のロードデータバッファレジスタと１つのストアバッファレジスタの３つのレジスタを同一の番号で指定している。このように、リード−モディファイ−ライト演算を行う場合にも、命令として使用する論理レジスタ本数が削減でき、高いコード効率を保ちながら、効率のよい処理が実現できる。また、この場合、命令として使用する論理レジスタ本数としてはＲ０とＲ１の２本で処理が実現でき、論理レジスタＲ２〜Ｒ７は、他の目的で自由に使用することが可能である。また、この処理例では、論理レジスタＲ２〜Ｒ７の値を破壊せず元の値を保持するので、論理レジスタＲ２〜Ｒ７使用しない場合でも、論理レジスタＲ２〜Ｒ７の値を待避、復帰するための処理は不要である。
【０３９９】
また、繰り返し処理の基本処理単位（リピートブロックサイズ）を最小限に抑えながら、パイプライン処理を考慮した効率のよいプログラムが容易に実現でき、プログラムの開発効率もよく、バグの混入を低減できる。
【０４００】
また、リングバッファと汎用レジスタをうまく活用することにより、２オペランド命令を実質的に３オペランド命令のごとく処理している。
【０４０１】
この実施の形態では、ストアバッファ用のレジスタとして汎用レジスタを使用している。従って、既存のハードウェアリソースを有効に活用し、追加ハードウェア量を抑え、低コストで効率のよいプログラミングを実現している。
【０４０２】
ハードウェア量は追加する必要があるが、汎用レジスタとは独立にストアバッファ用レジスタを実装し、命令実行によるレジスタ値の更新時にストアバッファ用レジスタに値を書き込み、ストア命令実行時にストアバッファ用レジスタの値を参照する機能を設けても、同様の効果を得ることが出来る。この場合、繰り返し処理前後で汎用レジスタ値の値が保持されるので、待避、復帰処理が更に削減できる場合がある。
【０４０３】
＜プログラム例９：差分二乗和＞
図５６は、差分二乗和を計算するプログラム例９を示す説明図である。プログラム例９はＣ言語表記で、以下の処理を行う場合について説明する。
【０４０４】
for (i = 0, sum = 0; i < N; ++i) sum += (A[i] - B[i]) * (A[i] - B[i]);。
【０４０５】
１６ビットの固定小数点数配列であるＡとＢの差分の二乗和をＮ回繰り返す。Ｎは２の倍数であるとする。Ａ［ｉ］、Ｂ［ｉ］は、ｉの順番にアドレスの増加方向に順に内蔵データメモリ上に配置されており、Ａ［０］、および、Ｂ［０］は、３２ビット（４バイト）整置されているものとする。積和演算結果（ｓｕｍ）は１６ビットに丸められ、ｒ０に保持されるものとする。
【０４０６】
本データ処理装置は、差分二乗和専用の命令を備えていない。このプログラム例では、減算命令と積和演算命令を繰り返し実行する。ただし、ＳＩＭＤ演算により、１クロックサイクルに１回のスループットで差分二乗和演算処理を行っている。
【０４０７】
コマンド行９２１〜９２６はリピート処理を行うための前処理、コマンド行９２７はブロックリピート命令、コマンド行９２８〜９２９がブロックリピート対象命令、コマンド行９３０がリピート処理後の後処理を行う部分である。
【０４０８】
ＬＤＴＣＩ命令９２３により、ＲＢＣＮＦビット８０が“０１”に、ＳＴＭビット８１が“０”に、ＷＭビット８２が“１”に、ＲＢＥ０ビット８３，ＲＢＥ１ビット８５，ＲＢＥ２ビット８７，ＲＢＥ３ビット８９が“１”に、ＯＰＭ０ビット８４、ＯＰＭ１ビット８６が“１０”に、ＯＰＭ２ビット８８、ＯＰＭ４ビット９０が“０１”に設定される。すなわち、論理レジスタＲ０〜Ｒ３が各々２エントリからなるリングバッファ構成（図１０参照）となり、論理レジスタＲ０，Ｒ１はリピートブロックの最終命令で出力ポインタを更新し、論理レジスタＲ２，Ｒ３はレジスタ値の参照により出力ポインタを更新する設定となる。ロード以外の命令実行によるレジスタ値の更新は、汎用レジスタと出力ポインタが指し示すバッファレジスタの両方に対して行われる。この設定では、論理レジスタＲ０、Ｒ１に関して、出力ポインタにより選択されたエントリのバッファレジスタをリピートブロック内で作業用レジスタとして使用することが出来る。すなわち、演算結果を一時的に保持できる。
【０４０９】
“ＳＵＢ２  Ｒａ，Ｒｂ”命令は、２つの減算を行うＳＩＭＤ演算命令であり、Ｒａの値からＲｂの値を減算し、減算結果をＲａに書き戻し、Ｒ（ａ＋１）の値からＲ（ｂ＋１）の値を減算し、減算結果をＲ（ａ＋１）に書き戻す。
【０４１０】
図５７はコマンド行９２８、９２９の命令のリピート処理中のパイプライン処理の詳細を示す説明図である。図５８はその際のリングバッファの様子を示す説明図である。以下、これらの図を参照してプログラム例９におけるパイプライン動作について説明する。
【０４１１】
リピート処理中のある期間Ｔ１でＥステージ４０３においてＩ１命令９２８を実行しており、その際”Ａ［ｎ］−Ｂ［ｎ］”と”Ａ［ｎ＋１］−Ｂ［ｎ＋１］”の減算を行っている場合の処理の様子を示している。命令の処理としては、２クロックサイクル毎に処理を繰り返す。リングバッファの動作は、４クロックサイクル毎に入出力ポインタが同じ状態に戻る。
【０４１２】
Ｔ１期間にＥステージ４０３で処理９３２（Ｉ１命令９２８の実行）が行われる。第１演算部２２２では、ＬＤ２Ｗ命令９２８ａのアドレス出力と、アドレスの更新が行われる。汎用レジスタＧＲ９の値がアドレスとしてオペランドアクセス部２０４に出力され、４だけポストインクリメントされて汎用レジスタＧＲ９に書き戻される。第２演算部２２３では、ＳＵＢ２命令９２８ｂの減算が行われる。Ｒ０［０］として割り当てられているバッファレジスタＢＲ０の値とＲ２［０］として割り当てられているバッファレジスタＢＲ２の値が読み出され、ＡＬＵ３８０で減算が行われ、減算結果がＲ０［０］として割り当てられている（出力ポインタＢＯＰ０が指し示す）バッファレジスタＢＲ０と、汎用レジスタＧＲ０に書き戻される。さらに、Ｒ１［０］として割り当てられているバッファレジスタＢＲ１の値とＲ３［０］として割り当てられているバッファレジスタＢＲ３の値が読み出され、加算器３９５で減算が行われ、減算結果がＲ１［０］として割り当てられている（出力ポインタＢＯＰ１が指し示す）バッファレジスタＢＲ１と、汎用レジスタＧＲ１に書き戻される。
【０４１３】
このように、演算対象のデータはリングバッファから読み出され、演算結果である減算結果はリングバッファの出力ポインタが指し示すエントリと汎用レジスタの両方に書き込まれる。ＬＤ２Ｗ命令９２８ａの実行に伴い、論理レジスタＲ２，Ｒ３に各々１ワードのデータがロードされるので、２つの入力ポインタＢＩＰ２、ＢＩＰ３値が、入力ポインタ更新回路５１４等により１インクリメントされ、循環して“０”に更新される。また、ＳＵＢ２命令９２８ｂの実行に伴い、論理レジスタＲ２，Ｒ３の値が参照されるので、論理レジスタＲ２と論理レジスタＲ３の出力ポインタＢＯＰ２，ＢＯＰ３が出力ポインタ更新回路５１８等により１インクリメントされて、“１”に更新される。ＳＵＢ２命令９２８ｂにより、論理レジスタＲ０，Ｒ１の値も参照されるが、論理レジスタＲ０，Ｒ１はリピートブロックの最終命令で出力ポインタを更新する設定となっているため、出力ポインタの更新は行われない。
【０４１４】
Ｔ２期間のＭステージ４０４で、処理９３６（Ｉ１ａ命令９２８ａの処理）が行われる。Ｍステージ４０４では、Ｒ２［１］として割り当てられているバッファレジスタＢＲ６にＢ［ｎ＋２］の値が、Ｒ３［１］として割り当てられているバッファレジスタＢＲ７にＢ［ｎ＋３］の値が、各々書き込まれる。Ｔ２期間のＥ２ステージ４０６では、有効な処理は行われない。
【０４１５】
Ｔ１期間にＤステージ４０２では、処理９３１（Ｉ２命令９２９のデコード）が行われる。この際、処理９３２で行われたポインタ更新後の論理レジスタＲ０〜Ｒ３のうち、デコード対象の論理レジスタの入出力ポインタが認識される。
【０４１６】
Ｔ２期間にＥステージ４０３で処理９３５（Ｉ２命令９２９の実行）が行われる。第１演算部２２２では、ＬＤ２Ｗ命令９２９ａのアドレス出力とアドレスの更新が行われる。汎用レジスタＧＲ８の値がアドレスとしてオペランドアクセス部２０４に出力され、４だけポストインクリメントされて汎用レジスタＧＲ８に書き戻される。
【０４１７】
また、第２演算部２２３では、ＭＡＣ２Ａ命令９２９ｂの乗算が行われる。Ｒ０［０］として割り当てられているバッファレジスタＢＲ０から“Ａ［ｎ］−Ｂ［ｎ］”の値が、Ｒ１［０］として割り当てられているバッファレジスタＢＲ１から“Ａ［ｎ＋１］−Ｂ［ｎ＋１］”の値が各々読み出され、乗算器３７６，３９１で２つの二乗演算が行われ、乗算結果がＰラッチ３７９、及び、ＰＸラッチ３９４に書き込まれる。
【０４１８】
また、ＬＤ２Ｗ命令９２９ａの実行に伴い、論理レジスタＲ０，Ｒ１に各々１ワードのデータがロードされるので、論理レジスタＲ０の入力ポインタＢＩＰ０の値と論理レジスタＲ１の入力ポインタＢＩＰ１の値とが、入力ポインタ更新回路５１４等により１インクリメントされ、“１”に更新される。さらに、Ｉ２命令９２９はリピートブロックの最終命令なので、論理レジスタＲ０，Ｒ１の出力ポインタＢＯＰ０とＢＯＰ１が出力ポインタ更新回路５１８等により１インクリメントされて、“１”に更新される。
【０４１９】
Ｔ３期間のＭステージ４０４、Ｅ２ステージ４０６で、処理９３９（Ｉ２命令９２９の処理）が行われる。Ｍステージ４０４では、Ｒ０［０］として割り当てられているバッファレジスタＢＲ０にＡ［ｎ＋４］の値が、Ｒ１［０］として割り当てられているバッファレジスタＢＲ１にＡ［ｎ＋５］の値が、各々書き込まれる。Ｅ２ステージ４０６では、Ｅステージ４０３での乗算結果であるＰラッチ３７９の値、及び、ＰＸラッチ３９４の値と、アキュムレータＡ０の値が加算器３６２で３値加算され、アキュムレータＡ０に書き戻される。
【０４２０】
Ｔ２期間にＤステージ４０２では、処理９３４（Ｉ１命令９２８のデコード）が行われる。この際、処理９３５で行われたポインタ更新後の論理レジスタＲ０〜Ｒ３のうち、デコード対象の論理レジスタの入出力ポインタが認識される。
【０４２１】
このプログラム例９では、論理レジスタＲ２と論理レジスタＲ３とは命令の実行によるレジスタ値の参照でポインタ更新を行うように設定しているが、論理レジスタＲ２と論理レジスタＲ３もリピートブロックの最終命令で出力ポインタを更新する設定にしてもよい。
【０４２２】
このように、リピートブロックの最終命令で出力ポインタを更新し、ロード以外の命令実行によるレジスタ値の更新を出力ポインタが指し示すバッファレジスタに対しても行う設定として、処理を行うことにより、出力ポインタにより選択されたエントリのバッファレジスタをリピートブロック内で作業用レジスタとして使用することができる。このような制御を行うことにより、バッファレジスタを単にロードオペランドのバッファとして使用するのみでなく、通常の汎用レジスタと同様、作業用レジスタとして演算の途中結果を保持し、後続の命令で演算結果を参照することが可能になる。
【０４２３】
すなわち、リード・モディファイ・ライトオペランドとして同一のレジスタを使用することにより、使用するレジスタ本数を削減することが可能である。さらに、２オペランド命令のデスティネーションオペランドとして指定して、リングバッファを指定できるので、短い命令長でオペレーションが指定できることになり、より多くの命令の並列実行が可能となるため、性能を向上できる。３オペランド命令をショート命令として実装できれば、読み出すロードオペランド値を別の汎用レジスタに書き込むことが出来るため、このような制御を行わなくても同様の機能を実現できるが、例えば本実施の形態のデータ処理装置の場合、３つのレジスタオペランドを持つ３オペランド命令をショートフォーマットの命令に割り当てることは、３つのレジスタオペランド指定フィールドで１２ビットの命令コードが必要となるため、現実問題不可能である。
【０４２４】
命令コードとして明示的に示されないレジスタに演算結果（減算結果）を書き込む命令を備えることも考えられるが、汎用性が乏しく、また、その専用命令を追加する必要があり、ショート命令に割り当てる命令の数の制限が厳しくなる。さらに、参照する側の命令もリングバッファとは異なるレジスタを参照する別の命令を設ける必要があり、ショート命令に割り当てる命令の数の制限が厳しくなる。
【０４２５】
すなわち、ロード以外の命令実行によるレジスタ値の更新を出力ポインタが指し示すバッファレジスタに対して行う機能を実装することにより、新しい専用命令を追加しなくても、通常使用する命令をそのまま使用して、後続命令が演算結果を参照できるようになるため、ショートフォーマットの命令として効率のよい命令割り当てができ、コード効率も向上する。
【０４２６】
このように、演算結果をバッファレジスタにも書き戻すことが出来るようにすることにより、高性能で、低コストなデータ処理装置が実現可能となる。
【０４２７】
このプログラム例では、演算結果が汎用レジスタにも書き込まれるが、その汎用レジスタ値は参照されない。すなわち、汎用レジスタへの書き込みは無駄である。本データ処理装置ではＷＭビット８２を１ビットに割り当て、汎用レジスタにに書き込むか、汎用レジスタとバッファレジスタとに書き込むかをモード設定できるようにしているが、モード指定ビットを２ビットにして、バッファレジスタのみに書き込むモードを追加してもよい。そうすれば、汎用レジスタへの無駄な書き込みはなくなり、このプログラム例９では、汎用レジスタＧＲ０、ＧＲ１の値が破壊されないようになる。すなわち、単に無駄な書き込みを抑止できるのみでなく、待避／復帰のオーバーヘッドが更に削減できる効果も奏することになる。
【０４２８】
さらに、演算結果を汎用レジスタに書き戻すか、バッファレジスタにも書き戻すかの、モード設定が可能な構成とすることにより、図５３に示したプログラム例８や図５６に示したプログラム例９など、処理内容に応じて適切な動作が選択できるので、少ないハードウェアコストの追加で、高性能で、低コストなデータ処理装置が実現可能となる。
【０４２９】
本実施の形態では、リングバッファ全体に対して１つのモード指定ビット（ＷＭビット８２）で制御を行うようにしているが、レジスタ毎にモード設定できるようにしてもよい。そうすれば、さらに細やかな制御が出来るため、待避／復帰のオーバーヘッドが更に削減できる場合もある。
【０４３０】
＜プログラム例１０：１次関数＞
図５９は、１６ビット整数配列データに関して１次関数の処理を繰り返すプログラム例１０を示す説明図である。プログラム例１０はＣ言語で表記すると、以下の処理を行うことになる。
【０４３１】
for (i = 0; i < N; ++i) Y[i] = A * X[i] + B;。
【０４３２】
Ｘ［ｉ］にＡをかけＢを加算した結果を、Ｙ［ｉ］として書き戻す処理をＮ回繰り返す。（ｉは０〜（Ｎ−１））Ｘ［ｉ］は１６ビットデータであり、Ｘ［０］、Ｙ［０］のアドレスは３２ビット整置されており、Ｎは２の倍数であるものとする。以下の説明で、Ｔ［ｉ］＝Ａ＊Ｘ［ｉ］とする。図５９のプログラム実行前に、論理レジスタＲ２（ＧＲ２），Ｒ３（ＧＲ３）にはＡの値を、論理レジスタＲ４（ＧＲ４）、Ｒ５（ＧＲ５）にＢの値を設定しておく。
【０４３３】
ＳＩＭＤ演算により、１クロックサイクルに１回のスループットで１次関数の処理を行う。
【０４３４】
コマンド行９５１〜９５８はリピート処理を行うための前処理、コマンド行９５９はブロックリピート命令、コマンド行９６０〜９６１がブロックリピート対象命令、コマンド行９６２〜９６３がリピート処理後の後処理を行う部分である。
【０４３５】
ＬＤＴＣＩ命令９５３により、ＲＢＣＮＦビット８０が“００”に、ＳＴＭビット８１が“０”に、ＷＭビット８２が“１”に、ＲＢＥ０ビット８３，ＲＢＥ１ビット８５が“１”に、ＯＰＭ０ビット８４、ＯＰＭ１ビット８６が“１０”に設定される。すなわち、論理レジスタＲ０〜Ｒ１が各々４エントリからなるリングバッファ構成（図９参照）となり、論理レジスタＲ０，Ｒ１はリピートブロックの最終命令で出力ポインタを更新する設定となる。ロード以外の命令実行によるレジスタ値の更新は、汎用レジスタと出力ポインタが指し示すバッファレジスタの両方に対して行われる。この設定では、論理レジスタＲ０、Ｒ１に関して、出力ポインタにより選択されたエントリのバッファレジスタをリピートブロック内で作業用レジスタとして使用することが出来る。すなわち、演算結果を一時的に保持できる。
【０４３６】
特定論理レジスタに対するデータ更新を指示するデータ更新命令でもある“ＭＵＬ２  Ｒａ，Ｒｂ”命令は、２つの整数乗算を行うＳＩＭＤ演算命令であり、Ｒａの値とＲｂの値を乗算し、乗算結果をＲａに書き戻し、Ｒ（ａ＋１）の値とＲ（ｂ＋１）の値を乗算し、乗算結果をＲ（ａ＋１）に書き戻す。また、上記データ更新命令でもある“ＡＤＤ２  Ｒａ，Ｒｂ”命令は、２つの加算を行うＳＩＭＤ演算命令であり、Ｒａの値とＲｂの値とを加算し、加算結果をＲａに書き戻し、Ｒ（ａ＋１）の値とＲ（ｂ＋１）の値とを加算し、加算結果をＲ（ａ＋１）に書き戻す。
【０４３７】
図６０はコマンド行９６０、９６１の命令のリピート処理中のパイプライン処理の詳細を説明図である。図６１はその際のリングバッファの様子を示す説明図である。以下、これらの図を参照してプログラム例１０におけるパイプライン動作について説明する。
【０４３８】
リピート処理中のある期間Ｔ１でＥステージ４０３においてＩ１命令９６０を実行しており、その際“Ａ＊Ｘ［ｎ］”と“Ａ＊Ｘ［ｎ＋１］”の乗算を行っている場合の処理の様子を示している。命令の処理としては、２クロックサイクル毎に処理を繰り返す。リングバッファの動作は、８クロックサイクル毎に入出力ポインタが同じ状態に戻る。
【０４３９】
Ｔ１期間にＥステージ４０３で処理９７２（Ｉ１命令９６０の実行）が行われる。第１演算部２２２では、ＳＴ２Ｗ命令９６０ａのアドレス出力、アドレスの更新、ストアデータの読み出しが行われる。汎用レジスタＧＲ９の値がアドレスとしてオペランドアクセス部２０４に出力され、４だけポストインクリメントされて汎用レジスタＧＲ９に書き戻される。ストアデータは、汎用レジスタから読み出される。論理レジスタＲ０、Ｒ１として割り当てられている汎用レジスタＧＲ０、ＧＲ１に各々保持されているＹ［ｎ−２］、Ｙ［ｎ−１］の値が読み出される。
【０４４０】
第２演算部２２３では、ＭＵＬ２命令９６０ｂの乗算が行われる。Ｒ０［０］として割り当てられているバッファレジスタＢＲ０の値と汎用レジスタＧＲ２の値が読み出され、乗算器３７６で乗算が行われ、乗算結果Ｔ［ｎ］がＲ０［０］として割り当てられている（出力ポインタＢＯＰ０が指し示す）バッファレジスタＢＲ０と、汎用レジスタＧＲ０に書き戻される。さらに、Ｒ１［０］として割り当てられているバッファレジスタＢＲ１の値とＧＲ３の値が読み出され、乗算器３９１で乗算が行われ、乗算結果Ｔ［ｎ＋１］がＲ１［０］として割り当てられている（出力ポインタＢＯＰ１が指し示す）ＢＲ１と、汎用レジスタＧＲ１に書き戻される。このように、演算対象のデータはリングバッファから読み出され、演算結果である減算結果はリングバッファの出力ポインタが指し示すエントリと汎用レジスタの両方に書き込まれる。
【０４４１】
ＳＴ２Ｗ命令９６０ａ実行時のストアデータの参照に関しては、汎用レジスタ値を参照するので、リングバッファの出力ポインタの更新は行われない。また、ＭＵＬ２命令９６０ｂの実行に伴い、論理レジスタＲ０，Ｒ１の値が参照されるが、論理レジスタＲ０，Ｒ１はリピートブロックの最終命令で出力ポインタを更新する設定となっているため、出力ポインタの更新は行われない。
【０４４２】
Ｔ２期間のＭステージ４０４で、処理９７６（Ｉ１ａ命令９６０ａの処理）が行われる。Ｍステージ４０４では、Ｅステージ４０３でＧＲ０、ＧＲ１から読み出されたＹ［ｎ−２］、Ｙ［ｎ−１］の値がオペランドアクセス部２０４に出力され、メモリにストアされる。Ｔ２期間のＥ２ステージ４０６では、有効な処理は行われない。
【０４４３】
Ｔ１期間にＤステージ４０２では、処理９７１（Ｉ２命令９６１のデコード）が行われる。この際、処理９７２で行われたポインタ更新後の論理レジスタＲ０〜Ｒ３のうち、デコード対象の論理レジスタの入出力ポインタが認識される。
【０４４４】
Ｔ２期間にＥステージ４０３で処理９７５（Ｉ２命令９６１の実行）が行われる。第１演算部２２２では、ＬＤ２Ｗ命令９６１ａのアドレス出力とアドレスの更新が行われる。汎用レジスタＧＲ８の値がアドレスとしてオペランドアクセス部２０４に出力され、４だけポストインクリメントされて汎用レジスタＧＲ８に書き戻される。また、第２演算部２２３では、ＡＤＤ２命令９６１ｂの加算が行われる。Ｒ０［０］として割り当てられているバッファレジスタＢＲ０の値Ｔ［ｎ］と汎用レジスタＧＲ４の値が読み出され、ＡＬＵ３８０で加算が行われ、加算結果がＲ０［０］として割り当てられている（出力ポインタＢＯＰ０が指し示す）ＢＲ０と、汎用レジスタＧＲ０に書き戻される。さらに、Ｒ１［０］として割り当てられているバッファレジスタＢＲ１の値Ｔ［ｎ＋１］と汎用レジスタＧＲ５の値が読み出され、加算器３５９で加算が行われ、加算結果がＲ１［０］として割り当てられている（出力ポインタＢＯＰ１が指し示す）バッファレジスタＢＲ１と、汎用レジスタＧＲ１に書き戻される。
【０４４５】
このように、演算対象のデータはリングバッファから読み出され、演算結果である減算結果はリングバッファの出力ポインタが指し示すエントリと汎用レジスタの両方に書き込まれる。また、ＬＤ２Ｗ命令９６１ａの実行に伴い、論理レジスタＲ０，Ｒ１に各々１ワードのデータがロードされるので、論理レジスタＲ０の入力ポインタＢＩＰ０の値とＲ１の入力ポインタＢＩＰ１の値とが、入力ポインタ更新回路５１４等に１インクリメントされ、“３”に更新される。さらに、Ｉ２命令９６１はリピートブロックの最終命令なので、論理レジスタＲ０，Ｒ１の出力ポインタＢＯＰ０とＢＯＰ１が出力ポインタ更新回路５１８等により１インクリメントされて、“１”に更新される。
【０４４６】
Ｔ３期間のＭステージ４０４で、処理９７９（Ｉ２ａ命令９６１ａの処理）が行われる。Ｍステージ４０４では、Ｒ０［２］として割り当てられているバッファレジスタＢＲ２にＸ［ｎ＋４］の値が、Ｒ１［２］として割り当てられているバッファレジスタＢＲ３にＸ［ｎ＋５］の値が、各々書き込まれる。Ｔ３期間のＥ２ステージ４０６では、有効な処理は行われない。
【０４４７】
Ｔ２期間にＤステージ４０２では、処理９７４（Ｉ１命令９６０のデコード）が行われる。この際、処理９７５で行われたポインタ更新後の論理レジスタＲ０〜Ｒ３のうち、デコード対象の論理レジスタの入出力ポインタが認識される。
【０４４８】
プログラム例１０では、図５６の差分二乗和のプログラム例９と同様、リピートブロックの最終命令で出力ポインタを更新し、ロード以外の命令実行によるレジスタ値の更新を出力ポインタが指し示すバッファレジスタに対しても行う設定として、処理を行うことにより、出力ポインタにより選択されたエントリのバッファレジスタをリピートブロック内で作業用レジスタとして使用することができる。
【０４４９】
このような制御を行うことにより、バッファレジスタを単にロードオペランドのバッファとして使用するのみでなく、通常の汎用レジスタと同様、作業用レジスタとして後続の命令で演算結果を参照することが可能になる。さらに、ストアデータは汎用レジスタ値を参照することにより、汎用レジスタをストアバッファとしても使用している。このように、演算結果を汎用レジスタとバッファレジスタの両方に書き戻すことにより、作業レジスタとしても、ストアレジスタとしても使用できる。このプログラム例の論理レジスタＲ０，Ｒ１のように、演算途中のデータとストアするデータを同じレジスタに保持する場合、非常に有効である。すなわち、１つの論理レジスタ番号の複数のレジスタをロードオペランドのバッファ、作業レジスタ、ストアバッファとして使用することが出来るので、使用する論理レジスタ本数を大幅に削減することが可能である。また、汎用レジスタとバッファレジスタの両方に書き込むことにより、汎用レジスタに書き戻す命令と、バッファレジスタに書き戻す命令を区別する必要がないので、短い命令コードに有効に命令を割り当てることが可能となり、高性能化、コード効率向上に伴う低コスト化を実現することが可能となる。
【０４５０】
本プログラム例１０では繰り返し処理の最初は演算結果のストアは行わないため、ループの前処理で最初の演算を行っている。出力ポインタの更新は、リピートブロックの最終命令で行う設定となっているが、最初の演算処理はリピートブロック外で行うため、ＵＰＤＢＯＰ命令９５７ａで明示的に行っている。このように、理想的な繰り返し処理とはならない場合のポインタ更新に対して、多少のオーバーヘッドはあるがＵＰＤＢＯＰ命令９５７ａが有効に作用する場合がある。
【０４５１】
本プログラム例１０では、論理レジスタＲ０とＲ１について各々４本のリングバッファを用いてプログラム実行しているが、各々２本のリングバッファの構成を使用しても、動作可能である。
【０４５２】
本プログラム例では、リピートブロックの最終命令でバッファレジスタと汎用レジスタの両方に書き込みを行っている。しかし、リピートブロックの最終命令でバッファレジスタに書き込んだ値はその後参照されないことは明白なので、リピートブロックの最終命令でバッファレジスタへの書き込みを抑止し、無駄な書き込みを行わないように制御してもよい。
【０４５３】
＜ＥＩＴ処理時の動作＞
次に、ＥＩＴ（例外、割り込み、トラップ）処理時の動作について簡単に説明する。ＥＩＴが検出され起動条件が満たされていると、ＥＩＴ処理の起動を行う。例えば、外部端子で割り込み要求がアサートされており、制御レジスタＣＲ０（ＰＳＷ）のＩＥ６２ビットが“１”の場合、３２ビット命令の切れ目で割り込み処理が起動される。ＥＩＴの起動は、ハードウェア的に制御される。ＥＩＴ検出時のＰＳＷの値がＤ１バス２６１を介してＢＰＳＷレジスタ３２２に待避され、ＰＳＷの初期設定が行われる。ＳＭビット６１は割り込み関連のＥＩＴの場合“０”に初期設定され、それ以外のＥＩＴの場合は値を保持する。ＳＭビット６１以外のビットは、ＲＭビット６８も含めて“０”に初期設定される。また、戻り先アドレスとなる値がＥＰＣレジスタ３３４からラッチ３３５を介してＢＰＣレジスタ３３６に待避される。起動されるＥＩＴに応じてＥＩＴベクタアドレスがジャンプ先アドレスとして制御部で生成され、即値として第１演算部２２２に出力され、ＡＢラッチ３０３、ＡＬＵ３０１を通してＪＡバス２７４に出力され、ジャンプ命令実行時と同じ処理が行われる。あとは、ジャンプ先のＥＩＴベクタアドレスの命令に従って、ＥＩＴ処理を行う。制御レジスタＣＲ４（ＲＢＣ）や制御レジスタＣＲ５（ＲＢＰ）は、ＥＩＴ検出時の状態を保持する。
【０４５４】
ＥＩＴ処理ハンドラの中で、別のＥＩＴを受け付ける可能性がある場合には、制御レジスタＣＲ３（ＢＰＣ）、制御レジスタＣＲ１（ＢＰＳＷ）の値を待避しておく。また、ハンドラ内でリングバッファ機能を使用する場合には、制御レジスタＣＲ４（ＲＢＣ）、制御レジスタＣＲ５（ＲＢＰ）やバッファレジスタＢＲ０〜ＢＲ７の値を待避しておく。ハンドラ内でリングバッファ機能を使用しない場合は、リングバッファ関連のレジスタ値を待避する必要はない。
【０４５５】
ＥＩＴ処理から元のプログラムに戻る場合には、ＥＩＴ処理からのリターン命令であるＲＴＥ命令を実行する。ＲＴＥ命令の実行により、ＢＰＳＷレジスタ３２２の値が、ＣＮＴＩＦラッチ３２１を介してＰＳＷに復帰される。また、戻り先アドレスを保持しているＢＰＣレジスタ３３６の値が、Ｓ３バス２５３、ＡＢラッチ３０３、ＡＬＵ３０１を通してＪＡバス２７４に出力され、ジャンプ命令実行時と同じ処理が行われる。ＲＭビット６８もＥＩＴを検出した状態に復帰される。このようにして、もとの処理に復帰する。
【０４５６】
リングバッファの制御は、制御レジスタＣＲ０（ＰＳＷ）のＲＭビット６８と制御レジスタＣＲ４（ＲＢＣ）のＲＢＥｉビット８３、８５、８７、８９による２段階のイネーブル制御がなされている。このように２段階の制御を行うことにより、ＥＩＴの起動及び復帰時に、制御レジスタＣＲ０（ＰＳＷ）のＲＭビット６８の１ビットのみ特殊な処理が必要となるが、制御レジスタＣＲ４（ＲＢＣ）のＲＢＥｉビット８３、８５、８７、８９はハードウェア的な待避、復帰処理が不要となり、ハードウェアが単純になり、ハードウェアの開発効率が向上する。
【０４５７】
また、ハンドラ内でリングバッファ機能を使用しない場合は、リングバッファ関連のレジスタ値を待避する必要はないため、ＥＩＴ処理中に別のＥＩＴを受け付けるようにする場合の待避／復帰が必須となるコンテキスト情報を削減でき、割り込み応答処理性能が向上できると共に、コードサイズ削減が可能である。
【０４５８】
＜実施の形態の効果＞
上述のように、ＦＩＦＯ制御のバッファをレジスタの一部に割り当てることにより、使用する論理レジスタ本数を大幅に削減でき、短い基本命令長の命令に多くのオペレーションを割り当てることが可能となる。また、繰り返し処理、端数処理や、繰り返し処理前後の処理サイクル数、及び、コードサイズを大幅に削減できる。従って、低コストで、高性能なデータ処理装置を得ることが出来る。また、処理サイクル数の削減により、消費電力も削減できる。さらに、プログラムが単純になるため、ソフトウェアの開発効率を向上出来ると共に、バグ混入の可能性を低減出来る。
【０４５９】
また、ＲＭビット６８によって、物理レジスタ固定動作を実行する汎用レジスタモードと物理レジスタ可変動作を実行するリングバッファモードが切り替え可能なので、プログラムの処理内容やソフトウェアの開発方針に応じて使い分けることが可能となり、性能向上とソフトウェアの開発効率向上の両立が可能である。例えば、ディジタル信号処理などでサイクル数の削減を優先する部分はリングバッファモードを使用して、ロードのレイテンシを考慮しループ処理を充分最適化すればよい。また、コンパイラ等のツールを使用したり、アセンブラでコーディングするがソフトウェアの開発効率を優先しループの最適化を行わない部分は単純な汎用レジスタモードを使用するなどすればよい。
【０４６０】
さらに、ＲＢＥｉビット８３，８５，８７，８９によって、レジスタ毎に汎用レジスタモードとリングバッファモードが切り替え可能なので、処理対象のプログラムにおける各レジスタに割り当てられた変数の用途に応じて、最適な設定が選択でき、効率のよいプログラムが書ける。
【０４６１】
また、制御レジスタＣＲ０（ＰＳＷ）のＲＭビット６８と制御レジスタＣＲ４（ＲＢＣ）のＲＢＥｉビット８３、８５、８７、８９による各レジスタ毎のモード設定の２段階でモード設定を行うことにより、ＥＩＴ処理のためのハードウェア制御が単純になり、ハードウェアの開発効率が向上する。また、待避／復帰が必須となるコンテキスト情報を削減できるので、割り込み応答処理性能が向上し、コードサイズ削減による低コスト化も可能である。
【０４６２】
リングバッファモード時にバッファレジスタとして追加したレジスタのみでリングバッファを構成することにより、リングバッファモードでの繰り返し処理前後におけるレジスタ値の待避、復帰が不要となり、オーバーヘッドが削減できる。
【０４６３】
逆に、既存の汎用レジスタをリングバッファモードのレジスタとして一部使用することにより、追加されるハードウェア量を削減できる。いずれを優先するかは、コストと性能のトレードオフで判断すればよい。
【０４６４】
また、ＲＢＣＮＦビット８０によってリングバッファのレジスタ構成内容を設定できるようになっているので、プログラムの処理内容に応じて、最適なバッファ構成が選択でき、効率のよいプログラムを書くことが出来る。
【０４６５】
指定対象物理レジスタ群における複数のレジスタが論理的にリング状に結合された循環バッファとしてＦＩＦＯバッファを構成し、入出力ポインタで入出力制御を行うことにより、ＦＩＦＯバッファの入出力制御が単純になり、ハードウェア開発効率が向上する。また、データを転送してＦＩＦＯバッファを実現する場合に比べ、無駄なデータ転送が削減されるため、消費電力が低減できる。さらに、変則的なポインタ更新やワーキングレジスタとして使用するなど様々な機能を追加しやすい効果もある。
【０４６６】
また、２のべき乗のエントリ数のリングバッファを実装することにより、ポインタの更新が単純なｎビットのカウンタで実現でき、ハードウェア開発効率が向上する。
【０４６７】
また、１つのレジスタに一度に複数（ｋ≧２）のデータをロードする複数データ更新命令を有することにより、使用する論理レジスタ本数を更に削減することが可能となる。
【０４６８】
リングバッファの出力ポインタ更新に関して、レジスタ値参照命令の実行に伴い暗黙的に出力ポインタ更新を行うことにより、処理サイクル数、コードサイズを削減できる。
【０４６９】
また、リングバッファに割り付けられた変数の用途や使われ方に応じて、リピートブロック最終命令や分岐命令を実行する場合など、所定の条件が成立した場合に暗黙的に設定された特定論理レジスタに対応する出力ポインタ更新を行うことにより、処理サイクル数、コードサイズを削減できる。
【０４７０】
また、出力ポインタ更新命令により明示的にポインタ更新を行う機能を備えることにより、複数の処理単位でループを形成したり、変則的な処理が必要な場合に、柔軟に対応できる効果がある。
【０４７１】
さらに、出力ポインタ更新命令でレジスタ毎に出力ポインタ更新が指示できるので、プログラムの処理内容に合わせて効率のよいプログラムが書ける。
【０４７２】
また、複数の出力ポインタ更新モード情報によってプログラムで出力ポインタの変更方法を設定可能にしているので、上述のプログラム例でも示されているように、レジスタに割り当てている変数の用途に応じて、効率のよいプログラムが書ける。
【０４７３】
また、レジスタ毎に出力ポインタの変更方法の設定を行うことにより、変数毎に細やかな設定が出来るため、効率のよいプログラムが書ける。
【０４７４】
１つのレジスタ番号のリングバッファから２つのデータを一度に参照し、出力ポインタを１のみ更新するような複数データ参照命令を備えることにより、ＳＩＭＤ演算でシングルサンプルＦＩＲ処理の２サンプル同時処理が効率よく行える。
【０４７５】
ストア（メモリ格納）時にリングバッファとは異なるレジスタ（メモリ格納命令用物理レジスタ）の値を参照することにより、このレジスタをストアバッファとして使用することが出来る。
【０４７６】
さらに、このレジスタとして汎用レジスタを使用することにより、ハードウェアコストを削減できる。ストア時にリングバッファの値を参照することにより、メモリ−メモリ間転送を効率よく行うことが出来る。
【０４７７】
ストア時にリングバッファを構成するレジスタの値を参照することにより、メモリ−メモリ間転送を行う場合に、効率のよいプログラムが書ける効果を奏する。
【０４７８】
また、ストア時に参照するレジスタとして、リングバッファを構成するレジスタあるいはリングバッファとは異なるレジスタを選択する機能を備えることにより、処理するプログラムの内容に応じて、効率のよいプログラミングを行うことが出来る。
【０４７９】
さらに、プログラムでレジスタに割り当てられる変数の用途に応じて、リングバッファを構成する各レジスタ毎に任意にストア時に参照されるレジスタ値の設定を行うことが出来るため、プログラムの処理内容に応じて効率のよいプログラムを書くことが出来る。
【０４８０】
演算命令等のデータ更新命令の実行時に、リングバッファとは異なるレジスタ（データ更新用物理レジスタ）の値を更新することにより、このレジスタをストアバッファとして使用することが出来る。
【０４８１】
また、演算命令等のデータ更新命令の実行時に、リングバッファの出力ポインタが指し示すエントリに書き込むことにより、リングバッファの出力ポインタが指し示すエントリを作業用レジスタとして使用できる。
【０４８２】
また、リングバッファとは異なるレジスタ（データ更新用物理レジスタ）とリングバッファの出力ポインタが指し示すエントリの両方に書き込むことにより、１つの論理レジスタ番号で作業用レジスタとストアバッファを同時に扱うことが出来る。このように、扱う論理レジスタ番号が削減できるため、効率のよいプログラムが書ける。
【０４８３】
プログラムでレジスタに割り当てられる変数の用途に応じて、任意に更新するレジスタの設定を行うことが出来るため、効率のよいプログラムを書くことが出来る。
【０４８４】
さらに、リングバッファとは異なるレジスタとして汎用レジスタを使用することにより、ハードウェアコストを削減できる。
【０４８５】
また、新規命令を追加することなく扱う論理レジスタ本数を削減することが出来るため、基本命令長を削減でき、コード効率の向上と性能向上を両立できる。
【０４８６】
命令数及び処理サイクル数の少ない効率のよいプログラムが書けることにより、処理性能が向上し、ＲＯＭのコードサイズが削減できるため、製品コストを低減できる効果がある。また、より単純なプログラムが書けることにより、ソフトウェアの開発効率も向上する。
【０４８７】
上記実施の形態で示したデータ処理装置の構成例は、あくまでも一実施の形態を示したものであり、本発明の適用範囲を限定するものではない。
【０４８８】
上記実施の形態では、ＶＬＩＷプロセッサに対して本発明の技術を適用した例を示しているが、ＲＩＳＣプロセッサやＣＩＳＣプロセッサ等、基本的にどのようなアーキテクチャのデータ処理装置に関しても適用可能である。ただし、ＣＩＳＣプロセッサでは、ロード、ストア命令以外のメモリオペランドに関しては対応できないなど、一部制限が加わる場合がある。
【０４８９】
パイプライン構成も本技術の適用に特に制限はない。ただし、パイプライン段数が深くなればなるほど、より多くのバッファレジスタが必要になる。
【０４９０】
上記実施の形態では、一実施の形態としてＦＩＦＯバッファとしてリングバッファを実装した場合について詳細に説明したが、ＦＩＦＯ方式で制御されるどのようなバッファを実装しても、上記実施の形態と同様の効果を奏する。例えば、実際データをシフトすることによりＦＩＦＯ制御を実現する形態のＦＩＦＯバッファでもよい。
【０４９１】
上記実施の形態では、汎用レジスタを備えるデータ処理装置に対して、汎用レジスタの一部をリングバッファについて説明したが、その他のアーキテクチャのデータ処理装置に関してもこの技術は適応可能であり、同様の効果を奏することが出来る。例えば、データレジスタとアドレスレジスタが分離されているデータレジスタや、汎用レジスタではなくアキュムレータと捉えているアキュムレータに対して、本発明の技術を適用してもよい。
【０４９２】
上記実施の形態では、リングバッファのポインタの更新はポストインクリメントで実現しているが、デクリメントするようにしてもよいし、どのような更新制御を行ってもよい。入力ポインタ及び出力ポインタは、各々入力データ位置と出力データ位置を管理できればよい。
【０４９３】
＜リングバッファ制御レジスタの他の構成＞
図６２は制御レジスタＣＲ４（ＲＢＣ）とは異なるリングバッファ制御レジスタ（ＲＢＣレジスタ）の構成例を示す説明図である。全体の基本的な構成は、実施の形態１のデータ処理装置で用いた図６で示す制御レジスタＣＲ４（ＲＢＣレジスタ）とほぼ同じである。簡単のため、実施の形態１のデータ処理装置と異なる点についてのみ説明する。
【０４９４】
リングバッファの構成は、制御レジスタＣＲ４（ＲＢＣ）のＲＢＣＮＦビット８０が“００”の場合と同様、論理レジスタＲ０，Ｒ１の２つのレジスタが、各々４本のバッファレジスタで構成される場合を示している。
【０４９５】
ＲＢＥ０ビット１００１及びＲＢＥ１ビット１００４は、図６で示したＲＢＥ０ビット８３及びＲＢＥ１ビット８５と同様、リングバッファイネーブル制御ビットである。リングバッファとして動作可能な論理レジスタＲ０、Ｒ１の各レジスタ毎にリングバッファレジスタとして動作するか、汎用レジスタとして動作するかを制御できる。ＲＢＥ０ビット１００１，ＲＢＥ１ビット１００４は、各々論理レジスタＲ０、Ｒ１のレジスタに対応し、“０”の場合通常のレジスタとして動作し、“１”の場合リングバッファレジスタとして動作することを示す。
【０４９６】
２つのモード設定情報であるＳＴＭ０ビット１００２、ＳＴＭ１ビット１００６は、バッファレジスタとして動作しているレジスタの値をストアするストア命令処理時にストアするデータを、リングバッファとして動作可能な論理レジスタＲ０、Ｒ１の各レジスタ毎に選択するストアデータ選択モードビットである。ＳＴＭ０ビット１００２及びＳＴＭ１ビット１００６が、“０”の場合ストアするデータをリングバッファを構成するバッファレジスタの出力ポインタが指し示すレジスタから読み出し（第２のモード指定）、“１”の場合ストアするデータを通常の汎用レジスタから読み出す（第１のモード指定）。
【０４９７】
ＷＭ０ビット１００３，ＷＭ１ビット１００７は、命令の実行に伴うロード以外のレジスタへの書き込み時に、どのレジスタに値を書き込むかを、リングバッファとして動作可能な論理レジスタＲ０、Ｒ１の各レジスタ毎に選択するレジスタ値書き込み対象選択ビット（２ビット構成）である。ＷＭ０ビット１００３及びＷＭ１ビット１００７が“０１”の場合対応する汎用レジスタに値を書き込み（第１のレジスタ指定）、“１０”の場合リングバッファを構成するバッファの出力ポインタが指し示すレジスタに値を書き込み（第３のレジスタ指定（第２のレジスタ指定））、“１１”の場合汎用レジスタ及びリングバッファを構成するバッファの出力ポインタが指し示すレジスタの両方に値を書き込む（第４のレジスタ指定（第２のレジスタ指定））。
【０４９８】
ＯＰＭ０ビット１００４，ＯＰＭ１ビット１００８は、図６で示したＯＰＭ０ビット８４，ＯＰＭ２ビット８８と同様、リングバッファの出力ポインタ更新モードビット（２ビット構成）である。図６２で示すＲＢＣレジスタ１０００では、リングバッファとして動作可能な論理レジスタＲ０、Ｒ１の各レジスタ毎に４種類のポインタ更新方法の指定が可能である。
【０４９９】
ＯＰＭ０ビット１００４及びＯＰＭ１ビット１００８は、各々論理レジスタＲ０及びＲ１のレジスタに対してポインタ更新方法を指定する。ＯＰＭｉビットが“００”の場合、リングバッファの出力ポインタ更新命令が実行されたことにより明示的に出力ポインタの更新が指定された場合のみ、命令により指定された出力ポインタを＋１だけ更新する。ＯＰＭｉビットが“０１”の場合、命令の実行によりレジスタ値が参照されたことにより参照されたレジスタのポインタが自動的に＋１更新される。ＯＰＭｉビットが“１０”の場合は、ブロックリピート処理中のリピートブロックの最終命令実行時に自動的にリングバッファとして動作しているレジスタの出力ポインタが＋１更新される。ＯＰＭｉビットが“１１”の場合は、分岐命令実行時に自動的にリングバッファとして動作しているレジスタの出力ポインタが＋１更新される。ＯＰＭｉビットが“０１”、“１０”、もしくは、“１１”の場合も、出力ポインタ更新命令によるポインタの更新は行われる。
【０５００】
リングバッファの構成以外で制御レジスタＣＲ４（ＲＢＣ）とＲＢＣレジスタ１０００で大きく異なる点は、ストアデータ選択モード用のビット（ＳＴＭ０、ＳＴＭ１）、レジスタ値書き込み対象選択用のビット（ＷＭ０、ＷＭ１）が各レジスタ毎に設けられている点と、レジスタ値書き込み対象選択ビット（ＷＭ０、ＷＭ１）が２ビット化され、リングバッファのみに書き込む機能が追加されている点である。ＲＢＣレジスタ１０００に基づく基本的な動作は、上述した実施の形態のデータ処理装置における制御レジスタＣＲ４（ＲＢＣ）に基づくとほぼ同一なので詳細な説明は省略する。
【０５０１】
このように、ＲＢＣレジスタ１０００は、各レジスタ毎にストアデータ選択モードビット（ＳＴＭ０、ＳＴＭ１）、レジスタ値書き込み対象選択ビット（ＷＭ０、ＷＭ１）を設けることにより、プログラムの処理内容に依存してより詳細な設定が可能となる。例えば、レジスタ値書き込み対象選択ビットをレジスタ毎に設けることにより、あるレジスタは汎用レジスタをストアバッファとして使用し、別のレジスタは作業用レジスタとして使用するなどの使い方が可能となる。ストアデータ選択モードビットをレジスタ毎に設けることにより、メモリデータの転送と演算処理が混在するような処理を行う場合に、レジスタの使用効率を向上させることが出来る。従って、処理サイクル数、コードサイズが削減され、高性能化、低コスト化が図られる場合がある。
【０５０２】
加えて、レジスタ値書き込み対象選択ビット（ＷＭ０、ＷＭ１）が２ビット化され、リングバッファのみに書き込む機能が追加されることにより、よりレジスタの使用効率を高めることができる。
【０５０３】
また、リングバッファのみに書き込む機能が追加されたことにより、汎用レジスタ値の不要な更新が削減できる。例えば、図５６のプログラム処理例９では、このモードがなかったため、汎用レジスタの値を不必要に破壊しているが、このモードを備えると汎用レジスタの値を保持できるようになるので、繰り返し処理の前後でレジスタ値の待避、復帰が不要になる。従って、処理サイクル数、コードサイズが削減され、高性能化、低コスト化が図られる場合がある。
【図面の簡単な説明】
【０５０４】
【図１】汎用レジスタを示す説明図である。
【図２】アキュムレータを示す説明図である。
【図３】制御レジスタ（その１）を示す説明図である。
【図４】制御レジスタ（その２）を示す説明図である。
【図５】制御レジスタＣＲ０に格納されるＰＳＷの構成を示す説明図である。
【図６】制御レジスタＣＲ４に格納されるＲＢＣの構成を示す説明図である。
【図７】制御レジスタＣＲ５に格納されるＲＢＰの構成を示す説明図である。
【図８】汎用レジスタモードにおける論理レジスタ構成を示す説明図である。
【図９】リングバッファモード時における論理レジスタ構成（その１）を示す説明図である。
【図１０】リングバッファモード時における論理レジスタ構成（その２）を示す説明図である。
【図１１】リングバッファモード時における論理レジスタ構成（その３）を示す説明図である。
【図１２】本データ処理装置の命令フォーマットを示す説明図である。
【図１３】ＦＭビットのフォーマット及び実行順序指定の詳細を示す説明図である。
【図１４】典型的な命令のビット割り付けの例（その１）を示す説明図である。
【図１５】典型的な命令のビット割り付けの例（その２）を示す説明図である。
【図１６】典型的な命令のビット割り付けの例（その３）を示す説明図である。
【図１７】典型的な命令のビット割り付けの例（その４）を示す説明図である。
【図１８】本実施の形態のデータ処理装置の機能ブロック構成を示すブロック図である。
【図１９】レジスタファイルの内部構成の詳細を示すブロック図である。
【図２０】第１演算部の内部構成の詳細を示すブロック図である。
【図２１】ＰＣ部の内部構成の詳細を示すブロック図である。
【図２２】第２演算部の内部構成の詳細を示すブロック図である。
【図２３】パイプライン処理を示す説明図である。
【図２４】ロードオペランド干渉の例を示す説明図である。
【図２５】演算ハードウェア干渉の例を示す説明図である。
【図２６】制御部におけるリングバッファ制御関連部分の構成を示すブロック図である。
【図２７】命令ニーモニックで指定されるレジスタ名とオペレーションコードで指定される４ビットの論理レジスタ番号との対応関係を表形式示す説明図である。
【図２８】レジスタセットとしてのレジスタ名と５ビットの物理レジスタ番号の対応関係を表形式で示す説明図である。
【図２９】積和演算を行うアセンブラでのプログラム例１を示す説明図である。
【図３０】ロード命令ＬＤ２の命令コードの割り付けを示す説明図である。
【図３１】積和演算命令ＭＡＣの命令コードの割り付けを示す説明図である。
【図３２】プログラム例１におけるブロックリピート処理時のパイプライン処理の詳細を説明図である。
【図３３】図３２のパイプライン処理時におけるリングバッファの様子を示す説明図である。
【図３４】積和演算を行うアセンブラでのプログラム例２を示す説明図である。
【図３５】プログラム例２におけるブロックリピート処理時のパイプライン処理の詳細を説明図である。
【図３６】図３５のパイプライン処理時におけるリングバッファの様子を示す説明図である。
【図３７】積和演算を行うアセンブラでのプログラム例３を示す説明図である。
【図３８】プログラム例３におけるブロックリピート処理時のパイプライン処理の詳細を説明図である。
【図３９】図３８のパイプライン処理時におけるリングバッファの様子を示す説明図である。
【図４０】倍精度の乗算を伴う積和演算を行うプログラム例４を示す説明図である。
【図４１】プログラム例４におけるブロックリピート処理中のパイプライン処理の詳細を示す説明図である。
【図４２】図４１のパイプライン処理時におけるリングバッファの様子を示す説明図である。
【図４３】倍精度の乗算を伴う積和演算を行うプログラム例５を示す説明図である。
【図４４】リングバッファの出力ポインタ更新命令ＵＰＤＢＯＰのビット割り付けを示す説明図である。
【図４５】プログラム例５におけるブロックリピート処理中のパイプライン処理の詳細を示す説明図である。
【図４６】図４５のパイプライン処理時におけるリングバッファの様子を示す説明図である。
【図４７】単精度積和演算で２サンプル分同時に処理する場合のプログラム例６を示す説明図である。
【図４８】プログラム例６におけるブロックリピート処理中のパイプライン処理の詳細を示す説明図である。
【図４９】図４８のパイプライン処理時におけるリングバッファの様子を示す説明図である。
【図５０】メモリ−メモリ間転送を行う場合のプログラム例７を示す説明図である。
【図５１】プログラム例７におけるリピート処理中のパイプライン処理の詳細を示す説明図である。
【図５２】図５１のパイプライン処理時におけるリングバッファの様子を示す説明図である。
【図５３】配列データのシフトを行うプログラム例８を示す説明図である。
【図５４】プログラム例８におけるリピート処理中のパイプライン処理の詳細を示す説明図である。
【図５５】図５４のパイプライン処理時におけるリングバッファの様子を示す説明図である。
【図５６】差分二乗和を計算するプログラム例９を示す説明図である。
【図５７】プログラム例９におけるリピート処理中のパイプライン処理の詳細を示す説明図である。
【図５８】図５７のパイプライン処理時におけるリングバッファの様子を示す説明図である。
【図５９】１６ビット整数配列データに関して１次関数の処理を繰り返すプログラム例１０を示す説明図である。
【図６０】プログラム例１０におけるリピート処理中のパイプライン処理の詳細を示す説明図である。
【図６１】図６０のパイプライン処理時におけるリングバッファの様子を示す説明図である。
【図６２】リングバッファ制御レジスタの他の構成例を示す説明図である。
【符号の説明】
【０５０５】
２００  データ処理装置、２０１  ＭＰＵコア部、２０２  命令フェッチ部、２０３  内蔵命令メモリ、２０４  オペランドアクセス部、２０５  内蔵データメモリ、２０６  外部バスインターフェイス部、２１１  制御部、２１２  命令キュー、２１３  命令デコード部、２１４  第１デコーダ、２１５  第２デコーダ、２５０  リングバッファ制御部、２６０  ＰＳＷ部、５１４  入力ポインタ更新回路、５１８  出力ポインタ更新回路、５３１  レジスタマッピング回路。
【図１】
2006004042.tif 000003
【図２】
2006004042.tif 000004
【図３】
2006004042.tif 000005
【図４】
2006004042.tif 000006
【図５】
2006004042.tif 000007
【図６】
2006004042.tif 000008
【図７】
2006004042.tif 000009
【図８】
2006004042.tif 000010
【図９】
2006004042.tif 000011
【図１０】
2006004042.tif 000012
【図１１】
2006004042.tif 000013
【図１２】
2006004042.tif 000014
【図１３】
2006004042.tif 000015
【図１４】
2006004042.tif 000016
【図１５】
2006004042.tif 000017
【図１６】
2006004042.tif 000018
【図１７】
2006004042.tif 000019
【図１８】
2006004042.tif 000020
【図１９】
2006004042.tif 000021
【図２０】
2006004042.tif 000022
【図２１】
2006004042.tif 000023
【図２２】
2006004042.tif 000024
【図２３】
2006004042.tif 000025
【図２４】
2006004042.tif 000026
【図２５】
2006004042.tif 000027
【図２６】
2006004042.tif 000028
【図２７】
2006004042.tif 000029
【図２８】
2006004042.tif 000030
【図２９】
2006004042.tif 000031
【図３０】
2006004042.tif 000032
【図３１】
2006004042.tif 000033
【図３２】
2006004042.tif 000034
【図３３】
2006004042.tif 000035
【図３４】
2006004042.tif 000036
【図３５】
2006004042.tif 000037
【図３６】
2006004042.tif 000038
【図３７】
2006004042.tif 000039
【図３８】
2006004042.tif 000040
【図３９】
2006004042.tif 000041
【図４０】
2006004042.tif 000042
【図４１】
2006004042.tif 000043
【図４２】
2006004042.tif 000044
【図４３】
2006004042.tif 000045
【図４４】
2006004042.tif 000046
【図４５】
2006004042.tif 000047
【図４６】
2006004042.tif 000048
【図４７】
2006004042.tif 000049
【図４８】
2006004042.tif 000050
【図４９】
2006004042.tif 000051
【図５０】
2006004042.tif 000052
【図５１】
2006004042.tif 000053
【図５２】
2006004042.tif 000054
【図５３】
2006004042.tif 000055
【図５４】
2006004042.tif 000056
【図５５】
2006004042.tif 000057
【図５６】
2006004042.tif 000058
【図５７】
2006004042.tif 000059
【図５８】
2006004042.tif 000060
【図５９】
2006004042.tif 000061
【図６０】
2006004042.tif 000062
【図６１】
2006004042.tif 000063
【図６２】
2006004042.tif 000064