(57)【要約】  第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号を識別する命令をより効率的に符号化するための様々な符号化方式について論じる。第１の例では、第１のアーキテクチャレジスタ番号を第２のアーキテクチャレジスタ番号よりも大きくなるように制約することによって、他の演算の符号化に使用するために符号化を解放する。第２の例では、第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号は任意の値をとることができるが、第１のタイプの処理演算および第２のタイプの処理演算のうちの一方が、第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号の比較に応じて選択される。
2019503010.tif 000002
【特許請求の範囲】
【請求項１】
データ値を記憶するための複数のレジスタと、
命令に応答して処理演算を実行する処理回路と
を備える装置であって、
第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号を識別する第１のクラスの命令のうちの１つに応答して、前記処理回路は、前記第１のアーキテクチャレジスタ番号および前記第２のアーキテクチャレジスタ番号に対応する第１のレジスタおよび第２のレジスタを使用して、対応する処理演算を実行するように構成され、
前記第１の命令クラスの命令は、前記第１のアーキテクチャレジスタ番号を前記第２のアーキテクチャのレジスタ番号よりも大きくなるように制約する命令符号化を有する、装置。
【請求項２】
前記第１のクラスの命令は、前記対応する処理演算が可換的演算である少なくとも１つの可換的命令を含む、請求項１に記載の装置。
【請求項３】
前記第１のクラスの命令は、前記対応する処理演算が非可換的演算である少なくとも１つの非可換的命令を含む、請求項１および２のいずれか一項に記載の装置。
【請求項４】
前記第１のクラスの命令は、前記第１のレジスタおよび前記第２のレジスタに記憶された第１のオペランドおよび第２のオペランドに適用される同じタイプの前記非可換的演算に対応する少なくとも１対の相補的な非可換的命令を含み、各対について、前記対のうちの１つの命令は、前記第１のオペランドおよび前記第２のオペランドを用いて前記非可換的演算を、前記対の他の命令と異なる順序で実行するように、前記処理回路を制御するためのものである、請求項１〜３のいずれか一項に記載の装置。
【請求項５】
前記第１のクラスの命令は、前記第１のアーキテクチャレジスタ番号と前記第２のアーキテクチャレジスタ番号との間の連続範囲内のアーキテクチャレジスタ番号に対応する複数のレジスタを使用して処理演算を実行するように前記処理回路を制御するための少なくとも１つのレジスタ範囲指定命令を含む、請求項１〜４のいずれか一項に記載の装置。
【請求項６】
前記第１のアーキテクチャレジスタ番号および前記第２のアーキテクチャレジスタ番号を識別するために前記第１のクラスの命令の前記命令符号化を復号するレジスタ復号回路を備える、請求項１〜５のいずれか一項に記載の装置。
【請求項７】
前記処理回路は、２Ｎ個のアーキテクチャレジスタを提供する命令セットアーキテクチャに従って命令を処理するように構成され、前記第１の命令クラスにおいて、前記第１のアーキテクチャレジスタ番号および前記第２のアーキテクチャレジスタ番号が前記命令符号化の２Ｎ−１ビットを用いて表される、請求項１〜６のいずれか一項に記載の装置。
【請求項８】
前記第１の命令クラスの前記命令符号化は、オペコードフィールドと、前記複数のレジスタの複数のスペアビットパターンが、前記第１のアーキテクチャレジスタ番号が前記第２のアーキテクチャレジスタ番号よりも大きい前記第１のアーキテクチャレジスタ番号と第２のアーキテクチャレジスタ番号との任意の有効な組み合わせに対応しない所定の符号化方式に従って前記第１のアーキテクチャレジスタ番号および前記第２のアーキテクチャレジスタ番号を表す複数のレジスタ識別ビットとを含み、
前記命令セットアーキテクチャは、前記オペコードフィールドと、前記複数のレジスタ識別ビットが前記スペアビットパターンのうちの１つを有する前記複数のレジスタ識別ビットとを含む命令符号化を有する第２のクラスの命令を含み、
前記第２のクラスの命令のうちの１つに応答して、前記処理回路は、前記命令の前記オペコードフィールドを、前記第１のクラスの命令のうちの１つの同一のオペコードフィールドとは別様に解釈するように構成される、請求項１〜７のいずれか一項に記載の装置。
【請求項９】
前記第２のクラスの命令は、単一ソースアーキテクチャレジスタ番号によって識別されるレジスタを使用して対応する処理演算を実行するように前記処理回路を制御するための、前記単一ソースアーキテクチャレジスタ番号を識別する少なくとも１つの命令を含む、請求項８に記載の装置。
【請求項１０】
前記単一ソースアーキテクチャレジスタ番号は、前記レジスタ識別ビットのサブセットおよび前記オペコードフィールドのビットを使用して、前記第２のクラスの前記少なくとも１つの命令の前記命令符号化において表現される、請求項９に記載の装置。
【請求項１１】
前記第１のクラスの命令の前記命令符号化は、
前記第２のアーキテクチャレジスタ番号の最上位ビットが０であるときに前記第１のアーキテクチャレジスタ番号に依存し、前記第２のアーキテクチャレジスタの最上位ビットが１であるときに、前記第１のアーキテクチャレジスタ番号のすべてのビットを反転した結果に依存する第１のレジスタフィールドと、
前記第２のアーキテクチャレジスタ番号の前記最上位ビット以外の前記第２のアーキテクチャレジスタ番号の残りのビットに依存する値を有する第２のレジスタフィールドと
を含む、請求項１〜１０のいずれか一項に記載の装置。
【請求項１２】
前記第２のレジスタフィールドは、前記第２のアーキテクチャレジスタ番号の前記残りのビットと前記第１のアーキテクチャレジスタ番号の対応するビットとの、ビットごとの排他的論理和の結果に依存する値を有する、請求項１１に記載の装置。
【請求項１３】
前記第２のレジスタフィールドは、前記第２のアーキテクチャレジスタ番号の前記最上位ビットが０である場合、前記第２のアーキテクチャレジスタ番号の前記残りのビットに依存し、前記第２のアーキテクチャレジスタ番号の最上位ビットが１である場合、前記第２のアーキテクチャレジスタ番号の前記残りのビットを反転した結果に依存する値を有する、請求項１１に記載の装置。
【請求項１４】
データ処理方法であって、
命令に応答して処理演算を実行するように処理回路を制御するステップを含み、
第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号を識別する第１のクラスの命令のうちの１つに応答して、前記処理回路は、前記第１のアーキテクチャレジスタ番号および前記第２のアーキテクチャレジスタ番号に対応する第１のレジスタおよび第２のレジスタを使用して、対応する処理演算を実行するように制御され、
前記第１の命令クラスの命令は、前記第１のアーキテクチャレジスタ番号を前記第２のアーキテクチャのレジスタ番号よりも大きくなるように制約する命令符号化を有する、データ処理方法。
【請求項１５】
請求項１〜１３のいずれか一項に記載の装置に対応する仮想マシン実行環境を提供するようにコンピュータを制御するコンピュータプログラムを記憶した、コンピュータ可読記憶媒体。
【請求項１６】
データ値を記憶するための複数のレジスタと、
命令に応答して処理演算を実行する処理回路と
を備える装置であって、
第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号を識別する命令符号化を有する命令に応答して、前記処理回路は、前記第１のアーキテクチャレジスタ番号と前記第２のアーキテクチャレジスタ番号との比較に基づいて、前記第１のアーキテクチャレジスタ番号および前記第２のアーキテクチャレジスタ番号に対応するレジスタを使用して、第１のタイプの処理演算を実行すべきか、または、第２のタイプの処理演算を実行すべきかを選択するように構成されている、装置。
【請求項１７】
前記第１のアーキテクチャレジスタ番号が前記第２のアーキテクチャレジスタ番号よりも大きい場合、前記処理回路は前記第１のタイプの処理演算を実行するように構成され、
前記第１のアーキテクチャレジスタ番号が前記第２のアーキテクチャレジスタ番号よりも小さい場合、前記処理回路は前記第２のタイプの処理演算を実行するように構成される、請求項１６に記載の装置。
【請求項１８】
前記第１のタイプの処理演算および前記第２のタイプの処理演算は、異なる可換的演算である、請求項１７に記載の装置。
【請求項１９】
前記第１のタイプの処理演算および前記第２のタイプの処理演算のうちの１つは、前記第１のアーキテクチャレジスタ番号および前記第２のアーキテクチャレジスタ番号に対応する前記レジスタに記憶された第１のオペランドおよび第２のオペランドに対して実行される処理演算を含み、
前記第１のアーキテクチャレジスタ番号が前記第２のアーキテクチャレジスタ番号に等しいとき、前記処理回路は、前記第１のタイプの処理演算および前記第２のタイプの処理演算のうちの前記一方を実行するように構成され、前記第１のオペランドおよび前記第２のオペランドは両方とも同じデータ値を含む、請求項１７および１８のいずれか一項に記載の装置。
【請求項２０】
前記第１のアーキテクチャレジスタ番号が前記第２のアーキテクチャレジスタ番号と等しい場合、前記処理回路は、前記第１のアーキテクチャレジスタ番号および前記第２のアーキテクチャレジスタ番号に対応するレジスタを使用して第３のタイプの処理演算を実行するように構成される、請求項１７および１８のいずれか一項に記載の装置。
【請求項２１】
前記第１のアーキテクチャレジスタ番号と前記第２のアーキテクチャレジスタ番号とが異なる場合、前記処理回路は前記第１のタイプの処理演算を実行するように構成され、
前記第１のアーキテクチャレジスタ番号と前記第２のアーキテクチャレジスタ番号とが等しい場合、前記処理回路は前記第２のタイプの処理演算を実行するように構成される、請求項１６に記載の装置。
【請求項２２】
前記第１のタイプの処理演算は、非可換的演算を含む、請求項２１に記載の装置。
【請求項２３】
前記第１のアーキテクチャレジスタ番号と前記第２のアーキテクチャレジスタ番号とを比較するレジスタ番号比較回路と、
前記命令のオペコードおよび前記第１のアーキテクチャレジスタ番号と前記第２のアーキテクチャレジスタ番号との前記比較の結果に基づいて実行されるべき処理演算のタイプを識別する復号回路と
を備える、請求項１６〜２２のいずれか一項に記載の装置。
【請求項２４】
前記レジスタ番号比較回路は、前記比較の前記結果に応じて少なくとも１つの追加のオペコードビットを生成するように構成され、前記復号回路は、前記オペコードおよび前記少なくとも１つの追加のオペコードビットを復号して、実行される処理演算のタイプを識別するように構成される、請求項２３に記載の装置。
【請求項２５】
前記第２のタイプの処理演算は、前記第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号に対応する前記レジスタに記憶された第１のオペランドおよび第２のオペランドに対して前記第１のタイプの処理演算を実行した結果と等価な値を生成することと、前記第１のタイプの処理演算の前記結果の絶対的な大きさを決定することとを含む、請求項１７〜２０のいずれか一項に記載の装置。
【請求項２６】
前記命令は、前記第１のアーキテクチャレジスタ番号および前記第２のアーキテクチャレジスタ番号に対応する前記レジスタに記憶された第１のオペランドおよび第２のオペランドを比較する比較命令を含み、前記第１のタイプの処理演算は、前記第１のオペランドと前記第２のオペランドとが等しいか否かの判定を含み、前記第２のタイプの処理演算は、前記第１のオペランドと前記第２のオペランドとが不等であるか否かの判定を含む、請求項１７〜２０のいずれか一項に記載の装置。
【請求項２７】
前記命令は、前記第１のアーキテクチャレジスタ番号および前記第２のアーキテクチャレジスタ番号に対応する前記レジスタに記憶された第１のオペランドおよび第２のオペランドを比較する比較命令を含み、前記比較命令は比較条件フィールドを有し、
前記比較条件フィールドが第１の値を有するとき、前記比較回路は、前記第１のアーキテクチャレジスタ番号が前記第２のアーキテクチャレジスタ番号より大きい場合に前記第１のオペランドおよび前記第２のオペランドが等しいか否かを判定し、前記第１のアーキテクチャレジスタ番号が前記第２のアーキテクチャレジスタ番号よりも小さい場合に前記第１のオペランドおよび前記第２のオペランドが不等であるか否かを判定するように構成され、
前記比較条件フィールドが第２の値を有するとき、前記処理回路は、前記第１のアーキテクチャレジスタ番号と前記第２のアーキテクチャレジスタ番号との前記比較にかかわらず、（ｉ）前記第１のオペランドが前記第２のオペランドよりも大きいか否か、および（ｉｉ）前記第１のオペランドが前記第２のオペランド以下であるか否かのいずれかを判定するように構成され、
前記比較条件フィールドが第３の値を有するとき、前記処理回路は、前記第１のアーキテクチャレジスタ番号および前記第２のアーキテクチャレジスタ番号の前記比較にかかわらず、（ｉ）前記第１のオペランドが前記第２のオペランド以上であるか否か、および（ｉｉ）前記第１のオペランドが前記第２のオペランドよりも小さいか否かを判定するように構成されている、請求項１７〜２０のいずれか一項に記載の装置。
【請求項２８】
前記比較条件フィールドは、２ビットフィールドを含む、請求項２７に記載の装置。
【請求項２９】
第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号を識別する命令符号化を有する命令に応答して、前記第１のアーキテクチャレジスタ番号と前記第２のアーキテクチャレジスタ番号とを比較するステップと、
前記第１のアーキテクチャレジスタ番号と前記第２のアーキテクチャレジスタ番号との比較に基づいて、前記第１のアーキテクチャレジスタ番号および前記第２のアーキテクチャレジスタ番号に対応するレジスタを使用して、第１のタイプの処理演算を実行すべきか、または、第２のタイプの処理演算を実行すべきかを選択するステップと
を含む、データ処理方法。
【請求項３０】
請求項１６〜２８のいずれか一項に記載の装置に対応する仮想マシン実行環境を提供するようにコンピュータを制御するコンピュータプログラムを記憶した、コンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、データ処理の分野に関する。
【背景技術】
【０００２】
データ処理装置は、所与の命令セットアーキテクチャ（ＩＳＡ）に従って符号化された命令を実行するように構成された処理回路を有することができる。命令は、いずれの処理演算を実行すべきか、および、その処理演算中にいずれのレジスタを使用すべきかを識別するために復号される所与のビット数を使用して表現することができる。理論的にはサポートすることが望ましいかもしれない多種多様な処理演算が存在する可能性があるが、追加の動作に対応するために各命令のビット数を増やすことは、追加のビットを各命令の処理パイプラインに沿って搬送する必要があり、より複雑な復号回路が必要となり、プログラムをメモリに記憶するのに必要なメモリ空間が命令のサイズとともに増加することになるために、ＩＳＡに従って命令を実行する処理装置の回路面積および電力消費を増加させる傾向があるため、ＩＳＡ設計は困難になる可能性がある。一方、回路面積およびエネルギーを節約するために、命令符号化のビット数を特定の数に制限することができるが、これはＩＳＡによっていずれの演算がサポートされるかに関して妥協を必要とする場合がある。
【発明の概要】
【課題を解決するための手段】
【０００３】
少なくともいくつかの例は、
データ値を記憶するための複数のレジスタと、
命令に応答して処理演算を実行する処理回路と
を備える装置であって、
第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号を識別する第１のクラスの命令のうちの１つに応答して、処理回路は、第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号に対応する第１のレジスタおよび第２のレジスタを使用して、対応する処理演算を実行するように構成され、
上記第１の命令クラスの命令は、上記第１のアーキテクチャレジスタ番号を上記第２のアーキテクチャのレジスタ番号よりも大きくなるように制約する命令符号化を有する、装置を提供する。
【０００４】
少なくともいくつかの例は、データ処理方法であって、
命令に応答して処理演算を実行するように処理回路を制御するステップを含み、
第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号を識別する第１のクラスの命令のうちの１つに応答して、処理回路は、第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号に対応する第１のレジスタおよび第２のレジスタを使用して、対応する処理演算を実行するように制御され、
上記第１の命令クラスの命令は、上記第１のアーキテクチャレジスタ番号を上記第２のアーキテクチャのレジスタ番号よりも大きくなるように制約する命令符号化を有する、データ処理方法を提供する。
【０００５】
少なくともいくつかの例は、
データ値を記憶するための複数のレジスタと、
命令に応答して処理演算を実行する処理回路と
を備える装置であって、
第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号を識別する命令符号化を有する命令に応答して、処理回路は、第１のアーキテクチャレジスタ番号と第２のアーキテクチャレジスタ番号との比較に基づいて、第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号に対応するレジスタを使用して、第１のタイプの処理演算を実行すべきか、または、第２のタイプの処理演算を実行すべきかを選択するように構成されている、装置を提供する。
【０００６】
少なくともいくつかの例は、
第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号を識別する命令符号化を有する命令に応答して、第１のアーキテクチャレジスタ番号と第２のアーキテクチャレジスタ番号とを比較するステップと、
第１のアーキテクチャレジスタ番号と第２のアーキテクチャレジスタ番号との比較に基づいて、第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号に対応するレジスタを使用して、第１のタイプの処理演算を実行すべきか、または、第２のタイプの処理演算を実行すべきかを選択するステップと
を含む、データ処理方法を提供する。
【０００７】
上述したいずれかの装置に対応する仮想マシン実行環境を提供するようにコンピュータを制御するコンピュータプログラムを記憶したコンピュータ読み取り可能な記憶媒体を提供することができる。記憶媒体は、非一時的記憶媒体であってもよい。
【０００８】
本技術のさらなる態様、特徴および利点は、添付の図面と併せて読まれるべき以下の実施例の説明から明らかになるであろう。
【０００９】
ここで本発明の実施形態を、添付の図面を参照して、単なる例として以下に説明する。
【図面の簡単な説明】
【００１０】
【図１】命令を処理するための処理パイプラインを有するデータ処理装置の一例を概略的に示す図である。
【図２】任意の値をとることができる第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号を識別する命令符号化の一例を示す図である。
【図３】第１のアーキテクチャレジスタ番号が第２のアーキテクチャレジスタ番号よりも大きくなるように制約されている第１のクラスの命令と、単一のソースアーキテクチャレジスタ番号を符号化する第２のクラスの命令とを提供する命令符号化の一例を示す図である。
【図４Ａ】図３に示された第１のクラスの命令の第１のレジスタフィールドおよび第２のレジスタフィールドの２つの可能な符号化のうちの１つを示す図である。
【図４Ｂ】図３に示された第１のクラスの命令の第１のレジスタフィールドおよび第２のレジスタフィールドの２つの可能な符号化のうちの１つを示す図である。
【図５】図３に示すように符号化された命令を復号するための復号ステージの一例を示す図である。
【図６Ａ】図４Ａの符号化方式に従って第１のレジスタフィールドおよび第２のレジスタフィールドを復号するための回路の第１の例を示す図である。
【図６Ｂ】復号回路の第２の例を示す図である。
【図７】命令を処理する方法を示す図である。
【図８】第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号を比較するためのレジスタ比較器を含む命令復号回路の第２の例を示す図である。
【図９】比較命令の符号化の例を示す図である。
【図１０】命令を処理する方法を示す図である。
【図１１】使用することができる仮想マシンの実施態様を示す図である。
【００１１】
いくつかの具体例を以下に示す。本発明はこれらの例に限定されないことは理解されよう。
【００１２】
処理回路は、第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号を識別するいくつかの命令をサポートすることができる。そのような命令に応答して、処理回路は、第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号に対応する第１のレジスタおよび第２のレジスタを使用して、対応する処理演算を実行することができる。典型的なＩＳＡは、所与の数のアーキテクチャレジスタを指定し、これらのアーキテクチャレジスタのいずれかが任意の組み合わせで第１および第２のアーキテクチャレジスタ番号として指定され得るように命令を符号化する。
【００１３】
しかし、本発明者らは、いずれのレジスタをそれぞれ第１のアーキテクチャレジスタ番号および第２のアーキテクチャレジスタ番号として見なされるかを交換しても、異なる結果をもたらさない可能性があるため、そのような手法ではいくらかの冗長性があることを認識した。例えば、レジスタＲ１およびＲ２に記憶された値を加算するａｄｄ命令は、レジスタＲ２およびＲ１内の値を加算するａｄｄ命令と同じ結果をもたらす。したがって、典型的なＩＳＡは、所与の処理演算のために両方の順序の所与のレジスタ対を別々に符号化する際に、かなりの量の命令符号化空間を使い果たす可能性がある。本技術は、この冗長性を利用して命令のより効率的な符号化を提供することができる技術を提供する。
【００１４】
第１の例では、第１のアーキテクチャレジスタ番号を第２のアーキテクチャレジスタ番号よりも大きくなるように制約する命令符号化を有する第１のクラスの命令を提供することができる。第１のアーキテクチャレジスタ番号が第２のアーキテクチャレジスタ番号以下であるという選択肢を排除することにより、アーキテクチャレジスタの有効な組み合わせの数が減少し、これにより、他の処理演算をシグナリングするために使用するためのいくつかの命令符号化を解放することができる。アーキテクチャレジスタの任意の組み合わせが指定され得る場合と比較して、第１のアーキテクチャレジスタ番号を第２のアーキテクチャレジスタ番号よりも大きくなるように制限することにより、有効なレジスタ対符号化の数を半分以上減らすことができ、それらが１つ少ないビットを使用して識別されることが可能になる。これによって、全体でより少ないビットを使用して命令が符号化されることを可能にし、命令を実行する処理装置においてエネルギーおよび電力を節約することができるか、または、実行されるべき処理演算を符号化するために追加のビットが利用可能となるため、所与のビット数が、追加の機能をサポートするために、より広い範囲の異なる処理演算を表すことを可能にすることができる。
【００１５】
簡潔にするために、第１のアーキテクチャレジスタ番号は以下ではＲｘとして見なされ、第２のアーキテクチャレジスタ番号はＲｙとして見なされ、Ｒｘ＞Ｒｙである。
【００１６】
装置は、命令に応答して処理回路によってアクセス可能なハードウェア内に設けられた物理レジスタを有することができる。いくつかの実施形態では、アーキテクチャレジスタ番号Ｒｘ、Ｒｙは、使用される物理レジスタを識別することもできる。この場合、Ｒｘ＞Ｒｙの制約は、いずれの物理レジスタが処理されるべきデータを記憶するかを制約することもできる。一方、他の実施形態は、命令によって指定されるアーキテクチャレジスタ番号がハードウェア内に提供される異なる物理レジスタにマッピングされ得るレジスタリネーミングをサポートすることができる。この場合、命令符号化はＲｘ＞Ｒｙを必要とし得るが、レジスタリネーミング回路は依然として、指定されたアーキテクチャレジスタ番号を任意の利用可能な物理レジスタにマッピングする自由を有することができるため、これは必ずしも、決して物理レジスタの選択を制約するものではない。命令符号化は、Ｒｘ＞Ｒｙであるようにアーキテクチャレジスタ番号を制約するが、対応するレジスタに記憶されるデータには制約がなく、ＲｘおよびＲｙに記憶されたデータは任意の値をとることができることに留意されたい。
【００１７】
処理回路は、ＲｘがＲｙよりも大きくなるように制約される命令符号化に従って第１のクラスの命令を復号する復号回路を有することができる。
【００１８】
第１のクラスの命令の少なくともいくつかについて、第１のアーキテクチャレジスタ番号Ｒｘおよび第２のアーキテクチャレジスタ番号Ｒｙは、対応する命令に応答して処理されるべきオペランド値を記憶するレジスタを識別するソースアーキテクチャレジスタ番号であってもよい（例えば算術命令または論理命令は、そのソースオペランドが、Ｒｘ＞Ｒｙであるアーキテクチャレジスタによって識別されるようにすることができる）。命令はまた、演算結果が書き込まれる宛先レジスタも指定することができる。宛先レジスタの選択は無制約であり得るため、ソースアーキテクチャレジスタＲｘ、Ｒｙの選択にかかわらず、宛先アーキテクチャレジスタとして任意のアーキテクチャレジスタを指定することができる。
【００１９】
他方、第１のクラスの命令の他の命令について、第１のアーキテクチャレジスタ番号Ｒｘおよび第２のアーキテクチャレジスタ番号Ｒｙの一方または両方は、結果が書き込まれる宛先レジスタを識別することができる。例えば、ｌｏａｄ  ｍｕｌｔｉｐｌｅ命令は、Ｒｘ＞Ｒｙの符号化を使用して値がメモリからロードされるべき２つの宛先レジスタＲｘ、Ｒｙを指定することができる。
【００２０】
一例では、第１のクラスの命令は、対応する処理演算が可換的演算である少なくとも１つの可換的命令を含むことができる。可換的演算は、オペランドが入力される順序に関係なく、所与のオペランドセットに適用されたときに同じ結果を与える演算であり得る（例えば、Ａ≠Ｂであっても、ｆ（Ａ，Ｂ）＝ｆ（Ｂ，Ａ）となる関数ｆ（ｍ，ｎ））。例えば、加算は２＋３＝３＋２なので可換的演算である。可換的演算の他の例には、乗算、絶対差、およびＡＮＤ、ＯＲ、ＸＯＲのようないくつかのビット単位の論理演算が含まれる。可換的演算では、入力オペランドの順序にかかわらず同じ結果が生成されるため、Ｒｘ＞Ｒｙの符号化に加えてＲｘ＞Ｒｙの符号化を可能にすることは、全体的に冗長になる。したがって、そのような演算の場合、Ｒｘ＜Ｒｙの符号化の損失は、ＩＳＡによって提供される機能性に影響を与えない。コンパイラは、例えばＡＤＤ  Ｒ２、Ｒ３の代わりに単にＡＤＤ  Ｒ３、Ｒ２を符号化する命令を選択することができる。
【００２１】
いくつかの可換的演算では、２つの同一のオペランドに演算を適用することが依然として重要である可能性があり、そのため、Ｒｘ＝Ｒｙの符号化を除外することによって、ある程度機能が制限される場合がある。しかし、いくつかのタイプの演算では、２つの同一の入力に演算を適用するのと同じ結果をもたらす、ＩＳＡがサポートしている別の演算がすでに存在する可能性がある（例えば、Ｒｘ＋ＲｘはＲｘ＊２、または１ビット位置だけの左シフトと等価であり得、そのため、両方のソースレジスタが同じであることを可能にするａｄｄ命令は必須ではない場合がある）。
【００２２】
また、２つの同一の入力に適用されるある可換的演算が命令セットアーキテクチャ内の他の場所に同等のものを有しないとしても、Ｒｘ＞Ｒｙによって対応する可換的命令を依然として実行できるように、同じオペランド値を２つの異なるアーキテクチャレジスタＲｘ、Ｒｙに書き込むことができる。
【００２３】
また、所与の可換的演算に対して、２つの同一のオペランドに演算を適用することが頻繁に使用される可能性が高く、そのため、ＩＳＡでこれを明示的にサポートすることが望ましい場合、または、同じ値を記憶するために２つの異なるレジスタの使用と関連付けられる追加のレジスタ圧力を避けることが望ましい場合、第２の命令タイプ（例えば、異なるオペコードを有する）を命令セット符号化空間の他の場所に実装して、同一の入力によってその特定の可換的演算を実行することができる。例えば、Ｒｘ＞Ｒｙである符号化を有する乗算命令ＭＵＬ  Ｒｘ、Ｒｙに加えて、ＭＵＬ  Ｒｘ、Ｒｘを実行してレジスタＲｘの値を２乗する２乗命令に追加の符号化を割り当てることができる。典型的には、Ｒｘ＝Ｒｙのときに演算を実行することが重要である可換的演算の数は、サポートされる可換的演算の総数よりも少なく、そのため、演算のいくつかがそれぞれＲｘ＞ＲｙおよびＲｘ＝Ｒｙに対して定義される別個の符号化を有する場合であっても、全体として必要とされる命令符号化の総数を減らすことができる。
【００２４】
第１のクラスの命令はまた、対応する処理演算が非可換的演算である少なくとも１つの非可換的命令を含むこともできる。非可換的演算は、オペランドがすべて等しいものではない場合に、オペランドの順序を変更することによって、異なる結果が生成される演算であり得る（例えば、Ａ≠Ｂの場合、ｆ（Ａ，Ｂ）≠ｆ（Ｂ，Ａ）となる関数ｆ（ｍ，ｎ））。例えば、４−１は１−４と等しくないため、減算は非可換的演算である。非可換的演算の他の例には、除算およびシフト演算が含まれる（例えば、オペランドＢによって指定される複数のビット位置だけオペランドＡをシフトすることは、一般に、オペランドＡによって指定される複数のビット位置だけオペランドＢをシフトすることと同じ結果を与えない）。
【００２５】
Ｒｘ＜Ｒｙを許容することが異なる結果を生成するため、これを可能にすることは依然として重要であるという理由で、Ｒｘ＞Ｒｙを制約する命令符号化は、非可換的命令には望ましくないと予測される可能性がある。しかし、たとえ命令セットアーキテクチャが所与の非可換的演算に対してＲｘ＞Ｒｙしか許容しないとしても、入力値は以前の命令によって異なる順序でアーキテクチャレジスタに書き込まれ、それによって、非可換的演算は依然として、アーキテクチャレジスタ番号Ｒｘ、Ｒｙの制約にもかかわらず、正しい順序で正しい値に適用することができる。例えば、非可換的演算が適用されるべきオペランドを生成する、先行する命令の宛先レジスタは、非可換的演算のための第１のオペランドが、第２のオペランドに使用されるレジスタよりも大きいアーキテクチャレジスタ番号を有するレジスタであるように、選択することができる。代替的に、非可換的命令の前にレジスタ移動命令を実行して、あるレジスタから別のレジスタにデータ値を移動させ、オペランドが制約Ｒｘ＞Ｒｙに適合する適切なレジスタ内にあり、非可換的演算命令を、正しい順序のオペランドによって実行することができることを保証することができる。
【００２６】
しかし、追加の移動命令を実行するか、または非可換的演算のためにオペランドを記憶できるレジスタを制約すると、性能に影響を与える可能性がある。これを回避し、コンパイラ設計を単純化するために、第１のクラスの命令は、同じタイプの非可換的演算に対応する少なくとも１対の相補的非可換的命令を含むことができる。各対に対して、対のうちの１つの命令は、第１のオペランドおよび第２のオペランドを有する非可換的演算を、対の他の命令とは異なる順序で実行するように、処理回路を制御する。例えば、例としてＲｘ−Ｒｙに対応するＳＵＢ  Ｒｘ、ＲｙおよびＲｙ−Ｒｘに対応するＳＵＢＲ  Ｒｘ、Ｒｙを有する、相補的な一対の減算命令が提供され得る。非可換的演算の非反転および反転の両方のバージョンを別々の命令として含めることによって、コンパイラは、非可換的演算のオペランドを任意のアーキテクチャレジスタに完全に自由に配置することができる。
【００２７】
これは、そもそもアーキテクチャレジスタ番号符号化Ｒｘ、Ｒｙを制約するという目的を損なうことが予想される。しかしながら、レジスタ指定フィールドよりも命令の他の部分に冗長性をシフトすることによって、これは符号化空間の冗長部分を、それらの演算を復号することおよび／またはそのような冗長部分を他の演算に再利用することをより容易にする連続的な部分に融合することができるため、このようにアーキテクチャレジスタを符号化することの利点は依然として存在する。
【００２８】
相補的な非可換的命令の対は、種々の方法で区別することができる。場合によっては、命令の対は異なるオペコードを有することができる。場合によっては、非可換的命令の相補的な対のオペコードは、異なる１つのビットを除いて同一であり得る。異なるビットを、レジスタの順序を逆転させるための論理をアクティブにするために使用することができるため、この手法は、復号回路を単純にすることができる。代替的に、命令対は同じオペコードを有することができるが、非可換的演算を使用してオペランドが処理される順序を指定する追加のビットフィールドを有することができる。
【００２９】
代替的に、Ｒｘ＞Ｒｙである第１のクラスの命令に加えて、ＲｘがＲｙよりも小さくなるように制約されるさらなるクラスの命令が存在してもよく、第１のクラスおよびさらなるクラスの各々における１つの命令が、同じ非可換的演算に割り当てられる（例えば、オペコードの１ビットは、ＲｘおよびＲｙの復号値が反転されるか否かを選択することができ、ＲｘおよびＲｙのいずれがより大きいかを実効的に反転する）が、可換的演算は第１のクラスまたはさらなるクラスのいずれかに割り当てられる単一の命令のみを有し得る。
【００３０】
第１のクラスの命令は、第１のアーキテクチャレジスタ番号Ｒｘと第２のアーキテクチャレジスタ番号Ｒｙとの間の連続範囲内のアーキテクチャレジスタ番号に対応する複数のレジスタを使用して処理演算を実行するように処理回路を制御するための少なくとも１つのレジスタ範囲指定命令を含むことができる。例えば、レジスタ範囲指定命令は、レジスタとメモリ内の対応するアドレスとの間でデータを転送するためのｌｏａｄ  ｍｕｌｔｉｐｌｅ命令もしくはｓｔｏｒｅ  ｍｕｌｔｉｐｌｅ命令、またはレジスタとスタックとの間でデータを転送するプッシュ命令またはポップ命令とすることができる。レジスタ範囲指定命令について、範囲を昇順と降順の両方で符号化できることについて大きな利点はないため、Ｒｘ＞Ｒｙとなるようにレジスタ符号化を制約することによって、ＩＳＡの全体的な符号化をより効率的にする他の演算を符号化するために、いくつかの命令符号化を使用できるようにすることができる。レジスタリネーミングをサポートするシステムでは、アーキテクチャレジスタ番号がレジスタ範囲指定命令によって連続範囲として識別され得るが、各アーキテクチャレジスタ番号は、物理レジスタファイル内の個別の物理レジスタにマッピングされ得るため、対応する物理レジスタ番号は連続的な範囲内にある必要はないことに留意されたい。
【００３１】
第１のアーキテクチャレジスタ番号Ｒｘおよび第２のアーキテクチャレジスタ番号Ｒｙは、第１のクラスの命令の命令符号化において明示的に識別されない場合がある。したがって、装置は、第１のアーキテクチャレジスタ番号Ｒｘおよび第２のアーキテクチャレジスタ番号Ｒｙを識別するために第１のクラスの命令の命令符号化を復号するレジスタ復号回路を備えることができる。場合によっては、レジスタ復号回路は、命令自体を復号する命令復号器の一部であってもよく、その結果、命令復号器は、実行すべき処理演算を識別する命令のオペコードと、実際のアーキテクチャレジスタ番号Ｒｘ、Ｒｙを識別するための命令のビットを識別するレジスタの両方を復号する。他の場合には、レジスタ復号回路を命令復号器とは別個に設けることができる。例えば、命令復号器は最初にオペコードを復号することができるが、その後、レジスタリネーミングステージまたは発行ステージのような後続のステージにおいて、アーキテクチャレジスタ番号Ｒｘ、Ｒｙを復号することができる。しかしながら、一般に、第１のアーキテクチャレジスタ番号Ｒｘおよび第２のアーキテクチャレジスタ番号Ｒｙが早期に識別され得るほど、同じアーキテクチャレジスタを指定する命令間の危険を早期に識別することができるため、レジスタ復号回路を可能な限り早く、例えば命令復号ステージにおいて提供することが有益であり得る。
【００３２】
場合によっては、アーキテクチャレジスタ番号Ｒｘ、Ｒｙの符号化を、即値、制御フラグまたは他のパラメータなど、命令の少なくとも１つのさらなるパラメータの符号化と組み合わせることができる。この場合、命令の共通のビットフィールド（または複数のビットフィールド）を復号して、Ｒｘ、Ｒｙおよびさらなるパラメータを識別することができ、Ｒｘ＞Ｒｙのレジスタ対のみがビットフィールド（複数可）の有効な符号化を割り当てられる。このようにレジスタ番号Ｒｘ、Ｒｙの符号化をさらなるパラメータの符号化と組み合わせることにより、レジスタおよびさらなるパラメータのための別個のフィールドが提供される場合よりも命令をより効率的に符号化することができる。
【００３３】
他の例では、第１のクラスの命令の命令符号化のいくつかのビットは、第１のアーキテクチャレジスタ番号Ｒｘおよび第２のアーキテクチャレジスタ番号Ｒｙを識別するために特に割り当てられてもよく、命令の任意の他のパラメータは命令の異なるフィールドにおいて別々に識別されてもよい。この場合、２Ｎ個のアーキテクチャレジスタを提供するＩＳＡについて、第１のクラスの命令において、第１のアーキテクチャレジスタＲｘおよび第２のアーキテクチャレジスタＲｙは、命令符号化の２Ｎ−１ビットを使用して表すことができる。例えば、アーキテクチャが１６または３２のレジスタを提供する場合、ＲｘおよびＲｙはそれぞれ７または９ビットを使用して表すことができる。対照的に、命令符号化がアーキテクチャレジスタ番号Ｒｘ、Ｒｙの自由な選択を許可した場合、２Ｎビットが必要となる。したがって、レジスタ指定フィールドに１ビットを保存することによって、命令幅を縮小するか、命令の他の部分の符号化空間を解放して、他の演算の符号化に使用することができる。
【００３４】
２Ｎ個のアーキテクチャレジスタがあり、ＲｘおよびＲｙが２Ｎ−１個のレジスタ識別ビットを使用して表される場合、Ｒｘ＞ＲｙであるＲｘとＲｙとの組み合わせの数は２Ｎ２Ｎ−１／２であり、他の目的のために使用することができるレジスタ識別ビットの２Ｎ−１個のスペア値を残す。これらのスペア符号化のうちのいくつかは、命令オペコードまたは命令符号化の他の部分を第１クラスの命令とは別様に解釈することができる第２のクラスの命令を表すために使用することができ、それによって、他のオペコードが他の演算を符号化するために解放される。
【００３５】
例えば、第２のクラスの命令は、１つの入力オペランドしか必要とせず、したがって１つのソースアーキテクチャレジスタ番号のみを指定する必要がある命令を含むことができる。例えば、このような単一入力命令は、指定されたレジスタ内のビットの順序を逆転させる命令、または所与のレジスタに記憶されたデータ値の先頭のゼロの数をカウントする命令を含むことができる。また、２つの同一の入力に演算を適用することが重要である、上述したようないくつかの可換的演算（例えば上述の２乗命令）が存在する可能性がある。そのような命令は、これらの単一入力動作のために他のオペコードを使い切る必要を回避するために、レジスタ識別ビットのいくつかのスペアビットパターンを使用して符号化することができる。
【００３６】
スペアビットパターンの数は、可能なすべてのアーキテクチャレジスタを単一入力演算の単一ソースレジスタとして識別するのには十分でなくてもよく、したがって第２のクラスの命令について、第１のクラスの命令のオペコードフィールドのビットは、レジスタ識別ビットの少なくともサブセットとともに、単一ソースレジスタを識別することができる。したがって、第２のクラスの命令のオペコードは事実上１ビット短くなり得、それによって、第１のクラスの命令よりも、第２の命令クラスの命令が少なくなる。
【００３７】
第１のクラスの命令について、所与のビットパターンにおいてＲｘおよびＲｙを符号化するために使用され得る多種多様な符号化方式が存在し得る。最も一般的には、レジスタ識別ビットの可能な各ビットパターンは、Ｒｘ＞Ｒｙである所与のレジスタ対Ｒｘ、Ｒｙに任意にマッピングすることができ、いくつかのビットパターンが、上述したように第２のクラスの命令に使用できるスペアに残る。しかしながら、いくつかの符号化方式は、他の符号化方式よりも複雑な復号回路を必要とすることがある。
【００３８】
特に効率的な符号化は、Ｒｙの最上位ビットが０であるときにＲｘに依存し、Ｒｙの最上位ビットが１であるときにＲｘの全ビットを反転した結果に依存する第１のレジスタフィールドＡ、および、Ｒｙの最上位ビット以外のＲｙの残りのビットに依存する値を有する第２のレジスタフィールドＢを提供することである。これは、ＡとＢの比較に応じてＡフィールドの内容を選択的に反転させることによって復号することができ、それによって、ＲｘおよびＲｙは比較的少ない回路で復号することができる。
【００３９】
一例では、第２のレジスタフィールドＢは、Ｒｙの残りのビットとＲｘの対応するビットとのビット単位の排他的ＯＲ（ＸＯＲ）の結果に依存する値を有することができる。この符号化にはいくつかの利点がある。第１に、第２のクラスの命令に対して再使用されるスペアビットパターンは、第２のレジスタフィールドＢのすべてのビットがゼロであり、第１のレジスタフィールドＡの最上位ビットもゼロである符号化に融合され、第２のクラスの命令の復号がより単純になる。また、この復号論理は、他の符号化を復号する論理に比べて、比較的単純で高速である。
【００４０】
別の例では、第２のレジスタフィールドＢは、Ｒｙの最上位ビットが０であるときにＲｙの残りのビットに依存し、Ｒｙの最上位ビットが１であるときはＲｙの残りのビットを反転した結果に依存する値を有することができる。この手法では、スペア符号化は、Ｂの対応するビットに等しいＡの最下位ビットを有することができる。
【００４１】
アーキテクチャレジスタ番号符号化における冗長性を利用するためのもう１つの技法は、いずれのアーキテクチャレジスタがＲｘおよびＲｙとして指定されるかの自由な選択を可能にし、ただし、ＲｘおよびＲｙの比較から何らかの追加情報を導出することである。例えば、処理回路は、ＲｘとＲｙとの比較に基づいて、Ｒｘ、Ｒｙに対応するレジスタを使用して、第１のタイプの処理演算を実行するか、または第２のタイプの処理演算を実行するかを選択することができる。一般に、第１の処理演算および第２のタイプの処理演算は、入力値の少なくともいくつかの組み合わせについて異なる結果を生成する任意の処理演算であってもよい。したがって、上述したようにレジスタ符号化を制約するのではなく、レジスタ符号化は、利用可能なアーキテクチャレジスタ番号のいずれかから選択することができるが、アーキテクチャレジスタ番号を比較することによって、少なくとも一片の追加情報を導出することができ、この情報はその後、命令コードの残りの部分が他の様態で同一であっても、処理回路によって異なるタイプの処理演算を実行できるように、どのように命令が復号されるかに影響を与えることができる。ここでも、これによってその追加情報片を識別するために符号化の別のビットを提供する必要性をなくし、命令をより短くすることができ、または、これによって、他の目的のための符号化の追加のビットを解放して、増大した機能が、所与の数の命令ビットを使用してサポートされることを可能にすることができる。
【００４２】
いくつかの命令について、Ｒｘ＞Ｒｙの場合、処理回路は第１のタイプの処理演算を実行することができ、Ｒｘ＜Ｒｙの場合、処理回路は第２のタイプの処理演算を実行することができる。したがって、オペランドが符号化される順序は、実効的に、処理演算のタイプを選択するためのオペコードの追加ビットを提供することができる。
【００４３】
この手法は、第１のタイプの処理演算および第２のタイプの処理演算が異なる可換的演算である場合に特に有用であり得る。上記で論じたように、可換的演算の場合、所与の対のレジスタのうちのいずれのレジスタが第１のオペランドまたは第２のオペランドとして指定されるかにかかわらず、所与の対のレジスタに可換的演算が適用される場合、結果は同じになる。したがって、所定の命令オペコードに対してレジスタが指定される順序は、他の何らかの情報をシグナリングするために使用することができる。場合によっては、可換的演算はまったく異なる可能性があり得る。例えば、第１のタイプの処理演算は加算であり得、第２のタイプの処理演算はＸＯＲであり得る。他の場合には、第１のタイプの処理演算および第２のタイプの処理演算は、本質的に同じ種類の算術演算または論理演算に対応することができるが、第２のタイプの処理演算は第１のタイプの変更バージョンである（例えば、第２のタイプの演算が、第１のタイプの演算の結果の絶対的な大きさを返してもよい）。
【００４４】
ＲｘおよびＲｙが自由に選択でき、Ｒｘ＞ＲｙおよびＲｙ＜Ｒｘがそれぞれ第１の処理演算および第２の処理演算に対応する場合、ＲｘがＲｙに等しいいくつかの符号化も存在する。これらは、いくつかの異なる方法で処理することができる。
・いくつかの命令では、Ｒｘ＝Ｒｙのとき、処理回路は、第１のタイプの処理演算または第２のタイプの処理演算のいずれかを選択することができる。例えば、第１のタイプの処理演算はＲｘ≧Ｒｙであるときに選択することができ、第２のタイプの動作はＲｘ＜Ｒｙである場合に選択することができる。Ｒｘ＝Ｒｙのとき、両方のタイプの演算を符号化することが意味をなさない場合があるいくつかのタイプの処理演算がある。例えば、第１のタイプの演算が減算であり、第２のタイプの演算が減算の結果の絶対値を生成する場合、Ｒｘ＝Ｒｙの場合、両方の演算は結果０を生成するため、Ｒｘ＝Ｒｙのときの２つのタイプの演算のための別々の符号化を提供することには何の意味もなく、代わりに、Ｒｘ＝Ｒｙのときには、これによって第１のタイプの演算が選択されることになり得る。
・代替的に、Ｒｘ＝Ｒｙである何らかの命令について、第３のタイプの処理演算が実行されてもよい。したがって、Ｒｘ＝Ｒｙの符号化は、Ｒｘ＞ＲｙまたはＲｘ＜Ｒｙの場合の演算とはまったく異なる演算をシグナリングすることができる。
・もう１つの手法は、特定の命令について、Ｒｘ＝Ｒｙの符号化が単に、任意のタイプの処理演算に対応しない無効な符号化であることであり得る。そのような符号化に遭遇すると、命令復号器は未定義の命令をシグナリングしてもよく、またはその命令をＮＯＰとして扱ってもよい。
Ｒｘ＝Ｒｙの場合を処理するのに、ＩＳＡのすべての命令が同じ手法を使用する必要はない。所与のＩＳＡは、これらの手法の１つを使用するある命令、および、別の手法を使用する他の命令を有し得る。
【００４５】
他の命令について、第１のタイプの処理演算は、ＲｘとＲｙが異なる場合に実行され得、第２のタイプの処理演算は、ＲｘがＲｙに等しい場合に実行され得る。これは、第１のタイプの処理演算が非可換的演算である場合に特に有用である。非可換的演算について、非可換的演算はオペランドの順序が逆になったときに異なる結果をもたらすため、所与のレジスタ対が符号化され得る可能性のある両方の順序が重要であり得る。しかし、両方のオペランドが同じであるいくつかの非可換的演算については、結果は、重要でないものであり得るか、または、代替的な演算を使用して生成され得る。例えば、ＢＩＣ演算（Ｒｘ  ＡＮＤ（ＮＯＴ  Ｒｙ））について、Ｒｘ＝Ｒｙの場合、結果は常に０であるため、代わりに、Ｒｘ＝ＲｙであるＢＩＣ演算の符号化は、異なる第２のタイプの処理演算、例えば、レジスタＲｘ内のデータ値の全ビットを反転させるためのビット反転演算をシグナリングし得る。Ｒｘ＝Ｒｙのときの結果が重要でないものであり得る非可換的演算の他の例は、整数減算（Ｒｘ−Ｒｘが常に０）、除算（Ｒｘ／Ｒｘが常に１）、またはＯＲＮ（Ａ  ＯＲＮ  ＢはＡ  ＯＲ（ＮＯＴ  Ｂ）と等価であるため、Ｒｘ  ＯＲＮ  Ｒｘは常にすべて１のビットパターン、すなわち、０ｘｆｆｆｆ．．．，または−１である）である。
【００４６】
装置は、第１のアーキテクチャレジスタ番号Ｒｘおよび第２のアーキテクチャレジスタ番号Ｒｙを比較するレジスタ番号比較回路と、命令のオペコードおよびレジスタ番号比較回路によって実行された比較の結果に基づいて実行されるべき処理演算のタイプを識別する復号回路とを有することができる。例えば、オペコードは、レジスタを用いて実行される必要な処理演算を識別するために、オペコードとともに復号され得る、レジスタ比較から導出される追加のオペコードビットによって補完され得る。これにより、明示的な命令符号化において追加のオペコードビットを表す必要がなくなる。
【００４７】
それぞれＲｘ＞ＲｙおよびＲｘ＜Ｒｙのときに異なる演算を実行することが有用であり得る命令の例は、第１のタイプの処理演算が、第１のオペランドおよび第２のオペランドが等しいか否かの判定を含むことができ、第２のタイプの処理演算が、第１のオペランドおよび第２のオペランドが不等であるか否かの判定を含むことができる、比較命令である。等しいかの比較および不等かの比較は可換的であるため、Ｒｘ＞ＲｙおよびＲｘ＜Ｒｙの両方を表すことができる必要はなく、そのため、これらは、等価条件が使用されるか、または、不等条件が使用されるかをシグナリングするレジスタ番号の相対的な順序付けによる共通の符号化を使用して表現することができる。Ｒｘ＝Ｒｙの符号化では、もはや等価条件と不等条件とを区別することはできないが、所与の値がそれ自体と等しいかまたは不等であるかの比較は、通常、他の演算によって評価することができる。
【００４８】
より詳細には、比較命令は、比較条件フィールドを有することができる。比較条件フィールドが第１の値を有するとき、処理回路は、Ｒｘ＞Ｒｙのときに第１のオペランドおよび第２のオペランドが等しいか否かを判定し、Ｒｘ＜Ｒｙのときに第１のオペランドおよび第２のオペランドが不等であるか否かを決定することができる。比較条件フィールドが第２の値を有するとき、処理回路は、Ｒｘ＞ＲｙまたはＲｘ＜Ｒｙであるかにかかわらず、（ｉ）第１のオペランドが第２のオペランドよりも大きいか否か、および（ｉｉ）第１のオペランドが第２のオペランド以下であるか否かのうちの一方を判定することができる。比較条件フィールドが第３の値を有するとき、処理回路は、Ｒｘ＞ＲｙまたはＲｘ＜Ｒｙであるかにかかわらず、（ｉ）第１のオペランドが第２のオペランド以上であるか否か、および（ｉｉ）第１のオペランドが第２のオペランド未満であるか否かのうちの一方を判定することができる。この手法では、６つの異なる比較条件（未満（＜）、より大きい（＞）、以下（≦）、以上（≧）、等しい（＝＝）、等しくない（！＝））を表すのに、予測され得るような３ビットフィールドではなく、２ビットフィールドで十分である。これは、すべての比較条件が比較条件フィールドの専用符号化を有するわけではないが、反対の順序で指定されたオペランドを有する他の比較条件の１つを用いて等価な結果を適用することができる（例えば、Ｒｘ＞ＲｙはＲｙ≦Ｒｘと等価である）ために、可能である。また、比較条件フィールドの符号化は、必要に応じて別の演算をシグナリングするのに使用するためにスペアも残す。
【００４９】
上述のすべての例について、本技術は仮想マシン実行環境で使用することもできる。仮想マシンは、コンピュータ可読記憶媒体に記憶されたコンピュータプログラムとして提供されてもよく、媒体は、非一時的記憶媒体であってもよい。上記のように符号化された命令を処理するための命令復号または処理回路をそれ自体は有しないコンピュータによって実行されると、仮想マシンプログラムはその符号化に従って命令を解釈し、対応する動作を実行するように処理回路を制御する。例えば、仮想マシンプログラムは、ホストコンピュータの処理回路によってサポートされるネイティブ命令に命令をマッピングすることができる。これにより、上記の符号化技術をサポートする別のプラットフォーム用に書かれたコードが、これらの技術をそれ自体はサポートしていないコンピュータ上で実行されることが可能になる。
【００５０】
図１は、命令に応答してデータ処理を実行するための処理パイプライン４を備えるデータ処理装置２の一例を概略的に示す図である。パイプライン４は、命令キャッシュ８から処理すべき命令をフェッチするためのフェッチステージ６と、フェッチされた命令を復号する復号ステージ１０と、復号された命令によって指定されるアーキテクチャレジスタ指定子を、ハードウェア内に設けられている物理レジスタ１４を識別する物理レジスタ指定子にマッピングするためのレジスタリネームを実行するレジスタリネームステージ１２と、オペランドが利用可能になる間は実行を待つ命令を待ち行列に入れ、オペランドが利用可能になると実行のための命令を発行する発行ステージ１６と、発行された命令を実行する実行ステージ１８とを含む複数のパイプラインステージを含む。発行ステージ１６は、命令がフェッチステージ６によって命令キャッシュ８からフェッチされたプログラム順序と同じ順序で命令が実行されるインオーダーパイプラインであってもよく、または、プログラム順序と異なる順序で実行するために命令を順序外で発行することを可能にすることができるアウトオブオーダーパイプラインであってもよい。
【００５１】
実行ステージ１８は、算術または論理命令を実行するための算術論理ユニット（ＡＬＵ）、浮動小数点命令を実行する浮動小数点（ＦＰ）ユニット、および、メモリシステムからデータをロードするためのロード命令またはメモリシステムにデータを記憶するためのストア命令を実行するためのロード／ストアユニットのような、異なる種類の命令を処理するための複数の実行ユニットを含むことができる。図１に示すように、メモリシステムは、命令キャッシュ８、レベル１（Ｌ１）データキャッシュ２６、レベル２（Ｌ２）キャッシュ２８およびメインメモリ３０を含むことができる。この例では、Ｌ２キャッシュ２８は共有命令／データキャッシュとして使用されるが、別個のＬ２命令キャッシュおよびデータキャッシュも提供されてもよい。また、３つ以上のレベルのキャッシュが存在してもよいことが理解されるであろう。
【００５２】
図１は概略的なものに過ぎず、簡潔にするために、処理装置２のすべての可能な構成要素を示すものではなく、そのため、装置２は他の要素も含んでもよい。図１に示されるパイプライン４における特定のパイプラインステージの構成は単なる一例に過ぎず、他のタイプのパイプラインステージが提供されてもよい。図１は、実行ステージ１８がレジスタ１４からデータ値を読み出してデータ値をレジスタ１４に書き戻す例を示しているが、他の例では、命令が発行ステージ１６において保留されている間に命令のソースレジスタからデータが読み出されてもよい。また、命令の結果をレジスタ１４に書き戻すために、実行ステージの後に別個のライトバックステージを設けることも可能である。また、いくつかのパイプライン４は、発行ステージ１６が満杯であっても、命令がリネームステージ１２を離れることができるようにバッファを提供するために、リネームステージ１２と発行ステージ１６との間に別個のディスパッチステージを有することができる。図１はレジスタリネーミングステージ１２を含むパイプラインの例を示しているが、これは任意選択であり、他のパイプラインはリネームステージ１２を省略してもよい。例えば、元のプログラム順序で命令を処理するインオーダーパイプラインは、リネームステージ１２を必要としない場合がある。リネームステージ１２が提供されない場合、復号された命令によって指定されるアーキテクチャレジスタもまた、それらの命令に応答してアクセスされるべき物理レジスタ１４を識別する。
【００５３】
復号ステージ１０は、ある命令セットアーキテクチャ（ＩＳＡ）に従って命令を復号する。各命令は特定のビット数を有し、ＩＳＡはこれらのビットをどのように解釈すべきかを定義する。一般に、処理パイプライン４によってサポートされる多種多様な異なる処理演算が存在し得る。理解を容易にするために、以下の例は、例えば加算、減算（ＳＵＢ）、ＡＮＤ、ＯＲ、乗算（ＭＵＬ）、除算（ＤＩＶ）、ビット反転（ＢＩＴＲＥＶ、所与の値の全ビットを反転させる演算、例えば０００１のビットを反転させると１０００がもたらされる）、先行ゼロカウント（ＣＬＺ、例えば、値００１１の先行ゼロカウントは２である）などの、演算の限られたサブセットに焦点を当てる。実際には、ほとんどのＩＳＡは、スタックまたは同様のデータ構造からデータをプッシュまたはポップするためのシフト、プッシュまたはポップ動作、ロードまたはストア命令、分岐命令などの他のタイプの動作を定義することが理解されよう。以下の例は、簡潔にするために簡略化されている。また、以下の例では、アーキテクチャが、命令に応答してアクセス可能な１６個のアーキテクチャレジスタを定義すると仮定している。他のアーキテクチャは、例えば３２などの他の数のレジスタを定義することができることは理解されよう。これは、ハードウェアに設けられた物理レジスタ１４の数を制限するものではないことに留意されたい。レジスタリネーミングがサポートされている場合、物理レジスタファイルは、アーキテクチャで定義されたアーキテクチャレジスタが存在するよりも多数の物理レジスタを有する場合がある。
【００５４】
図２の例に示すように、上述の動作のサブセットは、１５ビットを使用して表すことができ、４ビットが、命令の結果が書き込まれる宛先アーキテクチャレジスタＲｄを表し、３ビットが実行されるべき演算のタイプを識別する命令オペコードＯＰＣを表し、４ビットが、第１のソースアーキテクチャレジスタＲｘを表し、４ビットが、第２のソースアーキテクチャレジスタＲｙを表す。ＡＤＤ、ＳＵＢ、ＡＮＤ、ＯＲ、ＭＵＬおよびＤＩＶ命令はすべて、ソースレジスタＲｘおよびＲｙの両方を必要とし、レジスタＲｘ、Ｒｙに記憶されたオペランドに対して対応する処理演算を実行するように処理パイプライン４を制御する２ソース命令であり、結果はアーキテクチャレジスタＲｄに書き込まれる。ＢＩＴＲＥＶおよびＣＬＺ命令は、１つのソースレジスタＲｘしか必要とせず、この場合、Ｒｙに対応するビットフィールドは無視される。図２に示す１５個の命令ビットは、符号化空間全体の一部分のみを表し得ることが理解されよう。例えば、命令は１５ビットよりも多いビットを有してもよく、この場合、命令の他のビットのいくつかは、図２に示す１５ビットを図２の符号化に示すように解釈すべきか、または、シフトまたはロード／ストア命令などの他の命令に対して何らかの他の様式で解釈すべきかを指定することができる。
【００５５】
アーキテクチャレジスタは１６個あり、ソースレジスタおよび宛先レジスタＲｘ、Ｒｙ、Ｒｄは各々４ビットで表されているため、ソースレジスタおよび宛先レジスタの各々のいずれとしてアーキテクチャレジスタを使用するかは自由に選択できる。しかしながら、例えば、ＡＤＤ命令は、所与のアーキテクチャレジスタ対（例えば、Ｒ１およびＲ２）に適用されるとき、Ｒ１およびＲ２のいずれが第１のソースオペランドＲｘとして指定され、いずれが第２のソースオペランドＲｙとして指定されるかにかかわらず同じ結果を与えることになるため、この方式はある程度の冗長性を含む。同様に、ＡＮＤ、ＯＲおよびＭＵＬ命令は、ソースオペランドＲｘおよびＲｙの順序を逆にしても結果が変化しない可換的命令である。
【００５６】
対照的に、図３は、図３の左側部分に示された第１のクラスの命令について、第１のソースアーキテクチャレジスタＲｘおよび第２のソースアーキテクチャレジスタＲｙが、ＲｘをＲｙよりも大きくなるように制約する符号化を使用して表される、上述した演算のサブセットを表す代替的な符号化を示す。宛先アーキテクチャレジスタＲｄおよびオペコードＯＰＣは、依然としてそれぞれ４ビットおよび３ビットのフィールドを使用して表される。
【００５７】
図３の第１のクラスの命令では、２つのソースアーキテクチャレジスタＲｘ、Ｒｙが、図２の８ビットではなく７ビットをともに含む２つのフィールドＡ、Ｂを使用して表される。ＲｘおよびＲｙに基づいてフィールドＡおよびＢを符号化する２つの例が、図４Ａおよび図４Ｂに関して以下に説明されるが、一般に、以下に説明するようなＲｘ＞Ｒｙである符号化方式によってＲｘ、Ｒｙを再符号化することによって、１ビットが節約され、いくつかの機能が犠牲になる。レジスタは、それ自体に加算することはできず、または、それ自体を乗算することはできない。また、ＤＩＶまたはＳＵＢのすべての固有の事例を１つのオペコードで符号化することはできない。ＡＤＤの失われた機能は、依然としてシフトによって実行することができる（１ビット位置だけオペランドを左シフトすることは、オペランドをそれ自体に加算することと等価である）。
【００５８】
Ｒｘ／Ｒｙコード化方式は、この例では、Ａ、Ｂフィールドのための８つの未使用コードポイントを有する。これらは、図３の右側部分に第２のクラスの命令として示される、単一入力オペレーションのための別個のオペコード空間をシグナリングするために使用される。単一の未処理のソースレジスタを完全に指定するためには１つの追加ビットが必要であり、このビットＳはオペコード符号化から得られ、単一入力演算のための２ビットオペコード空間、および、２入力演算のための別個の３ビットオペコード空間が残る。ＢＩＴＲＥＶおよびＣＬＺは、この単一入力オペコード空間内に、その単一入力を２乗するＭＵＬの変形とともに配置される。これにより、２入力オペコード空間内に２つのスロットが開き、これらは、ＳＵＢおよびＤＩＶの逆転した変形によって使用され、それによって、これらの演算のＲｘ＞ＲｙとＲｘ＜Ｒｙの両方のオペランドの事例を符号化することができる。
【００５９】
より現実的な実施態様では、オペコードのリストはより長くなる可能性が高く、どのように事を運ぶかにより大きな柔軟性をもたらす。それはシフトを含む場合があり、その場合にはこれらの逆のバージョンも必要となり、これは命令のレジスタによってシフトされた定数の形式の可能性を示唆している。レジスタオペランドを即値定数によって指定される複数のビットだけシフトすることをサポートするシフト命令がサポートされている場合、命令の逆の形式は、レジスタオペランドによって指定される複数のビット位置だけ即値定数をシフトすることができ、これは例えばマスク生成に有用であり得る。
【００６０】
図３は、１６個のアーキテクチャレジスタが存在する例を示しているが、より一般的には２Ｎ個のレジスタがある場合、Ｒｘ＞Ｒｙを制約することは、２Ｎ−１個の未使用値を残して２Ｎ−１ビットにおいて符号化することができる、ＲｘとＲｙとの２Ｎ２Ｎ−１／２個の有効な組み合わせが存在することを意味する。ここで提案されるコード化方式によって、これらの未使用値を使用して別個の１入力オペランド空間をシグナリングすることができるが、代替的に、ＡフィールドおよびＢフィールドのスペア符号化を使用する第２のクラスの命令を使用して他のタイプの演算が表されてもよい。追加の逆オペランドオペコードの数が十分に少ない場合、オペコードフィールドをより大きくする必要はなく、全体的な符号化方式はナイーブ方式より１ビット小さくなる。しかし、一般的に、非可換的演算のために逆オペコードを追加した後、オペコードフィールドは１ビット増加し、何も節約されないことが判明するかもしれないが、この場合の利点は、未使用のオペコードスペースが統合されることであり、復号が単純化され、将来の拡張が複雑にならないようにされる。
【００６１】
図４Ａおよび図４Ｂは、図３に示す命令符号化のＡフィールドおよびＢフィールドの２つの例示的な符号化を示す。図４Ａにおいて、Ｘが常にＹより大きい２つのＮビットアーキテクチャレジスタ指定子Ｒｘ、Ｒｙは、以下のように符号化される。
２つのソースレジスタＲｘ、Ｒｙを必要とする２入力動作の場合、
Ａ＝ｘ  ＥＯＲ  Ｒｅｐｌｉｃａｔｅ（ｙ＜Ｎ−１＞）；
Ｂ＝ｘ＜Ｎ−２：０＞ＥＯＲ  ｙ＜Ｎ−２：０＞；
ｉｎｓｔｒｕｃｔｉｏｎ＝ｂｉｎａｒｙ＿ｏｐｃｏｄｅ：Ｂ：Ａ：ｄ；
１入力演算のために単一のソースレジスタＲｘを符号化するには、
Ａ＝ｘ  ＥＯＲ  Ｒｅｐｌｉｃａｔｅ（ｘ＜Ｎ−１＞）；
Ｂ＝０；
Ｓ＝ｘ＜Ｎ−１＞；ｉｎｓｔｒｕｃｔｉｏｎ＝ｕｎａｒｙ＿ｏｐｃｏｄｅ：Ｓ：Ｂ：Ａ：ｄ；
この記法において、
・ｖ＜ｂ＞は値ｖのビットｂを意味する。例えば、ｙ＜Ｎ−１＞は値ｙからのビットＮ−１を参照する。
・ｖ＜ｂ：ａ＞は、値ｖのビットの範囲ａ〜ｂを意味し（ｂは慣例的にａより大きい）、ｘ＜Ｎ−２：０＞は、値ｘのビット０〜Ｎ−２を意味する。
・ＥＯＲは排他的論理和（ＸＯＲ）を意味する。
・Ｒｅｐｌｉｃａｔｅ（）は、カッコ（）内の引数のビットを繰り返すことによって形成される全幅の値を意味する。したがって、Ｒｅｐｌｉｃａｔｅ（ｙ＜Ｎ−１＞）は、ｙのビットＮ−１（ｙの最上位ビット）にすべて等しいＮビットを含む。実効的には、ｙの最上位ビットが１の場合、Ａ＝ｘであり、ｙの最上位ビットが０の場合、Ａ＝ｉｎｖｅｒｔ（ｘ）である。
・コロン（：）は連結を示し、最上位ビットが最初に表示される。したがって、ｂｉｎａｒｙ＿ｏｐｃｏｄｅが１０１、Ｂが００、Ａが１０、ｄが１００１の場合、ｂｉｎａｒｙ＿ｏｐｃｏｄｅ：Ｂ：Ａ：ｄの結果は１０１００１０１００１になる。
【００６２】
図４Ａは、この符号化を使用する場合のＲｘおよびＲｙの各ペアリングについて、ＡおよびＢの可能な値を示す。Ｒｙ＞Ｒｘであり、十字で表示されたエントリはＲｘ＝Ｒｙであるために無効であるため、表の濃い色のエントリで示されたＲｘとＲｙとの組み合わせは無効であることに留意されたい。表の対称性から、ＲｘをＲｙよりも大きくなるように制約することにより、可能な組み合わせの数が総数の半分未満だけに減ることが分かり、これが１ビットを節約することができる理由である。また、図４ａの下部に示されているように、１入力演算に再利用できるいくつかのスペア符号化がある。この例では、スペア符号化はＢ＝０００およびＡ＝０？？？である（？は０または１のいずれかであり、これらのビットは追加のオペコードビットＳとともに、ＢＩＴＲＥＶ、ＣＲＺまたは２乗ＭＵＬ命令などの単一入力演算の１つについて単一のソースレジスタＲｘを識別する）。
【００６３】
ＡおよびＢ値を生成するために所与のアーキテクチャレジスタ指定子対を符号化することは、図１の装置２自体によって実行されるのではなく、ソースコードまたはコンパイルされたコードに基づいて実行されるべき命令を生成するときにコンパイラまたはアセンブラによって実行されることに留意されたい。
【００６４】
アーキテクチャレジスタ指定子Ｒｘ、Ｒｙを識別するためにＡおよびＢフィールドを復号するための復号回路が、パイプライン２のある点に設けられる。レジスタ復号は、任意のステージ（例えば、レジスタリネーミング）に配置することができるが、アーキテクチャレジスタ番号が早期に識別されるほど、より早期のハザード検出を実行することができる。したがって、復号ステージ１０においてレジスタ復号が行われることが望ましい場合がある。
【００６５】
図５は、命令を復号するための復号ステージ１０の一部の例を示す。図５に示すように、復号ステージは、オペコード復号器４０およびレジスタ復号器４２を含むことができる。宛先レジスタ指定子Ｒｄは、命令符号化において明示的に識別されるため、変更されずに復号ステージ１０を通過する。レジスタ復号器４２は、命令のＡおよびＢフィールドを追加のオペコードビットＳとともに受信し、これらを復号して第１のソースアーキテクチャレジスタＲｘおよび第２のソースアーキテクチャレジスタＲｙを識別する。レジスタ復号器４２はまた、現在の命令が単一入力命令（第２のクラスの命令）の１つであるか否かをＡフィールドおよびＢフィールドから識別し、オペコード復号器４０にこれが当てはまるか否かの指示を提供する。オペコード復号器４０は、命令が第１の命令クラスまたは第２の命令クラスのうちの１つであるかに従って命令のオペコードを復号し、復号された命令を識別する所与の数のビットを出力する。復号された命令は、命令を適切に処理するためにパイプラインの後続のステージを制御するために必要な任意の数のビットを含むことができ、例えば、実行ステージ８０内のいくつかの機能ユニットのいずれが命令を処理すべきかの選択についてシグナリングする。
【００６６】
図４Ａに示す符号化が使用されるとき、レジスタ復号器４２は、以下の演算を使用して、ＡおよびＢフィールドならびに追加のオペコードビットＳを復号することができる。
ｂｏｏｌｅａｎ  ｂｉｎａｒｙ＝（Ｂ：Ａ＜Ｎ−１＞！＝Ｒｅｐｌｉｃａｔｅ（’０’））；
ｂｉｔｓ（Ｎ−１）ｔｍｐ＿ｙ＝Ｂ  ＥＯＲ  Ａ＜Ｎ−２：０＞；
ｂｏｏｌｅａｎ  ｆｌｉｐ＝（’０’：ｔｍｐ＿ｙ：Ｓ＞Ａ：’０’）；
ｂｉｔｓ（Ｎ）ｍａｓｋ＝ｆｌｉｐ？Ｒｅｐｌｉｃａｔｅ（’１’，Ｎ）：Ｒｅｐｌｉｃａｔｅ（’０’，Ｎ）；
ｂｉｔｓ（Ｎ）ｘ＝Ａ  ＥＯＲ  ｍａｓｋ；
ｂｉｔｓ（Ｎ）ｙ＝’０’：ｔｍｐ＿ｙ  ＥＯＲ  ｍａｓｋ；
「ｂｉｎａｒｙ」フラグは、オペコードがバイナリオペコード（第１のクラスの演算）または単項オペコード（第２のクラスの演算）として解釈されるべきであるかをオペコード復号器４０にシグナリングするために使用され得る。
これは、比較的複雑な一連の演算のように見え得るが、回路内でこれを判定する論理は、実際には上記の式によって暗示されるよりも単純である。Ａおよびｔｍｐ＿ｙの値が反転されるか否かに影響を与える値「ｆｌｉｐ」を決定するために、Ａのいずれのビットが、ＡがＡ  ＸＯＲ  Ｂより大きいか否かを決定するのを選択するために、Ｂの第１の非ゼロスキャンを使用することができる。図６Ａは、Ｒｘ、Ｒｙを識別するためにＡおよびＢを復号する回路の例を示す。回路は、Ｂのそれぞれのビットと、Ａの対応するビットとの排他的論理和をとる一連の排他的ＯＲゲート５０を含む（すなわち、これらのゲート５０は、実効的に、上記の式において「ｔｍｐ＿ｙ」の値を決定する）。この回路はまた、その出力がＯＲゲート５４によって結合された一連のＮＯＲゲート５２を含む。ＯＲゲート５４の出力は、上に示したパラメータ「ｆｌｉｐ」を表す。ＮＯＲゲート５２−０は、追加のオペコードビットＳの反転バージョン、Ｂフィールドの３ビット、およびＡフィールドの最上位ビットを入力として受信し、その出力は、Ｓ＝１、Ｂ＝０００かつＡの最上位ビットが０である場合のみ、１になる。ＮＯＲゲート５２−１は、Ｂの上位２ビット、Ａの最上位ビット、Ｂの最下位ビットの反転バージョンおよびＡの最下位ビットを入力として受信し、その出力は、Ｂ＝００１かつＡ＝０？０（ここでも、？によって表されるすべてのビットは０または１のいずれかになり得る）である場合に１になる。ＮＯＲゲート５２−２は、Ｂの最上位ビット、Ａの最上位ビット、Ｂの最上位から２番目のビットの反転バージョンおよびＡの最下位から２番目のビットを入力として受信し、その出力はＢ＝０１？かつＡ＝０？０？である場合に１になる。最後に、ＮＯＲゲート５２−３は、Ａの最上位から２ビット、および、Ｂの最上位ビットの反転バージョンを入力として受信し、その出力はＢ＝１？？かつＡ＝００？？である場合に１になる。いずれかのＮＯＲゲート５２が１を出力する場合、ＯＲゲート５４によって生成されるものとして「ｆｌｉｐ」＝１となる。「ｆｌｉｐ」が１に等しいとき、Ａフィールドは、ＸＯＲゲート５６を使用して反転されて、第１のソースレジスタ指定子Ｒｘが生成される。また、「ｆｌｉｐ」が１に等しいとき、Ｒｙの最上位ビットは１であり、Ｒｙの他の３ビットは、ＸＯＲゲート５０によって生成されるものとしてのｔｍｐ＿ｙの対応するビットの出力を反転するＸＯＲビット５８によって形成される。代替的に、「ｆｌｉｐ」が０に等しいとき、Ｒｘ＝Ａ、Ｒｙの最上位ビット＝０であり、Ｒｙの残りのビットはＢの対応するビットに等しい。
【００６７】
図６Ｂは、復号論理の第２の例を示す。この例では、追加のＸＯＲゲート５５が、ＯＲゲート５４とＸＯＲゲート５６，５８との間の経路上に設けられている。ＸＯＲゲート５５は、その第２の入力として、オペコードの選択されたビット（例えば、最下位ビット）を受信する。このような復号論理によって、オペコードは、オペコード番号によるすべての第２のオペコードが、Ｒｘ＞Ｒｙ条件を反転させて実質的にＲｘ＜Ｒｙとなるようにするという特性を有し（ＸＯＲゲート５５は実効的に、最終的なＲｘ、Ｒｙ結果のすべてのビットを反転させるため）、これにより、２つの異なるオペコードスロットに単一の非可換的演算を割り当てることが可能になり、それによって、すべてのオペランドの順序が可能になる。ゲート５５によって反転が適用される反転された非可換的命令のうちの１つのＲｘ、Ｒｙの所与の値を符号化する場合、Ｒｘ、Ｒｙへの対応する反転は、ＲｘおよびＲｙの正確な値が返されることを確実にするために、上記に示した符号化プロセスを適用する前に実行されるべきである。したがって、同じ非可換的演算に対応するが、異なるオペランド順序を有する相補命令の対は、実効的に、１ビットだけ異なるオペコードによって表され、１つの追加のゲート５５のみを使用した比較的単純な復号が可能となる。一方、可換的演算の場合、１つのオペコードスロットのみが割り当てられ、１ビットだけが異なる、隣接するオペコードの対が、まったく異なる可換的演算に対応する。図６Ｂでは、図６ＡのＮＯＲゲート５２−０は簡潔にするため省略されているが（例えば、これは１入力演算のためにＡ、Ｂのスペア符号化空間を再使用しない例であり得る）、他の例では、ＮＯＲゲート５２−０を設けることもできる。
【００６８】
図４Ｂは、使用可能なＡおよびＢフィールドの第２の符号化例を示す。ここでも、ＲｘはＲｙよりも大きくなるように制約される。この場合、０〜２Ｎ−１の範囲の所与の値Ｒｘ、ＲｙおよびＲｘ＞Ｒｙ、ＡおよびＢが以下のように符号化されるという制約について、
ｉｆ（ｙ＞＝２Ｎ−１）ｔｈｅｎ
Ａ＝ｘ  ＥＯＲ（２Ｎ−１）／／（２Ｎ−１はすべて１であるＮ−１ビットを有する値）
Ｂ＝ｙ  ＥＯＲ（２Ｎ−１）
ｅｌｓｅ
Ａ＝ｘ
Ｂ＝ｙ
ｅｎｄｉｆ
Ｒｙのこの制約された値のために、Ｂは常に２Ｎ−１より小さくなるため、１ビットを削除することができることが観察され得る。
【００６９】
図４Ｂは、この符号化方式によって利用可能な異なる符号化を示す表である。ここでもいくつかのスペア符号化があるが、今回は、これらは、Ａの最上位ビットがゼロであり、Ａの残りのビットがＢの対応するビットと等しい値である。したがって、スペア符号化は図４Ａのものと異なるが、これは依然として、レジスタフィールドＡ、Ｂの特定の値によって第１のクラスと区別される、オペコードの異なる解釈を使用して別個の第２のクラスの命令が定義されることを可能にする。これらのスペア符号化のために、図３に示す単一ソースレジスタＲｘは（Ａの下位３ビットと同一である）Ｂの３ビットおよび追加のオペコードビットＳを使用して識別され、その単一のレジスタＲｘを使用して実行されるべき演算は、オペコードフィールドの残りの２ビットによって識別される。
【００７０】
図４Ｂに示された方法で符号化された場合、第１のクラスの命令のＡおよびＢを復号するために、以下の論理を使用することができる。
ｉｆ（Ｂ＞＝Ａ）ｔｈｅｎ
ｘ＝Ａ  ＥＯＲ（２Ｎ−１）
ｙ＝Ｂ  ＥＯＲ（２Ｎ−１）
ｅｌｓｅ
ｘ＝Ａ
ｙ＝Ｂ
ｅｎｄｉｆ
この手法では、Ｂ＞＝Ａであるか否かを判定するためにＢとＡとのデジタル比較がいくつかのＸＮＯＲゲートを必要とするため、わずかにより深い復号論理が必要になる場合がある。第２のクラスの命令について、比較器は、Ａの下位３ビットがＢの対応するビットに等しいか否かを判定することができ、そうである場合、ＲｘはＳおよびＢからいかなる復号もせずに直接決定することができる。
【００７１】
Ｒｘ＞ＲｙであるＲｘおよびＲｙの特定の組み合わせの、ＡフィールドおよびＢフィールドの潜在的な値に対する、他のより恣意的なマッピングを選択することができる。一般に、いずれの特定のレジスタ対がＡフィールドおよびＢフィールドの各異なる符号化によって表されるかは重要ではないが、図４Ａおよび図４Ｂに示す例は、必要とされる復号論理の量を低減するのに特に有利であり、図４Ａは、図６に示すように比較的浅い論理を必要とし、スペア符号化を、Ｂが０００であり、Ａの最上位ビットも０である符号化空間の共通部分に統合するため、特に効率的である。
【００７２】
図７は、命令を処理する方法を示す。ステップ１００において、復号器は、現在の命令が第１の命令クラスのものであるか否かを判定する（例えば、Ａ、Ｂがスペア符号化の１つを有していない場合）。命令が第１のクラスのものである場合、ステップ１０２において、レジスタフィールドＡおよびＢが復号されて、Ｒｘ＞Ｒｙである、命令に使用されるアーキテクチャレジスタ番号Ｒｘ、Ｒｙが決定される。ステップ１０４において、復号ステージ１０が命令のオペコードを復号する。ステップ１０６において、パイプラインの後続のステージは、識別されたアーキテクチャレジスタＲｘおよびＲｙに対応するレジスタを使用して命令を処理する。これらは、リネームステージ１２によって再マッピングされたものと異なる物理レジスタ番号を有する物理レジスタであってもよいことに留意されたい。Ｒｘ＞Ｒｙであるが、物理レジスタが使用される制約はない。
【００７３】
一方、命令が第１の命令クラスのものでない場合、ステップ１１０において、その命令が第２の命令クラスのものであるか否かが判定される。そうでない場合、命令は何らかの他の方法で処理される。命令が第２のクラスのものであるか否かを判定するために、これは、ＡおよびＢフィールドが上記のスペア符号化の１つを有するか否かから識別することができる。命令が第２のクラスのものである場合、ステップ１１２において、追加のオペコードビットＳならびにＡフィールドおよびＢフィールドのビットのサブセット（例えば、Ａフィールドの下位３ビット）が復号されて、単一のソースレジスタのアーキテクチャレジスタ番号Ｒｘが決定される。ステップ１１４において、命令のオペコードは、単項オペコード復号方式に従って復号される。ステップ１１６において、後続のパイプラインステージが、アーキテクチャレジスタ番号Ｒｘに対応する単一のレジスタを使用してオペコードによって表されるタイプの動作を実行するための命令を処理する。
【００７４】
上記の例では、表されているレジスタＲｘ、Ｒｙは、対応する処理演算のためのソースオペランドを含むソースレジスタである。しかし、この符号化方式を宛先レジスタまたは他のタイプのレジスタを符号化するために使用することも可能である。例えば、いくつかの命令は、開始レジスタから開始して終了レジスタで終了するアーキテクチャレジスタのリストを識別し、開始レジスタと終了レジスタとの間のアーキテクチャ番号を有するアーキテクチャレジスタの連続ブロックを使用して所与の動作を実行するように処理回路を制御する。例えば、ｌｏａｄ  ｍｕｌｔｉｐｌｅ命令は、いくつかのアドレスからアーキテクチャレジスタ番号の連続ブロックに対応するレジスタにデータ値をロードすることができ、または、ｓｔｏｒｅ  ｍｕｌｔｉｐｌｅ命令は、指定レジスタからメモリ内の対応アドレスにデータを記憶することができる。また、いくつかのスタック命令（プッシュまたはポップ命令）は、ある範囲のレジスタからスタックにデータを保存し、または、スタックからレジスタにデータを復元することができる。この場合、レジスタのリストを定義する開始および終了アーキテクチャレジスタも、上に示したものと同様の方式を使用して符号化することができる。第２のクラスの命令が第１のクラスのレジスタフィールドのスペア符号化のいくつかを用いて表される、第１のクラスの命令および第２のクラスの命令の定義は、そのようなリストベースの命令にも有用である。なぜなら、第１のクラスが複数のレジスタからなるリストを与え、第２のクラスが単一のレジスタのみを与える場合、リストの要素間の異なる潜在的な相互作用を記述するために、第１のクラスの演算が第２のクラスよりも多くのオペコードを利用できることが有用であり得るためである。
【００７５】
図８は、レジスタ符号化Ｒｘ、Ｒｙの冗長性の利用の代替的な例を示す。この例では、命令は、命令内で明示的に識別されるＲｘおよびＲｙ、ならびに、ＲｘおよびＲｙの許容される任意の組み合わせによって符号化され得る。例えば、これは図２に示す符号化を使用することができる。しかしながら、図８に示すように、復号ステージ１０は、ＲｘとＲｙを比較し、ＲｘおよびＲｙのいずれが大きいかを示すためにオペコード復号器１５４に提供される比較結果信号１５２を生成するレジスタ比較器１５０を含むことができる。オペコード復号器１５４は、ＲｘおよびＲｙのいずれが大きいかに応じて、同じオペコードから異なる復号された命令１５６が生成されるように、信号１５２によって示される比較結果に応じて異なる方法で命令のオペコードを復号することができる。本質的に、ＲｘおよびＲｙの相対順序付けは、オペコードを補完することができる少なくとも１ビットの追加情報を提供し、それによって、オペコードフィールド自体を１ビット小さくすることができ、またはより多くの異なる演算を、オペコードの所与の数のビットを使用してサポートすることができる。場合によっては、比較信号１５２からの追加情報は、オペコードの拡張ではなく、別個のフラグと考えることができることに留意されたい。
【００７６】
これは様々な方法で使用することができる。場合によっては、命令のＲｘ＞ＲｙおよびＲｘ＜Ｒｙの形式で表される演算は、基本的には同じタイプの演算に対応し得るが、演算は比較結果に基づいて何らかの形で変更される。この一例は、結果に影響を与える、算術演算（例えば、乗算）命令のための「絶対値」修飾子を導出することである。この場合、Ｒｘ＜Ｒｙは「結果の正の絶対値をとらない」ことを意味し、Ｒｘ＞Ｒｙの場合は「絶対値をとる」ことを意味する。Ｒｘ＝＝Ｒｙの場合は、それ自体と乗算された数はいずれにしても正であり、絶対値フラグが必要ないため、「とらない」の場合のみに入る。このとき、Ｒｘ＜＝Ｒｙの場合は「絶対値」フラグを明らかであるとしてだけ定義することができ、Ｒｘ＞Ｒｙの場合はフラグを設定することができる。したがって、ＲｘおよびＲｙの相対的な順序付けを使用することによって、命令内の絶対値フラグを符号化する必要はない。
【００７７】
代替的に、Ｒｘ＞ＲｙかつＲｘ＜Ｒｙのときに実行される演算は完全に異なってもよい。一般に、演算フィールドから１ビットがとられる場合、これはＲｘとＲｙレジスタの順序付けによって補完することができ、それによってオペコードフィールドを解釈するための本質的に３つの異なる技法、すなわち、Ｒｘ＞Ｒｙに対するオペコードセット０、Ｒｘ＜Ｒｙに対するオペコードセット１、Ｒｘ＝Ｒｙに対するオペコードセット２が存在する（セット２は、上で説明したタイプへの単一入力オペコードである）。この手法は、より深い試験論理を必要とすることがあるが（比較器１５０によって提供される比較は、ＲｘがＲｙよりも大きくなるように制約する符号化について示された図６の回路より多くの回路を必要とし得るため）、レジスタオペランドが見えるようになる前に復号は必要なく、そのため、これは、パイプラインのオペランド転送論理をより早期にアクティブにするのに役立ち得、異なる命令間の危険をより早期に検出することを可能にすることができるという利点がある。いずれの特定の演算が単一のオペコード符号化に結合されるかは、命令セット設計者が任意に選択することができる。
【００７８】
例えば、ＡＮＤ、ＯＲ、およびＭＯＶ演算を１つのオペコードポイントに結合することができる。ＲｘがＲｙより小さい場合、オペコードがＡＮＤ演算として扱われ、Ｒｘ  ＡＮＤ  Ｒｙが返される。ＲｘがＲｙより大きい場合、オペコードがＯＲ演算として扱われ、Ｒｘ  ＯＲ  Ｒｙが返される。ＲｘおよびＲｙが等しい場合、いずれの場合も結果はＭＯＶ演算と等価なため、実際にはいずれを行うかは重要でなく、そのため、この事例はＭＯＶと呼ばれる。次に、少なくとも半数がＲｘ＝＝Ｒｙのケースを処理する必要がないすべての可換的演算を行うことができ、それらを対にして、共有されるオペコード番号にする。例えば、ＳＵＢは引数をどちらの順序でも受け入れる必要があるのでＡＤＤとＳＵＢは対にすることはできないが、Ｒｘ＋ＲｘはＲｘ＊２を与え、Ｒｘ  ＥＯＲ  Ｒｘはゼロを与えるため、ＡＤＤとＥＯＲは対にすることができ、ＥＯＲ（例えばＲｘ−Ｒｘ）を使用せずに０の結果を得る他の方法が存在し、そのため、そのような事例を扱う必要はない（Ｒｘ＊２はまた、１桁分の左シフトに等価であるため、冗長であり得る）。
【００７９】
図９は、図８に示す手法を使用することができる命令の別の例を示す。図９は、アーキテクチャレジスタＲｘおよびＲｙの２つのソースオペランドにいずれの比較条件を適用するかを条件フィールド（ｃｏｎｄ）が識別する比較命令を示す。これは可換的ではないが、オペランドの順序を変更し、等価な演算を得るための演算を変更することができる。
【００８０】
仮説的なＣＭＰ命令がある場合、ＲｘおよびＲｙの２つの入力を比較することができる６つの基本的な方法がある、すなわち、より小さい（＜）、より大きい（＞）、以下（＜＝）、以上（＞＝）、等しい（＝＝）、および不等（！＝）。これらの６つの演算は、符号化のための３ビットに加えて、２つのレジスタインデックスＲｘおよびＲｙのビットを必要とし、総ビットカウントは（Ｎｘ＋Ｎｙ＋３）になり、ここでＮｘおよびＮｙはそれぞれＲｘおよびＲｙを指定するのに使用されるビット数である。可換性および等価性を使用することによって、これらをより効率的に符号化することができる。
【００８１】
（Ｎｘ＋Ｎｙ）ビットによって符号化されたＲｘおよびＲｙの自由な選択があると仮定する。実際には、演算には６つではなく、３つの選択肢のみが必要である。
ＣＭＰ（Ｒｘ＜Ｒｙ）はＣＭＰ（Ｒｘ＞＝Ｒｙ）と等価であるため、これらの２つの命令のうちの１つだけを符号化すればよい。
ＣＭＰ（Ｒｘ＜＝Ｒｙ）はＣＭＰ（Ｒｘ＞Ｒｙ）と等価であるため、ここでもまた１つの選択肢だけを符号化することができる。
ＣＭＰ（Ｒｘ＝＝Ｒｙ）とＣＭＰ（Ｒｘ！＝Ｒｙ）とは可換的であるため、これら両方を１つの演算値によって符号化することができ、Ｒｘ＜ＲｙかＲｘ＞Ｒｙかに基づいて正しい演算を選択することができる。
【００８２】
しかし、この最後の事例では、Ｒｘ＝＝Ｒｙの場合、等価演算と不等価演算を区別することができない。しかし、これらは些細な事例であるため、ここでもそれらを、同じ答えを返す他の演算に変換することができる。そのため、
ＣＭＰ（Ｒｘ＝＝Ｒｘ）はＣＭＰ（Ｒｘ＜＝Ｒｘ）と同じように常に真であるため、代わりにＣＭＰ（Ｒｘ＜＝Ｒｘ）を符号化する。
ＣＭＰ（Ｒｘ！＝Ｒｘ）はＣＭＰ（Ｒｘ＜＝Ｒｘ）と同じように常に偽であるため、代わりにＣＭＰ（Ｒｘ＜＝Ｒｘ）を符号化する。
これらの組み合わせにより、比較演算を符号化するために２ビットのみを使用することが可能になり、合計で（Ｎｘ＋Ｎｙ＋２）ビットになる。
【００８３】
このような比較命令について、レジスタ指定子Ｒｘ、Ｒｙを比較していずれのタイプの比較条件が使用されているかを識別する比較と、選択された比較条件に従ってレジスタに記憶されている実際のデータ値を比較する、パイプライン内で後に実施されるもう１つの比較との、２つの別個の比較が行われることに留意されたい。
【００８４】
図１０は、第２の例を用いて符号化された命令を処理する方法を示す。ステップ２００において、命令が受信され、レジスタフィールドＲｘおよびＲｙがレジスタ比較器１５０によって比較される。ＲｘがＲｙよりも大きい場合、ステップ２０２において、オペコード復号器１５４は、アーキテクチャレジスタＲｘおよびＲｙに対応するレジスタを使用して、第１のタイプの処理演算を実行するように後続のパイプラインステージを制御するように復号された命令１５６を生成する。一方、ＲｘがＲｙよりも小さい場合、ステップ２０４において、オペコード復号器１５４はオペコードを復号して、ＲｘおよびＲｙに対応するレジスタを使用して第２のタイプの処理演算を実施するようにパイプラインの残りの部分を制御する復号された命令１５６を生成する。この第２のタイプの処理演算は、第１のタイプの処理演算と同じであってもよいが、（結果の絶対値をとるなどの）何らかの方法で変更されてもよく、または、まったく異なる演算であってもよい。Ｒｘ＝Ｒｙの場合、復号器はステップ２０２または２０４のいずれかに進み、第１のタイプの処理演算または第２のタイプの処理演算のいずれかを実行するように処理パイプラインを制御するか、またはステップ２０６において、Ｒｘに対応する単一のレジスタを使用して実施される第３のタイプの処理演算に対応する復号された命令を生成することができる。別の代替案は、Ｒｘ＝Ｒｙ符号化についての何らかの命令が無効であることであり、それによってこの場合、復号された命令は生成されず、未定義の命令例外がシグナリングされ得る。Ｒｘ＝Ｒｙについてとられる手法は、オペコードごとに異なってもよい。
【００８５】
代替的に、いくつかの命令について、Ｒｘ＞ＲｙまたはＲｘ＜Ｒｙのときに第１のタイプの演算が選択されてもよく、Ｒｘ＝Ｒｙのときに第２のタイプの演算が選択されてもよい。例えば、減算命令は、Ｒｘ＞ＲｙまたはＲｘ＜Ｒｙのいずれかに応じて異なる結果を生成するが、Ｒｘ＝Ｒｙのときの結果は常に０であり、他の演算によって生成することができ、そのため、Ｒｘ＝ＲｙのＳＵＢオペコードの符号化は、別の演算、例えば単一入力オペランドのために再使用することができる。同様の手法は、Ｒｘ＝Ｒｙのときの結果が重要でない他の非可換的演算、例えばＢＩＣ、ＤＩＶ、ＯＲＮなどに対してもとることができる。
【００８６】
図１１は、使用することができる仮想マシンの実施態様を示す。前述の実施形態は、関連技術をサポートする特定の処理ハードウェアを動作させるための装置および方法に関して本発明を実施するが、ハードウェア装置のいわゆる仮想マシン実施態様を提供することも可能である。これらの仮想マシン実施態様は、一般的に仮想マシンプログラム３１０をサポートするホストオペレーティングシステム３２０を実行するホストプロセッサ３３０上で実行される。通常、大規模で強力なプロセッサは、妥当な速度で実行する仮想マシンの実装を可能にする必要があるが、そのような手法は、互換性または再利用の理由のために別のプロセッサに対してネイティブなコードを実行したいという要望がある場合などの特定の状況において正当化され得る。仮想マシンプログラム３１０は、実際のハードウェアデバイスによるプログラムの実行によって与えられるのと同じ結果を与えるために、アプリケーションプログラム（またはオペレーティングシステム）３００を実行することができる。したがって、上述したメモリアクセスの制御を含むプログラム命令は、仮想マシンプログラム３１０を使用してアプリケーションプログラム３００内から実行することができる。
【００８７】
本出願において、「〜ように構成されている」という用語は、装置の要素が定義された動作を実行することができる構成を有することを意味するために使用される。この文脈において、「構成」は、ハードウェアまたはソフトウェアの相互接続の配置または方法を意味する。例えば、装置は、規定の動作を提供する専用のハードウェアを有することができ、またはプロセッサもしくは他の処理装置が機能を実行するようにプログラムされてもよい。「〜ように構成されている」は、規定の動作を提供するために装置要素を何らかの方法で変更する必要があることを意味しない。
【００８８】
添付図面を参照して本発明の例示的な実施形態を詳細に説明したが、本発明はこれらの厳密な実施形態に限定されず、添付の特許請求の範囲によって規定される本発明の範囲および精神から逸脱することなく、様々な変更および修正が当業者によって実施され得ることが理解されるべきである。
【図１】
2019503010.tif 000003
【図２】
2019503010.tif 000004
【図３】
2019503010.tif 000005
【図４Ａ−１】
2019503010.tif 000006
【図４Ａ−２】
2019503010.tif 000007
【図４Ｂ−１】
2019503010.tif 000008
【図４Ｂ−２】
2019503010.tif 000009
【図５】
2019503010.tif 000010
【図６Ａ】
2019503010.tif 000011
【図６Ｂ】
2019503010.tif 000012
【図７】
2019503010.tif 000013
【図８】
2019503010.tif 000014
【図９】
2019503010.tif 000015
【図１０】
2019503010.tif 000016
【図１１】
2019503010.tif 000017
【国際調査報告】
2019503010.tif 000018
2019503010.tif 000019