(57)【特許請求の範囲】
【請求項１】
命令をパイプライン処理するプロセッサであって、
前記プロセッサは、
命令を実行して得られる結果を格納する複数のレジスタと、
命令を取得する取得手段と、
前記取得手段が取得した命令が含む、演算に用いるオペランドが格納されている前記レジスタを指定するソースレジスタ情報に従って取得したオペランドを用いて、前記取得手段が取得した命令が含む、処理の種類を指定するオペレーションコードによって指定された演算を行い、演算値を取得する演算手段と、
前記演算手段によって得られた演算値を格納するパイプラインレジスタと、
前記取得手段が取得した命令が含む、前記演算値を格納するレジスタを指定するディスティネーションレジスタ情報に従って、前記パイプラインレジスタに格納された演算値を前記レジスタに格納する格納手段と、
を備え、
前記プロセッサに、前記演算値を格納するレジスタを指定するディスティネーションレジスタ情報を含む第１の命令と、前記ディスティネーションレジスタ情報を含まない第２の命令とが入力され、前記第２の命令に従う演算を前記演算手段が行う際に、前記第１の命令により得られる演算値が前記パイプラインレジスタに格納されている場合に、
前記演算手段は、前記第２の命令が含むソースレジスタ情報が示すレジスタと、前記第１の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致する場合、前記パイプラインレジスタに格納されている演算値を前記第２の命令に用いるオペランドとして取得し、
前記格納手段は、前記第２の命令が含むソースレジスタ情報が示すレジスタと前記第１の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致し、かつ前記第２の命令が前記第１の命令によって得られる演算値を使用する最後の命令であることを前記第２の命令又は前記第２の命令に先行する命令が指定している場合、前記パイプラインレジスタに格納されている演算値を前記第１の命令が含むディスティネーションレジスタ情報が示すレジスタに格納せず、それ以外の場合、前記パイプラインレジスタに格納されている演算値を前記第１の命令が含むディスティネーションレジスタ情報が示すレジスタに格納する
ことを特徴とするプロセッサ。
【請求項２】
前記プロセッサに、前記第１の命令と、前記ディスティネーションレジスタ情報を含む第３の命令とが入力され、前記第３の命令に従う演算を前記演算手段が行う際に、前記第１の命令により得られる演算値が前記パイプラインレジスタに格納されている場合に、
前記演算手段は、前記第３の命令が含むソースレジスタ情報が示すレジスタと前記第１の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致する場合、前記パイプラインレジスタに格納されている演算値を前記第３の命令に用いるオペランドとして取得し、
前記格納手段は、前記第３の命令が含むソースレジスタ情報が示すレジスタと前記第１の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致し、前記第３の命令が含むソースレジスタ情報が示すレジスタと前記第３の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致する場合、前記パイプラインレジスタに格納されている演算値を前記レジスタに格納せず、それ以外の場合、前記パイプラインレジスタに格納されている演算値を前記第１の命令が含むディスティネーションレジスタ情報が示すレジスタに格納する
ことを特徴とする、請求項１に記載のプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、消費電力の小さいパイプライン処理方式のプロセッサを実現する技術に関する。
【背景技術】
【０００２】
プロセッサの処理性能を高めるために、パイプライン処理方式が一般に用いられている。パイプライン処理方式のプロセッサにおいては、命令の実行に必要なソースオペランド値を取得する際、最新のソースオペランド値がパイプライン中に存在する場合は、レジスタファイル中に存在する値ではなく、パイプライン中に存在する値を使用する。このことは、オペランドフォワード又はオペランドバイパスと呼ばれている。こうして、先行する命令による演算値がレジスタファイルへと書き込まれる前に、最新の演算値を用いて次の命令を実行することができる。
【０００３】
オペランドフォワードが行われる場合、レジスタファイルから値を読み出す必要はない。また、演算値のオペランドフォワードが行われ、その後その演算値を読み出す必要がない事が分かっている場合は、その演算値をレジスタファイルへと書き込む必要はない。レジスタファイルからの値の読み書きを減らすことにより、プロセッサの消費電力を減らすことができる。
【０００４】
非特許文献１の方法によれば、先行する命令のディスティネーションレジスタと、後続する命令のソースオペランドレジスタ及びディスティネーションレジスタが一致する場合が検出される。この場合、先行する命令による演算値が、後続する命令へとオペランドフォワードされる。さらに、後続する命令によってレジスタ値が更新されるために、先行する命令の演算値がその後読み出されることはない。すなわち、後続する命令によって、先行する命令の演算値がもう読み出されないことが指定される。したがって、先行する命令の演算値が、レジスタファイルに格納される必要はない。
【０００５】
特許文献１の方法によれば、先行する命令の演算値がオペランドフォワードされた際に、先行する命令の演算値をレジスタファイルに格納するか否かが、先行する命令において明示される。すなわち、先行する命令において、その命令の演算値がオペランドフォワード後にはもう読み出されないことが指定される。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】オペランド再利用によるレジスタファイルの低消費電力化  情報処理学会研究報告．  計算機アーキテクチャ研究会報告  ２００２（８１）  ｐｐ．１３−１８  ２００２０８２２
【特許文献】
【０００７】
【特許文献１】国際公開ＷＯ０７／０８３４２１号パンフレット
【発明の概要】
【発明が解決しようとする課題】
【０００８】
非特許文献１の方法では、後続する命令がディスティネーションレジスタとソースオペランドレジスタとの双方を指定する場合に、先行する命令の演算値がもう読み出されないことを指定できる。したがって後続する命令が、比較命令、メモリへのストア命令、及び分岐命令などの、ディスティネーションレジスタが指定されない命令である場合、先行する命令の演算値がもう読み出されないことを指定することができない。
【０００９】
また、先行する命令の演算値を後続する２つ以上の命令へとオペランドフォワードする場合、最後のオペランドフォワードが成功したことを確認しなければ、演算値をレジスタファイルに格納することを省略することができない。しかしながら特許文献１の方法には、このことを可能とする方法は開示されていない。また、特許文献１の方法では、先行する命令のそれぞれについて、レジスタファイルへの書き込みが必要か不要かが示される。したがって特許文献１の方法によると、平均命令ビット長及びプログラムサイズが大きくなり、消費電力も大きくなる。
【００１０】
本発明は、より小さいサイズのプログラムで動作させることが可能な、消費電力の小さいプロセッサを提供する。
【課題を解決するための手段】
【００１１】
本発明の目的を達成するために、例えば、本発明のプロセッサは以下の構成を備える。すなわち、
命令をパイプライン処理するプロセッサであって、
前記プロセッサは、
命令を実行して得られる結果を格納する複数のレジスタと、
命令を取得する取得手段と、
前記命令が含む、演算に用いるオペランドが格納されている前記レジスタを指定するソースレジスタ情報に従って取得したオペランドを用いて、前記命令が含む、処理の種類を指定するオペレーションコードによって指定された演算を行い、演算値を取得する演算手段と、
前記演算手段によって得られた演算値を格納するパイプラインレジスタと、
前記命令が含む、前記演算値を格納するレジスタを指定するディスティネーションレジスタ情報に従って、前記パイプラインレジスタに格納された演算値を前記レジスタに格納する格納手段と、
を備え、
前記プロセッサに、前記演算値を格納するレジスタを指定するディスティネーションレジスタ情報を含む第１の命令と、前記ディスティネーションレジスタ情報を含まない第２の命令とが入力され、前記第２の命令に従う演算を前記演算手段が行う際に、前記第１の命令により得られる演算値が前記パイプラインレジスタに格納されている場合に、
前記演算手段は、前記第２の命令が含むソースレジスタ情報が示すレジスタと、前記第１の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致する場合、前記パイプラインレジスタに格納されている演算値を前記第２の命令に用いるオペランドとして取得し、
前記格納手段は、前記第２の命令が含むソースレジスタ情報が示すレジスタと前記第１の命令が含むディスティネーションレジスタ情報が示すレジスタとが一致し、かつ前記第２の命令が前記第１の命令によって得られる演算値を使用する最後の命令であることを前記第２の命令又は前記第２の命令に先行する命令が指定している場合、前記パイプラインレジスタに格納されている演算値を前記第１の命令が含むディスティネーションレジスタ情報が示すレジスタに格納せず、それ以外の場合、前記パイプラインレジスタに格納されている演算値を前記第１の命令が含むディスティネーションレジスタ情報が示すレジスタに格納することを特徴とする。
【発明の効果】
【００１２】
本発明によれば、より小さいサイズのプログラムで動作させることが可能な、消費電力の小さいプロセッサを実現することができる。
【図面の簡単な説明】
【００１３】
【図１】実施例１に係るプロセッサの全体構成を表す図
【図２】実施例１に係る命令実行ユニットを表す図
【図３】実施例３に係る命令実行ユニットを表す図
【発明を実施するための形態】
【００１４】
［実施例１］
本実施例では、プロセッサ内の汎用レジスタが用いられる場合のように、複数のレジスタが存在する場合に、レジスタ番号を用いて各レジスタを識別する。また、Ｖａｌｉｄレジスタ１７２，１８２、Ｔｅｍｐレジスタ１７３，１８３、及び制御レジスタ１７４，１８４は、０又は１を値として持つ。これらのレジスタは、セット状態の時には値として１を持つ。またこれらのレジスタは、クリア状態の時には値として０を持つ。
【００１５】
図１に本実施例に係るプロセッサの一例を示す。本実施例に係るプロセッサは、入力された命令をパイプライン処理することができる。本実施例に係るプロセッサは、命令フェッチユニット２０３と命令実行ユニット２０４とを含む。命令フェッチユニット２０３は命令フェッチを行う（取得手段）。そして命令フェッチユニット２０３は、フェッチされた命令を、命令情報２０１として命令実行ユニット２０４に送る。命令実行ユニット２０４は、受信された命令を実行する。命令実行ユニット２０４が分岐命令を実行した場合、命令実行ユニット２０４は、新しい命令フェッチアドレスを、分岐情報２０２として命令フェッチユニット２０３に送る。
【００１６】
図２に本実施例に係る命令実行ユニット２０４の一例を示す。本実施例において、命令実行ユニット２０４が行う処理は、演算ステージと、メモリステージと、レジスタファイル書き込みステージとに分かれている。命令実行ユニット２０４が行う処理が各ステージへと異なる方法で分割される場合にも、当業者は本実施例を変形して利用することができるだろう。また説明の簡単化の為に、本実施例においてパイプラインストールは発生しないものとする。もっとも当業者ならば、パイプラインストールに対応するための既存の方法を本実施例に組み込むことができるだろう。
【００１７】
命令レジスタ１０１は、命令フェッチユニット２０３からの命令情報２０１を受け取る。そして命令レジスタ１０１は、命令情報２０１を格納する。命令情報２０１からは、オペレーションコードと、ディスティネーションレジスタ情報と、ソースオペランドレジスタ情報（ソースレジスタ情報）とを取得することが可能である。本実施例においては命令情報２０１からさらに、ソースオペランドレジスタに格納されている値が、命令を実行した後に再び参照されるか否かを示す情報を取得することができる。
【００１８】
新しい命令が命令レジスタ１０１に格納されると、命令デコード装置１０３は、命令レジスタ１０１に格納された命令をデコードする。命令デコード装置１０３は、オペレーションコードデコード装置１５２、ディスティネーションレジスタデコード装置１５３、及びソースレジスタデコード装置１５４を含む。
【００１９】
オペレーションコードデコード装置１５２は、命令のうちオペレーションコードをデコードする。オペレーションコードは、命令の種類を規定する。さらにオペレーションコードデコード装置１５２は、演算装置１０６に対して演算制御信号を出力する。例えば、命令レジスタ１０１に格納された命令が加算命令、減算命令、又はＡＮＤ命令の場合、オペレーションコードデコード装置１５２は演算装置１０６に演算制御信号を出力することにより、演算装置に加算、減算、又はＡＮＤ計算を行わせる。
【００２０】
また、オペレーションコードデコード装置１５２による処理の結果は、第１パイプラインレジスタ１０７内の、オペレーションコードレジスタ１７１、Ｖａｌｉｄレジスタ１７２、及びＴｅｍｐレジスタ１７３に格納される。オペレーションコードデコード装置１５２は、命令レジスタ１０１の内容から、メモリステージにおいて必要なオペレーションコードを算出する。そしてオペレーションコードデコード装置１５２は、算出されたオペレーションコードをオペレーションコードレジスタ１７１にセットする。さらにオペレーションコードデコード装置１５２は、命令レジスタ１０１内の命令が有効である場合にＶａｌｉｄレジスタ１７２をセットする。
【００２１】
またオペレーションコードデコード装置１５２は、命令レジスタ１０１の内容から、演算ステージにおいてレジスタファイルへの書き込みデータが確定されるか否かを判定する。確定される場合、オペレーションコードデコード装置１５２は制御レジスタ１７４をセットし、Ｔｅｍｐレジスタ１７３をクリアする。逆に、演算ステージにおいてレジスタファイルへの書き込みデータが確定しない場合、オペレーションコードデコード装置１５２はＴｅｍｐレジスタ１７３をセットし、制御レジスタ１７４をクリアする。
【００２２】
例えば、命令レジスタ１０１にＡＮＤ命令が格納されている場合を考える。この場合、演算ステージにおける演算装置１０６の演算により、レジスタファイルへと書き込まれるデータが確定する。したがってこの場合、オペレーションコードデコード装置１５２は制御レジスタ１７４をセットし、Ｔｅｍｐレジスタ１７３をクリアする。
【００２３】
一方で、命令レジスタ１０１にロード命令が格納されている場合を考える。この場合、演算装置１０６はロード時に使用するメモリアドレスの計算を行う。すなわち、演算ステージにおいては、レジスタファイルへと書き込まれるデータは確定されない。メモリステージにおいて、レジスタファイルへの書き込みデータが確定される。したがってこの場合、オペレーションコードデコード装置１５２は制御レジスタ１７４をクリアし、Ｔｅｍｐレジスタ１７３をセットする。
【００２４】
ディスティネーションレジスタデコード装置１５３は、命令レジスタ１０１の値から、処理結果が書き込まれるレジスタ番号を算出する。そしてディスティネーションレジスタデコード装置１５３は、算出されたレジスタ番号をディスティネーションレジスタ１７５に格納する。
【００２５】
ソースレジスタデコード装置１５４は、命令レジスタ１０１の値から、第１ソースオペランドのレジスタ番号１３４を算出し、出力する。またソースレジスタデコード装置１５４は、第１ソースオペランドが、命令実行後に再び取得されるか否かを判断する。言い換えるとソースレジスタデコード装置１５４は、命令情報２０１に示される命令の実行後、レジスタ番号１３４が示すレジスタの値が更新される前に、レジスタ番号１３４が示すレジスタが再び参照されるか否かを判断する。第１ソースオペランドが命令実行後に再び取得されるか否かは、命令情報２０１に含まれており、ソースレジスタデコード装置１５４によって解読されることができる。
【００２６】
参照されない場合には、ソースレジスタデコード装置１５４は保持不要信号１３６を出力する。同様にソースレジスタデコード装置１５４は、第２ソースオペランドに対して、レジスタ番号１３５と、第２ソースオペランドについての保持不要信号１３７とを出力する。
【００２７】
レジスタファイル１０２は、第１ソースオペランドのレジスタ番号１３４を受け取り、対応するレジスタ値１２２を出力する。同様にレジスタファイル１０２は、第２ソースオペランドのレジスタ番号１３５を受け取り、対応するレジスタ値１２３を出力する。オペランドフォワード装置１１１は、レジスタ値１２２と、データレジスタ１７６に格納されている値と、データレジスタ１８６に格納されている値とから１つを選択する。そしてオペランドフォワード装置１１１は、選択された値を第１ソースオペランド１３８として演算装置１０６へと出力する。またオペランドフォワード装置１１１は、レジスタ値１２３と、データレジスタ１７６と、データレジスタ１８６とから１つを選択し、第２ソースオペランド１３９として演算装置１０６へと出力する。オペランドフォワード装置１１１の処理については後述する。
【００２８】
演算装置１０６は、第１ソースオペランド１３８と、第２ソースオペランド１３９と、オペレーションコードデコード装置１５２が出力する演算制御信号とに応じて演算を行う（演算手段）。そして演算装置１０６は、演算結果をデータレジスタ１７６に格納する。第１パイプラインレジスタ１０７は、オペレーションコードレジスタ１７１、Ｖａｌｉｄレジスタ１７２、Ｔｅｍｐレジスタ１７３、及び制御レジスタ１７４を含む。これらのレジスタ１７１〜１７４は、オペレーションコードデコード装置１５２からのデータを格納する。
【００２９】
また第１パイプラインレジスタ１０７は、ディスティネーションレジスタ１７５、及びデータレジスタ１７６を含む。ディスティネーションレジスタ１７５は、ディスティネーションレジスタデコード装置１５３からのデータを格納する。データレジスタ１７６は、演算装置１０６による演算結果を格納する。
【００３０】
オペレーションコードレジスタ１７１は、オペレーションコードを保持している。Ｖａｌｉｄレジスタ１７２は、命令レジスタ１０１内の命令が有効であることを示す値を保持している。Ｔｅｍｐレジスタ１７３はレジスタファイルに書き込むデータが確定していないことを示す値を保持している。制御レジスタ１７４は、データレジスタ１７６に格納されている値を、レジスタファイルに書き込む必要があることを示す値を保持している。
【００３１】
メモリ制御装置１０９は、第１パイプラインレジスタ１０７のオペレーションコードレジスタ１７１に格納された値を参照する。参照された値に従ってメモリ制御装置１０９は、メモリ１１０へと制御信号を出力する。またメモリ制御装置１０９は参照された値に従って、Ｖａｌｉｄレジスタ１８２、Ｔｅｍｐレジスタ１８３、及び制御レジスタ１８４に格納する値を出力する。
【００３２】
オペレーションコードレジスタ１７１に格納されたオペレーションコードがロード命令又はストア命令の時は、メモリ制御装置１０９はメモリ１１０に対してメモリ制御信号を出力し、メモリ１１０に対してリード又はライトを行わせる。オペレーションコードレジスタ１７１に格納されたオペレーションコードがそれ以外の場合は、メモリ制御装置１０９はメモリ１１０に対してメモリ制御信号を出力し、データレジスタ１７６からのメモリ１１０への入力をそのまま出力させる。
【００３３】
またメモリ制御装置１０９は、Ｖａｌｉｄレジスタ１７２の内容を、Ｖａｌｉｄレジスタ１８２にセットする。また、オペレーションコードレジスタ１７１にロード命令が格納されている場合、メモリ１１０からのリードが行われるとレジスタファイルへの書き込みデータが確定する。したがって、オペレーションコードレジスタ１７１にロード命令が格納されている場合、メモリ制御装置１０９はＴｅｍｐレジスタ１８３をクリアし、かつ制御レジスタ１８４をセットする。
【００３４】
一方でオペレーションコードレジスタ１７１にロード命令以外が格納されている場合、メモリ制御装置１０９はＴｅｍｐレジスタ１８３に、Ｔｅｍｐレジスタ１７３の内容をセットする。また、メモリ制御装置１０９は制御レジスタ１８４に、キャンセル反映装置１７７からの値をセットする。キャンセル反映装置１７７については後述する。メモリ１１０は、メモリ制御装置１０９によって出力されるメモリ制御信号に基づいて、リード動作、ライト動作、又はデータレジスタ１７６の値をそのまま出力する動作を行う。そしてメモリ１１０は、結果をデータレジスタ１８６に出力する。
【００３５】
第２パイプラインレジスタ１０８は、オペレーションコードレジスタ１８１、Ｖａｌｉｄレジスタ１８２、Ｔｅｍｐレジスタ１８３、及び制御レジスタ１８４を含む。これらのレジスタ１８１〜１８４は、メモリ制御装置１０９によって出力された値を格納する。また第２パイプラインレジスタ１０７は、ディスティネーションレジスタ１８５、及びデータレジスタ１８６を含む。ディスティネーションレジスタ１８５は、ディスティネーションレジスタ１７５と同じ値を格納する。データレジスタ１８６は、メモリ１１０からの値を格納する。
【００３６】
レジスタ１８１〜１８６は、第１パイプラインレジスタ１０８内のレジスタ１７１〜１７６と同様の情報を格納する。キャンセル反映装置１８７は、制御レジスタ１８４の値と、キャンセル制御装置１０４からの値とに基づいて、データレジスタ１８６内のデータのレジスタファイル１０２への書き出しを制御する。キャンセル反映装置の処理については後述する。
【００３７】
次に、オペランドフォワード装置１１１について説明する。オペランドフォワード装置１１１は、ソースレジスタデコード装置１５４から出力された第１ソースオペランドのレジスタ番号１３４と、ディスティネーションレジスタ１７５又は１８５とが、一致するか否かを判定する。本実施例においてオペランドフォワード装置１１１は、より後にデコードされた命令についてのディスティネーションレジスタ１７５について、最初に判定を行う。
【００３８】
本実施例においてオペランドフォワード装置１１１（１３２ｃ）は、第１ソースオペランドのレジスタ番号１３４が、第１パイプラインレジスタ１０７のディスティネーションレジスタ１７５と同じかどうかを判定する。同じ場合オペランドフォワード装置１１１（１３１ｃ）は、第１パイプラインレジスタのデータレジスタ１７６に格納されている値を、第１ソースオペランド１３８として、演算装置１０６へと出力する。またオペランドフォワード装置１１１（１３２ｃ）は、第１パイプラインレジスタのデータレジスタ１７６に格納されている値がフォワードされたことを示す信号１４３を、キャンセル制御装置１０４へと出力する。
【００３９】
第１ソースオペランドのレジスタ番号１３４が、第１パイプラインレジスタ１０７のディスティネーションレジスタ１７５とは異なる場合について説明する。この場合、オペランドフォワード装置１１１（１３２ａ）は、第１ソースオペランドのレジスタ番号１３４が、第２パイプラインレジスタのディスティネーションレジスタ１８５と同じかどうかを判定する。同じ場合オペランドフォワード装置１１１（１３１ａ）は、第２パイプラインレジスタのデータレジスタ１８６に格納されている値を、第１ソースオペランド１３８として、（１３１ｃを介して）演算装置１０６へと出力する。またオペランドフォワード装置１１１（１３２ａ）は、第２パイプラインレジスタのデータレジスタ１８６に格納されている値がフォワードされたことを示す信号１４５を、キャンセル制御装置１０４へと出力する。
【００４０】
第１ソースオペランドのレジスタ番号１３４が、第１パイプラインレジスタ１０７のディスティネーションレジスタ１７５と、第２パイプラインレジスタ１０８のディスティネーションレジスタ１８５との何れとも異なる場合について説明する。この場合、オペランドフォワード装置１１１（１３１ａ，１３１ｃ）は、第１ソースオペランドのレジスタ番号１３４に従ってレジスタファイル１０２から読み出したレジスタ値１２２を、第１ソースオペランド１３８として出力する。
【００４１】
オペランドフォワード装置１１１は、第２ソースオペランドに対しても同様の処理を行う。すなわち、オペランドフォワード装置１１１（１３２ｄ）は、第２ソースオペランドのレジスタ番号１３５が、第１パイプラインレジスタ１０７のディスティネーションレジスタ１７５と同じかどうかを判定する。同じ場合オペランドフォワード装置１１１（１３１ｄ）は、第１パイプラインレジスタのデータレジスタ１７６に格納されている値を、第２ソースオペランド１３９として、演算装置１０６へと出力する。またオペランドフォワード装置１１１（１３２ｄ）は、第１パイプラインレジスタのデータレジスタ１７６に格納されている値がフォワードされたことを示す信号１４５を、キャンセル制御装置１０４へと出力する。
【００４２】
第２ソースオペランドのレジスタ番号１３５が、第１パイプラインレジスタ１０７のディスティネーションレジスタ１７５とは異なる場合について説明する。この場合、オペランドフォワード装置１１１（１３２ｂ）は、第２ソースオペランドのレジスタ番号１３４が、第２パイプラインレジスタのディスティネーションレジスタ１８５と同じかどうかを判定する。同じ場合オペランドフォワード装置１１１（１３１ｂ）は、第２パイプラインレジスタのデータレジスタ１８６に格納されている値を、第２ソースオペランド１３９として、（１３１ｄを介して）演算装置１０６へと出力する。またオペランドフォワード装置１１１（１３２ｂ）は、第２パイプラインレジスタのデータレジスタ１８６に格納されている値がフォワードされたことを示す信号１４４を、キャンセル制御装置１０４へと出力する。
【００４３】
第２ソースオペランドのレジスタ番号１３５が、第１パイプラインレジスタ１０７のディスティネーションレジスタ１７５と、第２パイプラインレジスタ１０８のディスティネーションレジスタ１８５との何れとも異なる場合について説明する。この場合、オペランドフォワード装置１１１（１３１ｂ，１３１ｄ）は、第２ソースオペランドのレジスタ番号１３５に従ってレジスタファイル１０２から読み出したレジスタ値１２３を、第２ソースオペランド１３９として出力する。
【００４４】
オペランドフォワード装置１１１からキャンセル制御装置１０４へと出力される信号のうち、信号１４２及び１４３は、第１オペランドについてフォワードが行われたことを示す。同様に信号１４４及び１４５は、第２オペランドに対してフォワードが行われたことを示す。また信号１４２及び１４４は、第２パイプラインレジスタ１０８内のデータがフォワードされたことを示す。同様に信号１４３及び１４５は、第１パイプラインレジスタ１０７内のデータがフォワードされたことを示す。
【００４５】
キャンセル制御装置１０４は、ソースレジスタデコード装置１５４から保持不要信号１３６，１３７が出力されているか否かを判断する。またキャンセル制御装置１０４は、オペランドフォワード装置１１１からのフォワードが行われたことを示す信号１４２〜１４５が出力されているか否かを判断する。信号１３６又は１３７と、信号１４２〜１４５とが出力されている場合、キャンセル制御装置１０４はキャンセル反映装置１７７，１８７にキャンセル信号を送る。こうしてキャンセル制御装置１０４は、データレジスタ１７６，１８６内のデータの、レジスタファイル１０２への書き込みをキャンセルする。
【００４６】
キャンセル制御装置１０４の具体的な動作について説明する。信号１３６と信号１４３とが出力されている場合、データレジスタ１７６内のデータは第１ソースオペランドとしてフォワードされている。また、第１ソースオペランド（すなわちデータレジスタ１７６内のデータ）は以後参照されない。この場合、キャンセル制御装置１０４（１４１ａ）はキャンセル反映装置１７７に対してキャンセル信号を送る。
【００４７】
信号１３６と信号１４２とが出力されている場合、データレジスタ１８６内のデータは第１ソースオペランドとしてフォワードされている。また、第１ソースオペランド（すなわちデータレジスタ１８６内のデータ）は以後参照されない。この場合、キャンセル制御装置１０４（１４１ｃ）はキャンセル反映装置１８７に対してキャンセル信号を送る。
【００４８】
信号１３７と信号１４５とが出力されている場合、データレジスタ１７６内のデータは第２ソースオペランドとしてフォワードされている。また、第２ソースオペランド（すなわちデータレジスタ１７６内のデータ）は以後参照されない。この場合、キャンセル制御装置１０４（１４１ｂ）はキャンセル反映装置１７７に対してキャンセル信号を送る。
【００４９】
信号１３７と信号１４４とが出力されている場合、データレジスタ１８６内のデータは第２ソースオペランドとしてフォワードされている。また、第２ソースオペランド（すなわちデータレジスタ１８６内のデータ）は以後参照されない。この場合、キャンセル制御装置１０４（１４１ｄ）はキャンセル反映装置１８７に対してキャンセル信号を送る。
【００５０】
キャンセル反映装置１７７は、キャンセル制御装置１０４からキャンセル信号が送られていない場合には、制御レジスタ１７４内の値をメモリ制御装置１０９に出力する。するとメモリ制御装置１０９は、受け取った値を制御レジスタ１８４にセットする。一方でキャンセル制御装置１０４からキャンセル信号が送られた場合には、キャンセル反映装置１７７は、値「０」をメモリ制御装置１０９に出力する。するとメモリ制御装置１０９は、制御レジスタ１８４をクリアする。
【００５１】
キャンセル反映装置１８７は、キャンセル制御装置１０４からキャンセル信号が送られていない場合には、制御レジスタ１８４内の値を出力する。一方でキャンセル制御装置１０４からキャンセル信号が送られた場合には、キャンセル反映装置１８７は、値「０」を出力する。
【００５２】
レジスタファイル書き込みステージにおいて、キャンセル反映装置１８７からの出力が「１」である場合、ディスティネーションレジスタ１８５の値によって示されるレジスタに、制御レジスタ１８４内の値が格納される（格納手段）。一方で、キャンセル反映装置１８７からの出力が「０」である場合、レジスタファイルへの書き込みは行われない。この処理は、非図示のレジスタファイル書き込み装置が行ってもよい。
【００５３】
以上の動作により、
・命令の実行後、この命令についてのソースオペランドレジスタ内の値が更新されるまでは、このソースオペランドレジスタは再び参照されないことが示されており、かつ
・この命令のソースオペランドが、オペランドフォワード装置によって、パイプラインレジスタからフォワードされている場合、
この命令のソースオペランド（すなわちパイプラインレジスタ内のデータレジスタ内の値）は、レジスタファイルに書き込まれない。したがって、レジスタファイルへの不必要なデータの書き込みを防ぐことができるために、プロセッサの消費電力を削減できる。
【００５４】
本実施例においては、命令デコード装置１０３は、ソースオペランドレジスタに格納されている値が、命令を実行した後に再び参照されるか否かを示す情報を取得することができる。これは、プロセッサを動作させるために用いる命令に、このような情報を追加することによって実現することができる。これは例えば、命令セットを拡張することによって実現できる。
【００５５】
本実施例で追加される命令として、ＣＭＰＸ１命令を例に説明する。ＣＭＰＸ１命令は、基本的にはＴｈｕｍｂ１６命令セットのＣＭＰ命令と同じ命令である。しかしながらＣＭＰＸ１命令は、第１ソースオペランドに示すレジスタが読み出された後には、そのレジスタへの次の書き込みが行われるまで、そのレジスタ値が読み出されないことを指定する。ソースレジスタデコード装置１５４は、ＣＭＰＸ１命令を受け取ると、保持不要信号１３６を出力する。
【００５６】
以上のように本実施例によれば、比較命令（ＣＭＰ命令）のように、ディスティネーションレジスタが指定されない命令（第２の命令）においても、先行する命令の演算値がもう読み出されないことを指定できる。また、先行する命令（第１の命令）の演算値が後続の複数の命令において読み出される場合、最後の命令において先行する命令の演算値がもう読み出されないことを指定することにより、複数回のオペランドフォワードを実現することができる。
【００５７】
［実施例２］
本実施例では、実施例１の方法を非特許文献１の方法と組み合わせる。非特許文献１の方法によれば、後続する命令（第３の命令）がディスティネーションレジスタとソースオペランドレジスタとの双方を指定する場合に、そのソースオペランドレジスタ値がもう読み出されないことを指定できる。一方で実施例１の方法によれば、後続する命令においてディスティネーションレジスタが指定されない場合にも、ソースオペランドレジスタ値がもう読み出されないことを指定できる。
【００５８】
したがって本実施例においては、ディスティネーションレジスタが指定されない命令において、ソースオペランドレジスタ値がもう読み出されないことを指定できるように、命令セットが拡張される。但し、関数の呼び出し規約を満たすために、特定のディスティネーションレジスタへと値を格納する必要があるかもしれない。したがって、レジスタ間の移動命令及び加算命令において、ソースオペランドレジスタ値がもう読み出されないことを指定できるように、命令セットが拡張されてもよい。以下の表１においては、レジスタ間の移動命令に関しても、命令セットが拡張されている。
【００５９】
表１にＡＲＭ社のＴｈｕｍｂ（Ｒ）１６−ｂｉｔ命令セットを例として、従来技術と本発明とにおける追加命令数種を示す。表１においては、ソースオペランドが即値である命令と、そうではない命令は、命令ニーモニックが同一であっても別の命令として数えられている。同様に、ソースオペランドに、ＰＣ又はＳＰのような汎用ではないレジスタが指定される命令と、そうではない命令は、命令ニーモニックが同一であっても別の命令として数えられている。なお、複数が指定されるロード命令・ストア命令並びに、プッシュ命令及びポップ命令においては、複数のレジスタが指定され、マルチサイクル動作が行われる。したがって、これらの命令については表１から除外されている。
【００６０】
従来技術において追加される命令種の数としては、特許文献１に記載の方法において追加される命令種の数を示す。特許文献１に従って表１に示される数の命令種を追加することにより、先行する命令による演算値が１回オペランドフォワードされた場合に、その演算値をレジスタファイルに書き込まないことを指定できる。演算値が２回以上オペランドフォワードされた場合にその演算値を書き込まないことを指定するためには、さらに命令種を追加する必要がある。
【００６１】
また、本実施例に従って表１に示される数の命令種を追加することにより、第１ソースオペランドをオペランドフォワードによって取得できた場合、その値をレジスタファイルに書き込まないことを指定できる。もし、第２ソースオペランドをオペランドフォワードによって取得できた場合、その値をレジスタファイルに書き込まないことを指定したいならば、さらに命令種を追加することもできる。
【００６２】
【表１】
0005555102.tif 000002
【００６３】
６つの論理演算命令のうち、ＴＳＴ命令はレジスタに結果を残さないため、本実施例に従ってＴＳＴ命令に対応する命令が追加される。表１に示されるように、本実施例の方法によれば、追加される命令種の数を特許文献１に記載の方法よりも少なくすることができる。例えば特許文献１の方法によれば、Ｔｈｕｍｂ１６命令セットに対して４８の命令を追加することが必要である。一方で、本実施例の方法では１４の命令を追加すればよい。このため、平均命令ビット長の増加及びプログラムサイズの増加を抑制することができる。したがって、消費電力が低減される。
【００６４】
以下、表１に示す命令セットを例に、ソースレジスタデコード装置１５４の動作を説明する。上述のようにソースレジスタデコード装置１５４は、第１ソースオペランドを格納するレジスタの値が、更新されるまではもう取得されないと判断した場合、保持不要信号１３６を出力する。さらに、非特許文献１で示される機能を実装したソースレジスタデコード装置１５４は、ディスティネーションレジスタ番号と、第１ソースオペランドのレジスタ番号とが、一致するかどうかを判断する。一致する場合には、ソースレジスタデコード装置１５４は、第１ソースオペランドを格納するレジスタの値が、更新されるまではもう取得されないと判断し、保持不要信号１３６を出力する。
【００６５】
例えば、ＡＤＤＳ  Ｒ１，Ｒ１，＃＜ｉｍｍ＞という命令について説明する。この命令においては、レジスタＲ１が、ディスティネーションレジスタと、第１ソースオペランドレジスタとの双方として指定されている。したがって、この命令によってレジスタＲ１の値が変更されるまで、レジスタＲ１が参照されることはない。すなわち、先行する命令においてディスティネーションレジスタとしてＲ１が指定されており、先行する命令の演算値がオペランドフォワードされた場合、先行する命令の演算値はもう参照されないから、この演算値がレジスタＲ１に格納される必要はない。したがってこの場合、ソースレジスタデコード装置１５４は、第１ソースオペランドの保持不要信号１３６を出力する。
【００６６】
一方で、ＡＤＤＳ  Ｒ２，Ｒ１，＃＜ｉｍｍ＞という命令によっては、第１ソースオペランドレジスタであるレジスタＲ１は更新されない。したがって、レジスタＲ１の値が後続する命令において再度参照される可能性がある。よって、この場合、第１ソースオペランドの保持不要信号１３６は出力されない。もし、第１ソースオペランドレジスタであるレジスタＲ１は、値が更新されるまでは参照されないのであれば、プログラムをＡＤＤＳ  Ｒ１，Ｒ１，＃＜ｉｍｍ＞に書き換えればよい。
【００６７】
［実施例３］
実施例１においては、命令におけるソースオペランドレジスタ内の値が更新されるまでは、このソースオペランドレジスタは再び参照されないことが、この命令において特定された。このために、いくつかの命令についての新しいバージョンが、命令セットに追加された。本実施例においては、命令セットにプリフィックス命令を追加する。このプリフィックス命令は、次に実行される命令におけるソースオペランドレジスタ内の値が更新されるまでは、このソースオペランドレジスタは再び参照されないことを特定する。
【００６８】
本実施例では、次に実行される命令の第１ソースオペランドレジスタが、以後更新が行われるまでは読み出されないことを示す命令（プリフィックス命令）が、従来の命令セットに追加される。以下の説明において、この命令をＬＡＳＴＵＳＥ１命令とする。このＬＡＳＴＵＳＥ１命令を、Ｔｈｕｍｂ１６命令セットのＣＭＰ命令と共に使用する場合について、以下で説明する。
【００６９】
ＬＡＳＴＵＳＥ１命令は、例えば、以下命令シーケンスにおいて用いられることができる。
ＭＯＶＳ  ｒ１，＃２５５
ＬＡＳＴＵＳＥ１
ＣＭＰ  ｒ１，ｒ２
この命令シーケンスにおいて、ＬＡＳＴＵＳＥ１命令は、ＬＡＳＴＵＳＥ１命令の次に実行されるＣＭＰ命令の第１ソースオペランドレジスタであるｒ１レジスタの値が、ＣＭＰ命令以降において更新されるまでは読み出されないことを示す。最初のＭＯＶＳ命令によってレジスタｒ１の値は２５５となる。そして、レジスタｒ１の値である２５５はＣＭＰ命令で用いられる。しかしながら、ＬＡＳＴＵＳＥ１命令によって、レジスタｒ１の値である２５５はＣＭＰ命令の後には用いられないことが特定されている。従って、値２５５がオペランドフォワードされるのであれば、値２５５がレジスタｒ１へと書き込まれる必要はない。
【００７０】
図３に本実施例に係るプロセッサの命令実行ユニットの一例を示す。本実施例は実施例１と類似している。以下では、実施例１とは異なる部分について説明する。実施例２のように、本実施例に対して非特許文献１の方法を組み合わせることも可能である。本実施例において、ソースレジスタデコード装置１５４は、命令記憶レジスタ１５１を持つ。
【００７１】
命令中のソースレジスタデコード装置１５４は、命令デコード装置１０３がＬＡＳＴＵＳＥ１命令を受け取ると、命令記憶レジスタ１５１をセットする。ＬＡＳＴＵＳＥ１命令を受け取った場合、命令デコード装置１０３は、演算装置１０６及び第１パイプラインレジスタ１０７のようなプロセッサ内の各部に、情報を送信しなくてもよい。
【００７２】
命令デコード装置１０３がＬＡＳＴＵＳＥ１命令の次の命令を受け取ると、命令デコード装置１０３はその命令をデコードする。そして、命令デコード装置１０３はプロセッサ内の各部に情報を送信する。このときソースレジスタデコード装置１５４は、命令記憶レジスタ１５１がセットされているか否かを判断する。
【００７３】
命令記憶レジスタ１５１がセットされている場合、ソースレジスタデコード装置１５４は、第１ソースオペランドのレジスタ番号１３４と共に、保持不要信号１３６を出力する。そしてソースレジスタデコード装置１５４は、命令記憶レジスタ１５１をクリアする。命令記憶レジスタ１５１がセットされていない場合、ソースレジスタデコード装置１５４は、第１ソースオペランドのレジスタ番号１３４を出力するが、保持不要信号１３６は出力しない。
【００７４】
このように本実施例においては、１つのプリフィックス命令を追加することで、プログラムサイズの増加を抑制し、消費電力を低減するという目的を達成できる。本実施例においては、続く命令の第１ソースオペランドレジスタ内の値が更新されるまでは、このソースオペランドレジスタは再び参照されないことを特定する命令を追加した。しかしながら、第１ソースオペランドレジスタ以外について、レジスタ内の値が更新されるまではそのレジスタは再び参照されないことを特定する命令をさらに追加することもできる。
【図１】
0005555102.tif 000003
【図２】
0005555102.tif 000004
【図３】
0005555102.tif 000005