(57)【特許請求の範囲】
【請求項１】
データ処理装置であって、該データ処理装置が、
データ処理命令群のストリームに応答してデータ処理を実行するための主プロセッサであって、前記データ処理命令群が
ａ）コプロセッサが実行すべきデータ処理オペレーションを指定する操作コード（ｏｐｃｏｄｅ）と、
ｂ）コプロセッサ命令に対する目的のコプロセッサを識別するためのコプロセッサ識別フィールドと、
をそなえた少なくとも一つのコプロセッサ命令を含み、
前記コプロセッサ識別フィールドの少なくとも１ビットが前記データ処理オペレーションで使用されるべきデータ型を示すデータ型フィールドとしての役目も果たす、主プロセッサと、
バスによって前記主プロセッサに結合されたコプロセッサであって、前記主プロセッサはコプロセッサ命令に応答して前記バス上に前記コプロセッサ命令の少なくとも表現を送出し、前記コプロセッサは前記バス上の前記コプロセッサ命令に応答して前記コプロセッサ識別フィールドを前記コプロセッサを識別する少なくとも一つのコプロセッサ番号値と比較し、前記コプロセッサが前記目的コプロセッサである場合には前記バスを介してアクセプト信号を前記主プロセッサに送出する、コプロセッサと、
を具備し、
前記コプロセッサが複数データ型をサポートする複数データ型コプロセッサである場合には、前記コプロセッサは複数のコプロセッサ番号値をそなえ、前記複数のコプロセッサ番号値のいずれかに対するアクセプト信号を送出し、前記データ型フィールドを使用することにより、使用されるデータ型を制御する、データ処理装置。
【請求項２】
請求項１記載のデータ処理装置であって、前記コプロセッサが単一のデータ型をサポートする単一データ型である場合には、前記コプロセッサはサポートされないデータ型に対応するデータ型フィールドを含むどのコプロセッサ番号値に対するアクセプト信号を送出せず、前記データ型フィールドに関係なくサポートされたデータ型を使用する、データ処理装置。
【請求項３】
請求項１記載のデータ処理装置であって、前記複数データ型コプロセッサは、前記データ型フィールドによって指定され得るすべてのデータ型より少ないデータ型をサポートする、データ処理装置。
【請求項４】
請求項１記載のデータ処理装置であって、前記操作コードが前記データ型に関係ない、データ処理装置。
【請求項５】
請求項１記載のデータ処理装置であって、前記データ型フィールドは前記データ型が単精度データであるか、倍精度データであるかを示し、前記コプロセッサが浮動小数点ユニットである、データ処理装置。
【請求項６】
請求項１記載のデータ処理装置であって、前記主プロセッサが前記コプロセッサ識別フィールドの前記少なくとも１ビットに応答して、前記主プロセッサと前記コプロセッサによって一緒に実行されるべきデータ処理オペレーションに対するデータ型を判定する、データ処理装置。
【請求項７】
請求項１記載のデータ処理装置であって、前記コプロセッサの命令の前記少なくとも表現が前記コプロセッサ命令である、データ処理装置。
【請求項８】
請求項１記載のデータ処理装置であって、前記データ型フィールドによって指定されたサポートされないデータ型であるため前記コプロセッサがアクセプト信号を送出しない場合には、前記主プロセッサはエミュレーションコードを使用することにより、前記サポートされないデータ型に対する前記コプロセッサ命令のエミュレーションを行う、データ処理装置。
【請求項９】
主プロセッサとコプロセッサでデータを処理する方法であって、
データ処理命令群のストリームに応答して前記主プロセッサでデータ処理を実行するステップであって、前記データ処理命令群が
ａ）前記コプロセッサが実行すべきデータ処理オペレーションを指定する操作コード（ｏｐｃｏｄｅ）と、
ｂ）コプロセッサ命令に対する目的のコプロセッサを識別するためのコプロセッサ識別フィールドと、
をそなえた少なくとも一つのコプロセッサ命令を含み、
前記コプロセッサ識別フィールドの少なくとも１ビットが前記データ処理オペレーションで使用されるべきデータ型を示すデータ型フィールドとしての役目も果たす、ステップと、
コプロセッサ命令に応答して、前記主プロセッサがバスで前記コプロセッサに前記コプロセッサ命令の少なくとも表現を送出するステップと、
前記コプロセッサ命令に応答して、前記コプロセッサが前記コプロセッサ識別フィールドを前記コプロセッサを識別する少なくとも一つのコプロセッサ番号値と比較し、前記コプロセッサが前記目的コプロセッサである場合にはアクセプト信号を前記主プロセッサに送出するステップと、
を含み、
前記コプロセッサが複数データ型をサポートする複数データ型コプロセッサである場合には、前記コプロセッサは複数のコプロセッサ番号値をそなえ、前記複数のコプロセッサ番号値のいずれかに対するアクセプト信号を送出し、前記データ型フィールドを使用することにより、使用されるデータ型を制御する、データ処理方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はデータ処理の分野に関するものである。更に詳しく述べると、本発明はコプロセッサを組み込んだデータ処理システムに関するものである。
【０００２】
【従来の技術】
主プロセッサとコプロセッサの両方を組み込んだデータ処理システムを提供することが知られている。システムによっては、主プロセッサとともに一つ以上の異なるコプロセッサを設け得ることが知られている。この場合、異なるコプロセッサはコプロセッサ番号の相違により区別することができる。主プロセッサの命令データストリームに生じるコプロセッサ命令は、コプロセッサに結合されたバス上に送出される。バスに取り付けられた（その各々が対応するハードワイヤードコプロセッサ番号をそなえている）一つ以上のコプロセッサが命令のコプロセッサ番号フィールドを調べることにより、自分がその命令に対する目的のコプロセッサであるか判定する。目的のコプロセッサである場合には、その一つ以上のコプロセッサは主プロセッサにアクセプト信号を送出する。主プロセッサがアクセプト信号を受けない場合には、主プロセッサは例外状態に入って、定義されていない命令を処理する。
【０００３】
コプロセッサ命令が主プロセッサ命令のサブセットであると仮定すると、多くの場合、コプロセッサに対して命令ビットスペースが制限される。これらの問題は、コプロセッサが多数の広いオペレーションをそなえた豊富な命令を必要とする場合には、更に悪化する（たとえば、コプロセッサの中に多数のレジスタを設けることに対処するために、広いレジスタフィールドが必要とされる）。更に複雑化する問題は、コプロセッサは多数の異なる型のデータを操作することがあり、データ型の表示をコプロセッサ命令の中のコプロセッサに送らなければならないということである。
【０００４】
【発明が解決しょうとする課題】
本発明の一つの目的は、コプロセッサに対する限られた命令ビットスペースの問題に対処することである。
【０００５】
【課題を解決するための手段】
第一の側面から見ると、本発明はデータ処理装置を提供する。このデータ処理装置は、
データ処理命令群のストリームに応答してデータ処理を実行するための主プロセッサであって、前記データ処理命令群が
ａ）コプロセッサが実行すべきデータ処理オペレーションを指定する操作コード（ｏｐｃｏｄｅ）と、
ｂ）前記コプロセッサ命令に対する目的のコプロセッサを識別するためのコプロセッサ識別フィールドと、
をそなえた少なくとも一つのコプロセッサ命令を含み、
前記コプロセッサ識別フィールドの少なくとも１ビットが前記データ処理オペレーションで使用されるべきデータ型を示すデータ型フィールドとしての役目も果たす、主プロセッサと、
バスによって前記主プロセッサに結合されたコプロセッサであって、前記主プロセッサはコプロセッサ命令に応答して前記バス上に前記コプロセッサ命令の少なくとも表現を送出し、前記コプロセッサは前記バス上の前記コプロセッサ命令に応答して前記コプロセッサ識別フィールドを前記コプロセッサを識別する少なくとも一つのコプロセッサ番号値と比較し、前記コプロセッサが前記目的コプロセッサである場合には前記バスを介してアクセプト信号を前記主プロセッサに送出する、コプロセッサと、
を含み、
前記コプロセッサが多重データ型をサポートする多重データ型コプロセッサである場合には、前記コプロセッサは多重のコプロセッサ番号値をそなえ、前記多重のコプロセッサ番号値のいずれかに対してアクセプト信号を送出し、前記データ型フィールドを使用することにより、使用されるデータ型を制御する。
【０００６】
コプロセッサ命令に対する目的コプロセッサを識別し、どのデータ型をそれが使用すべきかをコプロセッサに指定するという二つの機能をコプロセッサ番号が果たすようにできるということを本発明は理解し、用いる。これにより、コプロセッサ操作コード命令ビットスペースが他の目的に解放され、これを使用してより豊富な命令セットを提供することができる。更に、コプロセッサ番号を使用してこのデータ型の符号化を伝えることにより、容易に増減（スケーリング）できるアーキテクチャが提供される。特に、データ型サポートのサブセット（部分集合）またはスーパセット（上位集合）を提供する異なるコプロセッサを提供することができ、主プロセッサは異なるコプロセッサ番号とともに同じ操作コードを使用して、これらのコプロセッサのアドレス指定を行う。主プロセッサがコプロセッサによってサポートされないデータ型のコプロセッサ命令を送出する場合には、コプロセッサはそれをアクセプトせず（受け入れず）、主プロセッサはそれの既存の機構を使用して例外処理コードに分岐することにより、その状況を処理する。
【０００７】
単一のデータ型だけをサポートする実施例では、コプロセッサはサポートされないデータ型に対応するデータ型フィールドを含む、どのコプロセッサ番号値に対してもアクセプト信号を送出せず、前記データ型フィールドにかかわりなく前記のサポートされるデータ型を使用する。
【０００８】
このようにして、このデータ型指定機能をサポートするいかなる修正も行う必要無しに、ハードウェアが削減されたコプロセッサを提供することができ、主プロセッサは既存のアクセプトまたは非アクセプト機構を使用して、コプロセッサの削減された機能を処理することができる。
【０００９】
コプロセッサは、データ型フィールドで指定され得るすべてのデータ型と単一のデータ型だけとの間の任意の個数のデータ型をサポートできることが理解されよう。サポートされるデータ型のデータ型フィールドをそなえたコプロセッサ番号のコプロセッサ命令をアクセプトするだけで、コプロセッサはこれを行うことができる。
【００１０】
本発明の更に好ましい特徴は、操作コードをデータ型にかかわりなくできるということである。これにより、命令復号化が簡略化される。この場合、操作コードはデータ型に直交する。
【００１１】
指定されているデータ型は種々の異なるパラメータ（たとえば、サイン符号化）とすることができるが、浮動小数点コプロセッサの中で単精度と倍精度のデータ型を処理するのに特に有用である。
【００１２】
主プロセッサはサポートされないデータ型のコプロセッサ命令の処理を停止するか、または無視するように構成してもよいが、前記データ型フィールドによってサポートされないデータ型と指定されているためにコプロセッサがアクセプト信号を送出しない場合には、前記主プロセッサはエミュレーションコードを使用することにより、前記サポートされないデータ型に対する前記コプロセッサ命令のエミュレーションを行うことが好ましい。
【００１３】
このようにして、性能低下の犠牲を払って、同じコードを主プロセッサで実行することができる。このことは、サポートされないデータ型のコプロセッサ命令がまれにしか生じない場合には、問題にならないかも知れない。
【００１４】
もう一つの側面から見ると、本発明は主プロセッサとコプロセッサでデータを処理する方法を提供する。この方法は、
データ処理命令群のストリームに応答して前記主プロセッサでデータ処理を実行するステップであって、前記データ処理命令群が
ａ）前記コプロセッサが実行すべきデータ処理オペレーションを指定する操作コード（ｏｐｃｏｄｅ）と、
ｂ）前記コプロセッサ命令に対する目的のコプロセッサを識別するためのコプロセッサ識別フィールドと、
をそなえた少なくとも一つのコプロセッサ命令を含み、
前記コプロセッサ識別フィールドの少なくとも１ビットが前記データ処理オペレーションで使用されるべきデータ型を示すデータ型フィールドとしての役目も果たす、ステップと、
コプロセッサ命令に応答して、前記主プロセッサがバスで前記コプロセッサに前記コプロセッサ命令の少なくとも表現を送出するステップと、
前記コプロセッサ命令に応答して、前記コプロセッサが前記コプロセッサ識別フィールドを前記コプロセッサを識別する少なくとも一つのコプロセッサ番号値と比較し、前記コプロセッサが前記目的コプロセッサである場合にはアクセプト信号を前記主プロセッサに送出するステップと、
を含み、
前記コプロセッサが多重データ型をサポート（支援）する多重データ型コプロセッサである場合には、前記コプロセッサは多重のコプロセッサ番号値をそなえ、前記多重のコプロセッサ番号値のいずれかに対してアクセプト信号を送出し、前記データ型フィールドを使用することにより、使用されるデータ型を制御する。
【００１５】
本発明を、付図に示されたその好適実施例を参照して更に説明する。これらは例を示しているに過ぎない。
【００１６】
【発明の実施の形態】
図１は、主プロセッサ２４、浮動小数点コユニットプロセッサ２６、キャッシュメモリ２８、主メモリ３０、および入力／出力システム３２を含むデータ処理システムを示す。主プロセッサ２４、キャッシュメモリ２８、主メモリ３０、および入力／出力システム３２は主バス３４を介してリンクされる。コプロセッサバス３６は主プロセッサ２４を浮動小数点ユニットコプロセッサ２６にリンクする。
【００１７】
オペレーションについて説明する。主プロセッサ２４（ＡＲＭコアとも呼ぶ）は、キャッシュメモリ２８、主メモリ３０、および入力／出力システム３２の相互作用を含む一般の型のデータ処理オペレーションを制御するデータ処理命令のストリームを実行する。データ処理命令のストリームの中に、コプロセッサ命令が埋め込まれる。主プロセッサ２４はこれらのコプロセッサ命令を、付属のコプロセッサが実行すべき型のものと認識する。これに応じて主プロセッサ２４は、これらのコプロセッサ命令をコプロセッサバス３６上に送出する。このコプロセッサバス３６から、任意の付属のコプロセッサがコプロセッサ命令を受信する。この場合、浮動小数点ユニットコプロセッサ２６は、自分宛てのものであると検出した受信コプロセッサ命令をアクセプトして受け入れて、実行する。この検出は、コプロセッサ命令の中のコプロセッサ番号フィールドを介して行われる。
【００１８】
図２は、浮動小数点ユニットコプロセッサ２６を更に詳しく示す概略図である。浮動小数点ユニットコプロセッサ２６には、３２個の３２ビットレジスタ（図２には少ししか示されていない）で構成されるレジスタバンク３８が含まれる。これらのレジスタは、３２ビットデータ値を各々記憶する単精度レジスタとして個別に動作するか、または一緒になって６４ビットデータ値を記憶する対として動作することができる。浮動小数点ユニットコプロセッサ２６の中には、パイプライン形乗算累算ユニット４０とロード記憶制御ユニット４２とが設けられる。適当な状況では、乗算累算ユニット４０とロード記憶制御ユニット４２とが同時に動作することができる。この場合、乗算累算ユニット４０がレジスタバンク３８の中のデータ値に対して（乗算累算オペレーションと他のオペレーションを含む）算術オペレーションを行っている間に、ロード記憶制御ユニット４２は乗算累算ユニット４０が使用していないデータ値の、主プロセッサ２４を介した浮動小数点ユニットコプロセッサ２６とのやり取りを行う。
【００１９】
浮動小数点ユニットコプロセッサ２６の中では、アクセプトされたコプロセッサ命令が命令レジスタ４４の中にラッチされる。この単純化された図ではコプロセッサ命令は、操作コード（ｏｐｃｏｄｅ）部分の後に、３個のレジスタ指定フィールドＲ１とＲ２とＲ３とが続いて構成されると考えることができる（実際には、これらのフィールドは命令全体の中で別の仕方で分割、展開してもよい）。これらのレジスタ指定フィールドＲ１とＲ２とＲ３とは、実行されているデータ処理オペレーションに対するデスティネーション（宛て先）、第一のソース（発生源）、および第二のソースとしての役目を果たすレジスタバンク３８の中のレジスタにそれぞれ対応する。ベクトル制御レジスタ４６はベクトル制御レジスタ命令に応じて、長さとストライド値の初期化と更新を行うことができる。ベクトル長さとストライド値は浮動小数点ユニットコプロセッサ２６の中で全体的に適用されるので、これらの値は全体的に動的に変更でき、自動修正モードに頼る必要は無い。
【００２０】
レジスタ制御−命令送出ユニット４８、ロード記憶制御ユニット４２、およびベクトル制御ユニット５０はまとめて、命令復号器の役割の主要部分を実行するものと考えることができる。レジスタ制御−命令送出ユニット４８は操作コードとレジスタ指定フィールドＲ１とＲ２とＲ３とに応答し、まず、初期レジスタアクセス（アドレス）信号をレジスタバンク３８に出力する。操作コードに対するふは行わないし、ベクトル制御ユニット５０を使用する必要は無い。このように初期レジスタ値に直接アクセスすることは、より高速のインプリメンテーションを実現する助けとなる。ベクトルレジスタが指定されれば、ベクトル制御ユニット５０は３ビットのインクリメンタ（加算器）５２を使用してレジスタアクセス信号の必要な系列を発生する役目を果たす。ベクトル制御ユニット５０は、レジスタバンク３８のそのアドレス指定を行う際、ベクトル制御レジスタ４６の中に記憶された長さの値とストライド値とに応答する。パイプライン形乗算累算ユニット４０とそれと同時に動作するロード記憶制御ユニット４２とがデータ一貫性の問題を生じないように、レジスタスコアボード５４を設けてレジスタロッキングを行う（代わりに、レジスタスコアボード５４をレジスタ制御−命令送出ユニット４８の一部とみなしてもよい）。
【００２１】
命令レジスタ４４の中の操作コードは実行すべきデータ処理オペレーションの性質（たとえば、命令が加算、減算、乗算、除算、ロード、記憶等であるか）を指定する。これは、指定されているレジスタのベクトルまたはスカラの性質によらない。これは更に、命令復号化と乗算累算ユニット４０の設定を単純化する。第一のレジスタ指定値Ｒ１と第二のレジスタ指定値Ｒ２は一緒になって、操作コードによって指定されるオペレーションのベクトル／スカラの性質を復号化する。符号化によってサポートされる三つの共通の場合は、Ｓ＝Ｓ＊Ｓ（たとえば、ＣコードのブロックからＣコンパイラによって作成されるような基本ランダム計算）、Ｖ＝ＶｏｐＳ（たとえば、ベクトルの要素をスケーリングするため）、およびＶ＝ＶｏｐＶ（たとえば、ＦＩＲフィルタ、図形変換のようなマトリックスオペレーション）である（注意すべきことは、この前後関係では、「ｏｐ」は一般的なオペレーションを示し、シンタクスはデスティネーション＝第二のオペランドｏｐ第一のオペランドという形式になっているということである）。命令によっては（たとえば、比較、零または絶対値との比較）、デスティネーションレジスタが無い（たとえば、出力が条件フラグである）、または入力オペランドが少ない（零との比較に１入力オペランドしかない）ことがあり得る。これらの場合には、ベクトル／スカラの性質のようなオプションを指定するために、より大きな操作コードビット空間が利用でき、各オペランドに対してレジスタの全範囲を利用可能とすることができる（たとえば、レジスタがなんであれ、比較は常に完全にスカラとしてもよい）。
【００２２】
一緒になって命令復号器の役割の主要部分を果たすレジスタ制御−命令送出ユニット４８とベクトル制御ユニット５０とは、第一のレジスタ指定フィールドＲ１と第二のレジスタ指定フィールドＲ２とに応答して、指定されたデータ処理オペレーションのベクトル／スカラの性質を判定した後、制御する。ベクトル制御レジスタ４６の中に記憶された長さ値が１の長さ（０の記憶された値に対応する）を示していれば、これは純粋にスカラのオペレーションの初期表示として使用することができる。
【００２３】
図３は、単精度モードでレジスタ指定値からベクトル／スカラの性質を復号するために使用される処理論理を示す流れ図である。ステップ５６で、ベクトル長さが全体的に１として設定されているか（長さ値が０に等しい）のテストが行われる。ベクトル長さが１であれば、ステップ５８ですべてのレジスタはスカラとして扱われる。ステップ６０で、デスティネーションレジスタＲ１がレンジＳ０からＳ７の中にあるか否かについてのテストが行われる。これが事実であれば、オペレーションはすべてスカラであり、ステップ６２に示されるように、Ｓ＝ＳｏｐＳの形式になっている。ステップ６０か”ｎｏ”を返すと、ステップ６４に示されるようにデスティネーションはベクトルであるものと判定される。デスティネーションがベクトルであれば、符号化は第二のオペランドもベクトルであるとみなす。したがって、この段階で残っている二つの可能性は、Ｖ＝ＶｏｐＳとＶ＝ＶｏｐＶである。これらの二つの可能性の区別は、第一のオペランドがＳ０からＳ７の中の一つであるか判定するステップ６６のテストによって行われる。これが事実であれば、オペレーションはＶ＝ＶｏｐＳであり、そうでなければＶ＝ＶｏｐＶである。これらの状態はステップ６８と７０でそれぞれ認識される。
【００２４】
注意すべきことは、ベクトル長さが１に設定されたときには、レジスタバンク３８の３２個のレジスタのすべてをスカラとして使用することができるということである。これは、オペレーションのスカラ性がステップ５８で認識され、デスティネーションに使用し得るレジスタの範囲を制限するステップ６０のテストに頼る必要が無いからである。ベクトルとスカラの混合の命令が使用されているときに、すべてがスカラのオペレーションを認識する際に、ステップ６０のテストは有用である。ベクトルとスカラの混合のモードで動作しているとき、第一のオペランドがスカラであれば、それはＳ０からＳ７のいずれかであり得るのに対して、第一のオペランドがベクトルであれば、それはＳ８からＳ３１のいずれかであり得るということもわかる。第一のオペランドがベクトルである場合に、レジスタバンクの中で利用し得るレジスタ数を３倍にしたのは、ベクトルオペレーションを使用するときにデータ値の系列を保持するために必要なレジスタ数が一般に多くなることに対する適応である。
【００２５】
実行したい普通のオペレーションは図形変換であることが理解されよう。一般的な場合には、実行すべき変換は４＊４マトリックスで表すことができる。このような計算でのオペランドの再使用は、ベクトルとして操作し得るレジスタにマトリックス値を記憶することが望ましいということを意味する。同様に、入力画素値は通常、４個のレジスタに記憶され、この４個のレジスタも再使用を助けるためにベクトルとして操作することができるべきである。マトリックスオペレーションの出力は通常、４個のレジスタに記憶された（別々のベクトル行乗算を累算した）スカラとなる。入力値と出力値とを二重に送り込む（ｄｏｕｂｌｅ  ｐｕｍｐ）ことが望ましい場合には、２４（＝１６＋４＋４）個のベクトルレジスタと８（＝４＋４）個のスカラレジスタとが必要になる。
【００２６】
図４は、図３の流れ図に対応する流れ図であるが、この場合には倍精度モードを示している。前に説明したように倍精度モードでは、レジスタバンク３８の中のレジスタスロットは対として動作し、論理レジスタＤ０からＤ１５に１６個の６４ビットデータ値を記憶する。この場合には、レジスタのベクトル／スカラの性質の符号化は図３のそれから変形され、ステップ６０と６６のテストがそれぞれステップ７２と７４の「デスティネーションはＤ０からＤ３の中の一つか？」と「第一のオペランドはＤ０からＤ３の中の一つか？」になる。
【００２７】
上記したようなレジスタ指定フィールド内のレジスタのベクトル／スカラの性質の符号化により、命令ビット空間は著しく節約されるが、加算や除算のような非可換性のオペレーションに対してある種の困難が生じる。レジスタ構成Ｖ＝ＶｏｐＳが与えられたとすると、非可換性のオペレーションに対する第一のオペランドと第二のオペランドとの間の対称性の欠如は、命令セットを拡張して、非可換性のオペレーションに対する二つの異なるオペランドオプションを表すＳＵＢ、ＲＳＵＢ、ＤＩＶ、ＲＤＩＶのような操作コードの対を含めるようにすることにより、レジスタ値を交換する付加的な命令無しに、克服することができる。
【００２８】
図５はレジスタバンク３８のサブセットの中のベクトルのラッピングを示す。特に、単精度モードでは、レジスタバンクはアドレスがＳ０からＳ７、Ｓ８からＳ１５、Ｓ１６からＳ２３、およびＳ２４からＳ３１の四つの範囲のレジスタに分割される。これらの範囲は互いに素で、隣接している。図２に示すように、８個のレジスタを含むこれらのサブセットに対するラッピング機能は、ベクトル制御ユニット５０の中の３ビットのインクリメンタ（加算器）５２を用いることにより提供することができる。このようにして、サブセットの境界を横切るとき、インクリメンタはラップバックする。この簡単なインプリメンテーションは、レジスタアドレス空間の中の８ワード境界にサブセットをそろえることによって、容易になる。
【００２９】
図５に戻って、レジスタのラッピングの理解を助けるために多数のベクトルオペレーションが示される。第一のベクトルオペレーションは、スタートレジスタＳ２、（ベクトル制御レジスタ４６の長さ値３によって示される）ベクトル長さ４、および（ベクトル制御レジスタ４６の中のストライド値０によって示される）ストライド１を指定する。したがって、これらのグローバルベクトル制御パラメータセットをそなえたベクトルとしてレジスタＳ２を参照するように復号された命令を実行するとき、レジスタＳ２、Ｓ３、Ｓ４、およびＳ５の中のデータ値をそれぞれ使用して命令が４回実行される。このベクトルがサブセット境界を横切らないので、ベクトルラッピングは無い。
【００３０】
第二の例では、スタートレジスタはＳ１４であり、長さはＳ１４であり、ストライドは１である。その結果、レジスタＳ１４から始まって、命令は６回実行される。使用される次のレジスタはＳ１５となる。レジスタが再びストライドだけ歩進すると、レジスタＳ１６を使用する代わりに、レジスタＳ８にラップされる。次に、命令が更に３回実行されることにより、Ｓ１４、Ｓ１５、Ｓ８、Ｓ９、Ｓ１０、およびＳ１１の全シーケンスが完了される。
【００３１】
図５の最後の例は、Ｓ２５のスタートレジスタ、８の長さ、および２のストライドを示す。使用される第一のレジスタはＳ２５であり、ストライド値２に従ってその後にＳ２７、Ｓ２９、およびＳ３１が続く。レジスタＳ３１の使用に続いて、次のレジスタ値はサブセットのスタートにラップバックし、ストライド２であるからレジスタＳ２４を通過し、レジスタＳ２５を使用してオペレーションを実行する。インクリメンタ５２は、ベクトルレジスタ相互間を動くとき現在値にストライドを加算する３ビット加算器の形式を取り得る。したがって、加算器に異なるストライド値を与えることにより、ストライドを調整することができる。
【００３２】
図６は倍精度モードでのレジスタバンク３８のラッピングを示す。このモードでは、レジスタのサブセットにＤ０からＤ３、Ｄ４からＤ７、Ｄ８からＤ１１、およびＤ１２からＤ１５が含まれる。倍精度モードでインクリメンタ５２としての役目を果たす加算器への最小値入力は２となる。これは倍精度ストライド１に対応する。倍精度ストライド２は加算器への入力４を必要とする。図６の第一の例では、スタートレジスタがＤ０、長さが４、ストライドが１である。その結果、Ｄ０、Ｄ１、Ｄ２およびＤ３のベクトルレジスタ系列が得られる。サブセット境界を横切らないので、この例ではラッピングは無い。第二の例では、スタートレジスタがＤ１５、長さが２、ストライドが２である。その結果、Ｄ１５およびＤ１３のベクトルレジスタ系列が得られる。
【００３３】
図２を参照して、ロード記憶制御ユニット４２はその出力に５ビットのインクリメンタをそなえており、多重ロード／記憶オペレーションはベクトルオペレーションに適用されるレジスタラッピングを受けないことがわかる。これにより、単一の多重ロード／記憶命令はそれが必要とするだけの数の連続レジスタにアクセスすることができる。
【００３４】
このラッピング構成を良好に使用するオペレーションの一例は、４個の信号値のユニットと４個のタップに分割されたＦＩＲフィルタである。シンタックスＲ８−Ｒ１１ｏｐＲ１６−Ｒ１９がベクトルオペレーションＲ８ｏｐＲ１６、Ｒ９ｏｐＲ１７、Ｒ１０ｏｐＲ１８、およびＲ１１ｏｐＲ１９を表す場合には、ＦＩＲフィルタオペレーションは次のように行うことができる。
【００３５】
８個のタップをＲ８−Ｒ１５に、８個の信号値をＲ１６−Ｒ２３にロードする。
【００３６】
Ｒ８−Ｒ１１ｏｐＲ１６−Ｒ１９、そして結果をＲ２４−Ｒ２７に入れる。
Ｒ９−Ｒ１２ｏｐＲ１６−Ｒ１９、そして結果をＲ２４−Ｒ２７に入れる。
Ｒ１０−Ｒ１３ｏｐＲ１６−Ｒ１９、そして結果をＲ２４−Ｒ２７に入れる。
Ｒ１１−Ｒ１４ｏｐＲ１６−Ｒ１９、そして結果をＲ２４−Ｒ２７に入れる。
【００３７】
Ｒ８−Ｒ１１に新しいタップを再ロードする。
【００３８】
Ｒ１２−Ｒ１５ｏｐＲ１６−Ｒ１９、そして結果をＲ２４−Ｒ２７に累積する。
Ｒ１３−Ｒ８ｏｐＲ１６−Ｒ１９、そして結果をＲ２４−Ｒ２７に累積する（Ｒ１５−＞Ｒ８ラップ）。
Ｒ１４−Ｒ９ｏｐＲ１６−Ｒ１９、そして結果をＲ２４−Ｒ２７に累積する（Ｒ１５−＞Ｒ８ラップ）。
Ｒ１５−Ｒ１０ｏｐＲ１６−Ｒ１９、そして結果をＲ２４−Ｒ２７に累積する（Ｒ１５−＞Ｒ８ラップ）。
【００３９】
Ｒ１２−Ｒ１５に新しいタップを再ロードする。
【００４０】
タップがなくなると、Ｒ１６−Ｒ１９に新しいデータを再ロードする。
【００４１】
Ｒ１２−Ｒ１５ｏｐＲ２０−Ｒ２３、そして結果をＲ２８−Ｒ３１に入れる。
【００４２】
Ｒ１３−Ｒ８ｏｐＲ２０−Ｒ２３、そして結果をＲ２８−Ｒ３１に入れる（Ｒ１５−＞Ｒ８ラップ）。
Ｒ１４−Ｒ９ｏｐＲ２０−Ｒ２３、そして結果をＲ２８−Ｒ３１に入れる（Ｒ１５−＞Ｒ８ラップ）。
Ｒ１５−Ｒ１０ｏｐＲ２０−Ｒ２３、そして結果をＲ２８−Ｒ３１に入れる（Ｒ１５−＞Ｒ８ラップ）。
【００４３】
残りは上記と同様
【００４４】
上記のことからわかるように、ロードは多重累算から異なるレジスタに対して行われるので、並列に行われ得る（すなわち、二重バッファを行う）。
【００４５】
図７Ａは、主プロセッサ２４がコプロセッサ命令をどのように調べるかを示す概略図である。主プロセッサは命令の中の（分割できる）フィールド７６のビット組み合わせを使用することにより、命令をコプロセッサ（ｃｏｐｒｏｃｅｓｓｏｒ）命令と識別する。標準のＡＲＭプロセッサの命令のセットの中で、コプロセッサ命令にはコプロセッサ番号フィールド７８が含まれる。主プロセッサに付属したコプロセッサ（一つまたは複数）はコプロセッサ番号フィールド７８を使用して、特定のコプロセッサ命令がそれらを目標としているか識別する。ＤＳＰコプロセッサ（たとえば、ＡＲＭ社製のピッコロ（Ｐｉｃｃｏｌｏ）コプロセッサ）または浮動小数点ユニットコプロセッサのような異なる型のコプロセッサには異なるコプロセッサ番号を割り当てることができ、したがって、同じコプロセッサバス３６を使用して単一のシステムの中で別々にアドレス指定することができる。コプロセッサ命令には、コプロセッサが使用する操作コード（ｏｐｃｏｄｅ）、ならびにコプロセッサレジスタの中からデスティネーション、第一のオペランド、および第二のオペランドをそれぞれ指定する３個の５ビットフィールドも含まれる。コプロセッサロードまたは記憶のような、いくつかの命令では、コプロセッサと主プロセッサが一緒になって所望のデータ処理オペレーションを完了できるように、主プロセッサは少なくとも部分的にコプロセッサ命令を復号する。主プロセッサは、このような状況でそれが行う命令復号の一部としてコプロセッサ番号の中で符号化されたデータ型に応答してもよい。
【００４６】
図７Ｂは、倍精度と単精度の両方のオペレーションをサポートするコプロセッサが受信したコプロセッサ命令をどのように解釈するかを示す。このようなコプロセッサには二つの隣接したコプロセッサ番号が割り当てられる。コプロセッサはコプロセッサ番号の最上位の３ビットを使用して、それがターゲットのコプロセッサであるか識別する。このようにして、コプロセッサ番号の最下位ビットはターゲットのコプロセッサを識別する目的で冗長であり、代わりにこれを使用して、そのコプロセッサ命令を実行する際に使用されるべきデータ型を指定することができる。この例では、データ型はデータサイズが単精度であるか、倍精度であるかということに対応する。
【００４７】
倍精度モードではレジスタ数が事実上３２から１６に減る。それに応じてレジスタのフィールドサイズを小さくすることは可能ではあるが、その場合には、使用すべきレジスタの復号化はコプロセッサ命令の中の既知の位置のそれだけで完備したフィールドから直接得ることはできず、コプロセッサ命令の他の部分の復号化に左右される。これには、複雑で、多分、コプロセッサのオペレーションが遅くなるという欠点がある。コプロセッサ番号の最下位ビットを使用してデータ型を復号するということは、操作コードは完全にデータ型によらないようにできることを意味し、これによっても、その復号化は簡単になり、速度が早くなる。
【００４８】
図７Ｃは、図７Ｂのコプロセッサによってサポートされたデータ型のサブセットである単一のデータ型だけをサポートするコプロセッサがどのようにコプロセッサ命令を解釈するかを示す。この場合には、全コプロセッサ番号を使用して、その命令をアクセプトするべきか否か判定する。このようにして、コプロセッサ命令がサポートされていないデータ型である場合には、それは異なるコプロセッサ番号に対応し、アクセプトされない。このとき、主プロセッサ２４は未定義の命令例外処理に頼って、サポートされていないデータ型に対してオペレーションのエミュレーションを行うことができる。
【００４９】
図８は、主プロセッサとしての役目を果たし、単精度と倍精度の両方のデータ型をサポートするコプロセッサ８４とコプロセッサバス８２を介して通信するデータ処理システムを示す。コプロセッサ番号を含むコプロセッサ命令は命令ストリームの中に出て来たとき、ＡＲＭコア８０からコプロセッサバス８２上に送出される。次にコプロセッサ８４は、コプロセッサ番号をそれ自身の番号と比較し、一致していればアクセプト信号をＡＲＭコア８０に返送する。アクセプト信号を受信しなければ、ＡＲＭコアは未定義の命令例外と認識し、メモリシステム８６に記憶されている例外処理コードを参照する。
【００５０】
図９は、コプロセッサ８４を単精度オペレーションのみをサポートするコプロセッサ８８に置き換えることにより修正された図８のシステムを示す。この場合、コプロセッサ８８は単一のコプロセッサ番号だけを認識する。したがって、図８のコプロセッサ８４によって実行される、オリジナル命令ストリームの中の倍精度コプロセッサ命令は、単精度のコプロセッサ８８によってアクセプトされない。したがって、同じコードを実行することが望ましい場合には、メモリシステム８６の中の未定義の例外処理コードに倍精度エミュレーションルーチンを含めることができる。
【００５１】
倍精度命令をエミュレーションしなければならないことにより、これらの命令の実行が遅くなるが、単精度コプロセッサ８８は倍精度コプロセッサ８４より小さく、安価にでき、倍精度命令が充分にまれであれば、正味の利点が得られる。
【００５２】
図１０は、単精度と倍精度の両方の命令をサポートし、二つの隣接したコプロセッサ番号をそなえたコプロセッサ８４の中の命令ラッチ回路を示す。この場合、コプロセッサ命令の中の望ましいコプロセッサ番号の最上位３ビットＣＰ＃［３：１］がそのコプロセッサ８４に割り当てられたものと比較される。この例で、コプロセッサ８４がコプロセッサ番号１０と１１をそなえている場合には、コプロセッサ番号の最上位３ビットＣＰ＃［３：１］を２進１０１と比較することにより、この比較を行うことができる。一致が生じると、アクセプト信号がＡＲＭコア８０に返送され、コプロセッサ命令が実行のためにラッチされる。
【００５３】
図１１は図９の単精度コプロセッサ８８の中の同等の回路を示す。この場合には、単一のコプロセッサ番号だけが認識され、単精度オペレーションがデフォルトにより使用される。コプロセッサ命令をアクセプトしてラッチすべきか否かについて判定する際に行われる比較は、コプロセッサ番号ＣＰ＃［３：０］の４ビット全体と単一の埋め込まれたコプロセッサ番号である２進１０１０との間で行われる。
【００５４】
図１２は、図９の実施例の未定義例外処理ルーチンをどのようにトリガして倍精度エミュレーションコードを動かせるかを示す流れ図である。これは、未定義命令例外を生じた命令が、コプロセッサ番号が２進１０１１であるコプロセッサ命令であるか検出する（ステップ９０）ことにより、行われる。「イエス」であれば、これは倍精度命令を意図したものであるので、ステップ９２でエミュレーションを行った後、主プログラムのフローに戻ることができる。ステップ９０でトラップされなければ、以後のステップにより他の例外の型の検出と処理を行ってもよい。
【００５５】
図１３は、レジスタバンク２２０の各３２ビットレジスタ、すなわち各データスロット、に記憶されたデータの型を識別する情報を記憶するための、フォーマットレジスタＦＰＲＥＧ２００の使用を示す。前に説明したように、各データスロットは３２ビットのデータ値（１データワード）を記憶するための単精度レジスタとして個別に動作するか、またはもう一つのデータスロットと対にして６４ビットのデータ値（２データワード）を記憶するための倍精度レジスタを提供することができる。本発明の好適実施例によれば、ＦＰＲＥＧレジスタ２００は任意の特定のデータスロットがその中に単精度のデータを記憶しているか、倍精度のデータを記憶しているかを識別するように構成される。
【００５６】
図１３に示すように、レジスタバンク２２０の中の３２個のデータスロットは１６対のデータスロットを提供するように配列される。ある第一のデータスロットがその中に単精度のデータ値を記憶している場合には、その対の他方のデータスロットは単精度のデータ値だけを記憶するように構成され、倍精度のデータ値を記憶するために他のどのデータスロットともリンクされることはない。これにより、どの特定のデータスロット対も二つの単精度データ値、または一つの倍精度データ値を記憶するように構成される。この情報は、レジスタバンク２２０の中の各データスロット対と結合された１ビットの情報により識別することができる。したがって好適実施例ではＦＰＲＥＧレジスタ２００は、レジスタバンク２２０の各データスロット対に記憶されたデータの型を識別するために１６ビットの情報を記憶するように構成される。したがって、レジスタＦＰＲＥＧ２００は１６ビットのレジスタとして具体化するか、またはＦＰＵコプロセッサ２６の中の他のレジスタとの一貫性のため、１６スペアビットの情報をそなえた３２ビットのレジスタとして具体化することができる。
【００５７】
図１５はレジスタバンク２２０の中の６対のデータスロットを示す。好適実施例によれば、この６対のデータスロットを使用して、６個の倍精度のデータ値または１２個の単精度のデータ値を記憶することができる。データスロットの中に記憶し得るデータの例が図１５に示されている。ＤＨは倍精度データ値の３２個の最上位ビットを表し、ＤＬは倍精度データ値の３２個の最下位ビットを表し、Ｓは単精度のデータ値を表す。
【００５８】
本発明の好適実施例によるＦＰＲＥＧレジスタ２００の中の対応するエントリも図１５に示されている。好適実施例によれば、対応するデータスロット対に倍精度データ値が入っていることを示すためにＦＰＲＥＧレジスタ２００に値「１」が記憶され、対応するデータスロット対の少なくとも一方に単精度データ値が入っているか、または両方のデータスロットとも初期化されていないことを示すために値「０」が使用される。したがって、両方のデータスロットとも初期化されていない場合、一方のデータスロットが初期化されていなくて、その対の他方のデータスロットに単精度データ値が入っている場合、または対の両方のデータスロットに単精度データ値が入っている場合には、ＦＰＲＥＧレジスタ２００の対応するビットに論理「０」の値が記憶される。
【００５９】
前に説明したように、好適実施例のＦＰＵプロセッサ２６を使用して単精度または倍精度のデータ値を処理してもよく、また主プロセッサ２４が送出したコプロセッサ命令は、任意の特定の命令が単精度命令であるか倍精度命令であるかを識別する（図７Ｂと付属の説明参照）。命令がコプロセッサよりアクセプトされると、その命令はレジスタ制御−命令送出ユニット４８に送られて、復号されて実行される。命令がロード命令であれば、レジスタ制御−命令送出論理４８はロード記憶制御ユニット４２に命じて、識別されたデータをメモリから検索させ、レジスタバンク２２０の指定されたデータスロットにそのデータを記憶させる。この段階でコプロセッサは単精度データ値が検索されているのか、倍精度データ値が検索されているのかを知り、ロード記憶制御ユニット４２はそれに応じて動作する。したがって、ロード記憶制御ユニット４２は経路２２５で３２ビットの単精度データ値または６４ビットの倍精度データ値をレジスタバンク入力論理２３０に送って、レジスタバンク２２０に記憶させる。
【００６０】
データはロード記憶制御ユニット４２によりレジスタバンク２２０にロードされるだけでなく、フォーマットレジスタＦＲＰＥＧ２００にも与えられる。これにより、データを受ける各データスロット対が単精度データを記憶しようとしているのか、倍精度データを記憶しようとしているのかを表すために必要な情報ビットを付加することができる。好適実施例では、このデータがフォーマットレジスタＦＲＰＥＧ２００に記憶された後に、データがレジスタバンクにロードされるので、この情報をレジスタバンク入力論理２３０が利用できる。
【００６１】
好適実施例では、レジスタバンク２２０の内部フォーマットは外部フォーマットと同じであるので、レジスタバンク２２０の中では単精度データ値は３２ビットのデータ値として記憶され、倍精度データ値は６４ビットのデータ値として記憶される。レジスタバンク入力論理２３０はフォーマットレジスタＦＲＰＥＧ２００にアクセスするので、レジスタバンク入力論理２３０はそれが受けているデータが単精度であるか、倍精度であるかがわかる。したがって、このような実施例では、レジスタバンク入力論理２３０はレジスタバンク２２０の適当なデータスロット（一つまたは複数）に記憶するために経路２２５で受け取ったデータを単に配列するだけである。しかし、代替実施例でレジスタバンクの中の内部表現が外部フォーマットと異なる場合には、レジスタバンク入力論理２３０は必要な変換を行うように構成される。たとえば、ある数は通常、１．ａｂｃ．．．に基数を乗じて、ある指数の累乗としたもので表される。効率性のため、通常の単精度と倍精度の表現は１０進小数点の左側の１を表すためにデータビットを使用しないで、１は暗示されているものとする。何らかの理由で、レジスタバンク２２０の中で使用される内部表現が１を明示しなければならない場合には、レジスタバンク入力論理２３０はデータの必要な変換を行う。このような実施例では、レジスタバンク入力論理２３０が発生する付加的なデータを収容するために、データスロットは通常、３２ビットより若干大きくなる。
【００６２】
データ値をレジスタバンク２２０にロードする他に、ロード記憶制御ユニット４２はコプロセッサ２６の一つ以上のシステムレジスタ、たとえばユーザステータス制御レジスタＦＰＳＣＲ２１０にデータをロードしてもよい。好適実施例では、ＦＰＳＣＲレジスタ２１０に、ユーザがアクセスできるコンフィギュレーションビットと例外ステータスビットとが含まれている。これについては、好適実施例の説明の最後に行う浮動小数点ユニットのアーキテクチャの説明で更に詳しく説明する。
【００６３】
その内容をメモリに記憶すべきレジスタバンク２２０の中の特定のデータスロットを表す記憶命令をレジスタ制御−命令送出ユニット４８が発すると、それに応じてロード記憶制御ユニット４２が命令され、必要なデータワードがレジスタバンク２２０からレジスタバンク出力論理２４０を介してロード記憶制御ユニット４２に呼び出される。読み出されつつあるデータが単精度データか倍精度データかを判定するために、レジスタバンク出力論理２４０はＦＰＲＥＧレジスタ２００の内容にアクセスする。次にレジスタバンク出力論理２４０は、レジスタバンク入力論理２３０によって加えられたデータ変換を逆にするために適当なデータ変換を加え、そのデータを経路２３５でロード記憶制御ユニット４２に与える。
【００６４】
本発明の好適実施例によれば、記憶命令が倍精度命令であれば、コプロセッサ２６は、命令が倍精度データ値に適用される第二のオペレーションモードで動作していると考えることができる。倍精度データ値には偶数個のデータワードが含まれているので、第二のオペレーションモードで送出されるどの記憶命令も通常、その内容がメモリに記憶されるべき偶数個のデータスロットを表す。しかし、本発明の好適実施例によれば、奇数個のデータスロットが指定された場合には、ロード記憶制御ユニット４２は、ＦＰＲＥＧレジスタ２００の内容を読んで、まずそれらの内容をメモリに記憶した後、レジスタバンク２２０からの識別された偶数個のデータスロットを記憶するように構成される。通常、転送すべきデータスロットは、レジスタバンクの中の特定のデータスロットを表すベースアドレスの後に、そのデータスロットから数えた、記憶すべきデータスロット数（すなわち、データワード数）を示す数を続けたもので表される。
【００６５】
ここで、たとえば、記憶命令がベースアドレスとしてレジスタバンク２２０の第一のデータスロットを与えて、３３個のデータスロットを指定した場合には、これにより３２個の全部のデータスロットの内容がメモリに記憶されるが、指定されたデータスロット数が奇数であるので、ＦＰＲＥＧレジスタ２００の内容もメモリに記憶される。
【００６６】
このアプローチにより単一の命令を使用して、レジスタバンクの内容と、レジスタバンク２２０の種々のデータスロットの中に記憶されたデータの型を表すＦＰＲＥＧレジスタ２００の内容の両方を記憶することができる。これにより、ＦＰＲＥＧレジスタ２００の内容を明示的に記憶するために別々の命令を発する必要が無くなるので、メモリへの記憶またはメモリプロセスからのロードの間の処理速度にあまり悪影響を及ぼすことは無い。
【００６７】
本発明のもう一つの実施例では、この手法をもう一段階進めることにより、単一の命令を使用して、必要な場合には、ＦＰＳＣＲレジスタ２１０のような付加的なシステムレジスタもメモリに記憶し得るようにできる。したがって、３２個のデータスロットをそなえたレジスタバンク２２０の例を考えると、前に説明したように、記憶命令で３３個のデータスロットが表された場合には、レジスタバンク２２０の３２個のデータスロットの内容の他に、ＦＰＲＥＧレジスタ２００がメモリに記憶される。しかし、レジスタバンクの中のデータスロット数を超える異なる奇数、たとえば、３５が表された場合には、これをロード記憶制御ユニット４２は、ＦＰＲＥＧレジスタ２００とレジスタバンク２２０のデータスロットの内容の他に、ＦＰＳＣＲレジスタ２１０の内容もメモリに記憶する必要性と解釈することができる。コプロセッサはそれ以上のシステムレジスタ、たとえば、コプロセッサによる命令の処理の間に生じた例外を表す例外レジスタを含んでもよい。記憶命令に異なる奇数、たとえば、３７が表された場合には、これをロード記憶制御ユニット４２は、ＦＰＳＣＲレジスタ２１０、ＦＰＲＥＧレジスタ２００、およびレジスタバンク２２０の内容の他に、一つ以上の例外レジスタの内容も付加的に記憶する必要性と解釈することができる。
【００６８】
この手法が特に有用であるのは、記憶またはロードの命令を開始するコードがレジスタバンクの内容を知っていなくて、後でレジスタバンクで検索するためにレジスタバンクの内容が一時的にのみメモリに記憶される。コードがレジスタバンクの内容を知っている場合には、ＦＰＲＥＧレジスタ２００の内容もメモリに記憶する必要は無いかも知れない。レジスタバンクの内容を知らないことがあるコードの代表的な例は、コンテキストスイッチコードおよび手順呼エントリとエクジットルーチンである。
【００６９】
このような場合には、レジスタバンクの内容の他にＦＰＲＥＧレジスタ２００の内容を効率良くメモリに記憶することができる。実際、上記したように、必要に応じて他のある種のシステムレジスタも記憶することができる。
【００７０】
後続のロード命令を受けると、同様のプロセスが用いられる。したがって、ロード記憶制御ユニット４２は、奇数個のデータスロットを指定する倍精度ロード命令を受けると、ＦＰＲＥＧレジスタ２００の内容をＦＰＲＥＧレジスタ２００にロードした後、ロード命令に表されたスロット数で示されるシステムレジスタの内容、その後に偶数個のデータワードをレジスタバンク２２０の指定されたデータスロットに記憶させるように構成される。したがって、前に説明した例を考えると、ロード命令で指定されたデータスロット数が３３である場合には、ＦＰＲＥＧレジスタ２００の内容がＦＰＲＥＧレジスタ２００にロードされた後、３２個のデータスロットの内容がロードされる。同様に、ロード命令に指定されたデータスロット数が３５である場合には、上記の内容の他に、ＦＰＳＣＲレジスタ２１０の内容もＦＰＳＣＲレジスタにロードされる。最後に、指定されたデータスロット数が３７である場合には、上記の内容の他に、例外レジスタの内容もそれらの例外レジスタにロードされる。熟練した当業者には明らかなように、特定の奇数と結合された特定のオペレーションは完全に任意であり、希望に応じて変えることができる。
【００７１】
図１４は、記憶とロードの命令を実行するときに本発明の好適実施例に従うレジスタ制御−命令送出ユニット４８のオペレーションを示す流れ図である。最初に、ステップ３００で、命令に表された第一のレジスタ番号、すなわちベースレジスタとともに、データワード数（これは好適実施例ではデータスロット数と同じである）が命令から読み出される。次に、ステップ３１０で、命令が倍精度命令であるか判定される。前に説明したように、命令が倍精度命令であるか単精度命令であるかを表すので、この段階でコプロセッサはこの情報を得ることができる。
【００７２】
命令が倍精度命令である場合には、プロセスはステップ３２０に進む。ステップ３２０で、命令で指定されたワード数が奇数であるか判定される。この実施例に対して、ＦＰＲＥＧレジスタ２００の他に種々のシステムレジスタを選択的に転送するために上記の手法を使用しないものと仮定すると、ワード数が奇数である場合には、これはＦＰＲＥＧレジスタ２００の内容を転送すべきであるということを示し、これに応じてステップ３２５で、ＦＰＲＥＧレジスタ２００の内容がロード記憶制御ユニット４２により転送される。次に、ステップ３２７でワード数が１だけ減らされ。プロセスがステップ３３０に進む。ステップ３２０でワード数が偶数であると判定された場合には、プロセスは直接ステップ３３０に進む。
【００７３】
ステップ３３０で、ワード数が零より大きいか判定される。ワード数が零より大きくなければ、命令は完了したと見なされ、プロセスはステップ３４０で出る。しかし、ワード数が零より大きければ、プロセスがステップ３３２に進む。ステップ３３２で、倍精度データ値（すなわち、二つのデータスロットの内容）が第一の指定されたレジスタ番号に、またはそれから転送される。次に、ステップ３３４でワード数が２だけ減らされ、ステップ３３６でレジスタ番号が１だけ増される。前に説明したように、倍精度命令の場合、レジスタは実際には二つのデータスロットで構成されるので、レジスタカウントを１だけ増すことはデータスロット番号を２だけ増すことと同等である。
【００７４】
次に、手順はステップ３３０に戻る。ステップ３３０で、ワード数がまだ零より大きいか判定される。ワード数が零より大きければ、プロセスが繰り返される。ワード数が零に達すると、プロセスはステップ３４０で出る。
ステップ３１０で命令が倍精度命令でないと判定された場合には、プロセスはステップ３５０に進む。ステップ３５０で、ワード数が零より大きいか再び判定される。ワード数が零より大きければ、プロセスはステップ３５２に進む。ステップ３５２で、単精度データ値が命令に表された第一のレジスタ番号に、またはそれから転送される。次に、ステップ３５４で、ワード数が１だけ減らされ、ステップ３５６で、次のデータスロットを指すようにレジスタ番号カウントが１だけ増される。次に、プロセスはステップ３５０に戻る。ステップ３５０で、ワード数がまだ零より大きいか判定される。ワード数が零より大きければ、プロセスが繰り返され、ワード数が零に等しくなったときに、プロセスはステップ３６０で出る。
【００７５】
レジスタバンク内容を知らないコード、たとえば、コンテキストスイッチコードまたは手順呼エントリとエクジット系列を実行するときに、上記のアプローチにより相当な柔軟性が得られる。これらの場合には、オペレーティングシステムはレジスタの内容を知らない、そしてそれらの内容に応じてレジスタに対して異なる取り扱いをする必要が無いことが望ましい。上記のアプローチにより、奇数のデータワードを指定する単一の記憶またはロードの命令でこれらのコードルーチンを書き込むことができる。コプロセッサがレジスタ内容情報の使用を必要とする場合には、コプロセッサは命令の中のデータワードの奇数を、レジスタバンクの中のデータの内容を表すために必要とされるフォーマット情報をメモリに記憶するか、またはメモリからロードする必要性と解釈する。この柔軟性により、レジスタ内容情報を必要とするコプロセッサをサポートするための特有のオペレーティングシステムソフトウェアが不要となる。
【００７６】
この手法により、コードの中の別々のオペレーションでレジスタ内容情報をロードし、記憶する必要もなくなる。レジスタ内容情報をロードし、記憶するオプションが命令に組み込まれているので、付加的なメモリアクセスは不要となる。これにより、コード長さが短くなり、時間が多分節約される。
【００７７】
上記の手法を組み込んだ浮動小数点ユニットのアーキテクチャについて以下に説明する。
【００７８】
１．緒言
ＶＦＰｖ１はＡＲＭプロセッサモジュールと一緒に使用するためにコプロセッサとしてインプリメンテーションされるように設計された浮動小数点システム（ＦＰＳ：ｆｌｏａｔｉｎｇ  ｐｏｉｎｔ  ｓｙｓｔｅｍ）である。このアーキテクチャのインプリメンテーションはハードウェアまたはソフトウェアに特徴を組み込んでもよいし、あるいはインプリメンテーションはソフトウェアを使用することにより、機能を完全にするか、またはＩＥＥＥ７５４の適合性を提供してもよい。この仕様は、ハードウェアとソフトウェアのサポートの組み合わせを使用して全ＩＥＥＥ７５４の適合性を達成しょうとするものである。
【００７９】
二つのコプロセッサ番号はＶＦＰｖ１によって使用される。単精度オペランドのオペレーションに対して１０が使用されるのに対して、倍精度オペランドのオペレーションに対して１１が使用される。単精度データと倍精度データとの間の変換は、ソースオペランドコプロセッサ空間で動作する２個の変換命令で実行される。
【００８０】
ＶＦＰｖ１アーキテクチャの特徴には下記のものが含まれる。
【００８１】
・  サポートコードをそなえたハードウェアでのＩＥＥＥ７５４との完全な適合性。
・  各々がソースオペランドまたはデスティネーションレジスタとしてアドレス指定可能な３２個の単精度レジスタ。
・  各々がソースオペランドまたはデスティネーションレジスタとしてアドレス指定可能な１６個の倍精度レジスタ。（倍精度レジスタは物理的な単精度レジスタと重なる）。
・  ベクトルモードは浮動小数点コード密度およびロードと記憶のオペレーションとの同時作用を著しく増大する。
・  ｄｓｐ（ディジタル信号処理）と図形のオペレーションを強化するための８個の循環単精度レジスタの４個のバンクまたは４個の循環倍精度レジスタの４個のバンク。
・  非正規処理オプションはＩＥＥＥ７５４適合性（浮動小数点エミュレーションパッケージからのサポートを意図）または高速フラッシュトゥゼロ（ｆｌｕｓｈ−ｔｏ−ｚｅｒｏ）機能を選択する。
・  完全なパイプラインチェーン乗算−累算の構成で、ＩＥＥＥ７５４に適合性のある結果を生じる。
・  ＦＦＴＯＳＩＺ命令によるＣ、Ｃ＋＋、およびジャバ（Ｊａｖａ）に対する浮動小数点から整数への変換。
インプリメンテーションを行う者は完全にハードウェアでＶＦＰｖ１のインプリメンテーションを行うか、ハードウェアとサポートコードの組み合わせを利用するかを選択してもよい。ＶＦＰｖ１は完全にソフトウェアでインプリメンテーションを行ってもよい。
【００８２】
２．用語
この仕様書では以下の用語を使用する。
【００８３】
自動例外  −  それぞれの例外イネーブルビットの値にかかわらずサポートコードに常にバウンス（ｂｏｕｎｃｅ）する例外条件。どの例外が自動であるかの選択があれば、それはインプリメンテーションのオプションである。セクション１の６．例外処理を参照のこと。
バウンス（Ｂｏｕｎｃｅ）  −  ユーザトラップハンドラを呼び出すことなく、または別の仕方でユーザコードの正規のフローを遮断することなく、全面的にサポートコードにより処理される、オペレーティングシステムに報告される例外。
ＣＤＰ  −  コプロセッサデータ処理（Ｃｏｐｒｏｃｅｓｓｏｒ  Ｄａｔａ  Ｐｒｏｃｅｓｓｉｎｇ）。ＦＰＳの場合、ＣＤＰオペレーションはロードまたは記憶のオペレーションではなくて、算術オペレーションである。
【００８４】
ＣｏｎｖｅｒｔＴｏＵｎｓｉｇｎｅｄＩｎｔｅｇｅｒ（Ｆｍ）（無符号整数への変換）  −  Ｆｍの内容を無符号３２ビット整数値へ変換。結果は、最終丸めと３２ビットの無符号整数の範囲の外側の浮動小数点値の処理について、丸めモードによって左右される。浮動小数点入力値が負または３２ビットの無符号整数に対して大き過ぎる場合には、ＩＮＶＡＬＩＤ例外が可能である。
ＣｏｎｖｅｒｔＴｏＳｉｇｎｅｄＩｎｔｅｇｅｒ（Ｆｍ）（符号つき整数への変換）  −  Ｆｍの内容を符号つき３２ビット整数値へ変換。結果は、最終丸めと３２ビットの符号つき整数の範囲の外側の浮動小数点値の処理について、丸めモードによって左右される。浮動小数点入力値が３２ビットの符号つき整数に対して大き過ぎる場合には、ＩＮＶＡＬＩＤ例外が可能である。
ＣｏｎｖｅｒｔＵｎｓｉｇｎｅｄＩｎｔＴｏＳｉｎｇｌｅ／Ｄｏｕｂｌｅ（Ｒｄ）（無符号整数を単／倍へ変換）  −  ３２ビットの無符号整数と解釈されたＡＲＭレジスタの内容（Ｒｄ）を単精度または倍精度の浮動小数点値に変換。デスティネーション精度が単精度であれば、変換オペレーションでＩＮＥＸＡＣＴ例外が可能である。
ＣｏｎｖｅｒｔＳｉｇｎｅｄＩｎｔＴｏＳｉｎｇｌｅ／Ｄｏｕｂｌｅ（Ｒｄ）（符号つき整数を単／倍へ変換）  −  ３２ビットの符号つき整数と解釈されたＡＲＭレジスタの内容（Ｒｄ）を単精度または倍精度の浮動小数点値に変換。デスティネーション精度が単精度であれば、変換オペレーションでＩＮＥＸＡＣＴ例外が可能である。
【００８５】
非正規化値  −  範囲（−２Emin＜ｘ＜２Emin）での値の表現。単精度と倍精度のオペランドに対するＩＥＥＥ７５４フォーマットでは、非正規化値すなわちｄｅｎｏｒｍａｌは零指数をそなえ、先行シグニフィカンド（ｓｉｇｎｉｆｉｃａｎｄ）ビットは１ではなくて、０である。ＩＥＥＥ７５４−１９８５の仕様では、非正規化オペランドの生成と操作は正規オペランドの場合と同じ精度で行わなければならない。
ディスエーブルド（Ｄｉｓａｂｌｅｄ）例外  −  ＦＰＳＣＲの中の対応する例外イネーブルビットが０に設定された例外は「ディスエーブルド」（ｄｉｓａｂｌｅｄ）と呼ばれる。これらの例外の場合、ＩＥＥＥ７５４仕様は正しい結果を返すように定める。例外条件を発生するオペレーションは、サポートコードにバウンスして、ＩＥＥＥ７５４で定められた結果を生じる。例外はユーザ例外ハンドラに報告されない。
イネーブルド（Ｅｎａｂｌｅｄ）例外  −  それぞれの例外イネーブルビットが１に設定された例外。この例外の生起の際に、ユーザハンドラへのトラップが行われる。例外条件を生成するオペレーションはサポートコードにバウンスすることにより、ＩＥＥＥ７５４で定められた結果を生じる。次に、例外はユーザ例外ハンドラに報告される。
【００８６】
指数  −  表現された数の値を判定する際に２の整数乗を通常表す浮動小数点の成分。時々、指数は符号つきまたは不偏の指数と呼ばれる。
小数部  −  その暗示された２進小数点の右側にあるシグニフィカンドのフィールド。
フラッシュ−トゥー−ゼロモード  −  このモードでは、丸めの後の範囲（−２Emin＜ｘ＜２Emin）のすべての値は非正規化された値に変換されるのではなくて、零として扱われる。
高（Ｆｎ／Ｆｍ）  −  メモリで表現された倍精度の上位３２ビット［６３：３２］。
【００８７】
ＩＥＥＥ７５４−１９８５  −  アメリカ電気電子学会、「２進浮動小数点演算のＩＥＥＥ規格」（”ＩＥＥＥ  Ｓｔａｎｄａｒｄ  ｆｏｒ  Ｂｉｎａｒｙ  Ｆｌｏａｔｉｎｇ−Ｐｏｉｎｔ  Ａｒｉｔｈｍｅｔｉｃ”，ＡＮＳＩ／ＩＥＥＥＳｔｄ  ７５４−１９８５，Ｔｈｅ  Ｉｎｓｔｉｔｕｔｅ  ｏｆ  Ｅｌｅｃｔｒｉｃａｌ  ａｎｄ  Ｅｌｅｃｔｒｏｎｉｃｓ  Ｅｎｇｉｎｅｅｒｓ，Ｉｎｃ．Ｎｅｗ  Ｙｏｒｋ，１００１７）。しばしばＩＥＥＥ７５４規格と呼ばれるこの規格は、データ型、正しいオペレーション、例外の型と処理、および浮動小数点システムに対するエラー範囲を定める。ほとんどのプロセッサは、ハードウェアまたはハードウェアとソフトウェアとの組み合わせの規格に従って構築される。
無限大  −  ∞を表現するために使用されるＩＥＥＥ７５４の特殊フォーマット。指数が精度に対して最大となり、シグニフィカンドはオール零となる。
入力例外  −  与えられたオペレーションに対するオペランドの一つ以上がハードウェアによってサポートされない例外条件。オペレーションの完了のために、オペレーションはサポートコードにバウンスする。
【００８８】
中間結果  −  丸めの前に計算の結果を記憶するために使用される内部フォーマット。このフォーマットは、デスティネーションフォーマットより大きな指数フィールドとシグニフィカンドフィールドをそなえ得る。
低（Ｆｎ／Ｆｍ）  −  メモリで表現された倍精度の下位３２ビット［３１：０］。
ＭＣＲ  −  ”Ｍｏｖｅ  ｔｏ  Ｃｏｐｒｏｃｅｓｓｏｒ  ｆｒｏｍ  ＡＲＭＲｅｇｉｓｔｅｒ”（ＡＲＭレジスタからコプロセッサへ移動）。ＦＰＳの場合、これには、ＡＲＭレジスタとＦＰＳレジスタとの間でデータの転送またはレジスタの制御を行う命令が含まれる。単一のＭＣＲクラス命令を使用して、情報の３２ビットだけを転送してもよい。
【００８９】
ＭＲＣ  −  ”Ｍｏｖｅ  ｔｏ  ＡＲＭ  Ｒｅｇｉｓｔｅｒ  ｆｒｏｍ  Ｃｏｐｒｏｃｅｓｓｏｒ”（コプロセッサからＡＲＭレジスタへ移動）。ＦＰＳの場合、これには、ＦＰＳとＡＲＭレジスタとの間でデータの転送またはレジスタの制御を行う命令が含まれる。単一のＭＣＲクラス命令を使用して、情報の３２ビットだけを転送してもよい。
ＮａＮ  −  Ｎｏｔ  ａ  ｎｕｍｂｅｒ  （数ではない）。浮動小数点フォーマットで符号化された記号存在。二つの型のＮａＮ、シグナリングとノンシグナリング、すなわち静止とがある。シグナリングＮａＮは、オペランドとして使用された場合、無効オペランド例外を生じる。静止ＮａＮは、シグナリング例外無しに殆どすべての算術オペレーションを通って伝搬する。ＮａＮに対するフォーマットは、シグニフィカンドが非零である、すべて１の指数フィールドをそなえている。シグナリングＮａＮを表現するために、小数部の最上位ビットが０であるのに対して、静止ＮａＮは１に設定されたビットをそなえている。
【００９０】
Ｒｅｓｅｒｖｅｄ  （リザーブド）  −  制御レジスタまたは命令フォーマットの中のフィールドは、そのフィールドがインプリメンテーションによって定義されるべき場合に「リザーブド」となる。フィールドの内容が０でない場合には、予測不能の（ＵＮＰＲＥＤＩＣＴＡＢＬＥ）結果を生じる。これらのフィールドは、アーキテクチャの将来の拡張で使用するために取って置かれる。すなわち、インプリメンテーション特有のものである。インプリメンテーションによって使用されない、すべてのリザーブドビットは零と書かれなければならず、零と読まれる。
【００９１】
丸めモード  −  ＩＥＥＥ７５４仕様では、すべての計算をあたかも無限の精度までのように行うことが要求されている。すなわち、二つの単精度値の乗算では、シグニフィカンドのビット数の２倍までシグニフィカンドを正確に計算しなければならない。デスティネーション精度でこの値を表現するために、シグニフィカンドの丸めが、しばしば必要とされる。ＩＥＥＥ７５４規格では、四つの丸めモードが指定されている。すなわち、最も近いものへの丸め（ＲＮ：ｒｏｕｎｄ  ｔｏ  ｎｅａｒｅｓｔ）、零への丸め、すなわち（ＲＺ：ｒｏｕｎｄ  ｔｏｚｅｒｏ）、プラス無限大への丸め（ＲＰ：ｒｏｕｎｄ  ｔｏ  ｐｌｕｓ  ｉｎｆｉｎｉｔｙ）、およびマイナス無限大への丸め（ＲＭ：ｒｏｕｎｄ  ｔｏ  ｍｉｎｕｓ  ｉｎｆｉｎｉｔｙ）である。第一の丸めは、真ん中の点で丸めることによって行われ、真ん中の場合、シグニフィカンドの最下位ビットを零にするときは切り上げて「丁度」にする。第二の丸めは、シグニフィカンドの右側のどのビットも事実上切り捨てる。このように、第二の丸めは常に切り捨てを行い、整数変換でＣ、Ｃ＋＋、およびジャバ（Ｊａｖａ）言語により使用される。後の二つのモードは区間演算で使用される。
【００９２】
シグニフィカンド  −  暗示された２進小数点の左側の明示されるか暗示された先行ビットと右側の小数部フィールドで構成される２進浮動小数点数の成分。
【００９３】
サポートコード  −  ハードウェアを補足することによりＩＥＥＥ７５４規格との適合性が得られるように使用されなければならないソフトウェア。サポートコードは二つの成分をそなえるように考えられている。一つの成分はルーチンのライブラリである。ルーチンは、超越的な演算のような、ハードウェアの範囲を超えるオペレーション、およびサポートされない入力での除算または例外を生じ得る入力のようなサポートされた機能を行う。もう一つの成分は例外ハンドラのセットである。例外ハンドラはＩＥＥＥ７５４に従うようにするために例外条件を処理する。サポートコードは、サポートされないデータ型またはデータ表現（たとえば、非正規値または１０進データ型）の適切な処理のエミュレーションを行うために、インプリメンテーションされた機能を実行しなければならない。ルーチンの出口でユーザの状態を復帰させるように配慮されていれば、ＦＳＰを中間の計算で利用するようにルーチンを書いてもよい。
【００９４】
トラップ  −  それぞれの例外イネーブルビットがＦＰＳＣＲに設定された例外条件。ユーザのトラップハンドラが実行される。
未定義（ＵＮＤＥＦＩＮＥＤ）  −  未定義の命令トラップを生成する命令を示す。ＡＲＭ例外についての更に詳しい情報については、ＡＲＭアーキテクチャのレファレンスマニュアルを参照のこと。
予測不能（ＵＮＰＲＥＤＩＣＴＡＢＬＥ）  −  頼ることができない命令または制御レジスタのフィールド値の結果。予測不能（ＵＮＰＲＥＤＩＣＴＡＢＬＥ）な命令または結果は、セキュリティホールを表現してはならないし、プロセッサまたはシステムのどの部分をも停止させてはならない。
【００９５】
サポートされないデータ（Ｕｎｓｕｐｐｏｒｔｅｄ  Ｄａｔａ）  −  ハードウェアによって処理されないが、完了のためサポートコードにバウンドされる特定のデータ値。これらのデータは無限大、ＮａＮ、非正規値、および零を含んでもよい。インプリメンテーションは、ハードウェアで全面的または部分的にこれらの値の中のどれをサポートするかを自由に選択し、あるいはオペレーションを完了するためにサポートコードからの助けを必要とする。例外に対する対応する例外イネーブルビットが設定されれば、サポートされないデータを処理することによって生じるいかなる例外もユーザコードにトラップされる。
【００９６】
３．レジスタファイル
【００９７】
３．１  緒言
このアーキテクチャは３２個の単精度レジスタと１６個の倍精度レジスタを提供する。これらはすべて、ソースまたはデスティネーションのオペランドとして、完全に定義された５ビットのレジスタインデックスの中で個々にアドレス指定することができる。
【００９８】
３２個の単精度レジスタは１６個の倍精度レジスタと重なる。すなわち、Ｄ５への倍精度データの書き込みはＳ１０とＳ１１の内容の上書きである。オーバラップしたインプリメンテーションで単精度データ記憶装置としてのレジスタの使用と倍精度データ記憶装置の半分としてのレジスタの使用との間のレジスタ使用の衝突に気がつくことが、コンパイラまたはアセンブリ言語のプログラマの仕事である。レジスタの使用を一つの精度に限定するためのハードウェアは設けられていない。これに違反した場合には、結果は予測不能（ＵＮＰＲＥＤＩＣＴＡＢＬＥ）である。
【００９９】
ＶＦＰｖ１は、１個、２個、または３個のオペランドレジスタを使用して結果を作成し、結果をデスティネーションレジスタに書き込むスカラモードで、または指定されたオペランドが１群のレジスタを参照するベクトルモードで、これらのレジスタへのアクセスを提供する。ＶＦＰｖ１は、単精度オペランドの場合は単一の命令で８個までの要素について、そして倍精度オペランドの場合は４個までの要素についてベクトルオペレーションをサポートする。
【０１００】
0003969895.tif 000002
【０１０１】
ベクトルモードは、非零値をＬＥＮフィールドに書き込むことによってイネーブルされる。ＬＥＮフィールドに０が含まれている場合には、ＦＰＳはスカラモードで動作し、レジスタフィールドはフラットレジスタモデルで３２個の個々の単精度レジスタまたは１６個の倍精度レジスタをアドレス指定するものと解釈される。ＬＥＮフィールドが非零である場合には、ＦＰＳはベクトルモードで動作し、レジスタフィールドはレジスタのベクトルをアドレス指定するものと解釈される。ＬＥＮフィールドの符号化については、表１参照。
【０１０２】
ＬＥＮフィールドを変えることなくスカラオペレーションとベクトルオペレーションとを混合する手段は、デスティネーションレジスタの指定により利用できる。デスティネーションレジスタがレジスタの第一のバンク（Ｓ０−Ｓ７またはＤ０−Ｄ３）にある場合には、ベクトルモードにある間にスカラオペレーションを指定してもよい。更に詳しい情報についてはセクション１を参照のこと。
【０１０３】
３．２  単精度レジスタの使用
ＦＰＳＣＲのＬＥＮフィールドが０である場合には、Ｓ０からＳ３１と番号を付けられた３２個の単精度レジスタが利用できる。どのレジスタもソースレジスタまたはデスティネーションレジスタとして使用することができる。
【０１０４】
【外１】
0003969895.tif 000003
イラスト１  単精度レジスタマップ
【０１０５】
単精度（コプロセッサ１０）のレジスタマップは、イラスト１に示すように描くことができる。
【０１０６】
ＦＰＳＣＲのＬＥＮフィールドが０より大きい場合には、イラスト２に示すように、レジスタファイルは８個の循環レジスタの４個のバンクとして振る舞う。ベクトルレジスタの第一のバンクＶ０からＶ７はスカラレジスタＳ０からＳ７と重なり、各オペランドに対して選択されたレジスタに応じてスカラまたはベクトルとしてアドレス指定される。より詳しい情報については、セクション１、３．４  レジスタの使用を参照のこと。
【０１０７】
【外２】
0003969895.tif 000004
イラスト２  単精度レジスタの循環
【０１０８】
たとえば、ＦＰＳＣＲのＬＥＮが３に設定されている場合には、参照ベクトルＶ１０がレジスタＳ１０、Ｓ１１、Ｓ１２、およびＳ１３をベクトルオペレーションに含める。同様に、Ｖ２２はＳ２２、Ｓ２３、Ｓ１６、およびＳ１７をオペレーションに含める。ベクトルモードでレジスタファイルがアクセスされると、順序でＶ７に続くレジスタはＶ０である。同様に、Ｖ８がＶ１５に続き、Ｖ１６がＶ２３に続き、Ｖ２４がＶ３１に続く。
【０１０９】
３．３  倍精度レジスタの使用
ＦＰＳＣＲのＬＥＮフィールドが０である場合には、１６個の倍精度スカラレジスタが利用できる。
【０１１０】
【外３】
0003969895.tif 000005
イラスト３  倍精度レジスタのマップ
【０１１１】
どのレジスタもソースレジスタまたはデスティネーションレジスタとして使用することができる。レジスタマップは、イラスト３に示すように描くことができる。
【０１１２】
ＦＰＳＣＲのＬＥＮフィールドが０より大きい場合には、イラスト４に示すように、４個の循環レジスタの４個のバンクでは、４個のスカラレジスタと１６個のベクトルレジスタが利用できる。ベクトルレジスタの第一のバンクＶ０からＶ３はスカラレジスタＤ０からＤ３と重なる。各オペランドに対して選択されたレジスタに応じてスカラまたはベクトルとしてアドレス指定される。より詳しい情報については、セクション１、３．４  レジスタの使用を参照のこと。
【０１１３】
【外４】
0003969895.tif 000006
イラスト４  倍精度レジスタの循環
【０１１４】
セクション１の単精度の例と同様に、４個のバンクの中で倍精度レジスタが循環している。
【０１１５】
３．４  レジスタの使用
スカラとベクトルとの間のこれらのオペレーションがサポートされる。（ＯＰ2は浮動小数点コプロセッサによってサポートされる二つのオペランドオペレーションのどれであってもよい。ＯＰ3は三つのオペランドオペレーションのどれであってもよい。）
【０１１６】
以下の説明では、レジスタファイルの「第一のバンク」は、単精度のオペレーションの場合はレジスタＳ０−Ｓ７、倍精度のオペレーションの場合はＤ０−Ｄ３と定められる。
【０１１７】
・  ＳｃａｌａｒＤ＝ＯＰ2ＳｃａｌａｒＡ  または  ＳｃａｌａｒＤ＝ＳｃａｌａｒＡ  ＯＰ3ＳｃａｌａｒＢ  または  ＳｃａｌａｒＤ＝ＳｃａｌａｒＡ＊ＳｃａｌａｒＢ＋ＳｃａｌａｒＤ
・  ＶｅｃｔｏｒＤ＝ＯＰ2ＳｃａｌａｒＡ  または  ＶｅｃｔｏｒＤ＝ＳｃａｌａｒＡ  ＯＰ3ＶｅｃｔｏｒＢ  または  ＶｅｃｔｏｒＤ＝ＳｃａｌａｒＡ＊ＶｅｃｔｏｒＢ＋ＶｅｃｔｏｒＤ
・  ＶｅｃｔｏｒＤ＝ＯＰ2ＶｅｃｔｏｒＡ  または  ＶｅｃｔｏｒＤ＝ＶｅｃｔｏｒＡ  ＯＰ3ＶｅｃｔｏｒＢ  または  ＶｅｃｔｏｒＤ＝ＶｅｃｔｏｒＡ＊ＶｅｃｔｏｒＢ＋ＶｅｃｔｏｒＤ
【０１１８】
３．４．１  スカラオペレーション
二つの条件で、ＦＰＳがスカラモードで動作する。
【０１１９】
１？  ＦＰＳＣＲのＬＥＮフィールドが０である。デスティネーションレジスタとソースレジスタは単精度オペレーションの場合にはスカラレジスタ０から３１のどれであってもよく、倍精度オペレーションの場合にはスカラレジスタ０から１５のどれであってもよい。命令で明示的に指定されたレジスタ上でだけ、オペレーションが行われる。
【０１２０】
２？  デスティネーションレジスタは、レジスタファイルの第一のバンク内にある。ソーススカラは他のレジスタのどれであってもよい。このモードによって、ＦＰＳＣＲのＬＥＮフィールドを変える必要無しにスカラオペレーションとベクトルオペレーションとの混合が可能になる。
【０１２１】
３．４．２  ベクトルデスティネーションとともにスカラとベクトルのソースを含むオペレーション
このモードで動作するために、ＦＰＳＣＲのＬＥＮフィールドは零より大きく、デスティネーションレジスタはレジスタファイルの第一のバンクの中に無い。スカラソースレジスタはレジスタファイルの第一のバンクの中のどのレジスタであってもよいが、ＶｅｃｔｏｒＢに対しては残りのレジスタのどれであってもよい。ソーススカラレジスタがＶｅｃｔｏｒＢのメンバである場合、またはＬＥＮ個より少ない要素でＶｅｃｔｏｒＤがＶｅｃｔｏｒＢと重なる場合には、振る舞いは予測不能（ＵＮＰＲＥＤＩＣＴＡＢＬＥ）である。ＶｅｃｔｏｒＤとＶｅｃｔｏｒＢは同じベクトルであるか、またはすべてのメンバで完全に異なっていなければならない。セクション１の概括表参照。
【０１２２】
３．４．３  ベクトルオペレーションだけを含むオペレーション
このモードで動作するために、ＦＰＳＣＲのＬＥＮフィールドは零より大きく、デスティネーションベクトルレジスタはレジスタファイルの第一のバンクの中に無い。ＶｅｃｔｏｒＡの個々の要素はＶｅｃｔｏｒＢの対応する要素と組合わされて、ＶｅｃｔｏｒＤに書き込まれる。ＶｅｃｔｏｒＡに対してはレジスタファイルの第一のバンクの中に無いどのレジスタも利用できるが、ＶｅｃｔｏｒＢに対してはすべてのベクトルが利用できる。第二の場合のように、ソースベクトルのどちらかとデスティネーションベクトルがＬＥＮより少ない個数の要素で重なる場合には、振る舞いは予測不能（ＵＮＰＲＥＤＩＣＴＡＢＬＥ）である。それらは同じであるか、またはすべてのメンバで完全に異なっていなければならない。セクション１の概括表参照。
【０１２３】
注意すべきことは、ＦＭＡＣファミリのオペレーションについては、デスティネーションレジスタまたはベクトルは常に累算レジスタまたはベクトルである。
【０１２４】
３．４．４  オペレーション概括表
次の表は、単精度と倍精度の、オペランドが２個と３個の命令に対するレジスタ使用オプションを表す。「任意」は、指定されたオペランドに対する、その精度のすべてのレジスタの利用可能性を意味する。
【０１２５】
0003969895.tif 000007
【０１２６】
0003969895.tif 000008
【０１２７】
0003969895.tif 000009
【０１２８】
0003969895.tif 000010
【０１２９】
４．命令セット
ＦＰＳ命令は三つのカテゴリーに分けることができる。
・  ＭＣＲとＭＲＣ  −  ＡＲＭとＦＰＳとの間の転送オペレーション
・  ＬＤＣとＳＴＣ  −  ＦＰＳとメモリとの間のロードと記憶のオペレーション
・  ＣＤＰ  −  データ処理オペレーション
【０１３０】
４．１  命令の同時実行性
ＦＰＳのアーキテクチャの仕様の意図は二つのレベル、すなわちパイプライン状の機能ユニットとＣＤＰ機能による並列のロード／記憶オペレーションでの同時実行性である。現在処理しているオペレーションと並列に実行するためにこれらのオペレーションに対するレジスタ依存性を持たないロードと記憶のオペレーションをサポートすることにより、著しい性能上の利点が得られる。
【０１３１】
４．２  命令の直列化
ＦＰＳは、現在実行しているすべての命令が完了して、各々の例外ステータスがわかるまで、ＦＰＳがＡＲＭをビジー待ち合わせさせる単一の命令を指定する。例外が生じている場合には、直列化命令は中断され、ＡＲＭで例外処理が始まる。ＦＰＳの中の直列化命令は次の通りである。
・  ＦＭＯＶＸ  −  浮動小数点システムレジスタに対する読み出しまたは書き込み
【０１３２】
現在の命令が完了するまで、浮動小数点システムレジスタに対するいかなる読み出しまたは書き込みも停止される。システムＩＤレジスタに対するＦＭＯＶＸ（ＦＰＳＩＤ）は、先行する浮動小数点命令によって生じた例外をトリガする。ユーザステータス−制御レジスタ（ＦＰＳＣＲ）上で（ＦＭＯＶＸを使用して）読み出し／修正／書き込みを行うことを使用して、例外ステータスビットをクリアすることができる（ＦＰＳＣＲ［４：０］）。
【０１３３】
４．３  整数データを含む変換
浮動小数点データと整数データとの間の変換は、整数データを含むデータ転送命令と変換を行うＣＤＰ命令とで構成されるＦＰＳの二段階のプロセスである。整数フォーマットのままＦＰＳレジスタで整数データに対して何か算術オペレーションを試みると、結果は予測不能（ＵＮＰＲＥＤＩＣＴＡＢＬＥ）であり、このようなオペレーションはどれも避けるべきである。
【０１３４】
４．３．１  整数データからＦＰＳレジスタ内の浮動小数点データへの変換
ＭＣＲのＦＭＯＶＳ命令を使用して、どちらかのＡＲＭレジスタから整数データを浮動小数点単精度レジスタにロードすることができる。このとき、整数−浮動のファミリのオペレーションにより、ＦＰＳレジスタ内の整数データを単精度または倍精度の浮動小数点値に変換して、デスティネーションのＦＰＳレジスタに書き込むことができる。整数値がもはや必要とされない場合には、デスティネーションレジスタはソースレジスタであってもよい。整数は符号つきまたは符号無しの３２ビットの数とすることができる。
【０１３５】
４．３．２  ＦＰＳレジスタ内の浮動小数点データから整数データへの変換
浮動−整数ファミリの命令により、ＦＰＳの単精度または倍精度のレジスタの中の値を符号つきまたは符号無しの３２ビットの整数フォーマットに変換することができる。結果の整数は単精度のデスティネーションレジスタに入れられる。ＭＲＣのＦＭＯＶＳ命令を使用して、整数データをＡＲＭレジスタに記憶することができる。
【０１３６】
４．４  レジスタファイルのアドレス指定
単精度スペース（Ｓ＝０）でオペレーションを行う命令は、オペランドアクセスに対して命令フィールドで利用できる５ビットを使用する。上位の４ビットはＦｎ、Ｆｍ、またはＦｄと表されたオペランドフィールドに入っている。アドレスの最下位ビットはそれぞれＮ、Ｍ、またはＤの中にある。
【０１３７】
倍精度スペース（Ｓ＝１）で動作する命令はオペランドアドレスの上位４ビットだけを使用する。これらの４ビットはＦｎ、Ｆｍ、およびＦｄのフィールドに入っている。対応するオペランドフィールドにオペランドアドレスが入っているとき、Ｎ、Ｍ、およびＤビットに０が入っていなければならない。
【０１３８】
４．５  ＭＣＲ（ＡＲＭレジスタからコプロセッサへの移動）
ＭＣＲオペレーションには、ＦＰＳによるＡＲＭレジスタ内のデータの転送または使用が含まれる。これには、ＡＲＭレジスタから単精度フォーマットでのデータの移動または一対のＡＲＭレジスタからＦＰＳレジスタへの倍精度フォーマットでのデータの移動、ＡＲＭレジスタから単精度ＦＰＳレジスタへの符号つきまたは符号無しの整数値のロード、および制御レジスタへのＡＲＭレジスタの内容のロードが含まれる。
【０１３９】
ＭＣＲ命令に対するフォーマットがイラスト５に示されている。
【外５】
0003969895.tif 000011
イラスト５  ＭＣＲ命令のフォーマット
【０１４０】
0003969895.tif 000012
0003969895.tif 000013
【０１４１】
0003969895.tif 000014
【０１４２】
注：３２ビットのデータオペレーションだけがＦＭＯＶ［Ｓ，ＨＤ，ＬＤ］命令によってサポートされる。
【０１４３】
ＡＲＭレジスタまたは単精度レジスタの中のデータだけがＦＭＯＶＳオペレーションによって移動される。２個のＡＲＭレジスタから倍精度オペランドを転送するために、ＦＭＯＶＬＤ命令とＦＭＯＶＨＤ命令が下位半分と上位半分とをそれぞれ移動させる。
【０１４４】
４．６  ＭＲＣ（コプロセッサからＡＲＭレジスタへの移動／浮動レジスタの比較）
ＭＲＣオペレーションには、ＦＰＳレジスタのデータのＡＲＭレジスタへの転送が含まれる。これには、単精度値、または浮動小数点値の整数への変換結果を一つのＡＲＭレジスタへ移動すること、あるいは倍精度ＦＰＳレジスタを２個のＡＲＭレジスタへ移動することと、前の浮動小数点比較オペレーションの結果によりＣＰＳＲのステータスビットを修正することが含まれる。
ＭＲＣ命令のフォーマットがイラスト６に示されている。
【０１４５】
【外６】
0003969895.tif 000015
イラスト６  ＭＲＣ命令のフォーマット
【０１４６】
0003969895.tif 000016
0003969895.tif 000017
【０１４７】
＊ＦＭＯＶＸ  ＦＰＳＣＲ命令の場合、ＲｄフィールドにＲ１５（１１１１）が入っている場合、ＣＰＳＲの上位４ビットは結果の条件コードで更新される。
【０１４８】
0003969895.tif 000018
【０１４９】
注：ＭＣＲ  ＦＭＯＶ命令の注参照。
【０１５０】
４．７  ＬＤＣ／ＳＴＣ（ロード／記憶ＦＰＳレジスタ）
ＬＤＣとＳＴＣオペレーションはＦＰＳとメモリとの間のデータ転送を行う。浮動小数点データは単一データ転送または多重データ転送でどちらかの精度で転送することができる。この際、ＡＲＭアドレスレジスタは更新されるか、または変化しないままとされる。移動多重オペーションでのデータ構造に対する多重オペランドアクセスとともに、満杯の降順スタックと空き昇順スタックがともにサポートされる。ＬＤＣとＳＴＣに対する種々のオプションの説明については表１１参照。
ＬＤＣとＳＴＣの命令のフォーマットがイラスト７に示されている。
【０１５１】
【外７】
0003969895.tif 000019
イラスト７  ＬＤＣ／ＳＴＣ命令のフォーマット
【０１５２】
0003969895.tif 000020
0003969895.tif 000021
【０１５３】
４．７．１  ロードと記憶のオペレーションについての一般的な注意
多重レジスタのロードと記憶は、ベクトルオペレーションが使用する４個または８個のレジスタ境界を横切るラッピングなしに、レジスタファイルを通って線形に行われる。
レジスタファイルの端を通り越してロードしようとすることは予測不能（ＵＮＰＲＥＤＩＣＴＡＢＬＥ）である。
【０１５４】
二重ロードまたは多重記憶に対するオフセットに奇数のレジスタカウント１７以下が入っている場合には、インプリメンテーションはもう一つの３２ビットのデータ項目を書き込んだり、もう一つの３２ビットのデータ項目を読み出したりしてもよいが、そうする必要は無い。付加的なデータ項目を使用して、ロードされたり記憶されたりするときのレジスタの内容を識別することができる。これは、レジスタファイルフォーマットがその精度に対するＩＥＥＥ７５４のフォーマットと異なり、各レジスタがメモリ内でそれを識別するために必要な型情報をそなえているインプリメンテーションで有用である。オフセットが奇数で、数が単精度レジスタの数より大きい場合には、これを使用して、レジスタのコンテキストスイッチとすべてのシステムレジスタを起動してもよい
【０１５５】
0003969895.tif 000022
Ｒｎの実行開始アドレスから多重レジスタのロード／記憶、とＲｎの修飾無し。レジスタ数は、単精度の場合には１から１６個、倍精度の場合には１から８個とすることができる。オフセットフィールドには、３２ビットの転送数が入っている。このモードを使用して、グラフィックオペレーションに対する変換マトリックスおよび変換に対する点をロードすることができる。
例：
ＦＬＤＭＥＱＳ  ｒ１２，｛ｆ８−ｆ１１｝はｒ１２のアドレスからの４個の単精度データを４個の浮動小数点レジスタにロードする。ｓ８、ｓ９、ｓ１０、およびｒ１２は変化しない。
ＦＳＴＭＥＱＤ  ｒ４，｛ｆ０｝はｄ０からの一つの倍精度データをｒ４のアドレスに記憶する。ｒ４は変化しない。
型１転送：Ｒｎのポストインデックスとライトバックを使用して多重をロード／記憶する。
0003969895.tif 000023
Ｒｎの実行開始アドレスから多重レジスタのロード／記憶、とＲｎへの最後の転送の後に次のアドレスのライトバック。オフセットフィールドは３２ビットの転送数である。ＲｎへのライトバックはＯｆｆｓｅｔ＊４である。多重ロードで転送される最大ワード数は１６である。Ｕビットは１に設定しなければならない。これは、空きの昇順スタックに記憶するためか満杯の降順スタックからロードするため、または変換された点を記憶してポインタを次の点に歩進するため、そして多重データをフィルタオペレーションにロードし、記憶するために、使用される。
例：
ＦＬＤＭＥＱＩＡＳ  ｒ１３！，｛ｆ１２−ｆ１５｝はｒ１３のアドレスから４個の浮動小数点レジスタｓ１２、ｓ１３、ｓ１４、およびｓ１５にロードし、系列の次のデータを指すアドレスでｒ１３を更新する。
型２転送：プリインデックスまたはＲｎを使用し、ライトバック無しで一つのレジスタをロード／記憶する。
0003969895.tif 000024
Ｒｎのアドレスのプリインクリメントを使用し、ライトバック無しで、単一のレジスタをロード／記憶する。オフセット値はＯｆｆｓｅｔ＊４であり、加算（Ｕ＝１）またはＲｎから減算（Ｕ＝０）されて、アドレスを生成する。これは構造体へのオペランドアクセスに対して有用であり、浮動小数点データのためメモリにアクセスするために使用される代表的な方法である。
例：
ＦＳＴＥＱＤ  ｆ４，［ｒ８，＃＋８］は３２（８＊４）だけオフセットされたｒ８のアドレスから倍精度データをｄ４に記憶する。ｒ８は変化しない。
型３転送：プリインデックスとライトバックを使用して多重レジスタをロード／記憶する。
0003969895.tif 000025
Ｒｎのアドレスのプリデクリメントと新しい目的アドレスで多重レジスタをＲｎへロード／記憶。オフセットフィールドには３２ビットの転送数が入っている。ライトバック値はＲｎから減算されるＯｆｆｓｅｔ＊４である。このモードは、満杯の降順スタックに記憶するため、または空きの昇順スタックからロードするために、使用される。
例：
ＦＳＴＭＥＱＤＢＳ  ｒ９！，｛ｆ２７−ｆ２９｝は、ｒ９に入っている最後のエントリアドレスでｓ２７、ｓ２８、およびｓ２９からの３個の単精度データを空きの降順スタックに記憶する。ｒ９は新しい最後のエントリへの点に更新される。
【０１５６】
４．７．２  ＬＤＣ／ＳＴＣオペレーションのまとめ
表１２は、ＬＤＣ／ＳＴＣオペレーションコードのＰ、Ｗ、およびＵビットに対して許容できる組み合わせ、および妥当な各オペレーションに対するオフセットフィールドの機能を表にしたものである。
【０１５７】
0003969895.tif 000026
【０１５８】
４．８  ＣＤＰ（コプロセッサデータ処理）
ＣＤＰ命令には、浮動小数点レジスタファイルからのオペランドを含み、レジスタファイルにライトバックされる結果を生じる、すべてのデータ処理オペレーションが含まれている。特に関心があるのは、ＦＭＡＣ（乗算−累積連鎖）オペレーション、オペランドの中の二つに乗算を行い、第三のオペランドを加算するオペレーションである。このオペレーションは、積に対してＩＥＥＥ丸めオペレーションを行った後、第三のオペランドの加算を行うという点で、融合された乗算−累積オペレーションと異なる。これにより、ジャバ（Ｊａｖａ）コードはＦＭＡＣオペレーションを利用することにより、別々に乗算した後、加算を行うオペレーションに比べて、乗算−累積オペレーションの速度を早くすることができる。
【０１５９】
ＣＤＰグループの二つの命令は、ＦＰＳレジスタ内の浮動小数点値をその整数値に変換する際に有用である。ＦＦＴＯＵＩ［Ｓ／Ｄ］は、ＦＰＳＣＲ内で現在の丸めモードを使用して、単精度または倍精度の内容をＦＰＳレジスタ内の符号無し整数に変換する。ＦＦＴＯＵＩ［Ｓ／Ｄ］は、符号つき整数への変換を行う。ＦＦＴＯＵＩＺ［Ｓ／Ｄ］とＦＦＴＯＳＩＺ［Ｓ／Ｄ］は同じ機能を行うが、変換に対するＦＰＳＣＲ丸めモードを無視し、小数部のビットを切り捨てる。ＦＦＴＯＳＩＺ［Ｓ／Ｄ］の機能は、浮動小数点から整数への変換において、Ｃ、Ｃ＋＋、およびジャバ（Ｊａｖａ）が必要とする。ＦＦＴＯＳＩＺ［Ｓ／Ｄ］命令はこの機能を提供し、変換に対してＦＰＳＣＲからＲＺへの丸めモードビットの調整を必要としない。変換のためのサイクルカウントはＦＦＴＯＳＩＺ［Ｓ／Ｄ］オペレーションのサイクルカウントだけとなり、４サイクルから６サイクルが節約される。
【０１６０】
比較オペレーションは、ＣＤＰＣＭＰ命令とその後のＭＲＣ  ＦＭＯＶＸ  ＦＰＳＣＲ命令を使用して、結果のＦＰＳフラグビットの付いたＡＲＭ  ＣＰＳＲフラグビットをロードすることにより、行われる。比較オペランドの一つがＮａＮである場合には、ＩＮＶＡＬＩＤ例外に対する可能性がある状態と無い状態とで、比較オペレーションが提供される。比較オペランドの一つがＮａＮである場合には、ＦＣＭＰＥとＦＣＭＰＥ０とが例外を伝えている間に、ＦＣＭＰとＦＣＭＰ０とはＩＮＶＡＬＩＤを伝えない。ＦＣＭＰ０とＦＣＭＰＥ０とはＦｍフィールドの中のオペランドを０と比較し、これに応じてＦＰＳフラグを設定する。ＡＲＭフラグＮ、Ｚ、Ｃ、およびＶは、ＦＭＯＶＸ  ＦＰＳＣＲオペレーションの後で次のように定義される。
【０１６１】
Ｎ  より小さい
Ｚ  等しい
Ｃ  以上または無秩序
Ｖ  無秩序
【０１６２】
ＣＤＰ命令のフォーマットがイラスト８に示されている。
【０１６３】
【外８】
0003969895.tif 000027
イラスト８  ＣＤＰ命令のフォーマット
【０１６４】
0003969895.tif 000028
0003969895.tif 000029
【０１６５】
４．８．１  操作コード（Ｏｐｃｏｄｅ）
表１４はＣＤＰ命令に対する主要な操作コードを表にしたものである。すべてのニーモニックは［ＯＰＥＲＡＴＩＯＮ］［ＣＯＮＤ］［Ｓ／Ｄ］の形式をそなえている。
【０１６６】
0003969895.tif 000030
0003969895.tif 000031
【０１６７】
４．８．２  拡張オペレーション
表１５は、操作コードフィールドで拡張値を使用して利用できる拡張オペレーションを表にしたものである。直列化命令とＦＬＳＣＢ命令を除いて、すべての命令は［ＯＰＥＲＡＴＩＯＮ］［ＣＯＮＤ］［Ｓ／Ｄ］の形式をそなえている。拡張オペレーションに対する命令符号化は、Ｆｎオペランドに対するレジスタファイルへのインデックスと同様に形成される。すなわち、｛Ｆｎ［３：０］，Ｎ｝の形式になっている。
【０１６８】
0003969895.tif 000032
0003969895.tif 000033
0003969895.tif 000034
【０１６９】
＊  ベクトル化不能のオペレーション。ＬＥＮフィールドは無視され、スカラオペレーションは指定されたレジスタ上で行われる。
【０１７０】
５．  システムレジスタ
【０１７１】
５．１  システムＩＤレジスタ（ＦＰＳＩＤ）
ＦＰＳＩＤには、ＦＰＳアーキテクチャ、およびインプリメンテーションで定義された識別値が入っている。このワードを使用して、ＦＰＳのモデル、特徴セット、および改訂、ならびにマスクセット番号を判定することができる。ＦＰＳＩＤは読み取り専用であり、ＦＰＳＩＤへの書き込みは無視される。ＦＰＳＩＤレジスタのレイアウトについては、イラスト９参照。
【０１７２】
【外９】
0003969895.tif 000035
イラスト９  ＦＰＳＩＤレジスタの符号化
【０１７３】
５．２  ユーザステータス−制御レジスタ（ＦＰＳＣＲ）
ＦＰＳＣＲレジスタには、ユーザがアクセスできる構成ビットと例外ステータスビットが入っている。構成オプションには、例外イネーブルビット、丸め制御、ベクトルストライドと長さ、非正規オペランドの処理と結果、およびデバッグモードの使用が含まれる。このレジスタは、ユーザとオペレーティングシステムコードがＦＰＳを構成し、完了したオペレーションのステータスを問い合わせるためのものである。これはコンテキストスイッチの間に、セーブされ、リストアされなければならない。ビット３１から２８には、最も最近の比較命令からのフラグ値が入っている。ビット３１から２８には、ＦＰＳＣＲの読み出しを使用してアクセスすることができる。ＦＰＳＣＲがイラスト１０に示されている。
【０１７４】
【外１０】
0003969895.tif 000036
イラスト１０  ユーザステータス−制御レジスタ（ＦＰＳＣＲ）
【０１７５】
５．２．１  ステータス比較と処理制御のバイト
ビット３１から２８には、最も最近の比較オペレーションの結果、および特殊な状況でのＦＰＳの演算応答を指定するのに有用な数個の制御ビットが入っている。ステータス比較と処理制御のバイトのフォーマットがイラスト１１に示されている。
【０１７６】
【外１１】
0003969895.tif 000037
イラスト１１  ＦＰＳＣＲのステータス比較と処理制御のバイト
【０１７７】
0003969895.tif 000038
【０１７８】
５．２．２  システム制御バイト
システム制御バイトは丸めモード、ベクトルストライド、およびベクトル長さフィールドを制御する。ビットはイラスト１２に示されているように指定されている。
ＶＦＰｖ１アーキテクチャには、ベクトルオペレーションと一緒に使用するためのレジスタファイルストライド機構が組み入れられている。ＳＴＲＩＤＥビットが００に設定されている場合には、ベクトルオペレーションで選択される次のレジスタはレジスタファイルの中の前のレジスタの直後のレジスタとなる。正規のレジスタファイルのラッピング機構はストライド値の影響を受けない。１１のＳＴＲＩＤＥは、入力レジスタの全部と出力レジスタを２だけインクリメントさせる。
【０１７９】
たとえば、
ＦＭＵＬＥＱＳ  Ｆ８，Ｆ１６，Ｆ２４
は次の非ベクトルオペレーションを行う。
ＦＭＵＬＥＱＳ  Ｆ８，Ｆ１６，Ｆ２４
ＦＭＵＬＥＱＳ  Ｆ１０，Ｆ１８，Ｆ２６
ＦＭＵＬＥＱＳ  Ｆ１２，Ｆ２０，Ｆ２８
ＦＭＵＬＥＱＳ  Ｆ１４，Ｆ２２，Ｆ３０
レジスタファイルの中の乗算に対するオペランドが事実上、１レジスタではなくて、２レジスタだけ「ストライド」する。
【０１８０】
【外１２】
0003969895.tif 000039
イラスト１２  ＦＰＳＣＲシステム制御バイト
【０１８１】
0003969895.tif 000040
0003969895.tif 000041
【０１８２】
５．２．３  例外イネーブルバイト
例外イネーブルバイトはビット１５：８を占め、例外トラップに対するイネーブルが入っている。ビットはイラスト１３に示すように指定されている。例外イネーブルビットは、浮動小数点例外条件の処理に対するＩＥＥＥ７５４仕様の要求に合致する。ビットが設定された場合には、例外はイネーブルされる。現在の命令に対する例外条件が生じた場合には、ＦＰＳはユーザの可視トラップをオペレーティングシステムに伝える。ビットがクリアされた場合には、例外はイネーブルされない。例外条件の場合には、ＦＰＳはユーザの可視トラップをオペレーティングシステムに伝えないが、数学的に妥当な結果を生じる。例外イネーブルビットに対するデフォルトはディスエーブルされる。例外処理の更に詳しい情報については、ＩＥＥＥ７５４規格を参照されたい。
【０１８３】
インプリメンテーションによっては、例外がディスエーブルされたときでも、ハードウェアの機能の外側で例外条件を処理するために、サポートコードへのバウンスを生じる。これは一般に、ユーザコードには見えない。
【０１８４】
【外１３】
0003969895.tif 000042
イラスト１３  ＦＰＳＣＲ例外イネーブル
【０１８５】
0003969895.tif 000043
【０１８６】
５．２．４  例外ステータスバイトはＦＰＳＣＲのビット７：０を占め、例外ステータスフラグビットが入っている。浮動小数点例外毎に一つづつ、５個の例外ステータスフラグビットがある。これらのビットは「粘着性がある」。検出された例外によって一旦設定されると、これらのビットはＦＰＳＣＲまたはＦＳＥＲＩＡＬＣＬへのＦＭＯＶＸ書き込みの命令によってクリアされなければならない。ビットはイラスト１４に示すように指定される。イネーブルされた例外の場合には、対応する例外ステータスビットは自動的に設定されることは無い。必要に応じて適当な例外ステータスビットを設定することは、サポートコードのタスクである。いくつかの例外は自動にし得る。すなわち、例外条件が検出されると、例外イネーブルビットがどのように設定されるかにかかわり無く、ＦＰＳは後続の浮動小数点命令にバウンスする。これにより、ＩＥＥＥ７５４規格が必要とする、より多くの関係する例外処理をハードウェアではなくソフトウェアで行うことができる。一例は、ＦＺビットが０に設定されるアンダフロー条件である。この場合、正しい結果は、結果の指数と丸めモードによって決まる非正規化された数となり得る。ＦＰＳによって作成者は、バウンスするオプションを含む応答を選択し、サポートコードを利用することにより正しい結果を作成して、この値をデスティネーションレジスタに書き込むことができる。アンダフロー例外イネーブルビットが設定された場合には、サポートコードがオペレーションを完了した後、ユーザのトラップハンドラが呼び出される。このコードはＦＰＳの状態を変更し、リターン、すなわちプロセスを終了させることができる。
【０１８７】
【外１４】
0003969895.tif 000044
イラスト１４  ＦＰＳＣＲ例外ステータスバイト
【０１８８】
0003969895.tif 000045
【０１８９】
５．３  レジスタファイル内容レジスタ（ＦＰＲＥＧ）
レジスタファイル内容レジスタは特権レジスタである。デバッガはその中に入っている情報を使用して、現在実行中のプログラムにより解釈されたようにレジスタの内容を適当に提示することができる。ＦＰＲＥＧには１６ビットが含まれており、レジスタファイルの中の倍精度レジスタ毎に１ビットとなっている。ビットがセットされると、そのビットによって表現される物理的なレジスタ対が倍精度レジスタとしてディスプレイされるべきである。そのビットがクリアである場合には、物理的なレジスタが初期化される。すなわち、物理的なレジスタに一つまたは二つの単精度データ値が含まれる。
【０１９０】
【外１５】
0003969895.tif 000046
イラスト１５  ＦＰＲＥＧレジスタの符号化
【０１９１】
0003969895.tif 000047
0003969895.tif 000048
【０１９２】
６．例外処理
ＦＰＳは、デバッグモードと正規モードの二つのモードの中の一つで動作する。ＦＰＳＣＲでＤＭビットがセットされれば、ＦＰＳはデバッグモードで動作する。このモードではＦＰＳは一度に一つの命令を実行し、命令の実行ステータスがわかるまでＡＲＭは待たされる。これにより、命令の流れに対してレジスタファイルとメモリが的確になるが、実行時間がずっと長くなってしまう。ＦＰＳは、リソースが許せば、ＡＲＭから新しい命令を受け入れ、そして例外条件を検出したときに例外を伝える。ＡＲＭへの例外報告は常に、浮動小数点命令ストリームに対して的確となる。ただし、ベクトルオペレーションに続き、ベクトルオペレーションと並列に実行するロードまたは記憶のオペレーションの場合は除く。この場合には、ロードオペレーションに対するレジスタファイルの内容、または記憶オペレーションに対するメモリが的確でなくなることがある。
【０１９３】
６．１  サポートコード
ＦＰＳのインプリメンテーションは、ハードウェアとソフトウェアのサポートの組み合わせでＩＥＥＥ７５４に従うように選ぶことができる。サポートされないデータ型と自動例外の場合、サポートコードはＩＥＥＥ７５４に従うハードウェアの機能を果たし、該当するときデスティネーションレジスタに結果を返送し、そしてユーザのトラップハンドラを呼び出したり、別の仕方でユーザのコードの流れを修正することなく、ユーザのコードに戻る。ハードウェアだけが浮動小数点コードの処理に責任を負うべきであったように、ユーザには見える。サポートコードにバウンスしてこれらの特徴を取り扱うことにより、特徴の実行または処理に要する時間が著しく長くなるが、これらの状況の発生は通常、ユーザコード、組込みアプリケーション、および良好に書かれた数値アプリケーションでは最小限となる。
【０１９４】
サポートコードは二つの成分をそなえるように考えられている。すなわち、ルーチンのライブラリと例外ハンドラのセットである。ルーチンのライブラリは、超越的な演算のような、ハードウェアの範囲を超えるオペレーション、およびサポートされない入力または例外を発生し得る入力での除算のような、サポートされた機能を実行する。例外ハンドラのセットは、ＩＥＥＥ７５４に適合するために、例外トラップを処理する。サポートされないデータ型またはデータ表現（たとえば、非正規値）の適当な処理のエミュレーションを行うために、サポートコードはインプリメントされた機能を実行する必要がある。ルーチンの出口でユーザの状態を元に戻すように配慮された場合には、中間計算でＦＰＳを利用するようにルーチンを書いてもよい。
【０１９５】
６．２  例外報告と処理
例外条件が検出された後に発せられる次の浮動小数点命令で、正規モードの例外がＡＲＭに報告される。ＡＲＭプロセッサ、ＦＰＳレジスタファイル、およびメモリの状態は、例外が得られた時点で、反する命令に対して的確でないかも知れない。命令の正しいエミュレーションを行い、命令によって生じるいかなる例外をも処理するために、サポートコードは充分な情報を利用できる。
【０１９６】
いくつかのインプリメンテーションでは、サポートコードを使用することにより、無限大、ＮａＮ、非正規データ、および零を含むＩＥＥＥ７５４の特殊データでいくつかの、またはすべてのオペレーションを処理することができる。そうするインプリメンテーションは、これらのデータをサポートされないものとして参照し、ユーザコードには一般に見えない仕方でサポートコードにバウンスし、デスティネーションレジスタにＩＥＥＥ７５４で指定された結果がある状態で戻る。オペレーションによって生じるどの例外も、例外についてのＩＥＥＥ７５４の規則に従う。これには、対応する例外イネーブルビットがセットされている場合の、ユーザコードへのトラップも含めることができる。
【０１９７】
ＩＥＥＥ７５４規格は、ＦＰＳＣＲでイネーブルされ、ディスエーブルされた例外の両方の場合について例外条件に対する応答を定めている。ＶＦＰｖ１アーキテクチャは、ＩＥＥＥ７５４仕様に正しく従うために使用されるハードウェアとソフトウェアとの間の境界を指定していない。
【０１９８】
６．２．１  サポートされないオペレーションとフォーマット
ＦＰＳは、１０進データでのオペレーション、もしくは１０進データへの変換または１０進データからの変換をサポートしない。これらのオペレーションはＩＥＥＥ７５４規格によって必要とされ、サポートコードにより提供されなければならない。１０進データを利用しようとするいかなる試みも、所望の機能に対するライブラリルーチンを必要とする。ＦＰＳは１０進データ型をそなえていない。そしてＦＰＳは、１０進データを使用する命令をトラップするために使用することはできない。
【０１９９】
６．２．２  ＦＰＳがディスエーブルされるか、または例外的であるときのＦＭＯＶＸの使用
ＳＵＰＥＲＶＩＳＯＲまたはＵＮＤＥＦＩＮＥＤモードで実行されるＦＭＯＶＸ命令は、ＦＰＳが例外状態にあるか、または（インプリメンテーションがディスエーブルオプションをサポートする場合に）ディスエーブルされているとき、例外をＡＲＭに伝えさせることなく、ＦＰＳＣＲの読み出しと書き込みを行うか、もしくはＦＰＳＩＤまたはＦＰＲＥＧの読み出しを行うことができる。
【０２００】
本発明の特定の実施例を説明してきたが、本発明はこれに限定されないこと、そして本発明の範囲内で多数の変形および追加を行い得ることは明らかであろう。たとえば、本発明の範囲から逸脱することなく、独立請求項の特徴に対して従属請求項の特徴を種々に組み合わせることができる。
【図面の簡単な説明】
【図１】データ処理システムの概略図である。
【図２】スカラレジスタとベクトルレジスタの両方をサポートする浮動小数点ユニットを示す図である。
【図３】単精度(single precision)オペレーションの場合に、与えられたレジスタがベクトルレジスタであるか、スカラレジスタであるかをどのように判定するかを示す流れ図である。
【図４】倍精度オペレーションの場合に、与えられたレジスタがベクトルレジスタであるか、スカラレジスタであるかをどのように判定するかを示す流れ図である。
【図５】単精度オペレーションの際の、レジスタバンクのサブセットへの分割と、各サブセット内のラッピングを示す図である。
【図６】倍精度オペレーションの際の、レジスタバンクのサブセットへの分割と、各サブセット内のラッピングを示す図である。
【図７】コプロセッサ命令がコプロセッサからどのように見えるかを示す図であって、Ａはコプロセッサ命令が主コプロセッサからどのように見えるかを示し、Ｂはコプロセッサ命令が単精度と倍精度のコプロセッサからどのように見えるかを示し、Ｃはコプロセッサ命令が単精度のコプロセッサからどのように見えるかを示す図である。
【図８】単精度と倍精度のコプロセッサを制御する主コプロセッサを示す図である。
【図９】単精度のコプロセッサを制御する主コプロセッサを示す図である。
【図１０】受信したコプロセッサ命令についてアクセプト信号を主コプロセッサに返送すべきか判定する単精度と倍精度のコプロセッサの中の回路を示す図である。
【図１１】受信したコプロセッサ命令についてアクセプト信号を主コプロセッサに返送すべきか判定する単精度のコプロセッサの中の回路を示す図である。
【図１２】主コプロセッサの中の未定義命令例外処理を示す図である。
【図１３】本発明の好適実施例によるコプロセッサの要素を示すブロック図である。
【図１４】本発明の好適実施例によるレジスタ制御−命令送出論理のオペレーションを示す流れ図である。
【図１５】本発明の好適実施例による浮動小数点レジスタの内容の一例を示す図である。
【符号の説明】
２２  データ処理システム
２４  主プロセッサ
７８  コプロセッサ番号フィールド
８０  ＡＲＭコア
８２  コプロセッサバス
８４  単精度と倍精度のコプロセッサ
８８  単精度コプロセッサ
９２  エミュレーションステップ
【図１】
0003969895.tif 000049
【図２】
0003969895.tif 000050
【図３】
0003969895.tif 000051
【図４】
0003969895.tif 000052
【図５】
0003969895.tif 000053
【図６】
0003969895.tif 000054
【図７】
0003969895.tif 000055
【図８】
0003969895.tif 000056
【図９】
0003969895.tif 000057
【図１０】
0003969895.tif 000058
【図１１】
0003969895.tif 000059
【図１２】
0003969895.tif 000060
【図１３】
0003969895.tif 000061
【図１４】
0003969895.tif 000062
【図１５】
0003969895.tif 000063