説明

プロセッサ

【課題】より小さいサイズのプログラムで動作させることが可能な、消費電力の小さいプロセッサを提供する。
【解決手段】第2の命令が含むソースレジスタ情報が示すレジスタと第1の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致し、かつ第2の命令が第1の命令によって得られる演算値を使用する最後の命令であることを第2の命令又は第2の命令に先行する命令が指定している場合、パイプラインレジスタに格納されている演算値を第1の命令が含むディスティネーションレジスタ情報が示すレジスタに格納せず、それ以外の場合、パイプラインレジスタに格納されている演算値を第1の命令が含むディスティネーションレジスタ情報が示すレジスタに格納する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、消費電力の小さいパイプライン処理方式のプロセッサを実現する技術に関する。
【背景技術】
【0002】
プロセッサの処理性能を高めるために、パイプライン処理方式が一般に用いられている。パイプライン処理方式のプロセッサにおいては、命令の実行に必要なソースオペランド値を取得する際、最新のソースオペランド値がパイプライン中に存在する場合は、レジスタファイル中に存在する値ではなく、パイプライン中に存在する値を使用する。このことは、オペランドフォワード又はオペランドバイパスと呼ばれている。こうして、先行する命令による演算値がレジスタファイルへと書き込まれる前に、最新の演算値を用いて次の命令を実行することができる。
【0003】
オペランドフォワードが行われる場合、レジスタファイルから値を読み出す必要はない。また、演算値のオペランドフォワードが行われ、その後その演算値を読み出す必要がない事が分かっている場合は、その演算値をレジスタファイルへと書き込む必要はない。レジスタファイルからの値の読み書きを減らすことにより、プロセッサの消費電力を減らすことができる。
【0004】
非特許文献1の方法によれば、先行する命令のディスティネーションレジスタと、後続する命令のソースオペランドレジスタ及びディスティネーションレジスタが一致する場合が検出される。この場合、先行する命令による演算値が、後続する命令へとオペランドフォワードされる。さらに、後続する命令によってレジスタ値が更新されるために、先行する命令の演算値がその後読み出されることはない。すなわち、後続する命令によって、先行する命令の演算値がもう読み出されないことが指定される。したがって、先行する命令の演算値が、レジスタファイルに格納される必要はない。
【0005】
特許文献1の方法によれば、先行する命令の演算値がオペランドフォワードされた際に、先行する命令の演算値をレジスタファイルに格納するか否かが、先行する命令において明示される。すなわち、先行する命令において、その命令の演算値がオペランドフォワード後にはもう読み出されないことが指定される。
【先行技術文献】
【非特許文献】
【0006】
【非特許文献1】オペランド再利用によるレジスタファイルの低消費電力化 情報処理学会研究報告. 計算機アーキテクチャ研究会報告 2002(81) pp.13−18 20020822
【特許文献】
【0007】
【特許文献1】国際公開WO07/083421号パンフレット
【発明の概要】
【発明が解決しようとする課題】
【0008】
非特許文献1の方法では、後続する命令がディスティネーションレジスタとソースオペランドレジスタとの双方を指定する場合に、先行する命令の演算値がもう読み出されないことを指定できる。したがって後続する命令が、比較命令、メモリへのストア命令、及び分岐命令などの、ディスティネーションレジスタが指定されない命令である場合、先行する命令の演算値がもう読み出されないことを指定することができない。
【0009】
また、先行する命令の演算値を後続する2つ以上の命令へとオペランドフォワードする場合、最後のオペランドフォワードが成功したことを確認しなければ、演算値をレジスタファイルに格納することを省略することができない。しかしながら特許文献1の方法には、このことを可能とする方法は開示されていない。また、特許文献1の方法では、先行する命令のそれぞれについて、レジスタファイルへの書き込みが必要か不要かが示される。したがって特許文献1の方法によると、平均命令ビット長及びプログラムサイズが大きくなり、消費電力も大きくなる。
【0010】
本発明は、より小さいサイズのプログラムで動作させることが可能な、消費電力の小さいプロセッサを提供する。
【課題を解決するための手段】
【0011】
本発明の目的を達成するために、例えば、本発明のプロセッサは以下の構成を備える。すなわち、
命令をパイプライン処理するプロセッサであって、
前記プロセッサは、
命令を実行して得られる結果を格納する複数のレジスタと、
命令を取得する取得手段と、
前記命令が含む、演算に用いるオペランドが格納されている前記レジスタを指定するソースレジスタ情報に従って取得したオペランドを用いて、前記命令が含む、処理の種類を指定するオペレーションコードによって指定された演算を行い、演算値を取得する演算手段と、
前記演算手段によって得られた演算値を格納するパイプラインレジスタと、
前記命令が含む、前記演算値を格納するレジスタを指定するディスティネーションレジスタ情報に従って、前記パイプラインレジスタに格納された演算値を前記レジスタに格納する格納手段と、
を備え、
前記プロセッサに、前記演算値を格納するレジスタを指定するディスティネーションレジスタ情報を含む第1の命令と、前記ディスティネーションレジスタ情報を含まない第2の命令とが入力され、前記第2の命令に従う演算を前記演算手段が行う際に、前記第1の命令により得られる演算値が前記パイプラインレジスタに格納されている場合に、
前記演算手段は、前記第2の命令が含むソースレジスタ情報が示すレジスタと、前記第1の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致する場合、前記パイプラインレジスタに格納されている演算値を前記第2の命令に用いるオペランドとして取得し、
前記格納手段は、前記第2の命令が含むソースレジスタ情報が示すレジスタと前記第1の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致し、かつ前記第2の命令が前記第1の命令によって得られる演算値を使用する最後の命令であることを前記第2の命令又は前記第2の命令に先行する命令が指定している場合、前記パイプラインレジスタに格納されている演算値を前記第1の命令が含むディスティネーションレジスタ情報が示すレジスタに格納せず、それ以外の場合、前記パイプラインレジスタに格納されている演算値を前記第1の命令が含むディスティネーションレジスタ情報が示すレジスタに格納することを特徴とする。
【発明の効果】
【0012】
本発明によれば、より小さいサイズのプログラムで動作させることが可能な、消費電力の小さいプロセッサを実現することができる。
【図面の簡単な説明】
【0013】
【図1】実施例1に係るプロセッサの全体構成を表す図
【図2】実施例1に係る命令実行ユニットを表す図
【図3】実施例3に係る命令実行ユニットを表す図
【発明を実施するための形態】
【0014】
[実施例1]
本実施例では、プロセッサ内の汎用レジスタが用いられる場合のように、複数のレジスタが存在する場合に、レジスタ番号を用いて各レジスタを識別する。また、Validレジスタ172,182、Tempレジスタ173,183、及び制御レジスタ174,184は、0又は1を値として持つ。これらのレジスタは、セット状態の時には値として1を持つ。またこれらのレジスタは、クリア状態の時には値として0を持つ。
【0015】
図1に本実施例に係るプロセッサの一例を示す。本実施例に係るプロセッサは、入力された命令をパイプライン処理することができる。本実施例に係るプロセッサは、命令フェッチユニット203と命令実行ユニット204とを含む。命令フェッチユニット203は命令フェッチを行う(取得手段)。そして命令フェッチユニット203は、フェッチされた命令を、命令情報201として命令実行ユニット204に送る。命令実行ユニット204は、受信された命令を実行する。命令実行ユニット204が分岐命令を実行した場合、命令実行ユニット204は、新しい命令フェッチアドレスを、分岐情報202として命令フェッチユニット203に送る。
【0016】
図2に本実施例に係る命令実行ユニット204の一例を示す。本実施例において、命令実行ユニット204が行う処理は、演算ステージと、メモリステージと、レジスタファイル書き込みステージとに分かれている。命令実行ユニット204が行う処理が各ステージへと異なる方法で分割される場合にも、当業者は本実施例を変形して利用することができるだろう。また説明の簡単化の為に、本実施例においてパイプラインストールは発生しないものとする。もっとも当業者ならば、パイプラインストールに対応するための既存の方法を本実施例に組み込むことができるだろう。
【0017】
命令レジスタ101は、命令フェッチユニット203からの命令情報201を受け取る。そして命令レジスタ101は、命令情報201を格納する。命令情報201からは、オペレーションコードと、ディスティネーションレジスタ情報と、ソースオペランドレジスタ情報(ソースレジスタ情報)とを取得することが可能である。本実施例においては命令情報201からさらに、ソースオペランドレジスタに格納されている値が、命令を実行した後に再び参照されるか否かを示す情報を取得することができる。
【0018】
新しい命令が命令レジスタ101に格納されると、命令デコード装置103は、命令レジスタ101に格納された命令をデコードする。命令デコード装置103は、オペレーションコードデコード装置152、ディスティネーションレジスタデコード装置153、及びソースレジスタデコード装置154を含む。
【0019】
オペレーションコードデコード装置152は、命令のうちオペレーションコードをデコードする。オペレーションコードは、命令の種類を規定する。さらにオペレーションコードデコード装置152は、演算装置106に対して演算制御信号を出力する。例えば、命令レジスタ101に格納された命令が加算命令、減算命令、又はAND命令の場合、オペレーションコードデコード装置152は演算装置106に演算制御信号を出力することにより、演算装置に加算、減算、又はAND計算を行わせる。
【0020】
また、オペレーションコードデコード装置152による処理の結果は、第1パイプラインレジスタ107内の、オペレーションコードレジスタ171、Validレジスタ172、及びTempレジスタ173に格納される。オペレーションコードデコード装置152は、命令レジスタ101の内容から、メモリステージにおいて必要なオペレーションコードを算出する。そしてオペレーションコードデコード装置152は、算出されたオペレーションコードをオペレーションコードレジスタ171にセットする。さらにオペレーションコードデコード装置152は、命令レジスタ101内の命令が有効である場合にValidレジスタ172をセットする。
【0021】
またオペレーションコードデコード装置152は、命令レジスタ101の内容から、演算ステージにおいてレジスタファイルへの書き込みデータが確定されるか否かを判定する。確定される場合、オペレーションコードデコード装置152は制御レジスタ174をセットし、Tempレジスタ173をクリアする。逆に、演算ステージにおいてレジスタファイルへの書き込みデータが確定しない場合、オペレーションコードデコード装置152はTempレジスタ173をセットし、制御レジスタ174をクリアする。
【0022】
例えば、命令レジスタ101にAND命令が格納されている場合を考える。この場合、演算ステージにおける演算装置106の演算により、レジスタファイルへと書き込まれるデータが確定する。したがってこの場合、オペレーションコードデコード装置152は制御レジスタ174をセットし、Tempレジスタ173をクリアする。
【0023】
一方で、命令レジスタ101にロード命令が格納されている場合を考える。この場合、演算装置106はロード時に使用するメモリアドレスの計算を行う。すなわち、演算ステージにおいては、レジスタファイルへと書き込まれるデータは確定されない。メモリステージにおいて、レジスタファイルへの書き込みデータが確定される。したがってこの場合、オペレーションコードデコード装置152は制御レジスタ174をクリアし、Tempレジスタ173をセットする。
【0024】
ディスティネーションレジスタデコード装置153は、命令レジスタ101の値から、処理結果が書き込まれるレジスタ番号を算出する。そしてディスティネーションレジスタデコード装置153は、算出されたレジスタ番号をディスティネーションレジスタ175に格納する。
【0025】
ソースレジスタデコード装置154は、命令レジスタ101の値から、第1ソースオペランドのレジスタ番号134を算出し、出力する。またソースレジスタデコード装置154は、第1ソースオペランドが、命令実行後に再び取得されるか否かを判断する。言い換えるとソースレジスタデコード装置154は、命令情報201に示される命令の実行後、レジスタ番号134が示すレジスタの値が更新される前に、レジスタ番号134が示すレジスタが再び参照されるか否かを判断する。第1ソースオペランドが命令実行後に再び取得されるか否かは、命令情報201に含まれており、ソースレジスタデコード装置154によって解読されることができる。
【0026】
参照されない場合には、ソースレジスタデコード装置154は保持不要信号136を出力する。同様にソースレジスタデコード装置154は、第2ソースオペランドに対して、レジスタ番号135と、第2ソースオペランドについての保持不要信号137とを出力する。
【0027】
レジスタファイル102は、第1ソースオペランドのレジスタ番号134を受け取り、対応するレジスタ値122を出力する。同様にレジスタファイル102は、第2ソースオペランドのレジスタ番号135を受け取り、対応するレジスタ値123を出力する。オペランドフォワード装置111は、レジスタ値122と、データレジスタ176に格納されている値と、データレジスタ186に格納されている値とから1つを選択する。そしてオペランドフォワード装置111は、選択された値を第1ソースオペランド138として演算装置106へと出力する。またオペランドフォワード装置111は、レジスタ値123と、データレジスタ176と、データレジスタ186とから1つを選択し、第2ソースオペランド139として演算装置106へと出力する。オペランドフォワード装置111の処理については後述する。
【0028】
演算装置106は、第1ソースオペランド138と、第2ソースオペランド139と、オペレーションコードデコード装置152が出力する演算制御信号とに応じて演算を行う(演算手段)。そして演算装置106は、演算結果をデータレジスタ176に格納する。第1パイプラインレジスタ107は、オペレーションコードレジスタ171、Validレジスタ172、Tempレジスタ173、及び制御レジスタ174を含む。これらのレジスタ171〜174は、オペレーションコードデコード装置152からのデータを格納する。
【0029】
また第1パイプラインレジスタ107は、ディスティネーションレジスタ175、及びデータレジスタ176を含む。ディスティネーションレジスタ175は、ディスティネーションレジスタデコード装置153からのデータを格納する。データレジスタ176は、演算装置106による演算結果を格納する。
【0030】
オペレーションコードレジスタ171は、オペレーションコードを保持している。Validレジスタ172は、命令レジスタ101内の命令が有効であることを示す値を保持している。Tempレジスタ173はレジスタファイルに書き込むデータが確定していないことを示す値を保持している。制御レジスタ174は、データレジスタ176に格納されている値を、レジスタファイルに書き込む必要があることを示す値を保持している。
【0031】
メモリ制御装置109は、第1パイプラインレジスタ107のオペレーションコードレジスタ171に格納された値を参照する。参照された値に従ってメモリ制御装置109は、メモリ110へと制御信号を出力する。またメモリ制御装置109は参照された値に従って、Validレジスタ182、Tempレジスタ183、及び制御レジスタ184に格納する値を出力する。
【0032】
オペレーションコードレジスタ171に格納されたオペレーションコードがロード命令又はストア命令の時は、メモリ制御装置109はメモリ110に対してメモリ制御信号を出力し、メモリ110に対してリード又はライトを行わせる。オペレーションコードレジスタ171に格納されたオペレーションコードがそれ以外の場合は、メモリ制御装置109はメモリ110に対してメモリ制御信号を出力し、データレジスタ176からのメモリ110への入力をそのまま出力させる。
【0033】
またメモリ制御装置109は、Validレジスタ172の内容を、Validレジスタ182にセットする。また、オペレーションコードレジスタ171にロード命令が格納されている場合、メモリ110からのリードが行われるとレジスタファイルへの書き込みデータが確定する。したがって、オペレーションコードレジスタ171にロード命令が格納されている場合、メモリ制御装置109はTempレジスタ183をクリアし、かつ制御レジスタ184をセットする。
【0034】
一方でオペレーションコードレジスタ171にロード命令以外が格納されている場合、メモリ制御装置109はTempレジスタ183に、Tempレジスタ173の内容をセットする。また、メモリ制御装置109は制御レジスタ184に、キャンセル反映装置177からの値をセットする。キャンセル反映装置177については後述する。メモリ110は、メモリ制御装置109によって出力されるメモリ制御信号に基づいて、リード動作、ライト動作、又はデータレジスタ176の値をそのまま出力する動作を行う。そしてメモリ110は、結果をデータレジスタ186に出力する。
【0035】
第2パイプラインレジスタ108は、オペレーションコードレジスタ181、Validレジスタ182、Tempレジスタ183、及び制御レジスタ184を含む。これらのレジスタ181〜184は、メモリ制御装置109によって出力された値を格納する。また第2パイプラインレジスタ107は、ディスティネーションレジスタ185、及びデータレジスタ186を含む。ディスティネーションレジスタ185は、ディスティネーションレジスタ175と同じ値を格納する。データレジスタ186は、メモリ110からの値を格納する。
【0036】
レジスタ181〜186は、第1パイプラインレジスタ108内のレジスタ171〜176と同様の情報を格納する。キャンセル反映装置187は、制御レジスタ184の値と、キャンセル制御装置104からの値とに基づいて、データレジスタ186内のデータのレジスタファイル102への書き出しを制御する。キャンセル反映装置の処理については後述する。
【0037】
次に、オペランドフォワード装置111について説明する。オペランドフォワード装置111は、ソースレジスタデコード装置154から出力された第1ソースオペランドのレジスタ番号134と、ディスティネーションレジスタ175又は185とが、一致するか否かを判定する。本実施例においてオペランドフォワード装置111は、より後にデコードされた命令についてのディスティネーションレジスタ175について、最初に判定を行う。
【0038】
本実施例においてオペランドフォワード装置111(132c)は、第1ソースオペランドのレジスタ番号134が、第1パイプラインレジスタ107のディスティネーションレジスタ175と同じかどうかを判定する。同じ場合オペランドフォワード装置111(131c)は、第1パイプラインレジスタのデータレジスタ176に格納されている値を、第1ソースオペランド138として、演算装置106へと出力する。またオペランドフォワード装置111(132c)は、第1パイプラインレジスタのデータレジスタ176に格納されている値がフォワードされたことを示す信号143を、キャンセル制御装置104へと出力する。
【0039】
第1ソースオペランドのレジスタ番号134が、第1パイプラインレジスタ107のディスティネーションレジスタ175とは異なる場合について説明する。この場合、オペランドフォワード装置111(132a)は、第1ソースオペランドのレジスタ番号134が、第2パイプラインレジスタのディスティネーションレジスタ185と同じかどうかを判定する。同じ場合オペランドフォワード装置111(131a)は、第2パイプラインレジスタのデータレジスタ186に格納されている値を、第1ソースオペランド138として、(131cを介して)演算装置106へと出力する。またオペランドフォワード装置111(132a)は、第2パイプラインレジスタのデータレジスタ186に格納されている値がフォワードされたことを示す信号145を、キャンセル制御装置104へと出力する。
【0040】
第1ソースオペランドのレジスタ番号134が、第1パイプラインレジスタ107のディスティネーションレジスタ175と、第2パイプラインレジスタ108のディスティネーションレジスタ185との何れとも異なる場合について説明する。この場合、オペランドフォワード装置111(131a,131c)は、第1ソースオペランドのレジスタ番号134に従ってレジスタファイル102から読み出したレジスタ値122を、第1ソースオペランド138として出力する。
【0041】
オペランドフォワード装置111は、第2ソースオペランドに対しても同様の処理を行う。すなわち、オペランドフォワード装置111(132d)は、第2ソースオペランドのレジスタ番号135が、第1パイプラインレジスタ107のディスティネーションレジスタ175と同じかどうかを判定する。同じ場合オペランドフォワード装置111(131d)は、第1パイプラインレジスタのデータレジスタ176に格納されている値を、第2ソースオペランド139として、演算装置106へと出力する。またオペランドフォワード装置111(132d)は、第1パイプラインレジスタのデータレジスタ176に格納されている値がフォワードされたことを示す信号145を、キャンセル制御装置104へと出力する。
【0042】
第2ソースオペランドのレジスタ番号135が、第1パイプラインレジスタ107のディスティネーションレジスタ175とは異なる場合について説明する。この場合、オペランドフォワード装置111(132b)は、第2ソースオペランドのレジスタ番号134が、第2パイプラインレジスタのディスティネーションレジスタ185と同じかどうかを判定する。同じ場合オペランドフォワード装置111(131b)は、第2パイプラインレジスタのデータレジスタ186に格納されている値を、第2ソースオペランド139として、(131dを介して)演算装置106へと出力する。またオペランドフォワード装置111(132b)は、第2パイプラインレジスタのデータレジスタ186に格納されている値がフォワードされたことを示す信号144を、キャンセル制御装置104へと出力する。
【0043】
第2ソースオペランドのレジスタ番号135が、第1パイプラインレジスタ107のディスティネーションレジスタ175と、第2パイプラインレジスタ108のディスティネーションレジスタ185との何れとも異なる場合について説明する。この場合、オペランドフォワード装置111(131b,131d)は、第2ソースオペランドのレジスタ番号135に従ってレジスタファイル102から読み出したレジスタ値123を、第2ソースオペランド139として出力する。
【0044】
オペランドフォワード装置111からキャンセル制御装置104へと出力される信号のうち、信号142及び143は、第1オペランドについてフォワードが行われたことを示す。同様に信号144及び145は、第2オペランドに対してフォワードが行われたことを示す。また信号142及び144は、第2パイプラインレジスタ108内のデータがフォワードされたことを示す。同様に信号143及び145は、第1パイプラインレジスタ107内のデータがフォワードされたことを示す。
【0045】
キャンセル制御装置104は、ソースレジスタデコード装置154から保持不要信号136,137が出力されているか否かを判断する。またキャンセル制御装置104は、オペランドフォワード装置111からのフォワードが行われたことを示す信号142〜145が出力されているか否かを判断する。信号136又は137と、信号142〜145とが出力されている場合、キャンセル制御装置104はキャンセル反映装置177,187にキャンセル信号を送る。こうしてキャンセル制御装置104は、データレジスタ176,186内のデータの、レジスタファイル102への書き込みをキャンセルする。
【0046】
キャンセル制御装置104の具体的な動作について説明する。信号136と信号143とが出力されている場合、データレジスタ176内のデータは第1ソースオペランドとしてフォワードされている。また、第1ソースオペランド(すなわちデータレジスタ176内のデータ)は以後参照されない。この場合、キャンセル制御装置104(141a)はキャンセル反映装置177に対してキャンセル信号を送る。
【0047】
信号136と信号142とが出力されている場合、データレジスタ186内のデータは第1ソースオペランドとしてフォワードされている。また、第1ソースオペランド(すなわちデータレジスタ186内のデータ)は以後参照されない。この場合、キャンセル制御装置104(141c)はキャンセル反映装置187に対してキャンセル信号を送る。
【0048】
信号137と信号145とが出力されている場合、データレジスタ176内のデータは第2ソースオペランドとしてフォワードされている。また、第2ソースオペランド(すなわちデータレジスタ176内のデータ)は以後参照されない。この場合、キャンセル制御装置104(141b)はキャンセル反映装置177に対してキャンセル信号を送る。
【0049】
信号137と信号144とが出力されている場合、データレジスタ186内のデータは第2ソースオペランドとしてフォワードされている。また、第2ソースオペランド(すなわちデータレジスタ186内のデータ)は以後参照されない。この場合、キャンセル制御装置104(141d)はキャンセル反映装置187に対してキャンセル信号を送る。
【0050】
キャンセル反映装置177は、キャンセル制御装置104からキャンセル信号が送られていない場合には、制御レジスタ174内の値をメモリ制御装置109に出力する。するとメモリ制御装置109は、受け取った値を制御レジスタ184にセットする。一方でキャンセル制御装置104からキャンセル信号が送られた場合には、キャンセル反映装置177は、値「0」をメモリ制御装置109に出力する。するとメモリ制御装置109は、制御レジスタ184をクリアする。
【0051】
キャンセル反映装置187は、キャンセル制御装置104からキャンセル信号が送られていない場合には、制御レジスタ184内の値を出力する。一方でキャンセル制御装置104からキャンセル信号が送られた場合には、キャンセル反映装置187は、値「0」を出力する。
【0052】
レジスタファイル書き込みステージにおいて、キャンセル反映装置187からの出力が「1」である場合、ディスティネーションレジスタ185の値によって示されるレジスタに、制御レジスタ184内の値が格納される(格納手段)。一方で、キャンセル反映装置187からの出力が「0」である場合、レジスタファイルへの書き込みは行われない。この処理は、非図示のレジスタファイル書き込み装置が行ってもよい。
【0053】
以上の動作により、
・命令の実行後、この命令についてのソースオペランドレジスタ内の値が更新されるまでは、このソースオペランドレジスタは再び参照されないことが示されており、かつ
・この命令のソースオペランドが、オペランドフォワード装置によって、パイプラインレジスタからフォワードされている場合、
この命令のソースオペランド(すなわちパイプラインレジスタ内のデータレジスタ内の値)は、レジスタファイルに書き込まれない。したがって、レジスタファイルへの不必要なデータの書き込みを防ぐことができるために、プロセッサの消費電力を削減できる。
【0054】
本実施例においては、命令デコード装置103は、ソースオペランドレジスタに格納されている値が、命令を実行した後に再び参照されるか否かを示す情報を取得することができる。これは、プロセッサを動作させるために用いる命令に、このような情報を追加することによって実現することができる。これは例えば、命令セットを拡張することによって実現できる。
【0055】
本実施例で追加される命令として、CMPX1命令を例に説明する。CMPX1命令は、基本的にはThumb16命令セットのCMP命令と同じ命令である。しかしながらCMPX1命令は、第1ソースオペランドに示すレジスタが読み出された後には、そのレジスタへの次の書き込みが行われるまで、そのレジスタ値が読み出されないことを指定する。ソースレジスタデコード装置154は、CMPX1命令を受け取ると、保持不要信号136を出力する。
【0056】
以上のように本実施例によれば、比較命令(CMP命令)のように、ディスティネーションレジスタが指定されない命令(第2の命令)においても、先行する命令の演算値がもう読み出されないことを指定できる。また、先行する命令(第1の命令)の演算値が後続の複数の命令において読み出される場合、最後の命令において先行する命令の演算値がもう読み出されないことを指定することにより、複数回のオペランドフォワードを実現することができる。
【0057】
[実施例2]
本実施例では、実施例1の方法を非特許文献1の方法と組み合わせる。非特許文献1の方法によれば、後続する命令(第3の命令)がディスティネーションレジスタとソースオペランドレジスタとの双方を指定する場合に、そのソースオペランドレジスタ値がもう読み出されないことを指定できる。一方で実施例1の方法によれば、後続する命令においてディスティネーションレジスタが指定されない場合にも、ソースオペランドレジスタ値がもう読み出されないことを指定できる。
【0058】
したがって本実施例においては、ディスティネーションレジスタが指定されない命令において、ソースオペランドレジスタ値がもう読み出されないことを指定できるように、命令セットが拡張される。但し、関数の呼び出し規約を満たすために、特定のディスティネーションレジスタへと値を格納する必要があるかもしれない。したがって、レジスタ間の移動命令及び加算命令において、ソースオペランドレジスタ値がもう読み出されないことを指定できるように、命令セットが拡張されてもよい。以下の表1においては、レジスタ間の移動命令に関しても、命令セットが拡張されている。
【0059】
表1にARM社のThumb(R)16−bit命令セットを例として、従来技術と本発明とにおける追加命令数種を示す。表1においては、ソースオペランドが即値である命令と、そうではない命令は、命令ニーモニックが同一であっても別の命令として数えられている。同様に、ソースオペランドに、PC又はSPのような汎用ではないレジスタが指定される命令と、そうではない命令は、命令ニーモニックが同一であっても別の命令として数えられている。なお、複数が指定されるロード命令・ストア命令並びに、プッシュ命令及びポップ命令においては、複数のレジスタが指定され、マルチサイクル動作が行われる。したがって、これらの命令については表1から除外されている。
【0060】
従来技術において追加される命令種の数としては、特許文献1に記載の方法において追加される命令種の数を示す。特許文献1に従って表1に示される数の命令種を追加することにより、先行する命令による演算値が1回オペランドフォワードされた場合に、その演算値をレジスタファイルに書き込まないことを指定できる。演算値が2回以上オペランドフォワードされた場合にその演算値を書き込まないことを指定するためには、さらに命令種を追加する必要がある。
【0061】
また、本実施例に従って表1に示される数の命令種を追加することにより、第1ソースオペランドをオペランドフォワードによって取得できた場合、その値をレジスタファイルに書き込まないことを指定できる。もし、第2ソースオペランドをオペランドフォワードによって取得できた場合、その値をレジスタファイルに書き込まないことを指定したいならば、さらに命令種を追加することもできる。
【0062】
【表1】

【0063】
6つの論理演算命令のうち、TST命令はレジスタに結果を残さないため、本実施例に従ってTST命令に対応する命令が追加される。表1に示されるように、本実施例の方法によれば、追加される命令種の数を特許文献1に記載の方法よりも少なくすることができる。例えば特許文献1の方法によれば、Thumb16命令セットに対して48の命令を追加することが必要である。一方で、本実施例の方法では14の命令を追加すればよい。このため、平均命令ビット長の増加及びプログラムサイズの増加を抑制することができる。したがって、消費電力が低減される。
【0064】
以下、表1に示す命令セットを例に、ソースレジスタデコード装置154の動作を説明する。上述のようにソースレジスタデコード装置154は、第1ソースオペランドを格納するレジスタの値が、更新されるまではもう取得されないと判断した場合、保持不要信号136を出力する。さらに、非特許文献1で示される機能を実装したソースレジスタデコード装置154は、ディスティネーションレジスタ番号と、第1ソースオペランドのレジスタ番号とが、一致するかどうかを判断する。一致する場合には、ソースレジスタデコード装置154は、第1ソースオペランドを格納するレジスタの値が、更新されるまではもう取得されないと判断し、保持不要信号136を出力する。
【0065】
例えば、ADDS R1,R1,#<imm>という命令について説明する。この命令においては、レジスタR1が、ディスティネーションレジスタと、第1ソースオペランドレジスタとの双方として指定されている。したがって、この命令によってレジスタR1の値が変更されるまで、レジスタR1が参照されることはない。すなわち、先行する命令においてディスティネーションレジスタとしてR1が指定されており、先行する命令の演算値がオペランドフォワードされた場合、先行する命令の演算値はもう参照されないから、この演算値がレジスタR1に格納される必要はない。したがってこの場合、ソースレジスタデコード装置154は、第1ソースオペランドの保持不要信号136を出力する。
【0066】
一方で、ADDS R2,R1,#<imm>という命令によっては、第1ソースオペランドレジスタであるレジスタR1は更新されない。したがって、レジスタR1の値が後続する命令において再度参照される可能性がある。よって、この場合、第1ソースオペランドの保持不要信号136は出力されない。もし、第1ソースオペランドレジスタであるレジスタR1は、値が更新されるまでは参照されないのであれば、プログラムをADDS R1,R1,#<imm>に書き換えればよい。
【0067】
[実施例3]
実施例1においては、命令におけるソースオペランドレジスタ内の値が更新されるまでは、このソースオペランドレジスタは再び参照されないことが、この命令において特定された。このために、いくつかの命令についての新しいバージョンが、命令セットに追加された。本実施例においては、命令セットにプリフィックス命令を追加する。このプリフィックス命令は、次に実行される命令におけるソースオペランドレジスタ内の値が更新されるまでは、このソースオペランドレジスタは再び参照されないことを特定する。
【0068】
本実施例では、次に実行される命令の第1ソースオペランドレジスタが、以後更新が行われるまでは読み出されないことを示す命令(プリフィックス命令)が、従来の命令セットに追加される。以下の説明において、この命令をLASTUSE1命令とする。このLASTUSE1命令を、Thumb16命令セットのCMP命令と共に使用する場合について、以下で説明する。
【0069】
LASTUSE1命令は、例えば、以下命令シーケンスにおいて用いられることができる。
MOVS r1,#255
LASTUSE1
CMP r1,r2
この命令シーケンスにおいて、LASTUSE1命令は、LASTUSE1命令の次に実行されるCMP命令の第1ソースオペランドレジスタであるr1レジスタの値が、CMP命令以降において更新されるまでは読み出されないことを示す。最初のMOVS命令によってレジスタr1の値は255となる。そして、レジスタr1の値である255はCMP命令で用いられる。しかしながら、LASTUSE1命令によって、レジスタr1の値である255はCMP命令の後には用いられないことが特定されている。従って、値255がオペランドフォワードされるのであれば、値255がレジスタr1へと書き込まれる必要はない。
【0070】
図3に本実施例に係るプロセッサの命令実行ユニットの一例を示す。本実施例は実施例1と類似している。以下では、実施例1とは異なる部分について説明する。実施例2のように、本実施例に対して非特許文献1の方法を組み合わせることも可能である。本実施例において、ソースレジスタデコード装置154は、命令記憶レジスタ151を持つ。
【0071】
命令中のソースレジスタデコード装置154は、命令デコード装置103がLASTUSE1命令を受け取ると、命令記憶レジスタ151をセットする。LASTUSE1命令を受け取った場合、命令デコード装置103は、演算装置106及び第1パイプラインレジスタ107のようなプロセッサ内の各部に、情報を送信しなくてもよい。
【0072】
命令デコード装置103がLASTUSE1命令の次の命令を受け取ると、命令デコード装置103はその命令をデコードする。そして、命令デコード装置103はプロセッサ内の各部に情報を送信する。このときソースレジスタデコード装置154は、命令記憶レジスタ151がセットされているか否かを判断する。
【0073】
命令記憶レジスタ151がセットされている場合、ソースレジスタデコード装置154は、第1ソースオペランドのレジスタ番号134と共に、保持不要信号136を出力する。そしてソースレジスタデコード装置154は、命令記憶レジスタ151をクリアする。命令記憶レジスタ151がセットされていない場合、ソースレジスタデコード装置154は、第1ソースオペランドのレジスタ番号134を出力するが、保持不要信号136は出力しない。
【0074】
このように本実施例においては、1つのプリフィックス命令を追加することで、プログラムサイズの増加を抑制し、消費電力を低減するという目的を達成できる。本実施例においては、続く命令の第1ソースオペランドレジスタ内の値が更新されるまでは、このソースオペランドレジスタは再び参照されないことを特定する命令を追加した。しかしながら、第1ソースオペランドレジスタ以外について、レジスタ内の値が更新されるまではそのレジスタは再び参照されないことを特定する命令をさらに追加することもできる。

【特許請求の範囲】
【請求項1】
命令をパイプライン処理するプロセッサであって、
前記プロセッサは、
命令を実行して得られる結果を格納する複数のレジスタと、
命令を取得する取得手段と、
前記取得手段が取得した命令が含む、演算に用いるオペランドが格納されている前記レジスタを指定するソースレジスタ情報に従って取得したオペランドを用いて、前記取得手段が取得した命令が含む、処理の種類を指定するオペレーションコードによって指定された演算を行い、演算値を取得する演算手段と、
前記演算手段によって得られた演算値を格納するパイプラインレジスタと、
前記取得手段が取得した命令が含む、前記演算値を格納するレジスタを指定するディスティネーションレジスタ情報に従って、前記パイプラインレジスタに格納された演算値を前記レジスタに格納する格納手段と、
を備え、
前記プロセッサに、前記演算値を格納するレジスタを指定するディスティネーションレジスタ情報を含む第1の命令と、前記ディスティネーションレジスタ情報を含まない第2の命令とが入力され、前記第2の命令に従う演算を前記演算手段が行う際に、前記第1の命令により得られる演算値が前記パイプラインレジスタに格納されている場合に、
前記演算手段は、前記第2の命令が含むソースレジスタ情報が示すレジスタと、前記第1の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致する場合、前記パイプラインレジスタに格納されている演算値を前記第2の命令に用いるオペランドとして取得し、
前記格納手段は、前記第2の命令が含むソースレジスタ情報が示すレジスタと前記第1の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致し、かつ前記第2の命令が前記第1の命令によって得られる演算値を使用する最後の命令であることを前記第2の命令又は前記第2の命令に先行する命令が指定している場合、前記パイプラインレジスタに格納されている演算値を前記第1の命令が含むディスティネーションレジスタ情報が示すレジスタに格納せず、それ以外の場合、前記パイプラインレジスタに格納されている演算値を前記第1の命令が含むディスティネーションレジスタ情報が示すレジスタに格納する
ことを特徴とするプロセッサ。
【請求項2】
前記プロセッサに、前記第1の命令と、前記ディスティネーションレジスタ情報を含む第3の命令とが入力され、前記第3の命令に従う演算を前記演算手段が行う際に、前記第1の命令により得られる演算値が前記パイプラインレジスタに格納されている場合に、
前記演算手段は、前記第3の命令が含むソースレジスタ情報が示すレジスタと前記第1の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致する場合、前記パイプラインレジスタに格納されている演算値を前記第3の命令に用いるオペランドとして取得し、
前記格納手段は、前記第3の命令が含むソースレジスタ情報が示すレジスタと前記第1の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致し、前記第3の命令が含むソースレジスタ情報が示すレジスタと前記第3の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致する場合、前記パイプラインレジスタに格納されている演算値を前記レジスタに格納せず、それ以外の場合、前記パイプラインレジスタに格納されている演算値を前記第1の命令が含むディスティネーションレジスタ情報が示すレジスタに格納する
ことを特徴とする、請求項1に記載のプロセッサ。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate


【公開番号】特開2012−53690(P2012−53690A)
【公開日】平成24年3月15日(2012.3.15)
【国際特許分類】
【出願番号】特願2010−196090(P2010−196090)
【出願日】平成22年9月1日(2010.9.1)
【出願人】(000001007)キヤノン株式会社 (59,756)
【Fターム(参考)】