(57)【特許請求の範囲】
【請求項１】
機械命令を実行するためのコンピュータ・プログラムであって、
コンピュータ・アーキテクチャに応じたコンピュータの実行のために定義される機械命令を、実行するためにプロセッサによって取得するステップであって、前記機械命令が、
変換命令を特定する少なくとも１つのオペコード・フィールド、
第１のレジスタを指定するために使用される少なくとも１つのフィールド、および      第２のレジスタを指定するために使用される少なくとも１つのその他のフィールドを含む、前記取得するステップと、
前記機械命令を前記プロセッサによって実行するステップであって、
第１のフォーマットの第１の表現の単精度バイナリ浮動小数点データを前記第１のレジスタから取得するサブステップ、
前記第１のフォーマットの前記第１の表現の前記単精度バイナリ浮動小数点データを、第２のフォーマットの第２の表現の変換された単精度バイナリ浮動小数点データに変換するサブステップ、および
前記変換された単精度バイナリ浮動小数点データを前記第２のレジスタに代入するサブステップを含む、前記実行するステップと
を含む方法を実行するための処理回路による実行のための、コンピュータ・プログラム。
【請求項２】
前記第１のフォーマットの前記第１の表現の前記単精度バイナリ浮動小数点データが、前記第２のフォーマットの前記第２の表現の単精度バイナリ浮動小数点データに変換されるべきであると判定するステップと、
判定する前記ステップにより変換されるべきであると判定した場合に、前記変換命令を決定するステップと
を前記方法はさらに含む、請求項１に記載のコンピュータ・プログラム。
【請求項３】
判定する前記ステップが、前記プロセッサまたは別のプロセッサで実行されるコンパイラによって実行される、請求項２に記載のコンピュータ・プログラム。
【請求項４】
前記第１のレジスタおよび前記第２のレジスタのうちの少なくとも一方が、複数アドレス指定可能なレジスタ・ファイルのレジスタである、請求項１に記載のコンピュータ・プログラム。
【請求項５】
前記複数アドレス指定可能なレジスタ・ファイルが、複数のレジスタを含み、前記複数のレジスタのうちのレジスタの第１のサブレンジが、１つのフォーマットのデータのために定義され、前記複数のレジスタのうちのレジスタの第２のサブレンジが、別のフォーマットのデータのために定義され、前記複数のレジスタが、少なくとも１つのさらなるフォーマットのデータのために定義される、請求項４に記載のコンピュータ・プログラム。
【請求項６】
前記複数のレジスタのそれぞれが、６４ビットスカラ単精度浮動小数点データまたは３２ビットベクトル単精度浮動小数点データを含むように定義される、請求項５に記載のコンピュータ・プログラム。
【請求項７】
前記機械命令が、第１の命令と第２の命令との間に挿入され、前記第２の命令が、前記第１の命令に依存し、前記第１の命令が、前記第２の命令によって使用されるフォーマットとは異なるフォーマットを有するデータを生成するためのものである、請求項１に記載のコンピュータ・プログラム。
【請求項８】
前記第１のレジスタが、変換されるべき前記第１の命令のデータを含む、請求項７に記載のコンピュータ・プログラム。
【請求項９】
前記第１の表現がベクトル表現を含み、前記第１のフォーマットが３２ビットを含み、前記第２の表現がスカラ表現を含み、前記第２のフォーマットが６４ビットを含むか、または前記第１の表現がスカラ表現を含み、前記第１のフォーマットが６４ビットを含み、前記第２の表現がベクトル表現を含み、前記第２のフォーマットが３２ビットを含む、請求項１に記載のコンピュータ・プログラム。
【請求項１０】
前記変換が、単精度のベクトル要素から単精度のスカラ要素への変換、または、単精度のスカラ要素から単精度のベクトル要素への変換である、請求項１に記載のコンピュータ・プログラム。
【請求項１１】
前記変換された単精度バイナリ浮動小数点データが、シグナリング非数（ＮａＮ）を含む場合に、前記シグナリングＮａＮが、前記第２のレジスタでシグナリングＮａＮとして保存される、請求項１に記載のコンピュータ・プログラム。
【請求項１２】
機械命令を実行するためのコンピュータ・システムであって、
メモリと、
前記メモリと通信するプロセッサとを含み、
コンピュータ・アーキテクチャに応じたコンピュータの実行のために定義される機械命令を、実行するためにプロセッサによって取得するステップであって、前記機械命令が、
変換命令を特定する少なくとも１つのオペコード・フィールド、
第１のレジスタを指定するために使用される少なくとも１つのフィールド、および      第２のレジスタを指定するために使用される少なくとも１つのその他のフィールドを含む、前記取得するステップと、
前記機械命令を前記プロセッサによって実行するステップであって、
第１のフォーマットの第１の表現の単精度バイナリ浮動小数点データを前記第１のレジスタから取得するサブステップ、
前記第１のフォーマットの前記第１の表現の前記単精度バイナリ浮動小数点データを、第２のフォーマットの第２の表現の変換された単精度バイナリ浮動小数点データに変換するサブステップ、および
前記変換された単精度バイナリ浮動小数点データを前記第２のレジスタに代入するサブステップを含む、前記実行するステップと
を含む方法を実行するように構成される、コンピュータ・システム。
【請求項１３】
前記第１のフォーマットの前記第１の表現の前記単精度バイナリ浮動小数点データが、前記第２のフォーマットの前記第２の表現の単精度バイナリ浮動小数点データに変換されるべきであると判定するステップと、
判定する前記ステップにより変換されるべきであると判定した場合に、前記変換命令を決定するステップと
を前記方法はさらに含む、請求項１２に記載のコンピュータ・システム。
【請求項１４】
前記第１のレジスタおよび前記第２のレジスタのうちの少なくとも一方が、複数アドレス指定可能なレジスタ・ファイルのレジスタであり、前記複数アドレス指定可能なレジスタ・ファイルが、複数のレジスタを含み、前記複数のレジスタのうちのレジスタの第１のサブレンジが、１つのフォーマットのデータのために定義され、前記複数のレジスタのうちのレジスタの第２のサブレンジが、別のフォーマットのデータのために定義され、前記複数のレジスタが、少なくとも１つのさらなるフォーマットのデータのために定義される、請求項１２に記載のコンピュータ・システム。
【請求項１５】
前記複数のレジスタのそれぞれが、６４ビットスカラ単精度浮動小数点データまたは３２ビットベクトル単精度浮動小数点データを含むように定義される、請求項１４に記載のコンピュータ・システム。
【請求項１６】
前記機械命令が、第１の命令と第２の命令との間に挿入され、前記第２の命令が、前記第１の命令に依存し、前記第１の命令が、前記第２の命令によって使用されるフォーマットとは異なるフォーマットを有するデータを生成するためのものである、請求項１２に記載のコンピュータ・システム。
【請求項１７】
前記第１の表現がベクトル表現を含み、前記第１のフォーマットが３２ビットを含み、前記第２の表現がスカラ表現を含み、前記第２のフォーマットが６４ビットを含むか、または前記第１の表現がスカラ表現を含み、前記第１のフォーマットが６４ビットを含み、前記第２の表現がベクトル表現を含み、前記第２のフォーマットが３２ビットを含む、請求項１２に記載のコンピュータ・システム。
【請求項１８】
機械命令を実行する方法であって、
コンピュータ・アーキテクチャに応じたコンピュータの実行のために定義される機械命令を、実行するためにプロセッサによって取得するステップであって、前記機械命令が、
変換命令を特定する少なくとも１つのオペコード・フィールド、
第１のレジスタを指定するために使用される少なくとも１つのフィールド、および
第２のレジスタを指定するために使用される少なくとも１つのその他のフィールドを含む、前記取得するステップと、
前記機械命令を前記プロセッサによって実行するステップであって、
第１のフォーマットの第１の表現の単精度バイナリ浮動小数点データを前記第１のレジスタから取得するサブステップ、
前記第１のフォーマットの前記第１の表現の前記単精度バイナリ浮動小数点データを、第２のフォーマットの第２の表現の変換された単精度バイナリ浮動小数点データに変換するサブステップ、および
前記変換された単精度バイナリ浮動小数点データを前記第２のレジスタに代入するサブステップを含む、前記実行するステップと
を含む、方法。
【請求項１９】
前記第１のレジスタおよび前記第２のレジスタのうちの少なくとも一方が、複数アドレス指定可能なレジスタ・ファイルのレジスタであり、前記複数アドレス指定可能なレジスタ・ファイルが、複数のレジスタを含み、前記複数のレジスタのうちのレジスタの第１のサブレンジが、１つのフォーマットのデータのために定義され、前記複数のレジスタのうちのレジスタの第２のサブレンジが、別のフォーマットのデータのために定義され、前記複数のレジスタが、少なくとも１つのさらなるフォーマットのデータのために定義される、請求項１８に記載の方法。
【請求項２０】
前記機械命令が、第１の命令と第２の命令との間に挿入され、前記第２の命令が、前記第１の命令に依存し、前記第１の命令が、前記第２の命令によって使用されるフォーマットとは異なるフォーマットを有するデータを生成するためのものである、請求項１８に記載の方法。
【請求項２１】
命令を処理するための、データ処理システムにおけるコンピュータ・プログラムであって、
受信された命令のタイプを判定するステップと、
前記命令のタイプに基づいて複数アドレス指定可能なレジスタ・ファイルにアクセスするステップと、
前記複数アドレス指定可能なレジスタ・ファイルにアクセスする前記ステップの結果に基づいて、前記データ処理システムの少なくとも１つの機能ユニットを使用して前記命令を処理するステップであって、前記複数アドレス指定可能なレジスタ・ファイルが、第１の命令のタイプの第１の命令に関連するレジスタの第１のサブセット、および第２の命令のタイプの第２の命令に関連するレジスタの第２のサブセットを含み、第３の命令のタイプの第３の命令および第４の命令のタイプの第４の命令が、レジスタの前記第１のサブセット内のレジスタおよびレジスタの前記第２のサブセット内のレジスタを含む、前記複数アドレス指定可能なレジスタ・ファイルのレジスタの組全体の中のレジスタにアクセスするためのものであり、前記第１の命令のタイプがスカラ命令タイプであり、前記第２の命令のタイプが浮動小数点命令タイプであり、前記第３の命令のタイプが６４ビット単精度浮動小数点命令タイプであり、前記第４の命令のタイプが３２ビット・ベクトル単精度浮動小数点命令タイプである、前記処理するステップと
を含む方法を実行するための処理回路による実行のための、コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本出願の１つまたは複数の態様は、全体的に、データ処理に関し、詳細には、複数アドレス指定可能なレジスタ・ファイルおよびそれに関連する処理に関する。
【背景技術】
【０００２】
高性能なプロセッサは、プログラムにおいて命令レベルの並列化を利用するために単一命令複数データ（ＳＩＭＤ：single instruction multiple data）技術を使用するマルチメディア処理をサポートする。つまり、ＳＩＭＤ技術は、２つ以上の演算を同時に実行するために使用される。これらのプロセッサは、複数の機能ユニットを含み、それらの複数の機能ユニットの一部は、スカラ・データの実行を対象とし、それらの複数の機能ユニットの一部は、構造化されたＳＩＭＤのベクトル・データの処理のためにグループ化される。ＳＩＭＤのデータ・ストリームは、構造化されたデータ・タイプで赤、緑、および青成分をエンコードすることによって、例えばＲＧＢフォーマットを使用する色情報を表すか、または位置を４つ組み（ｘ，ｙ，ｚ，ｗ）としてエンコードすることによって座標情報を表すなど、マルチメディア・データ・タイプを表すために使用される。
【０００３】
マルチメディア・データを処理するために設計されたプロセッサは、例えば、ＳＩＭＤユニットを追加することによって既存のスカラ・プロセッサの実装を拡張することによって実装されており、ＳＩＭＤユニット自体は、スカラ・データ・タイプの処理のために利用可能なリソースをミラーリングし、ＳＩＭＤアーキテクチャによってサポートされるべき構造化された要素の数に合わせてそれぞれの機能ユニットのタイプを複製する複数の機能ユニット（すなわち、固定小数点ユニットおよび浮動小数点ユニット）を含む。
【０００４】
マルチメディア処理およびその他の処理をサポートするプロセッサは、異なるタイプのデータを処理する可能性がある。しかし、そのような処理を管理するための機能が与えられなければならない。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】米国公開第２００９／０１９８９６６Ａ１号
【特許文献２】米国特許第７，８７７，５８２号
【特許文献３】米国特許第６，８３９，８２８号
【非特許文献】
【０００６】
【非特許文献１】RFC02182.r6: VSX ScalarSingle-Precision
【非特許文献２】"Power ISATMVersion 2.05," International Business Machines Corporation, October 23,2007
【非特許文献３】"Power ISATMVersion 2.06 Revision B", International Business Machines Corporation,July 23, 2010
【非特許文献４】Chapter 7: Vector-Scalar FloatingPoint Operations [Category: VSX]
【非特許文献５】RFC02242.r3: BFP/VSX MiscellaneousOperations
【発明の概要】
【発明が解決しようとする課題】
【０００７】
本発明の目的は、従来技術における課題を解決することにある。
【課題を解決するための手段】
【０００８】
機械命令を実行するためのコンピュータ・プログラム（製品）を提供することによって、従来技術の欠点が克服され、さらなる利点が与えられる。コンピュータ・プログラム（製品）は、処理回路によって読み取り可能であり、方法を実行するための処理回路による実行のための命令を記憶する記憶媒体を含む。例えば、方法は、コンピュータ・アーキテクチャに応じたコンピュータの実行のために定義される機械命令を、実行するためにプロセッサによって取得するステップであって、機械命令は、例えば、変換命令を特定する少なくとも１つのオペコード・フィールド、第１のレジスタを指定するために使用される少なくとも１つのフィールド、および第２のレジスタを指定するために使用される少なくとも１つのその他のフィールドを含む、ステップと、機械命令をプロセッサによって実行するステップであって、例えば、第１のフォーマットの第１の表現の単精度バイナリ浮動小数点データを第１のレジスタから取得するサブステップ、第１のフォーマットの第１の表現の単精度バイナリ浮動小数点データを、第２のフォーマットの第２の表現の変換された単精度バイナリ浮動小数点データに変換するサブステップ、および変換された単精度バイナリ浮動小数点データを第２のレジスタに代入するサブステップを含む、ステップとを含む。
【０００９】
本発明の１つまたは複数の態様に関連する方法およびシステムも、本明細書において説明され、特許請求される。さらに、本発明の１つまたは複数の態様に関連するサービスも、本明細書において説明され、特許請求される可能性がある。
【００１０】
さらなる特徴および利点が、本発明の１つまたは複数の態様の技術によって実現される。本発明のその他の実施形態および態様が、本明細書において詳細に説明され、特許請求される発明の一部と見なされる。
【００１１】
本発明の１つまたは複数の態様が、特に取り上げられ、本明細書の終わりの特許請求の範囲において例としてはっきりと特許請求される。本発明の１つまたは複数の態様の上述のおよびその他の目的、特徴、および利点は、添付の図面と関連してなされる以下の詳細な説明から明らかである。
【図面の簡単な説明】
【００１２】
【図１】スカラ処理ユニットと構造化されたデータ・タイプを処理するためのＳＩＭＤユニットとを両方含むプロセッサの一例を示す構成図である。
【図２】例示的な実施形態の１つまたは複数の態様が実装され得るデータ処理システムの一例の図である。
【図３】スカラとベクトルとの両方のデータおよびアドレス情報を記憶するレジスタ・ファイルを使用してスカラ命令とベクトル命令とを両方とも実行するように設計されたプロセッサの一例の図である。
【図４】プロセッサの分岐ユニットおよびロード／ストア・ユニットによって使用され得る、情報としてスカラ・データを選択するより柔軟な手法を示す図である。
【図５】１つの例示的な実施形態による、複数アドレス指定可能なレジスタ・ファイルが利用されるプロセッサの一例の図である。
【図６】１つの例示的な実施形態による、ベクトル−スカラ拡張（ＶＳＸ：Vector-ScalarExtension）レジスタ・ファイルの一例の図である。
【図７】１つの例示的な実施形態による、全体的なデコード操作の概要を示す論理の一例を示す図である。
【図８】１つの例示的な実施形態による、デコード操作の概要を示す論理の一例を提供する図である。
【図９】１つの例示的な実施形態による、デコード操作の概要を示す論理の一例を提供する図である。
【図１０】例示的な実施形態による、変換命令を命令ストリームに挿入するために使用される論理の一例を示す図である。
【図１１】例示的な実施形態による、ベクトル要素をスカラに変換するために使用されることになる変換命令を選択するために使用される論理の一例を示す図である。
【図１２】例示的な実施形態による、スカラ・データをベクトル要素に変換するために使用されることになる変換命令を選択するために使用される論理の一例を示す図である。
【図１３】本発明の１つまたは複数の態様を組み込むコンピュータ・プログラム（製品）の一実施形態を示す図である。
【発明を実施するための形態】
【００１３】
本発明の一態様によれば、スカラ・データおよびベクトル・データに関連する処理が容易にされる。一態様においては、レジスタ・ファイルの各レジスタが６４ビット（ｂ）単精度浮動小数点スカラ・データまたは３２ｂ単精度ベクトル・データおよびその他のデータ・フォーマットを含み得るレジスタ・ファイルが提供される。さらに、一態様においては、１つの単精度浮動小数点フォーマットから別の単精度浮動小数点フォーマットに変換するための変換技術が提供される。一例において、変換は、設計された命令を使用して、例外をシグナリングすることなしに実行される。
【００１４】
上で検討され、さらにはそれぞれが参照によりその全体が本明細書に組み込まれている、本発明の譲受人に譲渡された、２００９年８月６日に公開された「Multi-Addressable Register File」と題されたGschwindらによる米国公開第２００９／０１９８９６６Ａ１号および２０１１年１月２５日に発行された「Multi-Addressable Register File」と題されたGschwindらによる米国特許第７，８７７，５８２号で検討されたように、概して、マルチメディア・データを処理するために設計されたプロセッサは、例えば、ＳＩＭＤユニットを追加することによって既存のスカラ・プロセッサの実装を拡張することによって実装されており、ＳＩＭＤユニット自体は、スカラ・データ・タイプの処理のために利用可能なリソースをミラーリングし、ＳＩＭＤアーキテクチャによってサポートされるべき構造化された要素の数に合わせてそれぞれの機能ユニットのタイプを複製する複数の機能ユニット（すなわち、固定小数点ユニットおよび浮動小数点ユニット）を含む。多くの場合、スカラ処理ユニットとＳＩＭＤ処理ユニットとの間で共有される唯一のユニットは発行論理であり、発行論理は、スカラ処理ブロックかまたはＳＩＭＤ処理ブロックかのどちらかと、メモリ・サブシステムへのアクセスを管理するロード／ストア・ユニット（ＬＳＵ）とに命令を発行する。レジスタ・ファイルを含むすべてのその他のユニットは、典型的には、別々に保有される。
【００１５】
図１は、スカラ処理ユニットと構造化されたデータ・タイプを処理するためのＳＩＭＤユニットとを両方含み、ＳＩＭＤユニットが構造化されたデータ・タイプの各要素のための複数の処理ユニットを備える従来技術のプロセッサの一例を示す構成図である。概して、別々のスカラ・プロセッサおよびＳＩＭＤプロセッサを使用することは、構成がいくつかの冗長な機能ユニットおよびデータ・パスを含むという点で非効率的で高価である。さらに、そのような実装は、スカラ・ユニットまたはＳＩＭＤユニットのどちらかがデータを処理している間、概して、他方のユニットがアイドル状態で何もしておらず、そのユニットの次の命令を待っているが、その間ずっとシステムの電力は消費するので、望ましくない量の電力消費を生じる。
【００１６】
図１のシステムの動作中、命令が、命令フェッチ・ユニット１００によってフェッチされ、命令デコード・ユニット１０２に供給される。デコードされた命令は、発行／分岐ユニット１０４に渡され、そこで、分岐命令が解決され、その他の命令は、それらのその他の命令がプロセッサの機能ユニットのうちの１つで実行可能になるまで発行／分岐ユニット１０４の命令発行ユニット（図示せず）に記憶され得る。命令発行ユニットは、予測論理、命令リオーダ論理、命令発行バッファ、および命令の高性能な発行をサポートするその他の論理を含み得る。
【００１７】
命令は、発行／分岐ユニット１０４によって、ロード／ストア・ユニット１０６、固定小数点ユニット（ＦＸＵ）１０８、浮動小数点ユニット（ＦＰＵ）１１０、またはＳＩＭＤマルチメディア処理ブロック１１２のうちの１つまたは複数に発行される。命令が処理ユニットのうちの１つまたは複数によって処理され得るよりも前に、通常、１回または複数回のレジスタ・アクセスが、レジスタ・ファイル、例えば、整数レジスタ・ファイル１１４、浮動小数点レジスタ・ファイル１１６、または多くの最近のプロセッサで見られるＳＩＭＤマルチメディア拡張の一部であるベクタ・レジスタ・ファイル１１８で必要とされる。
【００１８】
典型的には、ＳＩＭＤマルチメディア処理ブロック１１２は、構造化されたデータ（通常は、４つの要素を有するベクトル）を記憶するためのベクトル・レジスタ・ファイル１１８を含む。ベクトル・レジスタ・ファイル１１８は、構造化されたデータの単一のフィールドをそれぞれが記憶する４つのサブレジスタ・ファイルにセグメント分けされ得る。ＳＩＭＤマルチメディア処理ブロック１１２は、機能ユニットのいくつかのタイプを含む可能性があり、それぞれのタイプは、マルチメディア拡張によってサポートされる構造化されたデータ・タイプの要素の数に合わせて複製される。図１においては、ＰｏｗｅｒＰＣ（Ｒ）ＶＭＸマルチメディア拡張で見られ得るように、それぞれが１つの構造の要素を処理するように４つ複製された固定小数点ユニット１１９および浮動小数点ユニット１２０が示されている。
【００１９】
スカラ命令の実行とＳＩＭＤ命令の実行とが両方行われる場合、通常は、ＣＰＵが対処する可能性があるさまざまなタイプの命令について別々にアドレス指定可能なレジスタ・ファイルが必要とされることが理解され得る。例えば、図１に示されるように、別々の整数レジスタ・ファイル１１４、浮動小数点レジスタ・ファイル１１６、およびベクトル・レジスタ・ファイル１１８が設けられている。このように別々のレジスタ・ファイルを持つことは、オーバーヘッドおよび電力消費の点で高価である。複数のレジスタ・ファイルを持つことは、コードが実行されるときに、コードがさまざまなレジスタ・ファイルを切り替えるか、またはさまざまなレジスタ・ファイルの間を移動することになることを意味する。これは、コード生成を、さまざまなレジスタ・ファイルの間の移動に関連するオーバーヘッドのために高価にする。さらに、コードのコンパイラが、レジスタ・ファイルに関連するリソースのさまざまな組をよりいっそう多く必要とし、レジスタ・ファイルのフラグメンテーションにつながる可能性がある。さらに、ＣＰＵのマイクロアーキテクチャ内に別々のリソースを持つことは、ＣＰＵの製造に関連するコストと、電力消費、放熱などに関連するコストとを上昇させる。
【００２０】
上述のプロセッサの実装は、従来技術のシステム一例であり、一部の実装においては、例えば、統合された整数および浮動小数点レジスタ・ファイルなどの一部のレジスタ・ファイルが共有される可能性があり、または比較結果のための条件レジスタ・ファイル（condition register file）もしくは述語レジスタ・ファイル（predicateregister file）などのさらなるレジスタ・ファイルが存在する可能性がある。参照によりその全体が本明細書に組み込まれている、２００４年１月４日に発行された「SIMD Datapath Coupled to Scalar/Vector/Address/Conditional DataRegister File with Selective Subpath Scalar Processing Mode」と題されたGschwindらによる米国特許第６，８３９，８２８号に記載された１つの特定の例においては、統合されたスカラ／ベクトル・アドレス指定可能レジスタ・ファイルが、ベクトル命令およびスカラ命令を処理するための複数のモードで動作するように設計されたプロセッサとともに説明されている。レジスタ・ファイルに結合された並列ベクトル・ユニット（parallel vector unit）が、ベクトル演算モードおよびスカラ演算モードで動作するように構成可能な機能ユニットを含む。ベクトル・ユニットは、現在の命令によって指定された演算を実行するための機能ユニットを密結合するための装置を含む。ベクトル演算モードの下では、ベクトル・ユニットは、単一のベクトル演算を複数のデータ要素に対して並列に実行する。複数のデータ要素に対して実行される演算は、ベクトル・ユニットの異なる機能ユニットでそれぞれ実行される。スカラ演算モードの下では、ベクトル・ユニットは、ベクトル・ユニット内の機能ユニットでレジスタ・ファイルから受け取られたデータ要素に対してスカラ演算を実行する。
【００２１】
米国特許第６，８３９，８２８号のメカニズムは、レジスタ・ファイルに異なるタイプの命令／データを記憶する能力を提供するが、この能力を実現するために、第’８２８号特許は、新しいアーキテクチャを示す。しかし、この新しいアーキテクチャは、複数アドレス指定を可能にしない、つまり、命令のタイプ、例えば、レガシーのスカラ、レガシーのベクトル、または新しい命令のタイプに基づいてレジスタ・ファイル内のレジスタをアドレス指定する異なる方法を提供しない。
【００２２】
本明細書に記載の１つまたは複数の例示的な実施形態および米国特許第７，８７７，５８２号は、複数アドレス指定可能なレジスタ・ファイルを提供する。そのような複数アドレス指定可能なレジスタ・ファイルは、データ処理システムのプロセッサに実装され得る。そのようなデータ処理システムは、１つまたは複数のプロセッサを有する可能性があり、各プロセッサまたはプロセッサのサブセットが、例示的な実施形態の複数アドレス指定可能なレジスタ・ファイルを実装することができる。プロセッサが１つまたは複数の例示的な実施形態による複数アドレス指定可能なレジスタ・ファイルを有するデータ処理システムのタイプは、非常に多岐にわたる可能性があり、したがって、この説明は、そのようなあり得るプロセッサ・アーキテクチャをそれぞれ扱うことはできない。しかし、例示を目的として、１つまたは複数の例示的な実施形態の複数アドレス指定可能なレジスタ・ファイルが実装され得るデータ処理システムの１つのタイプの一例として図２が与えられる。
【００２３】
ここで図２を参照すると、１つまたは複数の例示的な実施形態の態様が実装され得る例示的なデータ処理システムの構成図が示されている。データ処理システム２００は、本発明の１つまたは複数の例示的な実施形態に関するプロセスを実装するコンピュータが使用可能なコードまたは命令が配置され得るコンピュータの一例である。
【００２４】
示された例において、データ処理システム２００は、ノース・ブリッジおよびメモリ・コントローラ・ハブ（ＮＢ／ＭＣＨ）２０２ならびにサウス・ブリッジおよび入力／出力（Ｉ／Ｏ）コントローラ・ハブ（ＳＢ／ＩＣＨ）２０４を含むハブ・アーキテクチャを採用する。処理ユニット２０６、メイン・メモリ２０８、およびグラフィックス・プロセッサ２１０が、ＮＢ／ＭＣＨ２０２に接続されている。グラフィックス・プロセッサ２１０は、アクセラレーテッド・グラフィックス・ポート（ＡＧＰ）を通じてＮＢ／ＭＣＨ２０２に接続され得る。
【００２５】
示された例においては、ローカル・エリア・ネットワーク（ＬＡＮ）アダプタ２１２が、ＳＢ／ＩＣＨ２０４に接続する。オーディオ・アダプタ２１６、キーボードおよびマウス・アダプタ２２０、モデム２２２、読み出し専用メモリ（ＲＯＭ）２２４、ハード・ディスク・ドライブ（ＨＤＤ）２２６、ＣＤ−ＲＯＭドライブ２３０、ユニバーサル・シリアル・バス（ＵＳＢ）ポートおよびその他の通信ポート２３２、ならびにＰＣＩ／ＰＣＩｅデバイス２３４が、バス２３８およびバス２４０を通じてＳＢ／ＩＣＨ２０４に接続する。ＰＣＩ／ＰＣＩｅデバイスは、例えば、イーサネット（Ｒ）・アダプタ、アドイン・カード、およびノートブック・コンピュータ用のＰＣカードなどを含み得る。ＰＣＩがカード・バス・コントローラを使用する一方、ＰＣＩｅは使用しない。ＲＯＭ２２４は、例えば、フラッシュ・バイナリ入力／出力システム（ＢＩＯＳ：binary input/output system）である可能性がある。
【００２６】
ＨＤＤ２２６およびＣＤ−ＲＯＭドライブ２３０は、バス２４０を通じてＳＢ／ＩＣＨ２０４に接続する。ＨＤＤ２２６およびＣＤ−ＲＯＭドライブ２３０は、例えば、インテグレーテッド・デバイス・エレクトロニクス（ＩＤＥ：integrated drive electronics）またはシリアル・アドバンスド・テクノロジー・アタッチメント（ＳＡＴＡ：serial advanced technology attachment）インターフェースを使用する可能性がある。スーパーＩ／Ｏ（ＳＩＯ）デバイス２３６が、ＳＢ／ＩＣＨ２０４に接続される可能性がある。
【００２７】
オペレーティング・システムが、処理ユニット２０６で実行される。オペレーティング・システムは、図２のデータ処理システム２００内のさまざまなコンポーネントを調整し、制御する。クライアントとしては、Ｍｉｃｒｏｓｏｆｔ（Ｒ）Ｗｉｎｄｏｗｓ（Ｒ）ＸＰ（ＭｉｃｒｏｓｏｆｔおよびＷｉｎｄｏｗｓは、米国、その他の国、もしくはそれらの両方におけるマイクロソフトの商標である）またはＬｉｎｕｘ（Ｒ）オペレーティング・システム（Ｌｉｎｕｘは、米国、その他の国、もしくはそれらの両方におけるLinus Torvaldsの商標である）などの市販のオペレーティング・システムである可能性がある。Ｊａｖａ（商標）プログラミング・システムなどのオブジェクト指向プログラミング・システムが、オペレーティング・システムと連携して実行される可能性があり、データ処理システム２００で実行されるＪａｖａ（商標）プログラムまたはアプリケーションからオペレーティング・システムに対する呼び出しを行う（Ｊａｖａは、米国、その他の国、もしくはそれらの両方におけるサン・マイクロシステムズの商標である）。
【００２８】
サーバとしては、データ処理システム２００は、例えば、Ａｄｖａｎｃｅｄ  Ｉｎｔｅｒａｃｔｉｖｅ  Ｅｘｅｃｕｔｉｖｅ（ＡＩＸ（Ｒ））オペレーティング・システムまたはＬｉｎｕｘ（Ｒ）オペレーティング・システムを実行するＩＢＭ（Ｒ）ｅＳｅｒｖｅｒ（商標）Ｓｙｓｔｅｍ  ｐ（Ｒ）コンピュータ・システムである可能性がある（ｅＳｅｒｖｅｒ、Ｓｙｓｔｅｍ  ｐ（Ｒ）およびＡＩＸは、米国、その他の国、もしくはそれらの両方におけるＩＢＭの商標である）。データ処理システム２００は、処理ユニット２０６に、ニューヨーク州アーモンクのＩＢＭから入手可能なＰＯＷＥＲ（Ｒ）プロセッサなどの複数のプロセッサを含む対称型マルチプロセッサ（ＳＭＰ）システムである可能性がある。あるいは、単一プロセッサ・システムが使用される可能性がある。
【００２９】
オペレーティング・システム、オブジェクト指向プログラミング・システム、およびアプリケーションまたはプログラムに関する命令は、ＨＤＤ２２６などのストレージ・デバイスに置かれており、処理ユニット２０６によって実行するためにメイン・メモリ２０８にロードされ得る。１つまたは複数の例示的な実施形態に関する処理は、例えば、メイン・メモリ２０８、ＲＯＭ２２４などのメモリ、または、例えば、１つもしくは複数の周辺デバイス２２６および２３０に置かれる可能性があるコンピュータが使用可能なプログラム・コードを使用して処理ユニット２０６によって実行され得る。
【００３０】
図２に示されるバス２３８またはバス２４０などのバス・システムは、１つまたは複数のバスで構成される可能性がある。言うまでもなく、バス・システムは、ファブリックまたはアーキテクチャに接続された異なるコンポーネントまたはデバイス間のデータの転送を行う任意のタイプの通信ファブリックまたはアーキテクチャを使用して実装される可能性がある。図２のモデム２２２またはネットワーク・アダプタ２１２などの通信ユニットは、データを送受信するために使用される１つまたは複数のデバイスを含み得る。メモリは、例えば、メイン・メモリ２０８、ＲＯＭ２２４、または図２のＮＢ／ＭＣＨ２０２に見られるようなキャッシュである可能性がある。
【００３１】
当業者は、図１〜２のハードウェアが実装に応じて変わり得ることを理解するであろう。フラッシュ・メモリ、等価な不揮発性メモリ、または光ディスク・ドライブなどのその他の内部ハードウェアまたは周辺デバイスが、図１〜２に示されたハードウェアに加えて、またはそれらのハードウェアの代わりに使用される可能性がある。また、１つまたは複数の例示的な実施形態のプロセスは、本発明の１つまたは複数の態様の精神および範囲から逸脱することなく、上述のＳＭＰシステム以外のマルチプロセッサ・データ処理システムに適用され得る。
【００３２】
さらに、データ処理システム２００は、クライアント・コンピューティング・デバイス、サーバ・コンピューティング・デバイス、タブレット・コンピュータ、ラップトップ・コンピュータ、電話またはその他の通信デバイス、携帯情報端末（ＰＤＡ）などを含むいくつかの異なるデータ処理システムのいずれかの形態を取る可能性がある。一部の例示的な例において、データ処理システム２００は、例えば、オペレーティング・システム・ファイルまたはユーザが作成したデータあるいはその両方を記憶するための不揮発性メモリを提供するためのフラッシュ・メモリを用いて構成されるポータブル・コンピューティング・デバイスである可能性がある。基本的に、データ処理システム２００は、アーキテクチャの制約なしに、任意の知られているまたは将来開発されるデータ処理システムである可能性がある。
【００３３】
上で検討されたように、１つまたは複数の例示的な実施形態は、複数アドレス指定可能なレジスタ・ファイルを提供する。１つまたは複数の例示的な実施形態は、多数のレジスタを設け、命令の第１の組でレジスタの第１のサブセットをアドレス指定し、命令の第２の組でレジスタの第２のサブセットをアドレス指定し、少なくとも命令の第３の組でレジスタ・ファイル全体をアドレス指定する能力を提供することによってレジスタ・ファイルの性能を向上させることによって知られているレジスタ・ファイルを改良する。１つまたは複数の例示的な実施形態によれば、レジスタの第１のサブセットおよび第２のサブセットは、重なり合っておらず、「タイプ１の命令用のレジスタ」および「タイプ２の命令用のレジスタ」のように別個のレジスタ・ファイル領域を指す。タイプ１の命令に対応するサブセット内に含まれるレジスタは、タイプ２の命令によってアクセス不可能であり、逆も同様である。１つの例示的な実施形態において、タイプ１の命令は、ＩＢＭ  Ｐｏｗｅｒ  ＡｒｃｈｉｔｅｃｔｕｒｅのＦＰＵまたはレガシーの浮動小数点命令に対応し、タイプ２の命令は、ＩＢＭ  Ｐｏｗｅｒ  ＡｒｃｈｉｔｅｃｔｕｒｅのレガシーのＶＭＸ命令に対応し、タイプ３の命令は、ＩＢＭ  Ｐｏｗｅｒ  ＡｒｃｈｉｔｅｃｔｕｒｅのＶＳＸ命令に対応する。
【００３４】
１つまたは複数の例示的な実施形態のメカニズムは、知られているクラスタ化されたレジスタ・ファイル、レジスタ・ファイル内のオペランドのサブレンジ（subrange）、「レジスタ・ファイル間移動」命令を有するプロセッサ、および不連続なレジスタ指定子を用いるサブレンジの形態を使用するＶＭＸ１２８のレジスタ・ファイルとは異なる。オペランドのサブレンジを用いる場合、典型的には、１つのサブレンジは、１つのオペランドのみ、すなわち、１つのタイプの命令のためにのみ存在する。レジスタ・ファイル内のすべてのレジスタをアドレス指定し得る別の形態を有するその他の命令のタイプは存在せず、別のタイプの命令のためのレジスタのその他の範囲は存在せず、すなわち、複数アドレス指定が可能な機能は存在しない。クラスタ化されたレジスタ・ファイルは、異なる命令によってアドレス指定可能なサブレンジを有する大きなレジスタ・ファイルを含むが、レジスタ・ファイル内のレジスタのすべてをアドレス指定し得る命令のタイプは存在しない。それどころか、演算がレジスタの組全体で実行されなければならない場合、移動／コピー操作がレジスタ・ファイルで実行されなければならない。移動／コピー操作は、通常、特殊なスケジューリング・メカニズムを必要とする可能性がある比較的低速な操作である。
【００３５】
対照的に、１つまたは複数の例示的な実施形態は、命令のタイプ、例えば、レガシーの浮動小数点、レガシーのスカラ、ベクトル−スカラ、拡張または拡大されたベクトル−スカラなどに基づいて複数アドレス指定可能なレジスタ・ファイルのレジスタにアクセスできるようにする。１つのオペランドのタイプに関連するレジスタの１つのサブセットではなく、１つまたは複数の例示的な実施形態の複数アドレス指定可能なレジスタ・ファイルは、レジスタの複数のばらばらのサブセットを提供する。さまざまなタイプの命令に関連する、複数アドレス指定可能なレジスタ・ファイル内のレジスタの複数のサブセットは、レジスタの連続的な範囲である。さらに、１つまたは複数の例示的な実施形態を用いると、異なるタイプの命令が、複数アドレス指定可能なレジスタ・ファイル内のレジスタの重なり合わないサブセットにアクセスすることができるが、少なくとも１つのタイプの命令が、複数アドレス指定可能なレジスタ・ファイル内のレジスタのすべてにアクセスすることもできる。
【００３６】
１つの特定の実施形態においては、本発明の一態様によれば、異なるタイプの命令が、複数アドレス指定可能なレジスタ・ファイル内のレジスタの重なり合わないサブセットにアクセスすることができ、複数のタイプの命令（例えば、６４ｂスカラ単精度浮動小数点命令および３２ｂベクトル単精度浮動小数点命令）が、複数アドレス指定可能なレジスタ・ファイル内のレジスタのすべてにアクセスすることができる。
【００３７】
本発明の別の態様においては、１つまたは複数の例示的な実施形態が、アクセスされるべきレジスタ・ファイルの部分が実行されている命令のタイプに基づいて動的に決定されるようにして、同じレジスタ・ファイルを使用してスカラ、ベクトル、および浮動小数点命令を実行する能力を含めることによって、知られているスカラ／ベクトル・レジスタ・ファイルを拡張する。１つまたは複数の例示的な実施形態は、知られているスカラ／ベクトル・レジスタ・ファイルと、そのようなスカラ／ベクトル・レジスタ・ファイルを使用するプロセッサとを改良するので、そのようなプロセッサおよびスカラ／ベクトル・レジスタ・ファイルの基本的な動作の理解が与えられる。図３および４の以下の説明は、そのような知られているスカラ／ベクトル・レジスタ・ファイルおよびプロセッサの一例として、本発明の譲受人に譲渡された米国特許第６，８３９，８２８号を参照する。
【００３８】
図３は、米国特許第６，８３９，８２８号による、スカラとベクトルとの両方のデータおよびアドレス情報を記憶するレジスタ・ファイルを使用してスカラ命令とベクトル命令とを両方とも実行するように設計されたプロセッサの１つの例示的な図である。図３に示されたプロセッサにおいては、スカラ・データ・パス処理機能とＳＩＭＤデータ・パス処理機能とが、今やスカラ処理を包含するＳＩＭＤベクトル・データ・パスによって統合されている。スカラ処理は、ベクトル・データ・タイプの１つの要素を処理するために使用されるユニットのうちの１つで行われる。このデータ・ユニットは、以下で説明されるように、「優先スロット（preferred slot）」に指定され、分岐ユニットおよびロード／ストア・ユニットにアドレスを提供する。簡単にするために、図３の統一されたプロセッサの図は、データ・フローの接続のみを含み、制御信号の接続および外部システム・インターフェース、例えば、アドレス線、メモリとの接続などを含まない。後者の接続は、当然存在すると想定される。
【００３９】
図３の統一されたプロセッサは、命令フェッチ・ユニット３００を含み、命令フェッチ・ユニット３００は、フェッチ・ユニットのプログラム・カウンタの値に基づいてシステムのメモリ階層（図示せず）から命令およびデータをフェッチする。フェッチされた命令は、命令フェッチ・ユニット３００によって命令デコード・ユニット３０２に与えられ、そこでデコードされ、下流のユニットを制御するための適切な制御信号へと展開される。展開された命令は、発行／分岐ユニット３０４に渡され、そこで、命令キューに入れられて、処理のための適切な機能ユニットが利用可能になるのを待つ。命令が分岐である場合、制御が命令フェッチ・ユニット３００に戻され、命令フェッチ・ユニット３００が分岐先の命令をフェッチし、上述のプロセスが繰り返される。
【００４０】
スカラ演算の場合で、１つの機能ユニット（すなわち、固定小数点ユニットまたは浮動小数点ユニット）が利用可能になるとき、またはベクトル演算の場合で、複数の機能ユニットが利用可能になるとき、発行／分岐ユニット３０４が、１つまたは複数の機能ユニットに命令を発行する。計算が実行され得るよりも前に、元のオペランド・データが、スカラ−ベクトル・レジスタ・ファイル（ＳＶＲＦ）３１０にアクセスすることによって取得される。通常、複数のタイプの機能ユニット、例えば、固定小数点ユニット、浮動小数点ユニット、およびロード／ストア・ユニット（ＬＳＵ）３０６が設けられ、最後のユニットは、現在の命令によって特定されたデータをメモリ階層からフェッチし、メモリ階層に記憶する。ＬＳＵ３０６は、反対に、統合されたＳＶＲＦ３１０に、メモリ・アクセスの結果をバス３０８を介して記憶する。この実施形態において、ＳＶＲＦ３１０は、４つのスカラ・データ・ワードからなるデータ線を収容し、各線は、４つのデータ・ワードのそれぞれが異なる機能ユニットのペア（または組）３１１〜３１４に関連付けられるように分割され、それぞれの機能ユニットのペアは、示されるように、固定小数点ユニットおよび浮動小数点ユニットを含む。機能ユニットのペアは、本明細書においては並列ベクトル・ユニットと呼ばれるものを構成する。
【００４１】
発行論理が、処理のために、機能ユニットの各組の中の適切な機能ユニットにデータ線の内容を渡すようにＳＶＲＦ３１０に指示する。固定小数点ユニット、浮動小数点ユニット、比較ユニット、論理演算ユニット、シフト・ユニットなどを含むがこれらに限定されない、発行スロット（issue slot）に関連する任意の数およびタイプの機能ユニットが存在する可能性がある。データ・ワードを使用することになる組の中の特定の機能ユニットは、実行されるべき命令に依存し、発行／分岐ユニット３０４からの信号によって制御される。したがって、命令がデータに対して演算を行うように固定小数点ユニットに要求する場合、データは、線３１５〜３１８を介して固定小数点ユニット３１９〜３２２に渡される。命令が浮動小数点ユニット３２７〜３３０を必要とする場合、データは、線３２３〜３２６を介して渡される。その他の機能ユニットのタイプが存在するとすれば、データは、同様にしてそれらの機能ユニットに渡されることになる。それぞれの指定された機能ユニットは、入力データに対してその機能ユニットの演算を実行し終えたとき、結果をＳＶＲＦ３１０に戻し、そこで、結果は、ＬＳＵ３０６によって要求されるかまたはさらなる操作のために機能ユニットに渡されるまで記憶される。
【００４２】
機能ユニットによって実行されるべき演算およびそれらの演算を実行するための機能ユニットは、発行／分岐ユニット３０４によって与えられる制御信号によって決定される。操作がＳＶＲＦ３１０からデータを読むようにＬＳＵ３０６に指示するとき、データが、データ・バス３３２を介して渡される。加えて、データがメモリ内で記憶されるべきアドレスが、アドレス・バス３３１を介してＬＳＵ３０６に渡される。図３の実施形態においては、アドレス・バス３３１が、機能ユニットのペア３１４（このペアは、後で説明するように、優先スロットに指定されている）に関連付けられているＳＶＲＦ３１０のセグメント（Ｄ）からの情報を渡す。優先スロットは、機能ユニットを優先スロットとして定義するか、または制御レジスタの設定か、命令ワードでのスロットの指定か、もしくは例えば発行時間（issue time）において発行ユニットによって任意のその他の手段を用いてそれを決定することかのいずれかによって優先スロットを動的に決定することによるかのどちらかにより機能ユニットのいずれかになる可能性がある。優先スロットを指定することによって、機能ユニットの電力を選択的に切ることを可能にし、その結果、電力が節約される。
【００４３】
ここまでのところ、統一されたプロセッサの説明された動作は、スカラ演算とベクトル演算との両方に適用されてきた。つまり、実行されるべき演算がスカラ演算であり、したがって、１つの機能ユニットのペアだけの動作および出力を必要とする場合、残りの機能ユニットのペアは、それにもかかわらず、スカラ・ベクトル・レジスタ・ファイルからそれらの残りの機能ユニットのペアに渡されたデータに対して同じ演算を実行するように指示される可能性がある。異なる機能ユニットが異なる演算を同時に実行することを要求することは、必ず、複雑な設計上の配慮を生じるので、そのような手法は、設計の単純化を可能にする。同様に、ベクトル演算に関して、それぞれの機能ユニットのペアは、入力データに対して同じ演算（または密結合動作（tightly coupled operation）の一部、または単一の命令で指定された密結合動作の組み合わせの一部としての実質的に同じ演算）を実行する。
【００４４】
スカラ演算とベクトル演算とは、演算の解釈にしたがって、関連するアドレス情報が使用される方法により区別される。演算の解釈は、その演算の演算コードの直接的な結果である可能性があり、つまり、異なる演算コードが、異なる命令（例えば、「スカラ・バイトをロード」、「スカラ・ワードをロード」、「スカラ・ベクトルをロード」）に関して利用可能である可能性があり、またはシステムの別の部分、例えば、単一の「ロード」オペコードを解釈するためのモード・タグ・ビット（mode tag bit）に応じて決まる可能性がある。スカラ・データでさえも（ベクトルよりは少ないバイト数であるが）バイトのアドレスの範囲（address range of bytes）に広がり、ロード／ストアが動作し得る方法もさまざまである。
【００４５】
ＳＶＲＦ３１０内の特定のスロットに通常割り振られるその他の機能ユニットと異なり、ＬＳＵ３０６は、ＳＶＲＦ３１０に含まれるデータの線全体またはそのサブセットに対して動作する。ＬＳＵ３０６は、発行／分岐ユニット３０４によって発行された命令に応じて、ロード動作モードまたはストア動作モードのどちらかで動作する。ロード・モードにおいて、ＬＳＵ３０６は、アドレス・バス３３１を用いてＳＶＲＦ３１０の優先スロットからアドレス情報を受け取り、指定されたアドレスからデータをロードする。ロード・ベクトル命令が実行されているときは、ロード動作が、バス３０８を用いてメモリからＳＶＲＦ３１０にデータの線全体をロードする。ロード・スカラ動作が指定されるとき、ロード動作は、少なくとも、スカラ・タイプのサイズ（典型的には、バイト、半ワード、ワードなど）に対応するビット数をロードする。追加のビットが、実装上の選択にしたがってロードされる可能性があり、または無効なデータ、もしくはデフォルト値（「０」など、ただし、これに限定されない）に初期化されたデータが、要求されたデータ・タイプの範囲外のそれらのビットに与えられる可能性がある。一実施形態においては、「ロード・スカラ」動作は、要求されたスカラ値が、ＳＶＲＦ３１０に記憶される前に、優先スロットにおいてアラインされるアラインメント・ステップを含む。別の実施形態においては、アラインメントは、一連の１つまたは複数の命令を用いてプログラムによって実行される。
【００４６】
ストア動作モードにおいて、ＬＳＵ３０６は、データ・バス３３２によってＳＶＲＦ３１０から記憶されるべきデータを受け取り、アドレス・バス３３１を用いてＳＶＲＦ３１０の優先スロットからアドレス情報を受け取り、指定されたアドレスにデータを記憶する。
【００４７】
図４は、米国特許第６，８３９，８２８号による、分岐ユニットおよびＬＳＵによって使用され得る、情報としてスカラ・データを選択するより柔軟な手法を示す。この実施形態によれば、ＳＶＲＦ３１０のさまざまなセグメントが、（典型的には、実行されるべき命令の命令ワード内のフィールドから来る可能性がある）発行／分岐ユニット３０４からの線３３４を介した制御入力によって制御され得るマルチプレクサ３３３によって選択され得る。代替的な実施形態は、マルチプレクサの制御入力を与えるためのソフトウェアで制御される専用のレジスタまたはブート時パラメータを含み得るがこれに限定されない。
【００４８】
図４に示された実施形態は、以下のように動作する。スカラ・データ値が、操作のためのメモリ・アドレスを供給するためにロード／ストア・ユニットによって必要とされるか、または例えば分岐先アドレスもしくは分岐条件を与えるために分岐ユニットによって必要とされるか、またはすべての要素に適用されるべき単一のシフト回数を必要とするシフト・ユニットによって必要とされるか、またはスカラ・データ値をそのユニットの入力として必要とする可能性がある任意のその他のユニットによって必要とされるかのいずれかのときに、マルチプレクサ３３３は、動作のためのスカラ入力としてスロットＡ、Ｂ、Ｃ、またはＤのうちの１つを選択するための制御入力によって操作される。したがって、この実施形態によれば、機能ユニットのペアのいずれもが、「優先スロット」として選択される可能性があり、処理動作のバランスを取ることを可能にし、複数のスロットの間の転送操作の必要性を減らし、スカラ値が記憶され得るスロットの数を増やすことができる。
【００４９】
したがって、米国特許第６，８３９，８２８号は、スカラ処理のための優先スロットの２つの異なる実装を記載している。第１は、優先スロットが設計段階で選択されるハードウェア組み込み式の実装であり、第２は、優先スロットが実行中にオン・ザ・フライで選択され得る可変の手法である。第’８２８号特許で述べられているように、設計時に優先スロットを指定することは、上述の選択が行われる必要がないという点で実装を簡単にすることができる。さらに、同一の機能ユニットのペアを使用することは、優先スロットに関しては使われることがない無駄な回路を持つというわずかなオーバーヘッドのコストがかかるものの、より効率的である可能性がある。
【００５０】
米国特許第６，８３９，８２８号のレジスタ・ファイルのメカニズムおよびその他のレジスタ・ファイルのメカニズムは、単一のレジスタ・ファイルがスカラ演算とベクトル演算との両方のために使用されることを可能にするが、これらのレジスタ・ファイルのメカニズムは、複数アドレス指定を可能にせず、単一のレジスタ・ファイルに異なるタイプの命令／データを記憶する能力を提供するだけである。単一のレジスタ・ファイルで異なるタイプの命令／データを扱うために、複雑なアーキテクチャまたは動作あるいはその両方が提供されている。
【００５１】
対照的に、１つまたは複数の例示的な実施形態は、レガシーの命令と１つまたは複数の新しいまたは拡張されたタイプの命令との両方が複数アドレス指定可能なレジスタ・ファイルのレジスタにアクセスすることを可能にする複数アドレス指定可能なレジスタ・ファイルを提供する。１つまたは複数の例示的な実施形態のメカニズムを用いると、単一のレジスタ・ファイルが、スカラ命令と単一命令複数データ（ＳＩＭＤ）またはベクトル命令との両方を使用してアドレス指定され得る。つまり、１つまたは複数の例示的な実施形態による複数アドレス指定可能なレジスタ・ファイル内のレジスタのサブセットが、異なる命令の形態、例えば、スカラ命令、ＳＩＭＤまたはベクトル命令などでアドレス指定可能である一方、レジスタの組全体は、本明細書においてはベクトル−スカラ拡張（ＶＳＸ）命令と呼ばれるさらに別の形態の命令でアドレス指定され得る。ＶＳＸ命令の形態を用いてレジスタの組全体に対して実行され得る操作のタイプ、すなわち、操作セット（operation set）は、レジスタのサブセットの操作セットと実質的に同様である。
【００５２】
１つまたは複数の例示的な実施形態の複数アドレス指定可能なレジスタ・ファイルは、レガシーの命令が複数アドレス指定可能なレジスタ・ファイル内のレジスタのサブセットにアクセスすることを可能にし、一方、新しいまたは拡張された命令、例えば、ＶＳＸ命令は、複数アドレス指定可能なレジスタ・ファイル内のレジスタの範囲全体にアクセスすることができる。さらに、レガシーの命令のデータ・フォーマットは、ＶＳＸ命令のデータ・フォーマットと互換性がある。したがって、レガシーの命令によって生成されたデータが、ＶＳＸ命令によって処理される可能性があり、その逆も同様である。
【００５３】
例えば、１つまたは複数の例示的な実施形態は、レガシーの浮動小数点命令（スカラ演算）がレジスタ・ファイルのレジスタの第１のサブセット、例えば、ＶＳＸレジスタ０〜３１に記憶された値に作用することを可能にし、レガシーのＶＭＸ命令（ベクトル演算）がレジスタ・ファイル内のレジスタの第２のサブセット、例えば、（実際の命令ではレジスタ０から３１を参照し続けるが）ＶＳＸレジスタ３２から６３に作用することを可能にし、ＶＳＸ命令（ベクトル−スカラ演算）がレジスタ・ファイルのレジスタのすべて、例えば、ＶＳＸレジスタ０から６３に対して演算を行うことを可能にする。例示的な実施形態のうちの１つまたは複数は、さらに、異なるタイプの命令が、レジスタのさまざまなサブセットと、レジスタ・ファイルのレジスタのすべてにアクセスするＶＳＸ命令の能力とを使用してデータを共有することを可能にする。例えば、データは、ＶＳＸレジスタ０から３１にデータを記憶し、アクセスすることによって、ＶＳＸ命令とレガシーの浮動小数点命令との間で共有され得る。同様に、１つまたは複数の例示的な実施形態は、いかなる修正もなしにレガシーの浮動小数点命令およびレガシーのＶＭＸ命令のどちらか一方または両方を使用するプログラムを実行し続けながら、データがＶＳＸレジスタ３２および６３においてレガシーのＶＭＸ命令とＶＳＸ命令との間で共有されることを可能にする。さらに、１つまたは複数の例示的な実施形態は、いかなる修正もなしにレガシーの浮動小数点命令およびレガシーのＶＭＸ命令のどちらか一方または両方を使用するコード・モジュールを、新しいＶＳＸ命令を使用するコード・モジュールにリンクすることを可能にし、レガシーの命令で計算するコード・モジュールとＶＳＸ命令を使用するコード・モジュールとの間でデータを共有する。
【００５４】
１つの特定の実施形態においては、本発明の一態様によれば、ＶＳＸ命令は、６４ｂスカラ単精度浮動小数点命令および３２ｂベクトル単精度浮動小数点命令、ならびに場合によってはその他の命令を含む。６４ｂスカラ単精度浮動小数点命令の例は、この「発明を実施するための形態」の一部として含まれるRFC02182.r6: VSX Scalar Single-Precisionに記載されている。
【００５５】
図５は、１つの例示的な実施形態による、複数アドレス指定可能なレジスタ・ファイルが利用されるプロセッサの図の一例である。図５に示されるように、プロセッサ４００は、レジスタ・ファイル４４０の構成および利用を除いて図３のプロセッサと構成が同様である。命令フェッチ・ユニット４１０、発行／分岐ユニット４３０、機能ユニットのペア（または組）４８２〜４８８の機能ユニット４５０〜４８０、およびロード／ストア・ユニット４９０はすべて、図３に関連して上で説明されたのと同様の方法で動作する。命令デコード・ユニット４２０は、３つの異なるタイプ、すなわち、ベクトル、スカラ、およびベクトル−スカラ命令タイプの命令をデコードするために使用される、以降で説明される追加の論理を有する。１つの例示的な実施形態において、これらの３つの異なるタイプの命令は、ベクトル・マルチメディア拡張（ＶＭＸ：vector multimedia extension）命令、浮動小数点（ＦＰ）命令、およびベクトル−スカラ拡張（ＶＳＸ）命令である。ＦＰ演算は、当技術分野で広く知られている。ＶＭＸ命令は、ニューヨーク州アーモンクのＩＢＭから入手可能なＰＯＷＥＲ６プロセッサで使用され、複数のデータ要素に対して演算を行う単一の命令を提供する。ＶＳＸ命令は、以降でさらに詳細に説明される。
【００５６】
デコードされた命令に基づいて、命令は、レジスタ・ファイル４４０のサブレンジか、またはレジスタ・ファイル４４０内のレジスタの範囲全体かのどちらかにアクセスする。命令が命令デコード・ユニット４２０によってレガシーの浮動小数点命令であると判定される場合、レジスタ・ファイル４４０の第１のサブレンジ４４２がアクセスされ、データが、処理のために適切な機能ユニット４５０〜４８０に与えられる。命令が命令デコード・ユニット４２０によってレガシーのＶＭＸベクトル命令であると判定される場合、レジスタ・ファイル４４０の第２のサブレンジ４４４がアクセスされ、やはり、データが、処理のために適切な機能ユニット４５０〜４８０に与えられる。命令が命令デコード・ユニット４２０によってＶＳＸ命令であると判定される場合、レジスタ・ファイル４４０の範囲全体４４６がアクセスされる可能性があり、データが、処理のために適切な機能ユニット４５０〜４８０に与えられる。実行される特定のＶＳＸ命令に応じて、レジスタ・ファイル４４０の範囲全体４４６のうちのいずれかにアクセスするＶＳＸ命令は、入力データを得るためにレジスタの幅全体を使用する（ＶＳＸベクトル命令に対応し、命令のオペランドの位置のそれぞれでレジスタ・ファイル４４０の範囲全体４４６にアクセスできるようにする）か、またはレジスタの幅の一部を使用する（ＶＳＸスカラ命令に対応し、命令のオペランドの位置のそれぞれでレジスタ・ファイル４４０の範囲全体４４６にアクセスできるようにするが、そこに含まれるビットのサブセットだけを使用する）かのどちらかである可能性がある。
【００５７】
第１のサブレンジ４４２は、レジスタ・ファイル４４０内のレジスタの第１の組のビットの第１の範囲を含む。第２のサブレンジ４４４は、レジスタ・ファイル内のレジスタの第２の組のビットの第２の範囲を含む。レジスタ・ファイル４４０の範囲全体４４６は、レジスタ・ファイル４４０内のレジスタの組全体のビットの範囲全体を含む。このようにして、単一のレジスタ・ファイル４４０は、レガシーのスカラ命令とレガシーのベクトル命令との両方、および本明細書においてはＶＳＸ命令と呼ばれるベクトル−スカラ命令の統合された組を処理するために使用され得る。
【００５８】
ＶＳＸ命令は、レジスタ・ファイル４４０のレジスタの組全体にアクセスすることができる命令である。ＶＳＸ命令セットは、レジスタ・ファイル４４０全体の各レジスタの３２ビットのサブレンジにアクセスする単精度スカラ浮動小数点命令と、レジスタ・ファイル４４０全体の各レジスタの６４ビットのサブレンジにアクセスする単精度スカラ浮動小数点命令と、レジスタ・ファイル４４０全体の各レジスタの６４ビットのサブレンジにアクセスする倍精度スカラ浮動小数点命令と、レジスタ・ファイル４４０全体の中のビットの範囲全体にアクセスするベクトル命令とを含む命令のいくつかのクラスを含む。ＶＳＸ命令は、選択されたタイプのレジスタ指定子、例えば、レガシーのスカラ命令およびレガシーのベクトル命令によって使用されるレガシーの５ビットの指定子とは対照的な６ビットのレジスタ指定子を使用する。
【００５９】
したがって、１つまたは複数の例示的な実施形態は、別々のスカラ・レジスタ・ファイルおよびベクトル・レジスタ・ファイルを有するレガシーのアーキテクチャと互換性のあるレジスタ・ファイルの単一のスカラ／ベクトル・アーキテクチャを提供する。１つまたは複数の例示的な実施形態は、さらに、チップ領域の拡大をもたらすことなく、レガシーのレジスタ・ファイルと拡張されたベクトル−スカラ・レジスタ・ファイルとの間でプロセッサのストレージ空間を共有することを可能にする。その上、１つまたは複数の例示的な実施形態は、レガシーの命令を使用するレガシーのプログラムおよびライブラリと、（レガシーの命令かまたは新しい／拡張された命令かのどちらかを使用する）プログラムおよびライブラリとの間でデータを共有することと、コードの相互運用とを可能にし、それによって、レガシーのアプリケーションのコード・チューニングにかけた労力が無駄にならず、新しい／拡張された命令が最も有利な場合に新しい／拡張された命令が使用されることを可能にしながら、新しい／拡張された命令を使用するようにすべてのアプリケーションをコーディングし直す必要が回避される。結果として、スカラ、およびベクトル、例えば単一命令複数データ（ＳＩＭＤ）命令に対して別々のレジスタ・ファイルを利用する知られているプロセッサ・アーキテクチャが被る高価なオーバーヘッドと、単一のレジスタ・ファイルを使用してスカラ命令とベクトル命令とを両方とも処理するための複雑な新しいアーキテクチャに関連する追加コストとが、回避される可能性がある。
【００６０】
レジスタ・ファイル４４０は、複数のベクトル−スカラ・レジスタ（ＶＳＲ：vector-scalarregister）で構成され、それぞれのＶＳＲは、複数のビットを有する。例えば、レジスタ・ファイル４４０は、ＶＳＲ［０］からＶＳＲ［６３］までの番号を振られた６４個のＶＳＲで構成される可能性があり、それぞれのＶＳＲは、０から１２７までの番号を振られた１２８ビットを有する。説明を目的として、ＶＳＲがレジスタ・ファイル４４０の上から下に向かって連続的に番号を振られ、ビットがレジスタ・ファイル４４０の左から右に向かって連続的に番号を振られると仮定される。これが、以降で検討される図６に示される。
【００６１】
図６は、１つの例示的な実施形態によるベクトル−スカラ拡張（ＶＳＸ）レジスタ・ファイルの例示的な図である。図６のＶＳＸレジスタ・ファイル５００は、例えば、レジスタ・ファイル４４０として利用され得る。図６に示されるように、ＶＳＸレジスタ・ファイル５００は、ＶＳＲ［０］からＶＳＲ［６３］までの番号を振られた複数のベクトル−スカラ・レジスタ（ＶＳＲ）５１０を含む。ＶＳＲ５１０のそれぞれは、設定され得る所定の数のビットを有する。示された例においては、各ＶＳＲ５１０が、パラメータの受け渡しのためなど、命令に対応するデータを記憶するための、０から１２７までの番号を振られた１２８ビットを有する。
【００６２】
レジスタ・ファイル５００のレジスタの第１の組５３０内のビットの第１のサブレンジ５２０は、スカラ命令または浮動小数点命令などの第１のタイプの命令に関連付けられる。レジスタ・ファイル５００のレジスタの第２の組５５０内のビットの第２のサブレンジ５４０は、ベクトル、ＳＩＭＤ、またはＶＭＸ命令などの第２のタイプの命令に関連付けられる。レジスタ・ファイル５００のレジスタの組全体５７０内のビットの第３の範囲５６０は、ＶＳＸ命令などの第３のタイプの命令に関連付けられる。
【００６３】
ＶＳＸレジスタ・ファイル５００は、関連するレジスタの範囲およびレジスタ内のビット幅に基づいて３つの異なるタイプの命令がＶＳＸレジスタ・ファイル５００のレジスタにアクセスすることを可能にすることによってその他のシステムのその他のレジスタ・ファイルとは異なることが、図６から理解され得る。その他のレジスタ・ファイルは、特定の命令のタイプのすべてのオペランドに対応するレジスタのサブセットに対してではなく、レジスタの組全体５７０に対してアクセスされるべきレジスタを指定することによって、すべてのタイプの命令に関して同じ方法でレジスタ・ファイル全体がアクセスされることを必要とする。
【００６４】
ＶＳＸレジスタ・ファイル５００を用いると、レガシーのスカラ演算がＶＳＸレジスタ・ファイル５００からデータを読み出すこと／にデータを書き込むことになるとき、１つの例示的な実施形態においては、スカラ・データ値が、レジスタの幅の左側、すなわち、レジスタＶＳＲ［０］からＶＳＲ［３１］のビット０から６３まで、例えば、第１のサブレンジ５２０から読み出され／に書き込まれる。例示的な実施形態によって実現され得る、ベクトル−スカラ・レジスタ（ＶＳＲ）へのスカラ値の書き込みのいくつかの方法が存在する。１つの例示的な実施形態においては、ＶＳＲのビットのすべては、スカラ命令によって指定されたレジスタにおいて、スカラ・データ値に対応しないビットに対してベクトル計算が実行された結果に対応する値がビット６４から１２７までに書き込まれる一方、スカラ値がビット０から６３までに書き込まれるようにして書き込まれる可能性がある。例えば、レジスタＦ０およびＦ１のデータ値が足されてレジスタＦ３に結果を与える場合、ＶＳＲ３のビット６４から１２７までの値が、あたかもＶＳＲ０およびＶＳＲ１のビット６４から１２７までに対してベクトル演算が実行されたかのように対応する可能性がある。
【００６５】
別の例示的な実施形態においては、ビット０から６３までに書き込まれることになるスカラ値が、ビット６４から１２７までに複製される可能性がある。この手法は、例えば、スカラ浮動小数点値が後でベクトル値と組み合わされるべきであるとき、例えば、ベクトルにスカラ値を乗算するときに有用である可能性がある。通常、スカラ値は、初めに、ＶＭＸまたはＶＳＸ命令セットの「splat」命令などによってレジスタ全体にわたって複製されなければならない。この手法は、スカラ値が既に複製済みであるので、「splat」命令を実行する必要をなくす。
【００６６】
さらに別の例示的な実施形態においては、スカラ値は、ビット６４から１２７までに存在していたいかなる値も変更されずに残ることができる一方、レジスタのビット０から６３までに書き込まれる可能性がある。そのような手法は、ベクトル演算が一連のスカラ演算に分解される必要がある可能性があり、それぞれのスカラの結果が特定のベクトル要素に挿入され、最終的に、複数のスカラの結果からベクトルの結果を生成する可能性があるときに使用され得る。これは、レジスタに何も書き込まれる必要がないときは何も書き込まれないので、最小電力の実施形態である。しかし、このとき、レジスタ全体に存在する値が、スカラの結果が書き込まれる前にレジスタ・ファイルにどんな値が存在したかに依存する可能性があるので、その手法は、不確定性をもたらす可能性がある。これは、リネーム・レジスタに存在する値が極めて予測しにくいレジスタ・リネーミングを用いるアーキテクチャにとって特に問題となる。
【００６７】
別の例示的な実施形態においては、スカラ値は、レジスタのビット０から６３までに書き込まれる可能性がある一方、残りのビット６４から１２７がデフォルト値、例えばゼロで埋められる可能性がある。そのような手法は、ベクトル演算が一連のスカラ演算に分解される必要がある可能性があり、複数のスカラの結果がシフトし、ＯＲ演算でまとめられてベクトルの結果を形成するときに使用され得る。この手法は、予測可能な値をもたらし、したがって、何も書き込まないことに関連する問題が回避される。さらに、このオプションは、（負荷を２倍にする、レジスタ内の２つの位置にその値を与えることを必要としないので）値を複製するよりも結果バスに対して少ない負荷を示す。
【００６８】
レガシーのベクトル、ＳＩＭＤ、またはＶＭＸ命令に関して、データ値は、ＶＳＲ［３２］から［６３］の第２の組のビット０から１２７までの範囲全体から読み出され／に書き込まれる。新しいＶＳＸ命令に関して、データ値は、ＶＳＲ［０］から［６３］の組全体のビット０から１２７までの範囲全体から読み出され／に書き込まれる。これらのＶＳＸ命令によって、スカラ値は、レジスタの左側のビット０から６３までに書き込まれ、一方、ベクトル値は、ビット０から１２７までのすべてにわたって書き込まれる。
【００６９】
したがって、１つまたは複数の例示的な実施形態のメカニズムを用いると、命令をデコードするとき、実際には、デコードされるべき命令の２つの特徴が存在する。第１は、データ・アクセスの幅、すなわち、アクセス幅の指定であり、第２は、レジスタ指定子である。アクセス幅の指定は、レジスタのどのビットが読み出される／書き込まれるべきであるかを特定する。レジスタ指定子は、読み出される／書き込まれるべき、複数アドレス指定可能なレジスタ・ファイル内のレジスタのサブセットまたはレジスタの組全体を特定する。命令のデコードに関する第１の要件は、ベクトル−スカラ・レジスタ・ファイル上にレガシーのより小さなレジスタ・ファイルをオーバーレイ（overlay）する複数アドレス指定を可能にする態様がストレージを共有することを認めることを可能にするレジスタ指定子である。
【００７０】
再び図５を参照すると、上で検討されたように、デコード論理が、例示的な実施形態の単一のレジスタ・ファイルを使用する３つのタイプの命令を扱うためにプロセッサ４００の命令デコード・ユニット４２０に追加されている。デコード論理は、命令のタイプを判定し、命令のタイプに基づいて、命令によってアクセスされ得るレジスタ・ファイル４４０内のレジスタのビット幅を指定するための幅指定子を生成する。次に、レジスタの幅全体に対する完全な指定子（full specifier）が、命令のタイプおよび幅指定子に基づいて生成され、そして、レジスタ・ファイル４４０内のレジスタの対応するサブセット４４２〜４４６内のレジスタが、完全な指定子を用いてアドレス指定される。次に、演算の結果が、完全な指定子を使用したレジスタのサブセット４４２〜４４６のアドレス指定に基づいて計算され、レジスタ・ファイル４４０内のレジスタのサブセット４４２〜４４６に書き戻される。
【００７１】
１つの例示的な実施形態によれば、少なくとも、それぞれが参照によりその全体が本明細書に組み込まれている米国特許第７，８７７，５８２号（米国公開第２００９／０１９８９６６Ａ１号）に含まれる付録と、この「発明を実施するための形態」の一部である文献と、以下の刊行物、すなわち、それぞれが参照によりその全体が本明細書に組み込まれている"Power ISATM Version 2.05," Chapters 4, 5 and6, International Business Machines Corporation, October 23, 2007および"Power ISATM Version 2.06 Revision B", Chapter7, International Business Machines Corporation, July 23, 2010とに示された仕様による「カテゴリ：浮動小数点」（ＦＰＵまたはレガシーのＦＰＵ）の命令の第１のセットと、「カテゴリ：ベクトル」（ＶＭＸ）の命令の第２のセットと、「カテゴリ：ＶＳＸ」の命令の第３のセットを含むＰｏｗｅｒ  Ａｒｃｈｉｔｅｃｔｕｒｅ（「ＰｏｗｅｒＰＣ（Ｒ）」および「Ｐｏｗｅｒ  ＩＳＡ（商標）」の名前でも知られる）の実装が提供される。"Power ISATM Version 2.05", InternationalBusiness Machines Corporation, October 23, 2007および"PowerISATM Version 2.06 Revision B", International Business MachinesCorporation, July 23, 2010のそれぞれは、参照によりその全体が本明細書に組み込まれている。
【００７２】
浮動小数点プロセッサ機能に関する詳細な情報は、「Power ISATMVersion 2.05 - Chapter 4 - Floating-Point Processor [Category: Floating-Point]」で与えられている。ＶＭＸプロセッサ機能に関する詳細な情報は、「Power ISATM Version 2.05 - Chapter 6 - Vector Processor[Category: Vector]」で与えられている。ＶＳＸプロセッサ機能に関する詳細な情報は、参照によりその全体が本明細書に組み込まれている「Power ISATM Version 2.06 Revision B - Chapter 7 -Vector-Scalar Floating-Point Operations [Category: VSX]”」ならびにこの「発明を実施するための形態」の一部として含まれる「RFC02182.r6: VSX Scalar Single-Precision」および「Chapter 7: Vector-Scalar Floating Point Operations [Category: VSX]」で与えられている。１つの例示的な実施形態によれば、「カテゴリ：１０進浮動小数点」などの追加の命令のセットが、参照によりその全体が本明細書に組み込まれている「Power ISATM Version 2.05 - Chapter 5 - DecimalFloating-Point [Category: Decimal Floating-Point]」で詳細に説明されているように存在する可能性がある。
【００７３】
本発明の一態様によれば、本明細書とともに含まれるRFC02182.r6およびChapter 7は、既に与えられていた３２ｂスカラ命令とは異なる６４ｂ単精度スカラ命令を含む新しいＶＳＸ命令のセットを記載する。６４ｂスカラ演算を設けたことは、同様に６４ｂであるレガシーのスカラ演算とのさらなる互換性をもたらす。
【００７４】
図７〜９は、１つまたは複数の例示的な実施形態の命令デコード・ユニットのデコード論理で実施され得る例示的なデコード操作の概要を示す流れ図である。流れ図の各ブロック、および流れ図のブロックの組み合わせは、コンピュータ・プログラム命令によって実装され得ることが理解されるであろう。これらのコンピュータ・プログラム命令は、プロセッサまたはその他のプログラム可能なデータ処理装置で実行される命令が流れ図の１つのブロックまたは複数のブロックで規定された機能を実施するための手段をもたらすように、プロセッサ、またはマシンを生産するためのその他のプログラム可能なデータ処理装置に与えられる可能性がある。これらのコンピュータ・プログラム命令は、コンピュータ可読メモリまたはストレージ媒体に記憶された命令が、流れ図の１つのブロックまたは複数のブロックで規定された機能を実施する命令手段を含む製品をもたらすように、プロセッサまたはその他のプログラム可能なデータ処理装置を特定の方法で機能させることができるコンピュータ可読メモリまたはストレージ媒体に記憶される可能性もある。
【００７５】
したがって、流れ図のブロックは、規定された機能を実行するための手段の組み合わせ、規定された機能を実行するためのステップの組み合わせ、および規定された機能を実行するためのプログラム命令手段をサポートする。流れ図の各ブロック、および流れ図のブロックの組み合わせは、規定された機能もしくはステップを実行する専用のハードウェアに基づくコンピュータ・システムによって、または専用のハードウェアとコンピュータ命令との組み合わせによって実施され得ることも理解されるであろう。
【００７６】
さらに、流れ図は、例示的な実施形態内で実行される操作を説明するために与えられる。流れ図は、特定の操作、またはより詳細には操作の順番に関する限定を示すかまたは示唆するように意図されていない。流れ図の操作は、本発明の精神および範囲から逸脱することなく特定の実装に合うように修正され得る。
【００７７】
図７は、１つの例示的な実施形態による全体的なデコード操作の概要を示す流れ図である。図７に示されるように、操作は、命令フェッチ・ユニットからフェッチされた命令を受け取ることから始まる（ＳＴＥＰ６１０）。フェッチされた命令のオペコードに基づいて、デコード論理が、フェッチされた命令がＶＳＸ命令であるかどうかを判定する（ＳＴＥＰ６１５）。オペコードが命令がＶＳＸ命令（またはその他の選択されたタイプの命令）であると特定する場合、完全なレジスタ指定子（full register specifier）が、命令エンコーディングの１つまたは複数のフィールドから抽出される（ＳＴＥＰ６２０）。命令は、いくつかのフィールドを有する命令ワードによって規定される。これらのフィールドは、例えば、オペコード・フィールド、いくつかのレジスタ指定子フィールド、およびセカンダリ・オペコード・フィールドを含む可能性がある。命令に対処するとき、命令デコーダは、どのタイプの命令に対処するかを判定する（これは、オペコードおよびセカンダリ・オペコード・フィールドを分析することによって行われる）可能性があり、通常は、レジスタのどのビットを使用すべきか（例えば、サブレンジ５２０、５４０、５６０を使用すべきであること）も示す。レジスタ指定子フィールドは、５３０、５５０、または５７０のうちのどのレジスタにアクセスすべきかを指定する。一実施形態において、レジスタ指定子フィールドのそれぞれは、５ビットの指定子、すなわち、狭い指定子（narrow specifier）を与える可能性がある。レジスタ・ファイルの６４個のＶＳＲレジスタのうちの１つを指定するための６ビットを与える追加のビットを提供するために、命令ワードに拡張フィールドが設けられる可能性がある。
【００７８】
レジスタ・ファイル内の対応するレジスタが、それらのレジスタのデータ値を、処理のために適切な計算または機能ユニットに提供するようにアドレス指定され、すなわち、選択される（ＳＴＥＰ６２５）。つまり、完全なレジスタ指定子がレジスタ・ファイルに与えられ、その結果、レジスタ・ファイルが、レジスタの組全体５７０のうちのどれを読み出すまたは書き込むべきかを知る。レジスタ指定子は、レジスタを特定するストレージ・アレイ内の「アドレス」である。
【００７９】
オペランド・データ値が、計算／機能ユニットによって処理され（ＳＴＥＰ６３０）、次に、計算または機能ユニットによる処理の結果が、レジスタ・ファイル内の対応するレジスタに書き戻される（ＳＴＥＰ６３５）。書き戻すべき特定のレジスタは、やはり、レジスタ指定子によって指定される。
【００８０】
フェッチされた命令のオペコードが命令がＶＳＸ命令（またはその他のタイプの命令）ではないことを示す場合（ＳＴＥＰ６１５）、命令で使用するためのレジスタのサブセットと、場合によってはレジスタの幅全体の中のビットとを特定する狭いレジスタ指定子（narrow register specifier）が抽出される（ＳＴＥＰ６４０）。そして、レジスタのビットの範囲全体に関する完全なレジスタ指定子が、命令のタイプおよび狭いビット範囲指定子（narrow bit range specifier）に基づいて生成される（ＳＴＥＰ６４５）。つまり、１つまたは複数のビットが、完全なレジスタ指定子を生成するために狭いレジスタ指定子に追加される。追加されるべきビットは、レジスタ・ファイルのサブレンジと、それらがどのように定義されたかとに応じて決まる。例えば、レガシーのスカラ命令に関しては、５ビットのオペランド指定子、すなわち、狭いビット範囲指定子が、命令エンコーディングの各オペランドに対して与えられる。完全なレジスタ指定子は、例えば、示された例においては、頭に０を追加して、ＶＳＲ０〜３１にアクセスできるようにする６ビットの指定子を生成することによって生成される可能性がある。レガシーのベクトル命令に関しては、５ビットのオペランド指定子、すなわち、狭いレジスタ指定子が、命令エンコーディングの各オペランドに対して与えられる。完全なレジスタ指定子は、例えば、頭に１を追加して、ＶＳＲ３２〜６３にアクセスできるようにする６ビットの指定子を生成することによって生成される可能性がある。ＶＳＸ命令に関しては、６ビットのオペランド指定子、すなわち、完全なビット範囲指定子（full bit range specifier）が、命令エンコーディングの各オペランドに対して与えられ、したがって、レジスタ・ファイル内のＶＳＲのすべてにアクセスするために修正は必要とされない。
【００８１】
例示的な実施形態のうちの１つまたは複数の狭いレジスタ指定子および完全なレジスタ指定子は、レジスタ・ファイルの「複数アドレス指定可能な」性質をもたらし、「複数アドレス指定可能な」性質とは、異なる命令が実際に異なるアドレスを含み、デコードがレジスタ・ファイルの共有されたアドレス指定をオーバーレイし、使用するようにそれらの命令を適合させるという事実を指す。したがって、例えば、６ビットを有するＶＳＸレジスタの完全なレジスタ指定子００００００は、ＶＳＸレジスタ０を指す。５ビットの狭いレジスタ指定子０００００を有するレガシーの浮動小数点命令は、ＶＳＲレジスタの初めの３２個のレジスタをオーバーレイし、５ビットの狭いレジスタ指定子に「０」を加え、この特定の例においては００００００を与えることによって得られるので、同じレジスタを指す。一方、５ビットのレガシーのＶＭＸの狭いレジスタ指定子０００００は、レジスタ３２（ＶＳＲ３２から６３の範囲内の最初のレジスタ）を指し、５ビットの指定子に「１」を加え、特定の例においては１０００００を与えることによって得られる。
【００８２】
完全なレジスタ指定子が得られると、オペコードによって特定された命令のタイプに関連するレジスタのサブセット内のレジスタが、完全なレジスタ指定子に基づいてアドレス指定される（ＳＴＥＰ６５０）。任意で、ビット幅が、レジスタのビットの第１の組が１つの命令のタイプ、例えば、レガシーのスカラ命令に関連付けられ、レジスタのビットの別の組が別の命令のタイプ、例えば、レガシーのベクトル命令に関連付けられるように、命令のタイプに基づいて決定される可能性がある。この機能は、上で説明されており、特定の実装に対して任意である。この機能は任意であるので、図７には明示されていない。
【００８３】
次に、操作は、ＳＴＥＰ６３０へと続き、アドレス指定されたレジスタからのデータ値、例えば、オペランド値が、処理のために計算／機能ユニットに与えられ（ＳＴＥＰ６３０）、結果が、完全なレジスタ指定子を使用してレジスタのサブセット内のレジスタに書き戻される（ＳＴＥＰ６３５）。そして、操作は終了する。
【００８４】
図８および９は、１つの例示的な実施形態による１つの実装に関するデコード操作の一例の概要を示す流れ図を示す。図８および９に示されるように、操作は、やはり、命令フェッチ・ユニットからフェッチされた命令を受け取ることから始まる（ＳＴＥＰ７１０）。フェッチされた命令のオペコードに基づいて、デコード論理が、フェッチされた命令がＶＳＸ命令（またはその他の選択されたタイプの命令）であるかどうかを判定する（ＩＮＱＵＩＲＹ７１５）。オペコードが命令がＶＳＸ命令であると特定する場合、広いビット範囲指定子（wide bit range specifier）が抽出される（ＳＴＥＰ７２０）。広いビット範囲指定子は、レジスタの組全体５７０のうちのいずれもアドレス指定することができ、すなわち、レジスタ・ファイル全体がアドレス指定され、広いビット範囲指定子は、それらのレジスタ内のすべてのビットもアドレス指定することができる（ＳＴＥＰ７２５）。対応するレジスタは、レジスタ・ファイル全体の中の任意のレジスタである可能性がある。次に、命令が、レジスタからのデータを使用して計算され、計算は、任意の入力および出力レジスタのペアに対して行われる（ＳＴＥＰ７３０）。言い換えると、ＶＳＸ命令は、レジスタ・ファイル内のレジスタのいずれかに対して作用し、レジスタの特定のサブレンジに限定されない。そして、計算の結果が、レジスタ・ファイル内の適切なレジスタに書き戻される（ＳＴＥＰ７３５）。
【００８５】
命令のオペコードが命令がＶＳＸ命令ではないことを示す場合（ＩＮＱＵＩＲＹ７１５）、デコード論理が、命令のオペコードが命令がスカラ命令、例えば、浮動小数点命令などであると特定するかどうかを判定する（ＩＮＱＵＩＲＹ７４０）（図９）。命令のオペコードが命令をスカラ命令として特定する場合、レジスタ・ファイル内のレジスタのサブセットと、任意で、レジスタのサブセットのレジスタ内のビットのサブセットとを特定する狭いビット範囲指定子が抽出される（ＳＴＥＰ７４５）。完全なビット範囲指定子が、命令のタイプおよび狭いビット範囲指定子に基づいて生成される（ＳＴＥＰ７５０）。狭いビット範囲指定子を用いてオペコードによって指定された命令のタイプに関連するレジスタのサブセット、例えば、レジスタのスカラのサブセットからデータが抽出される（ＳＴＥＰ７５５）。データが、レジスタ・ファイル内のレジスタのスカラのサブセットに対応する入力および出力レジスタに基づいて結果を計算する計算／機能ユニットに与えられる（ＳＴＥＰ７６０）。そして、計算の結果が、この命令のタイプのためのレジスタのサブセット、例えば、スカラのレジスタのサブセット内の適切なレジスタに書き戻される（ＳＴＥＰ７６５）。
【００８６】
命令のオペコードが命令がスカラ命令ではないことを示す場合（ＩＮＱＵＩＲＹ７１５）、やはり、レジスタ・ファイル内のレジスタのサブセットと、任意で、これらのレジスタ内のビットの別のサブセットとを示す狭いビット範囲指定子が抽出される（ＳＴＥＰ７７０）。完全なビット範囲指定子が、命令のタイプ、例えば、ベクトル、ＳＩＭＤ、またはＶＭＸ命令と、狭いビット範囲指定子とに基づいて生成される（ＳＴＥＰ７７５）。完全なビット範囲指定子を用いてオペコードによって指定された命令のタイプに関連するレジスタのサブセット、例えば、レジスタのベクトルのサブセットからデータが抽出される（ＳＴＥＰ７８０）。データが、レジスタ・ファイル内のレジスタのベクトルのサブセットに対応する入力および出力レジスタに基づいて結果を計算する計算／機能ユニットに与えられる（ＳＴＥＰ７８５）。そして、計算の結果が、この命令のタイプのためのレジスタのサブセット、例えば、ベクトルのレジスタのサブセット内の適切なレジスタに書き戻される（ＳＴＥＰ７９０）。そして、操作は終了する。
【００８７】
１つまたは複数の例示的な実施形態は複数の異なるタイプのアドレス指定モードを可能にするレジスタ・ファイルおよびデコード方法を提供することが、上述の説明から理解され得る。例えば、第１のアドレス指定モードにおいては、第１の命令のタイプ、例えば、ＶＳＸ命令タイプに基づいてレジスタ・ファイル内のレジスタの組全体からすべてのオペランド・レジスタを選択するために不連続なエンコーディングが使用される。第２のアドレス指定モードにおいては、連続的なエンコーディングが使用され、レジスタ・ファイル内のレジスタの組全体のアドレス指定可能なオペランド・レジスタの第１の範囲が、第２の命令のタイプ、例えば、スカラ命令タイプに基づいて選択される。命令に関するオペランドのすべてが、アドレス指定可能なオペランド・レジスタの第１の範囲から得られるように、レジスタのアドレスが、オペランドのそれぞれに関して構築される。
【００８８】
第３のアドレス指定モードにおいては、やはり、連続的なエンコーディングが使用され、アドレス指定可能なオペランド・レジスタの第２の範囲が、第３の命令のタイプ、例えば、ベクトル命令タイプに基づいてレジスタ・ファイル内のレジスタの組全体から選択される。命令に関するオペランドが、アドレス指定可能なオペランド・レジスタの第２の範囲から得られるように、レジスタのアドレスが、オペランドのそれぞれに関して構築される。一例において、オペランド・レジスタのこの第２の範囲は、オペランド・レジスタの第１の範囲とは異なり、したがって、第１の範囲内のレジスタは、オペランド・レジスタの第２の範囲内にない。
【００８９】
１つまたは複数の例示的な実施形態は、単一のレジスタ・ファイルがレガシーのスカラ命令、レガシーのベクトル命令、およびベクトル−スカラ命令の処理で使用されることを可能にすることによって、知られているシステムおよびプロセッサのレジスタ・ファイルのアーキテクチャならびに命令デコード方法を改善する。このように、レガシーのスカラおよびベクトル命令が、ベクトル−スカラ命令に加えて処理される可能性があり、データ・フォーマットが、さまざまな命令のタイプの間で互換性を持つ。さらに、単一のレジスタ・ファイルが利用されているので、別々のレジスタ・ファイルの間の切り替えに関連するオーバーヘッドが回避される。１つまたは複数の例示的な実施形態によるレジスタの共有は、レジスタ・ファイルのチップ領域を小さくし、別々のレガシーのレジスタ・ファイルを構築することなく、レガシーのコードを維持しながら、統一されたレジスタ・ファイルが利用されることを可能にする。１つまたは複数の例示的な実施形態は、レガシーの命令と新しい／拡張された命令との間でデータを共有することを可能にし、すなわち、レガシーの命令はレジスタの第１の組５３０またはレジスタの第２の組５５０のうちの一方に書き込むことができ、ＶＳＸ命令はレジスタの組全体５７０のうちのいずれかまたはすべてからの値を組み合わせることができる。
【００９０】
本発明のさらなる態様においては、異なる表現の間の変換のための機能が与えられる。例として、プロデューサ命令（producer instruction）が１つのフォーマットであり、異なるフォーマットのコンシューマ命令（consumer instruction）によって消費されることになる結果を生成するとき、変換が行われる。１つの特定の態様においては、プロセッサで実行されるコンパイラが、図１０を参照して説明されるように、プロデューサ命令とコンシューマ命令との間の不一致を判定し、適切な変換命令を挿入する。一例として、図１０は、変換が必要であるか望ましいと判定し、変換命令を選択し、挿入するための論理の一実施形態を示す。一例において、それは、この論理を実行するコンパイラである。しかし、その他の実施形態においては、それは、プロセッサの、またはプロセッサで実行されるその他のコンポーネントまたはエンティティである可能性がある。
【００９１】
図１０を参照すると、最初に、複数の表現を有するデータ・タイプを用いる２つの命令の間の依存関係が選択される（ＳＴＥＰ８００）。つまり、互いに依存関係にある２つの命令（例えば、１つの命令が別の命令によって与えられる値または結果を使用することになる）が、処理のために選択される。選択された命令（例えば、プロデューサ命令およびコンシューマ命令）が同じ表現に対応するかどうかについての判定が行われる（ＩＮＱＵＩＲＹ８０２）。両方の命令が同じまたは互換性のある表現を有する場合、処理すべきさらなる依存関係が存在するかどうかについてさらに判定が行われる（ＩＮＱＵＩＲＹ８０４）。存在する場合、処理はＳＴＥＰ８００で継続する。
【００９２】
ＩＮＱＵＩＲＹ８０２に戻って、プロデューサ命令およびコンシューマ命令が同じまたは互換性のある表現に対応しない場合、変換命令が、命令ストリームにおいて２つの命令の間に挿入される（ＳＴＥＰ８０６）。変換命令は、命令のうちの一方（例えば、プロデューサ命令）のデータを他方の命令（例えば、コンシューマ命令）と互換性のあるフォーマットに変換するために使用される。一例において、変換されるべきデータは、（変換命令で特定される）複数アドレス指定可能なレジスタ・ファイルの１つのレジスタ内にあり、変換されたデータは、（やはり変換命令で示される）複数アドレス指定可能なレジスタ・ファイルの別のレジスタ（または同じレジスタ）に代入される。データを使用することになる命令は、そのレジスタから変換されたデータを取得する。一例においては、コンパイラが、プロデューサ命令およびコンシューマ命令に基づいて、変換命令によって使用されるべきレジスタを決定する。プロデューサ命令は、翻訳または変換されるべきデータを有するレジスタを示し、コンシューマ命令は、そのコンシューマ命令がデータを取得するために使用するレジスタを示す。処理は、ＩＮＱＵＩＲＹ８０４で継続する。
【００９３】
一実施形態において、挿入される変換命令は、図１１および１２を参照してさらに詳細に説明されるように、１つまたは複数の基準に応じて決まる。図１１は、ベクトルからスカラへの変換に関し、図１２は、スカラからベクトルへの変換に関する。これらの技術のうちの１つが、変換のタイプ（例えば、ベクトル−スカラまたはスカラ−ベクトル）に応じて選択される。図１１および１２の論理を含むこの論理は、一例においては、コンパイラによって実行される。
【００９４】
初めに図１１を参照すると、所望のフォーマット変換が単精度のベクトル要素を単精度のスカラに変換することであるかどうかについての判定が行われる（ＩＮＱＵＩＲＹ９００）。所望のフォーマット変換が単純なコピーであり、変換が単精度のベクトル要素から単精度のスカラへのものである場合、本明細書においてはXSCVSPDPNと呼ばれる変換命令が使用される（ＳＴＥＰ９０２）。この命令は、単精度のベクトル要素（３２ビット浮動小数点レジスタ・フォーマット）を単精度のスカラ（６４ビット浮動小数点レジスタ・フォーマット）に変換する。この変換は、物理的なフォーマット変更とだけ見なされ、論理的な変更とは見なされず、したがって、例外が検出またはシグナリングされず、シグナリング非数（ＳＮａＮ：signaling Not-a-Number）入力は、返される結果においてＳＮａＮとして保存される。つまり、コンパイラの外のあらゆるエンティティまたはコンポーネントに対して透過的な変換が行われる。例外が生じない（すなわち検出またはシグナリングあるいはその両方が起こらない）ので、変換は、例外と無関係に（すなわち、例外がないときに、または例外がなくても）実行されると言われる。
【００９５】
しかし、ＩＮＱＵＩＲＹ９００に戻って、所望のフォーマット変換が単精度のベクトル要素を単精度のスカラ要素に変換することではない場合、本明細書においてはXSCVSPDP命令と呼ばれる異なる命令がこの実施形態において使用される（ＳＴＥＰ９０４）。この命令は、単精度のベクトル要素（３２ビット浮動小数点レジスタ・フォーマット）を倍精度のスカラ（６４ビット浮動小数点レジスタ・フォーマット）に変換する。これは、真の論理的なフォーマット変更および物理的なフォーマット変更であると見なされ、したがって、無効演算例外（invalid operation exception）が検出され、シグナリングＮａＮ（非数）としてシグナリングされる。ＳＮａＮ値は、返される結果においてＱＮａＮ（クワイエットＮａＮ（quiet NaN））に変換される。
【００９６】
図１２を参照すると、さらなる実施形態において、望まれているフォーマット変換が単精度のスカラ・データを単精度のベクトル要素に変換することであるかどうかについての判定が行われる（ＩＮＱＵＩＲＹ１０００）。所望の変換が単純なコピーであり、単精度のスカラが単精度のベクトル要素に変換されるべきである場合、値のコピーのベクトルが生成されるべきかどうかについてのさらなる判定が行われる（ＩＮＱＵＩＲＹ１００２）。値のコピーのベクトルが生成されるべきでない場合、本明細書においてはXSCVDPSPNと呼ばれる命令が使用され、この命令は、単精度のスカラ（６４ビット浮動小数点レジスタ・フォーマット）を単精度のベクトル要素（３２ビット浮動小数点レジスタ・フォーマット）に変換する（ＳＴＥＰ１００４）。これは、物理的なフォーマット変更とだけ見なされ、論理的な変更とは見なされず、したがって、例外が検出またはシグナリングされず、ＳＮａＮ値は、返される結果においてＳＮａＮとして保存される。やはり、変換は、透過的であり、例外とは無関係に実行される。しかし、ＩＮＱＵＩＲＹ１００２に戻って、値のコピーのベクトルが生成されるべきである場合（ＩＮＱＵＩＲＹ１００２）、本明細書においてはXSCVSSPVSPSPLTと呼ばれる命令が使用される（ＳＴＥＰ１００６）。これは、単精度のスカラ（６４ビット浮動小数点レジスタ・フォーマット）を単精度のベクトル要素（３２ビット浮動小数点レジスタ・フォーマット）に変換し、４つのベクトル要素すべてに複製する。やはり、これは、物理的なフォーマット変更とだけ見なされ、例外が検出またはシグナリングされず、ＳＮａＮ入力は、返される結果においてＳＮａＮとして保存される。
【００９７】
ＩＮＱＵＩＲＹ１０００に戻ると、所望のフォーマット変換が単精度のスカラの単精度のベクトル要素への変換ではない場合、本明細書においてはXSCVDPSPと呼ばれる命令が使用される（ＳＴＥＰ１００８）。この命令は、倍精度のスカラ（６４ビット浮動小数点レジスタ・フォーマット）を単精度のベクトル要素（３２ビット浮動小数点レジスタ・フォーマット）に変換する。この場合、変換は、真の論理的なフォーマット変更および物理的なフォーマット変更であると見なされ、したがって、無効演算例外が検出され、シグナリング非数オペランドとしてシグナリングされる。ＳＮａＮ値は、返される結果においてＱＮａＮに変換される。
【００９８】
１つまたは複数の実施形態で使用され得るいくつかの変換命令が、上で説明された。これらの命令に関するさらなる詳細は、以下に、およびこの説明の一部として含まれる「RFC02242.r3: BFP/VSX Miscellaneous Operations」に記載されている。
【００９９】
まず、XSCVSPDPN命令に関するさらなる詳細が与えられる。一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールドの拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド）と、第１のレジスタを指定する第１のフィールド（例えば、Ｔフィールド）および第１のビット（例えば、ＴＸフィールド、連結される）と、第２のレジスタを指定する第２のフィールド（例えば、Ｂフィールド）および第２のビット（例えば、ＢＸフィールド、連結される）とを含む。サンプルの擬似コードは、以下のようになる。
reset_xflags()
src ← VSR[32×BX+B].word[0]
result ← ConvertSPtoDP_NS(src)
VSR[32×TX+T].dword[0] ← result
VSR[32×TX+T].dword[1] ← 0xUUUU_UUUU_UUUU_UUUU
【０１００】
ＸＴに、Ｔと連結された値ＴＸを代入する。
【０１０１】
ＸＢに、Ｂと連結された値ＢＸを代入する。
【０１０２】
ｓｒｃに、ＶＳＲ［ＸＢ］のワード要素０内の単精度浮動小数点値を代入する。
【０１０３】
ｓｒｃが、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。ＳＮａＮ値のエンコーディングは、保存される（すなわち、ＱＮａＮに変換されない）。
【０１０４】
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
【０１０５】
変更される特殊レジスタ
なし
【０１０６】
XSCVSPDPNに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜３１が、ＳＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３が、ＤＰを含む
【０１０７】
さらに、３２ビット単精度ベクトル要素を６４ビット単精度スカラに変換するためのコード・スニペットの例が、以下に与えられる。
【０１０８】
Ｃソース
void compute1()
{
float sa, sb, sx;
vector float vx, vy,vz;
:
vz =vec_mergeh(vx,vy);// VXSNAN例外を設定しない
sa = vz[1];// ベクトルからスカラへの単純なコピー。
VXSNAN例外を設定しない
sb = vz[3];// ベクトルからスカラへの単純なコピー。
VXSNAN例外を設定しない
sx = compute2(sa,sb);
}
float compute2(float sa, float sb)
{
return sa + sb;// VXSNANが検出されるべき箇所
}
等価なアセンブラ
compute1:
::
lxvxvx,addr_vx
lxvxvx,addr_vy
::
vmrghw vz,vx,vy
vsldoivtmp1,vz,vz,4 ;vzのSPベクトル要素1を抽出する
xscvspdpn sa,vtmp1; SPベクトル32ビット・フォーマットを
スカラ64ビット・フォーマットに変換する。
VXSNANは設定しない。単純なコピー
vsldoivtmp2,vx,vx,12 ; vzのベクトル要素3を抽出する
xscvspdpn sa,vtmp2; SPベクトル32ビット・フォーマットを
スカラ64ビット・フォーマットに変換する。
VXSNANは設定しない。単純なコピー
bclcompute2
::
compute2:
::
xsaddsp sx,sa,sb# ここでVXSNANが検出されるべき
:
blr
【０１０９】
さらに、XSCVSPDP命令に関する詳細が、以下で説明される。一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールドの拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド）と、第１のレジスタを指定する第１のフィールドおよび（例えば、連結される）第１のビットと、第２のレジスタを指定する第２のフィールドおよび（例えば、連結される）第２のビットとを含む。サンプルの擬似コードは、以下のようになる。
reset_xflags()
src ← VSR[32×BX+B].word[0]
result ←ConvertVectorSPtoScalarSP(src)
if(vxsnan_flag) then SetFX(VXSNAN)
vex_flag ← VE &vxsnan_flag
FR ← 0b0
FI ← 0b0
if( 〜vex_flag )then do
VSR[32×TX+T].dword[0] ← result
VSR[32×TX+T].dword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassDP(result)
end
【０１１０】
ＸＴに、Ｔと連結された値ＴＸを代入する。
【０１１１】
ＸＢに、Ｂと連結された値ＢＸを代入する。
【０１１２】
ｓｒｃに、ＶＳＲ［ＸＢ］のワード要素０内の単精度浮動小数点値を代入する。
【０１１３】
ｓｒｃがＳＮａＮである場合、結果は、ＱＮａＮに変換されたｓｒｃである（すなわち、ｓｒｃのビット９が１に設定される）。ＶＸＳＮＡＮが、１に設定される。
【０１１４】
それ以外の場合、結果はｓｒｃである。
【０１１５】
結果が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
【０１１６】
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
【０１１７】
ＦＰＲＦが、結果のクラスおよび符号に設定される。ＦＲが、０に設定される。ＦＩが、０に設定される。
【０１１８】
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］が修正されず、ＦＰＲＦが修正されず、ＦＲが０に設定され、ＦＩが０に設定される。
【０１１９】
変更される特殊レジスタ
【０１２０】
ＦＰＲＦ    ＦＲ←０ｂ０    ＦＩ←０ｂ０    ＦＸ    ＶＸＳＮＡＮ
【０１２１】
XSCVSPDPに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜３１が、ＳＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６４が、ＤＰを含む
【０１２２】
さらに、XSCVDPSPN命令に関する詳細が、以下で説明される。一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールドの拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド）と、第１のレジスタを指定する第１のフィールドおよび（例えば、連結される）第１のビットと、第２のレジスタを指定する第２のフィールドおよび（例えば、連結される）第２のビットとを含む。サンプルの擬似コードは、以下のようになる。
reset_xflags()
src ← VSR[32×BX+B].dword[0]
result ←ConvertDPtoSP_NS(src)
VSR[32×TX+T].word[0]← result
VSR[32×TX+T].word[1]← 0xUUUU_UUUU
VSR[32×TX+T].word[2]← 0xUUUU_UUUU
VSR[32×TX+T].word[3]← 0xUUUU_UUUU
【０１２３】
ＸＴに、Ｔと連結された値ＴＸを代入する。
【０１２４】
ＸＢに、Ｂと連結された値ＢＸを代入する。
【０１２５】
ｓｒｃに、倍精度フォーマットで表されたＶＳＲ［ＸＢ］のダブルワード要素０内の単精度浮動小数点値を代入する。
【０１２６】
ｓｒｃが、ＶＳＲ［ＸＴ］のワード要素０に単精度フォーマットで代入される。ＳＮａＮ値のエンコーディングは、保存される（すなわち、ＱＮａＮに変換されない）。
【０１２７】
ＶＳＲ［ＸＴ］のワード要素１、２、および３の内容は、未定義である。
【０１２８】
変更される特殊レジスタ
なし
【０１２９】
xscvdpspnに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜６３が、ＳＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜３１が、ＳＰを含む
【０１３０】
さらに、XSCVSSPVSPSPLT命令に関する詳細が、以下で説明される。一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールドの拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド）と、第１のレジスタを指定する第１のフィールド（例えば、Ｔフィールド）および第１のビット（例えば、ＴＸビット、連結される）と、第２のレジスタを指定する第２のフィールド（例えば、Ｂフィールド）および第２のビット（例えば、ＢＸビット、連結される）とを含む。サンプルの擬似コードは、以下のようになる。
reset_xflags()
src ←VSR[32xBX+B].dword[0]
result ←ConvertDPtoSP_NS(src)
do i = 0 to 3
VSR[32xTX+T].word[i] ← result
end
【０１３１】
ＸＴに、Ｔと連結された値ＴＸを代入する。
【０１３２】
ＸＢに、Ｂと連結された値ＢＸを代入する。
【０１３３】
ｓｒｃに、倍精度フォーマットで表されたＶＳＲ［ＸＢ］のダブルワード要素０内の単精度浮動小数点値を代入する。ＳＮａＮ値のエンコーディングは、保存される（すなわち、ＱＮａＮに変換されない）。
【０１３４】
ｓｒｃが、ＶＳＲ［ＸＴ］の各ワード要素に単精度フォーマットで代入される。
【０１３５】
変更される特殊レジスタ
【０１３６】
なし
【０１３７】
xscvsspvspspltに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜６３が、ＳＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜３１、ビット３２〜６３、ビット６４〜９６、およびビット９７〜１２７が、ＳＰを含む
【０１３８】
さらに、複製（splat）を用いて６４ビット単精度スカラを３２ビット単精度ベクトル要素に変換するためのコード・スニペットの例が、以下で説明される。
【０１３９】
Ｃソース
void compute()
{
:
float sa;
vector float vx;
:
vx =vec_splatw(sa,0);// SAの4つのコピーのベクトルを生成する
}
等価なアセンブラ
compute:
:
lxsspxsa,addr_sa
xscvdpspn sa,sa
vspltwvx,sa,0
:
blr
【０１４０】
さらに、XSCVDPSPに関する詳細が、以下に与えられる。一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールドの拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド）と、第１のレジスタを指定する第１のフィールド（例えば、Ｔフィールド）および第１のビット（例えば、ＴＸビット、連結される）と、第２のレジスタを指定する第２のフィールド（例えば、Ｂフィールド）および第２のビット（例えば、ＢＸビット、連結される）とを含む。サンプルの擬似コードは、以下のようになる。
reset_xflags()
src ← VSR[32×BX+B].dword[0]
result ←ConvertDPtoSP(src)
if(vxsnan_flag) then SetFX(VXSNAN)
if(xx_flag) then SetFX(XX)
if(ox_flag) then SetFX(OX)
if(ux_flag) then SetFX(UX)
vex_flag ← VE &vxsnan_flag
if( 〜vex_flag )then do
VSR[32×TX+T].word[0] ← result
VSR[32×TX+T].word[1] ← 0xUUUU_UUUU
VSR[32×TX+T].word[2] ← 0xUUUU_UUUU
VSR[32×TX+T].word[3] ← 0xUUUU_UUUU
FPRF ← ClassSP(result)
FR ← inc_flag
FI ← xx_flag
end
else do
FR ← 0b0
FI ← 0b0
end
【０１４１】
ＸＴに、Ｔと連結された値ＴＸを代入する。
【０１４２】
ＸＢに、Ｂと連結された値ＢＸを代入する。
【０１４３】
ｓｒｃに、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
【０１４４】
ｓｒｃがＳＮａＮである場合、結果は、ＱＮａＮに変換されたｓｒｃである（すなわち、ｓｒｃのビット１２が１に設定される）。ＶＸＳＮＡＮが、１に設定される。
【０１４５】
そうではなく、ｓｒｃがＱＮａＮ、無限大、またはゼロである場合、結果はｓｒｃである。
【０１４６】
それ以外の場合、結果は、ＲＮによって指定された丸めモードを使用して単精度に丸められたｓｒｃである。
【０１４７】
結果が、ＶＳＲ［ＸＴ］のワード要素０に単精度フォーマットで代入される。
【０１４８】
ＶＳＲ［ＸＴ］のワード要素１、２、および３の内容は、未定義である。
【０１４９】
ＦＰＲＦが、結果のクラスおよび符号に設定される。ＦＲが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。ＦＩが、結果が厳密でないことを示すように設定される。
【０１５０】
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されず、ＦＲおよびＦＩが０に設定される。
【０１５１】
変更される特殊レジスタ
【０１５２】
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＯＸ    ＵＸ    ＸＸ    ＶＸＳＮＡＮ
【０１５３】
xscvdpspに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜６３が、ＤＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜３１が、ＳＰを含む
【０１５４】
６４ビット表現を使用するスカラ単精度数に対する計算を行う命令および３２ビット表現を使用するベクトル単精度数に対する計算を行う命令をサポートする拡張されたＶＳＸ機能が、本明細書において詳細に説明される。第１の表現から第２の表現への翻訳を行うための機能が、さらに提供される。第１の実施形態においては、６４ビット演算から３２ビット演算へ、および３２ビット演算から６４ビット演算への明示的な変換が使用される。第２の実施形態においては、倍精度／単精度変換を使用して単精度数の３２ビット表現と６４ビット表現との間の変換を行うことによって単精度表現の間の変換を行うための命令が使用され、単精度数の６４ビット表現は倍精度演算と同様の形態である。さらなる実施形態においては、変換操作が、３２ビット単精度値が複数の要素の位置に複製されるsplat機能も提供する。一実施形態において、変換操作は、３２ビット単精度値が位置インジケータによって複数の要素の位置から選択される選択機能も提供する。
【０１５５】
１つまたは複数の態様によれば、複数の設計された表現が使用される。演算の第１のモードにおいて６４ビット単精度数を含め、特定し、演算の第２のモードにおいて３２ビット単精度数を含め、特定するための機能が提供される。第１および第２のエンコーディングを表す第１および第２のレガシーのエンコーディングと互換性がある形で相互運用するために必要とされる演算のタイプに基づいて第１および第２の演算を特定するための機能が提供される。第１の表現と第２の表現との間の翻訳を行う技術が、提供される。
【０１５６】
１つの表現と別の表現との間の変換を行うことにより、境界条件を調べる必要をなくすことによって、実行の複雑性が削減され得る。さらに、１つのデータ表現を別のデータ表現に変換するための変換命令を挿入することによって、エンコードされるべき命令の数、デコード論理、および実装のコストが削減される。
【０１５７】
１つまたは複数の態様によれば、ベクトル計算のために使用される３２ビット単精度表現とスカラ計算を使用する単精度浮動小数点の６４ビット表現との混合が可能にされる。新しい単精度から単精度へのフォーマット変換命令が、１つの６４ビット・フォーマットから別の３２ビット・フォーマットに変換するため、またはその逆の変換を行うために提供される。さらに、６４ビット単精度から３２ビット単精度に変換する変換命令と、ベクトル−スカラ計算でよくある操作である、同じ値がレジスタで４回複製される複製とが、提供される。このタイプの変換は計算命令ではないので、変換は、シグナリングの特徴とは無関係に実行される。
【０１５８】
さらに、同じ３２ビット単精度浮動小数点データ・タイプに関して２つの異なる浮動小数点表現を使用する計算を容易にするためのコンパイラ技術が、提供される。コンパイラは、データが使用されるときに、そのデータがさまざまな表現のうちのどれかである可能性があり、使用されるデータが命令によって使用される適切なフォーマットであることを保証するためのチェックが実行されるべきであると認識するように拡張される。これは、各命令をデータ・タイプに関連付けることによって実現され、結果を生成する命令のデータ・タイプは、結果を使用する命令のデータ・タイプと同じでなくてはならない。そうではない場合、変換が挿入される。フォーマット変換は、例外を設定せずにレジスタからレジスタへ直接実行される。
【０１５９】
一態様においては、各浮動小数点数の２つの異なる表現を含むことができる浮動小数点レジスタが、使用される。命令は、どのタイプの浮動小数点数が命令のオペランドとして使用されるべきかを指定し、存在する場合、表現のうちの選択された１つからオペランドを取得／記憶する。また、コンパイラは、浮動小数点レジスタを知っており、浮動小数点レジスタが誤った表現を含むとき、必要に応じて変換命令を挿入する。
【０１６０】
１つの特定の例においては、（複数アドレス指定可能なレジスタ・ファイルである可能性がある）あるレジスタ・クラスのレジスタ内の第１の設計されたフォーマット（例えば、Ｐｏｗｅｒ  ＩＳＡの定義によるＳＰ６４  ６４ビット幅単精度バイナリ浮動小数点フォーマット）からレジスタ・ファイル・フォーマットに関する第２の設計されたフォーマット（例えば、ＩＥＥＥ  ７５４メモリ・フォーマットの定義および同様のＰｏｗｅｒ  ＩＳＡの定義によるＳＰ３２  ３２ビット幅単精度バイナリ浮動小数点フォーマット）に変換する命令が、提供される。
【０１６１】
ＳＰ６４からＳＰ３２への変換は、例えば、アーキテクチャの定義にしたがってコンパイラによって異なる内部フォーマットを維持することに対応するために使用され、それぞれの数は、例えば、厳密に一致する（ＳＰ６４からＳＰ３２へのフォーマット変換）。これは、ユーザ定義の操作であるＤＰ（倍精度）からＳＰへの変換とは異なる。
【０１６２】
例えば、ＤＰからＳＰへの変換は、ＳＰフォーマットの表現を持たないＤＰの数に関してさえも、ＤＰの数をＳＰの数にマッピングする必要がある。ＤＰからＳＰへの変換は、（切り捨て、０への丸め、負の無限大への丸め、正の無限大への丸め、ゼロから遠ざける丸め、偶数への丸め、奇数への丸め、その他多数などの多くの可能な丸めモードのうちの１つによる）余分な仮数ビットの丸めと、ＤＰでは表現できるが、ＳＰでは表現できない小さな数のゼロへのフラッシュ（flush）と、ＤＰでは表現できるが、ＳＰでは表現できない大きな数の正の無限大または負の無限大への飽和とを実行することによってこれを行うことができる。それに比べて、ＳＰ６４からＳＰ３２への変換は、一例においては、ＳＰの数に対してのみ作用し、したがって、少なくとも１つの実施形態において、ＳＰ６４からＳＰ３２への変換の操作は、入力が、表現可能なＩＥＥＥ  ＳＰ浮動小数点の範囲内にないとき、未定義である。準拠したハードウェアは、この実施形態の一態様によれば、選択したことを何でも行うことができ、範囲外の（不正な）ＳＰ６４ビット入力を、あたかもその入力がＤＰの数であるかのように扱い、その入力を丸めることを選択する可能性があり、範囲外の数に対して規定の割り込み（specification interrupt）を起こすことを選択する可能性があり、ランダムな結果を生成することを選択する可能性があり、または結果をまったく生成しない可能性がある。
【０１６３】
別の例として、ＤＰからＳＰへの変換は、データ・タイプ変換のためのユーザ指定の命令であり、このユーザ指定の命令の定義にしたがって、ＳＮａＮ（すなわち、シグナリングＮａＮ、ここで、ＮａＮは、ＩＥＥＥ規格による非数の指示である）が例外を発生させるべきである。また、一実施形態において、このユーザ指定の命令は、数の変換中に算術的な条件（例えば、アンダーフローまたはオーバーフロー）に対して例外を設定するように定義される可能性がある。それに比べて、ＳＰ６４からＳＰ３２への変換は、ハードウェアを利用する、コンパイラの内部動作に対応するフォーマット変換である。一例において、ＳＰ６４ビット・フォーマットのそれぞれの有効なデータ点（data point）は、ＳＰ３２フォーマットの１つのデータ点に厳密に対応する。任意のそのようなデータ点が入力として与えられる（そしてＳＮａＮを明確に含む）とき、データ点は、１つのフォーマットの表現から第２の表現にマッピングされ、割り込みを生じない。
【０１６４】
一実施形態において、適切な単精度数は、第１の設計されたレジスタ・フォーマットから第２のレジスタ・フォーマットに直接変換され、命令が完了され、変換された結果が、ＩＥＥＥ単精度浮動小数点数または非数入力に対する目標レジスタに書き込まれる。一例において、シグナリングＮａＮは、目標レジスタにおいてシグナリングＮａＮとして保存される。
【０１６５】
当業者に理解されるであろうように、本発明の１つまたは複数の態様は、システム、方法、またはコンピュータ・プログラム製品として具現化され得る。したがって、本発明の１つまたは複数の態様は、すべてハードウェアの実施形態、すべてソフトウェアの実施形態（ファームウェア、常駐ソフトウェア、マイクロコードなどを含む）、またはすべてが概して本明細書において「回路」、「モジュール」、もしくは「システム」と呼ばれることがあるソフトウェアの態様とハードウェアの態様とを組み合わせる実施形態の形態をとる可能性がある。さらに、本発明の１つまたは複数の態様は、コンピュータ可読プログラム・コードを具現化する１つまたは複数のコンピュータ可読媒体で具現化されたコンピュータ・プログラム製品の形態をとる可能性がある。
【０１６６】
１つまたは複数のコンピュータ可読媒体の任意の組み合わせが、利用される可能性がある。コンピュータ可読媒体は、コンピュータ可読ストレージ媒体である可能性がある。コンピュータ可読ストレージ媒体は、例えば、電子、磁気、光、電磁、赤外線、または半導体システム、装置、もしくはデバイス、あるいはこれらの任意の好適な組み合わせである可能性があるが、これらに限定されない。コンピュータ可読ストレージ媒体のより詳細な例（非網羅的なリスト）には、以下、すなわち、１つもしくは複数の配線を有する電気的な接続、ポータブル・コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ（ＲＡＭ）、読み出し専用メモリ（ＲＯＭ）、消去可能プログラマブル読み出し専用メモリ（ＥＰＲＯＭもしくはフラッシュ・メモリ）、光ファイバ、ポータブル・コンパクト・ディスク読み出し専用メモリ（ＣＤ−ＲＯＭ）、光ストレージ・デバイス、磁気ストレージ・デバイス、またはこれらの任意の好適な組み合わせが含まれる。本明細書の文脈において、コンピュータ可読ストレージ媒体は、命令実行システム、装置、もしくはデバイスによって、または命令実行システム、装置、もしくはデバイスに関連して使用するためのプログラムを含むまたは記憶することができる任意の有形の媒体である可能性がある。
【０１６７】
ここで図１３を参照すると、一例において、コンピュータ・プログラム製品１１００が、例えば、本発明の１つまたは複数の態様を提供し、助けるために、コンピュータ可読プログラム・コード手段または論理１１０４を記憶するための１つまたは複数の非一時的コンピュータ可読ストレージ媒体１１０２を含む。
【０１６８】
コンピュータ可読媒体上に具現化されるプログラム・コードは、無線、有線、光ファイバ・ケーブル、ＲＦなど、またはこれらの任意の好適な組み合わせを含むがこれらに限定されない任意の適切な媒体を用いて送信される可能性がある。
【０１６９】
本発明の１つまたは複数の態様の動作を実行するためのコンピュータ・プログラム・コードは、Ｊａｖａ（Ｒ）、Ｓｍａｌｌｔａｌｋ、Ｃ＋＋などのオブジェクト指向プログラミング言語と、「Ｃ」プログラミング言語、アセンブラ、または同様のプログラミング言語などの通常の手続き型プログラミング言語とを含む１つまたは複数のプログラミング言語の任意の組み合わせで記述され得る。プログラム・コードは、すべてユーザのコンピュータ上で、スタンドアロンのソフトウェア・パッケージとしてユーザのコンピュータ上で部分的に、ユーザのコンピュータ上で部分的にかつ遠隔のコンピュータ上で部分的に、またはすべて遠隔のコンピュータもしくはサーバ上で実行され得る。最後の場合では、遠隔のコンピュータが、ローカル・エリア・ネットワーク（ＬＡＮ）もしくは広域ネットワーク（ＷＡＮ）を含む任意の種類のネットワークを介してユーザのコンピュータに接続され得るか、または外部コンピュータへの接続が（例えば、インターネット・サービス・プロバイダを使用してインターネットを介して）行われ得る。
【０１７０】
本発明の１つまたは複数の態様が、本発明の実施形態による方法、装置（システム）、およびコンピュータ・プログラム製品の流れ図または構成図あるいはその両方を参照して、本明細書において説明されている。流れ図または構成図あるいはその両方の各ブロック、および流れ図または構成図あるいはその両方のブロックの組み合わせは、コンピュータ・プログラム命令によって実装され得ることが理解されるであろう。これらのコンピュータ・プログラム命令は、コンピュータまたはその他のプログラム可能なデータ処理装置のプロセッサによって実行される命令が、流れ図または構成図あるいはその両方の１つのブロックまたは複数のブロックで規定された機能／動作を実施するための手段をもたらすように、多目的コンピュータ、専用コンピュータ、またはマシンを生産するためのその他のプログラム可能なデータ処理装置のプロセッサに与えられる可能性がある。
【０１７１】
これらのコンピュータ・プログラム命令は、コンピュータ可読媒体に記憶された命令が、流れ図または構成図あるいはその両方の１つのブロックまたは複数のブロックで規定された機能／動作を実施する命令を含む製品をもたらすように、コンピュータ、その他のプログラム可能なデータ処理装置、またはその他のデバイスを特定の方法で機能させることができるコンピュータ可読媒体に記憶される可能性もある。
【０１７２】
コンピュータ・プログラム命令は、コンピュータまたはその他のプログラム可能な装置で実行される命令が、流れ図または構成図あるいはその両方の１つのブロックまたは複数のブロックで規定された機能／動作を実施するためのプロセスを提供するように、コンピュータで実施されるプロセスを生成するために一連の操作のステップがコンピュータ、その他のプログラム可能な装置、またはその他のデバイスで実行されるようにするために、コンピュータ、その他のプログラム可能なデータ処理装置、またはその他のデバイスにロードされる可能性もある。
【０１７３】
図面の流れ図および構成図は、本発明の１つまたは複数の態様のさまざまな実施形態によるシステム、方法、およびコンピュータ・プログラム製品のあり得る実装のアーキテクチャ、機能、および動作を示す。これに関連して、流れ図または構成図の各ブロックは、（１つまたは複数の）規定された論理的な機能を実装するための１つまたは複数の実行可能命令を含むモジュール、セグメント、またはコードの一部を表す可能性がある。一部の代替的な実装においては、ブロックで示された機能が、図面に示された順序とは異なる順序で行われる可能性があることにも留意されたい。例えば、連続で示された２つのブロックが、実際には実質的に同時に実行される可能性があり、またはそれらのブロックが、関連する機能に応じて逆順に実行されることもあり得る。構成図または流れ図あるいはその両方の各ブロックと、構成図または流れ図あるいはその両方のブロックの組み合わせとは、規定された機能もしくは動作を実行する専用のハードウェアに基づくシステム、または専用のハードウェアとコンピュータ命令との組み合わせによって実装され得ることも認められるであろう。
【０１７４】
上記に加えて、本発明の１つまたは複数の態様は、顧客の環境の管理を請け負うサービス・プロバイダによって与えられ、提供され、配置され、管理され、サービスを提供される可能性などもある。例えば、サービス・プロバイダは、１人または複数の顧客のために本発明の１つまたは複数の態様を実行するコンピュータ・コードまたはコンピュータ・インフラストラクチャあるいはその両方を作成し、保守し、サポートする可能性などもある。その見返りに、サービス・プロバイダは、例として、加入または料金あるいはその両方の取り決めの下で顧客から支払いを受ける可能性がある。追加的にまたは代替的に、サービス・プロバイダは、１つまたは複数の第三者への広告コンテンツの販売から支払いを得る可能性がある。
【０１７５】
本発明の一態様においては、本発明の１つまたは複数の態様を実行するためのアプリケーションが配置される可能性がある。一例として、アプリケーションの配置は、本発明の１つまたは複数の態様を実行するように動作可能なコンピュータ・インフラストラクチャを提供することを含む。
【０１７６】
本発明のさらなる態様として、コンピュータ可読コードをコンピューティング・システムに統合することを含むコンピューティング・インフラストラクチャが配置される可能性があり、コードは、コンピューティング・システムと一緒に、本発明の１つまたは複数の態様を実行することができる。
【０１７７】
本発明のさらなる態様として、コンピュータ可読コードをコンピュータ・システムに統合することを含むコンピューティング・インフラストラクチャを統合するためのプロセスが、提供される可能性がある。コンピュータ・システムは、コンピュータ可読媒体を含み、コンピュータ媒体は、本発明の１つまたは複数の態様を含む。コードは、コンピュータ・システムと一緒に、本発明の１つまたは複数の態様を実行することができる。
【０１７８】
さまざまな実施形態が上に記載されているが、これらは例であるに過ぎない。例えば、その他のアーキテクチャのコンピューティング環境が、本発明の１つまたは複数の態様を組み込み、使用することができる。さらに、本発明の１つまたは複数の態様は、複数の表現を有する任意のフォーマットに当てはまる。１つの具体的な例として、１つまたは複数の態様は、６４ビット倍精度フォーマットと１２８ビット倍精度フォーマットとの両方をサポートする４倍精度（１２８ビット）浮動小数点拡張の定義に当てはまる可能性がある。１つまたは複数の態様は、データ・タイプに関して異なるフォーマットの定義をサポートする複数の拡張を１つにまとめることに当てはまる可能性がある。さらには、その他の命令が、本発明の精神から逸脱することなく使用され得る。
【０１７９】
さらに、その他の種類のコンピューティング環境が、本発明の１つまたは複数の態様から恩恵を受ける可能性がある。例として、環境がエミュレータ（例えば、ソフトウェアまたはその他のエミュレーション・メカニズム）を含む可能性があり、（例えば、命令の実行、アドレス変換などの設計された機能、および設計されたレジスタを含む）特定のアーキテクチャまたはそのアーキテクチャのサブセットが（例えば、プロセッサおよびメモリを有するネイティブのコンピュータ・システム上で）エミュレートされる。そのような環境においては、エミュレータを実行するコンピュータが、エミュレートされている機能とは異なるアーキテクチャを有する可能性があるとしても、エミュレータの１つまたは複数のエミュレーション機能が、本発明の１つまたは複数の態様を実施することができる。一例として、エミュレーション・モードにおいては、エミュレートされている特定の命令または操作が、デコードされ、適切なエミュレーション機能が、個々の命令または操作を実施するために構築される。
【０１８０】
エミュレーション環境においては、ホスト・コンピュータが、例えば、命令およびデータを記憶するためのメモリと、メモリから命令をフェッチし、任意で、フェッチされた命令に関するローカルのバッファリングを行うための命令フェッチ・ユニットと、フェッチされた命令を受け取り、フェッチされた命令のタイプを判定するための命令デコード・ユニットと、命令を実行するための命令実行ユニットとを含む。実行は、デコード・ユニットによって判定されたように、メモリからレジスタにデータをロードすること、逆にレジスタからメモリにデータを記憶すること、または何らかのタイプの算術もしくは論理演算を実行することを含む可能性がある。一例において、各ユニットは、ソフトウェアで実装される。例えば、ユニットによって実行される操作は、エミュレータ・ソフトウェア内の１つまたは複数のサブルーチンとして実装される。
【０１８１】
さらなる例として、システム・バスを通じてメモリ要素に直接的または間接的に結合された少なくとも１つのプロセッサを含む、プログラム・コードの記憶または実行あるいはその両方に好適なデータ処理システムが、使用可能である。メモリ要素は、例えば、プログラム・コードの実際の実行中に使用されるローカル・メモリと、大容量ストレージと、実行中に大容量ストレージからコードが取得されなければならない回数を減らすために少なくとも一部のプログラム・コードの一時的な記憶を行うキャッシュ・メモリとを含む。
【０１８２】
（キーボード、ディスプレイ、ポインティング・デバイス、ＤＡＳＤ、テープ、ＣＤ、ＤＶＤ、サム・ドライブ、およびその他のメモリ媒体などを含むがこれらに限定されない）入力／出力またはＩ／Ｏデバイスが、直接か、または介在するＩ／Ｏコントローラを通じてかのどちらかでシステムに結合される可能性がある。介在するプライベートまたはパブリック・ネットワークを通じてデータ処理システムがその他のデータ処理システムまたは遠隔のプリンタもしくはストレージ・デバイスに結合されるようになることを可能にするために、ネットワーク・アダプタもシステムに結合される可能性がある。モデム、ケーブル・モデム、およびイーサネット（Ｒ）・カードは、利用可能なタイプのネットワーク・アダプタのほんの一部である。
【０１８３】
本明細書で使用された用語は、特定の実施形態を説明することのみを目的としており、本発明を限定するように意図されていない。本明細書において使用されるとき、単数形「ａ」、「ａｎ」、および「ｔｈｅ」は、文脈がそうでないことをはっきりと示さない限り複数形も含むように意図される。用語「含む（comprises）」または「含む（comprising）」あるいはその両方は、本明細書において使用されるとき、言及された特徴、整数（integer）、ステップ、操作、要素、またはコンポーネントあるいはこれらすべての存在を指定するが、１つまたは複数のその他の特徴、整数、ステップ、操作、要素、コンポーネント、またはこれらのグループあるいはその両方の存在または追加を除外しないことがさらに理解されよう。
【０１８４】
以下の特許請求の範囲のすべてのミーンズまたはステップ・プラス・ファンクション要素（meansor step plus function element）の対応する構造、材料、動作、および等価なものは、もしあれば、明確に特許請求されたその他の特許請求された要素と組み合わせて機能を実行するための任意の構造、材料、または動作を含むように意図される。本発明の説明が、例示および説明を目的として示されたが、網羅的であるように、または開示された形態の本発明に限定されるように意図されていない。多くの修正および変更が、本発明の範囲および精神から逸脱することなく当業者に明らかになる。実施形態は、本発明の原理および実際の応用を最もよく説明し、考えられる特定の用途に適するさまざまな修正を加えたさまざまな実施形態に関して当業者が本発明を理解することを可能にするために選択され、説明された。
RFC02182.r6 - VSX Scalar Single-Precision
スカラ倍精度浮動小数点データは、ＶＳＲおよびストレージ内で倍精度フォーマットで表現される。
ベクトル倍精度浮動小数点データは、ＶＳＲおよびストレージ内で倍精度フォーマットで表現される。
スカラ単精度浮動小数点データは、ＶＳＲ内では倍精度フォーマットで表現され、ストレージ内では単精度フォーマットで表現される。
ベクトル単精度浮動小数点データは、ＶＳＲおよびストレージ内で単精度フォーマットで表現される。
倍精度のオペランドが、倍精度スカラ算術演算のための入力として使用され得る。
倍精度のオペランドが、オーバーフローおよびアンダーフロー例外のトラップが無効化されるときに単精度スカラ算術演算のための入力として使用され得る。
単精度のオペランドが、倍精度および単精度スカラ算術演算のための入力として使用され得る。
倍精度のオペランドが、倍精度ベクトル算術演算のための入力として使用され得る。
単精度のオペランドが、単精度ベクトル算術演算のための入力として使用され得る。
倍精度または単精度を必要としない操作のための命令も、提供される。加えて、ＶＳＲ内の整数表現にアクセスするための命令が、提供される。
単精度スカラ・データに関して、単精度フォーマットから倍精度フォーマットへの変換が、ストレージからＶＳＲへのロードのときに実行され、倍精度フォーマットから単精度フォーマットへの変換が、ＶＳＲからストレージへの記憶のときに実行される。浮動小数点例外は、これらの命令によって引き起こされない。
ＶＳＲ内のスカラおよびベクトル・データに関して単精度フォーマットと倍精度フォーマットとの間の変換を行うための命令が、提供される。
ＶＳＲ内の倍精度フォーマットのオペランドを単精度に明示的に変換するための命令が、提供される。スカラ単精度浮動小数点は、６つのタイプの命令で有効化される。
１．スカラをロード・単精度
この形態の命令は、ストレージ内の単精度フォーマットの浮動小数点オペランドにアクセスし、それを倍精度フォーマットに変換し、それをＶＳＲにロードする。浮動小数点例外は、これらの命令によって引き起こされない。
２．スカラの単精度への丸め
xsrspは、倍精度のオペランドを単精度に丸め、単精度の範囲に関して指数を調べ、それぞれの有効化ビットにしたがって任意の例外を処理し、そのオペランドをＶＳＲに倍精度フォーマットで代入する。単精度の計算命令、単精度のロード、およびxsrspのその他の場合によって生成された結果に関して、xsrspは値を変更しない。オーバーフローが有効化されている（ＯＥ＝１である）ときに絶対値が２３１９を超える値は、正規化された範囲に尺度を戻すことができないので、未定義の結果を生じる。アンダーフローが有効化されている（ＵＥ＝１である）ときに絶対値が２−３１８よりも小さい値は、正規化された範囲に尺度を戻すことができないので、未定義の結果を生じる。
３．スカラの単精度から倍精度への変換
xscvspdpは、変換元ＶＳＲのワード要素０からの単精度フォーマットの浮動小数点オペランドにアクセスし、それを倍精度フォーマットに変換し、それを変換先ＶＳＲのダブルワード要素０に代入する。
４．スカラの倍精度から単精度への変換
xscvdpspは、変換元ＶＳＲのダブルワード要素０内の倍精度浮動小数点値を単精度に丸め、結果を、変換先ＶＳＲのワード要素０に単精度フォーマットで代入する。この機能は、スカラ浮動小数点データを、単精度ベクトル演算と互換性のあるフォーマットに移植するために使用される。オーバーフローが有効化されている（ＯＥ＝１である）ときに絶対値が２３１９を超える値は、正規化された範囲に尺度を戻すことができないので、未定義の結果を生じる。アンダーフローが有効化されている（ＵＥ＝１である）ときに絶対値が２−３１８よりも小さい値は、正規化された範囲に尺度を戻すことができないので、未定義の結果を生じる。
５．ＶＳＸスカラの単精度の計算
この形態の命令は、倍精度フォーマットのＶＳＲからのオペランドを取得し、あたかも演算が無限の精度および限界のない指数範囲を有する中間結果を生成するかのように演算を実行し、それから、この中間結果を強制的に単精度フォーマットに合わせる。ＦＰＳＣＲと、任意で、条件レジスタとの状態ビットが、単精度の結果を反映するように設定される。次に、結果が、変換先ＶＳＲに倍精度フォーマットで入れられる。結果は、単精度フォーマットによってサポートされる範囲内にある。
何らかの入力値が単精度フォーマットで表現できず、ＯＥ＝１であるか、またはＵＥ＝１である場合、変換先ＶＳＲに入れられる結果と、ＦＰＳＣＲの状態ビットの設定とは、未定義である。
xsrespまたはxsrsqrtespの入力値が単精度フォーマットで表現できない場合、変換先ＶＳＲに入れられる結果と、ＦＰＳＣＲの状態ビットの設定とは、未定義である。
６．ＶＳＸスカラを記憶・単精度
stxsspxは、倍精度フォーマットである単精度値を単精度フォーマットに変換し、そのオペランドをストレージに記憶する。浮動小数点例外は、stxsspxによって引き起こされない。（記憶される値は、実際には、前の５つのタイプのうちの１つの命令の結果であると想定される。）
ＶＳＸスカラをロード・単精度（lxsspx）、ＶＳＸスカラの単精度への丸め（xsrsp）、またはＶＳＸスカラの単精度の計算［１］（VSX ScalarSingle-Precision Arithmetic[1]）命令の結果がＶＳＲに記憶されるとき、ＦＲＡＣＴＩＯＮの下位２９ビットはゼロである。ＶＳＸスカラの単精度の計算命令：xsaddsp、xsdivsp、xsmulsp、xsresp、xssubsp、xsmaddasp、xsmaddmsp、xsmsubasp、xsmsubmsp、xsnmaddasp、xsnmaddmsp、xsnmsubasp、xsnmsubmsp。
ＶＳＸスカラの単精度への丸め（xsrsp）が、適切な例外の検査および丸めをともなう倍精度から単精度への値の変換を可能にするために提供される。xsrspは、倍精度浮動小数点値を単精度フォーマットのストレージ要素に記憶する前、または倍精度浮動小数点値を単精度の計算命令のオペランドとして使用する前に、それらの倍精度浮動小数点値を単精度値に変換するために使用されるべきである。単精度ロードおよび計算命令によって生成された値は、既に単精度の値であり、記憶または計算命令の前のxsrspなしに、単精度フォーマットのストレージ要素に直接記憶されるか、または単精度の計算命令のオペランドとして直接使用され得る。
単精度値は、倍精度スカラ算術演算で使用され得る。xsrespまたはxsrsqrtespを除いて、どの倍精度値も、ＯＥ＝０およびＵＥ＝０であるとき、単精度スカラ算術演算で使用され得る。ＯＥ＝１またはＵＥ＝１であるとき、あるいは命令がxsrespまたはxsrsqrtespである場合、元のオペランドは、単精度フォーマットで表現できなければならない。
一部の実装は、倍精度の計算命令よりも高速に単精度の計算命令を実行することができる。したがって、倍精度の精度が必要とされない場合、単精度データおよび命令が使用されるべきである。
整数値を取るオペランド
浮動小数点オペランドを浮動小数点フォーマットの整数値に丸めるための命令が、提供される。浮動小数点処理と整数処理との間のデータの交換を容易にするために、ＶＳＲにおいて浮動小数点倍精度および単精度フォーマットと整数ワードおよびダブルワード・フォーマットとの間の変換を行うための命令が、提供される。整数値を取るオペランドに対する計算は、必要とされる精度の計算命令を使用して実行され得る。（結果は、整数値ではない可能性がある。）特に整数値を取るオペランドをサポートするために提供される命令の３つのグループが、以下で説明される。
１．浮動小数点整数への丸め
ＶＳＸスカラの倍精度整数への丸め命令は、倍精度のオペランドを倍精度フォーマットの整数値に丸める。ＶＳＸスカラの倍精度整数への丸め命令：xsrdpi、xsrdpip、xsrdpim、xsrdpiz、xsrdpic。
ＶＳＸベクトルの倍精度整数への丸め命令は、それぞれの倍精度のベクトル・オペランドの要素を倍精度フォーマットの整数値に丸める。ＶＳＸベクトルの倍精度整数への丸め命令：xvrdpi、xvrdpip、xvrdpim、xvrdpiz、xvrdpic。
ＶＳＸベクトルの単精度整数への丸め命令は、それぞれの単精度のベクトル・オペランドの要素を単精度フォーマットの整数値に丸める。ＶＳＸベクトルの単精度整数への丸め命令：xvrspi、xvrspip、xvrspim、xvrspiz、xvrspic。
xsrdpic、xvrdpic、およびxvrspicを除いて、丸めは、オペコードによって指定された丸めモードを用いて実行される。xsrdpic、xvrdpic、およびxvrspicに関しては、丸めは、ＲＮによって指定された丸めモードを用いて実行される。
浮動小数点整数へのＶＳＸ丸め命令は、無効演算（ＶＸＳＮＡＮ）例外を起こす可能性がある。浮動小数点整数へのＶＳＸ丸め命令：xsrdpi、xsrdpip、xsrdpim、xsrdpiz、xsrdpic、xvrdpi、xvrdpip、xvrdpim、xvrdpiz、xvrdpic、xvrspi、xvrspip、xvrspim、xvrspiz、およびxvrspic。
xsrdpic、xvrdpic、およびxvrspicは、不正確例外（Inexact exception）も起こす可能性がある。
２．浮動小数点フォーマットから整数フォーマットへの変換
ＶＳＸスカラの倍精度から整数フォーマットへの変換命令は、倍精度のオペランドを３２ビットかまたは６４ビットかのどちらかの符号付きまたは符号なし整数フォーマットに変換する。ＶＳＸスカラの倍精度から整数フォーマットへの変換命令：xscvdpsxds、xscvdpsxws、xscvdpuxds、xscvdpuxws。
ＶＳＸベクトルの倍精度から整数フォーマットへの変換命令は、倍精度のベクトル・オペランドの要素を３２ビットかまたは６４ビットかのどちらかの符号付きまたは符号なし整数フォーマットに変換する。ＶＳＸベクトルの倍精度から整数フォーマットへの変換命令：xvcvdpsxds、xvcvdpsxws、xvcvdpuxds、xvcvdpuxws。
ＶＳＸベクトルの単精度から整数ダブルワード・フォーマットへの変換命令は、変換元ベクトル・オペランドのそれぞれの奇数番のワード要素の単精度値を６４ビット符号付きまたは符号なし整数フォーマットに変換する。ＶＳＸベクトルの単精度から整数ダブルワード・フォーマットへの変換命令：xvcvspsxds、xvcvspuxds。
ＶＳＸベクトルの単精度から整数ワード・フォーマットへの変換命令は、変換元ベクトル・オペランドのそれぞれのワード要素の単精度値を３２ビット符号付きかまたは符号なしかのどちらかの整数フォーマットに変換する。ＶＳＸベクトルの単精度から整数ワード・フォーマットへの変換命令：xvcvspsxws、xvcvspuxws。
丸めは、「ゼロへの丸め」丸めモードを使用して実行される。これらの命令は、無効演算（ＶＸＳＮＡＮ、ＶＸＣＶＩ）例外および不正確例外を起こす可能性がある。
３．整数フォーマットから浮動小数点フォーマットへの変換
ＶＳＸスカラの整数ダブルワードから倍精度フォーマットへの変換命令は、６４ビット符号付きまたは符号なし整数を倍精度浮動小数点値に変換し、結果を倍精度フォーマットで返す。ＶＳＸスカラの整数ダブルワードから倍精度フォーマットへの変換命令：xscvsxddp、xscvuxddp。
ＶＳＸスカラの整数ダブルワードから単精度フォーマットへの変換命令は、６４ビット符号付きまたは符号なし整数を単精度浮動小数点値に変換し、結果を倍精度フォーマットで返す。ＶＳＸスカラの整数ダブルワードから単精度フォーマットへの変換命令：xscvsxdsp、xscvuxdsp。
ＶＳＸベクトルの整数ダブルワードから倍精度フォーマットへの変換命令は、変換元ベクトル・オペランドのそれぞれのダブルワード要素の６４ビット符号付きまたは符号なし整数を倍精度浮動小数点フォーマットに変換する。ＶＳＸベクトルの整数ダブルワードから倍精度フォーマットへの変換命令：xscvsxddp、xscvuxddp。
ＶＳＸベクトルの整数ワードから倍精度フォーマットへの変換命令は、変換元ベクトル・オペランドのそれぞれの奇数番のワード要素の３２ビット符号付きまたは符号なし整数を倍精度浮動小数点フォーマットに変換する。ＶＳＸベクトルの整数ワードから倍精度フォーマットへの変換命令：xscvsxwdp、xscvuxwdp。
ＶＳＸベクトルの整数ダブルワードから単精度フォーマットへの変換命令は、変換元ベクトル・オペランドのそれぞれのダブルワード要素の６４ビット符号付きまたは符号なし整数を単精度浮動小数点フォーマットに変換する。ＶＳＸベクトルの整数ダブルワードから単精度フォーマットへの変換命令：xscvsxdsp、xscvuxdsp。
ＶＳＸベクトルの整数ワードから単精度フォーマットへの変換命令は、変換元ベクトル・オペランドのそれぞれのワード要素の３２ビット符号付きまたは符号なし整数を単精度浮動小数点フォーマットに変換する。ＶＳＸベクトルの整数ワードから単精度フォーマットへの変換命令：xscvsxwsp、xscvuxwsp。
丸めは、ＲＮで指定された丸めモードを用いて実行される。変換元のフォーマットの制限のために、不正確例外のみが生成される可能性がある。
ConvertSP64toSP(x)
ｘは、倍精度フォーマットの単精度浮動小数点値である。
値ｘを単精度フォーマットで返す。ｘは単精度で表現可能でなければならず、またはそうでなければ、返される結果が未定義である。ｘは、非正規化を必要とする可能性がある。丸めは実行されない。ｘは、ＳＮａＮである場合、ｘと同じペイロードを有する単精度のＳＮａＮに変換される。
sign ← x.bit[0]
exp ← x.bit[1:11] -1023
frac ← x.bit[12:63]
if (exp = -1023) & (frac = 0) &(sign=0) then return(0x0000_0000) // 正のゼロ
else if (exp = -1023) & (frac = 0)& (sign=1) then return(0x8000_0000) // 
負のゼロ
else if (exp = -1023) & (frac != 0) thenreturn(0xUUUU_UUUU) // DP非正規
else if (exp < -126) then do // 非正規化が必要
msb = 1
do while (exp <-126) // exp=Eminとなるまでオペランドを非正規化する
frac.bit[1:51] ← frac.bit[0:50]
frac.bit[0] ← msb
msb ← 0
exp ← exp + 1
end
if (frac = 0) thenreturn(0xUUUU_UUUU) // SPフォーマットで表現できない値
else do //非正規化されたSPを返す
result.bit[0] ← sign
result.bit[1:8] ← 0
result.bit[9:31] ← frac.bit[0:22]
return(result)
end
end
else if (exp = +1024) & (frac = 0)& (sign=0) then return(0x7F80_0000) //
正の無限大
else if (exp = +1024) & (frac = 0)& (sign=1) then return(0xFF80_0000) //
負の無限大
else if (exp = +1024) & (frac != 0)then do // QNaNまたはSNaN 
result.bit[0] ← sign
result.bit[1:8] ← 255
result.bit[9:31] ← frac.bit[0:22]
return(result)
end
else if (exp < +1024) & (exp >+126) then return(0xUUUU_UUUU) // オーバーフロー
else do // 正常値
result.bit[0] ← sign
result.bit[1:8] ← exp.bit[4:11] + 127
result.bit[9:31] ← frac.bit[0:22]
return(result)
end
ConvertSPtoSP64(x)
ｘは、単精度フォーマットの浮動小数点値である。
値ｘを倍精度フォーマットで返す。ｘは、ＳＮａＮである場合、ｘと同じペイロードを有する倍精度のＳＮａＮに変換される。
sign ← x.bit[0]
exp ← x.bit[1:8] -127
frac ← x.bit[9:31]
if (exp = -127) & (frac != 0) then do// 非正規化された値を正規化する
msb ← frac.bit[0]
frac ← frac << 1
do while (msb = 0)
msb ← frac.bit[0]
frac ← frac << 1
exp ← exp - 1
end
end
else if (exp = -127) & (frac = 0) thenexp ← -1023 // ゼロ値
else if (exp = +128) then exp ← +1024 // 無限大、NaN
result.bit[0] ←sign
result.bit[1:11] ←exp + 1023
result.bit[12:34] ←frac
result.bit[35:63] ←0
return(result)
ＶＳＸスカラを整数ワードとしてロード・代数・インデックス付き・ＸＸ１形式（LoadVSX Scalar as Integer Word Algebraic Indexed XX1-form）
lxsiwax    XT,RA,RB    (0x7C00_0098)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜３０の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、ＲＡ、ビット１１〜１５）と、第３のフィールド（例えば、ＲＢ、ビット１６〜２０）とを含む。
EA ←( (RA=0) ? 0 :GPR[RA] ) +tea GPR[RB]
VSR[32×TX+T].doubleword[0]←ExtendSign(MEM(EA,4))
VSR[32×TX+T].doubleword[1]←0xUUUU_UUUU_UUUU_UUUU
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＥＡに、ＧＰＲ［ＲＡ］の内容、またはＲＡが０に等しい場合は０と、ＧＰＲ［ＲＢ］の内容との合計を代入する。
ストレージのアドレスＥＡにあるワード内の３２ビット符号付き整数値が、ダブルワードに符号拡張され、ＶＳＲ［ＸＴ］のダブルワード要素０に代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＥＡがワード・アラインされていない（つまり、ＥＡのビット６２：６３が０でない）場合、ストレージへのアクセスを実行する代わりに、システム・アラインメント・エラー・ハンドラの呼び出しが許可される。
変更される特殊レジスタ
なし
lxsiwaxに関するＶＳＲデータ・レイアウト
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＳＤを含む。
ＶＳＸスカラを整数ワードとしてロードおよびゼロ・インデックス付き・ＸＸ１形式（LoadVSX Scalar as Integer Word and Zero Indexed XX1-form）
lxsiwzx    XT,RA,RB    (0x7C00_0018)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜３０の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、ＲＡ、ビット１１〜１５）と、第３のフィールド（例えば、ＲＢ、ビット１６〜２０）とを含む。
EA ← ( (RA=0) ? 0 :GPR[RA] ) +tea GPR[RB]
VSR[32×TX+T].doubleword[0]← ExtendZero(MEM(EA,4))
VSR[32×TX+T].doubleword[1]← 0xUUUU_UUUU_UUUU_UUUU
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＥＡに、ＧＰＲ［ＲＡ］の内容、またはＲＡが０に等しい場合は０と、ＧＰＲ［ＲＢ］の内容との合計を代入する。
ストレージのアドレスＥＡにあるワード内の３２ビット符号なし整数値が、ダブルワードにゼロ拡張され、ＶＳＲ［ＸＴ］のダブルワード要素０に代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＥＡがワード・アラインされていない（つまり、ＥＡのビット６２：６３が０でない）場合、ストレージへのアクセスを実行する代わりに、システム・アラインメント・エラー・ハンドラの呼び出しが許可される。
変更される特殊レジスタ
なし
lxsiwzxに関するＶＳＲデータ・レイアウト
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＵＤを含む。
ＶＳＸスカラをロード・単精度・インデックス付き・ＸＸ１形式（Load VSXScalar Single-Precision Indexed XX1-form）
lxsspx    XT,RA,RB    (0x7C00_0418)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜３０の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、ＲＡ、ビット１１〜１５）と、第３のフィールド（例えば、ＲＢ、ビット１６〜２０）とを含む。
EA ← ( (RA=0) ? 0 :GPR[RA] ) +tea GPR[RB]
VSR[32×TX+T].doubleword[0]← ConvertSPtoSP64(MEM(EA,4))
VSR[32×TX+T].doubleword[1]← 0xUUUU_UUUU_UUUU_UUUU
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＥＡに、ＧＰＲ［ＲＡ］の内容、またはＲＡが０に等しい場合は０と、ＧＰＲ［ＲＢ］の内容との合計を代入する。
ストレージのアドレスＥＡにあるワード内の単精度浮動小数点値が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＥＡがワード・アラインされていない（つまり、ＥＡのビット６２：６３が０でない）場合、ストレージへのアクセスを実行する代わりに、システム・アラインメント・エラー・ハンドラの呼び出しが許可される。
変更される特殊レジスタ
なし
lxsspxに関するＶＳＲデータ・レイアウト
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む。
ＶＳＸスカラを整数ワードとして記憶・インデックス付き・ＸＸ１形式（Store VSXScalar as Integer Word Indexed XX1-form）
stxsiwx    XS,RA,RB    (0x7C00_0118)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜３０の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｓフィールド、ビット６〜１０）および第１のビット（例えば、ＳＸフィールド、ビット３１）と、第２のフィールド（例えば、ＲＡ、ビット１１〜１５）と、第３のフィールド（例えば、ＲＢ、ビット１６〜２０）とを含む。
EA ← ( (RA=0) ? 0 :GPR[RA] ) +tea GPR[RB]
MEM(EA,4) ← VSR[32×SX+S].word[1]
MEMtag(EA,4) ← 0
ＸＳに、Ｓと連結された値ＳＸを代入する。
ＥＡに、ＧＰＲ［ＲＡ］の内容、またはＲＡが０に等しい場合は０と、ＧＰＲ［ＲＢ］の内容との合計を代入する。
ＶＳＲ［ＸＳ］のワード要素１の内容が、ストレージのアドレスＥＡにあるワードに単精度フォーマットで代入される。
ＥＡがワード・アラインされていない（つまり、ＥＡのビット６２：６３が０でない）場合、ストレージへのアクセスを実行する代わりに、システム・アラインメント・エラー・ハンドラの呼び出しが許可される。
変更される特殊レジスタ
なし
stxsiwxに関するＶＳＲデータ・レイアウト
src = VSR[XS]
１２８ビットのうちのビット３２〜６３は、ＳＷ／ＵＷを含む。
ＶＳＸスカラを記憶・単精度・インデックス付き・ＸＸ１形式（Store VSXScalar Single-Precision Indexed XX1-form）
stxsspx    XS,RA,RB    (0x7C00_0518)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜３０の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｓフィールド、ビット６〜１０）および第１のビット（例えば、ＳＸフィールド、ビット３１）と、第２のフィールド（例えば、ＲＡ、ビット１１〜１５）と、第３のフィールド（例えば、ＲＢ、ビット１６〜２０）とを含む。
EA ← ( (RA=0) ? 0 :GPR[RA] ) +tea GPR[RB]
MEM(EA,4) ←ConvertSP64toSP(VSR[32×SX+S].doubleword[0])
MEMtag(EA,4) ← 0
ＸＳに、Ｓと連結された値ＳＸを代入する。
ＥＡに、ＧＰＲ［ＲＡ］の内容、またはＲＡが０に等しい場合は０と、ＧＰＲ［ＲＢ］の内容との合計を代入する。
ＶＳＲ［ＸＳ］のダブルワード要素０の倍精度浮動小数点フォーマットの単精度値が、ストレージのアドレスＥＡにあるワードに単精度フォーマットで代入される。
ＥＡがワード・アラインされていない（つまり、ＥＡのビット６２：６３が０でない）場合、ストレージへのアクセスを実行する代わりに、システム・アラインメント・エラー・ハンドラの呼び出しが許可される。
変更される特殊レジスタ
なし
stxsspxに関するＶＳＲデータ・レイアウト
src = VSR[XS]
１２８ビットのうちのビット０〜６３は、ＤＰを含む。
ＶＳＸスカラの加算・単精度・ＸＸ３形式（VSX Scalar AddSingle-Precision XX3-form）
xsaddsp    XT,XA,XB    (0xF000_0000)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src1 ← VSR[32×AX+A].doubleword[0]
src2 ← VSR[32×BX+B].doubleword[0]
v ←AddDP(src1,src2)
result ←RoundToSP(RN,v)
if(vxsnan_flag) then SetFX(VXSNAN)
if(vxisi_flag) then SetFX(VXISI)
if(ox_flag) then SetFX(OX)
if(ux_flag) then SetFX(UX)
if(xx_flag) then SetFX(XX)
vex_flag ← VE &(vxsnan_flag | vxisi_flag)
if( 〜vex_flag )then do
VSR[32×TX+T].doubleword[0] ← ConverSPtoDP(result)
VSR[32×TX+T].doubleword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassSP(result)
FR ← inc_flag
FI ← xx_flag
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＡに、Ａと連結された値ＡＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃ１に、ＶＳＲ［ＸＡ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃ２に、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃ２がｓｒｃ１に加算され、限界のない範囲および精度を有する和をもたらす。浮動小数点の加算は、指数の比較および２つの仮数の加算に基づく。２つのオペランドの指数が比較され、より小さな指数に付随する仮数が、２つの指数が等しくなるまで、ビットがシフトされるたびに１ずつその指数が増やされるようにして右シフトされる。次に、２つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の５３ビットすべておよび３つのガード・ビット（Ｇ、Ｒ、およびＸ）すべてが、計算に現れる。
和が、正規化される。浮動小数点の正規化は、最上位ビットが１になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、ＲＮによって指定された丸めモードを使用して単精度に丸められる。
結果が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。ＦＲが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。ＦＩが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されず、ＦＲおよびＦＩが０に設定される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＯＸ    ＵＸ    ＸＸ
ＶＸＳＮＡＮ    ＶＸＩＳＩ
xsaddspに関するＶＳＲデータ・レイアウト
src1 = VSR[XA]
１２８ビットのうちのビット０〜６３は、ＤＰを含む。
src2 = VSR[XB]
１２８ビットのうちのビット０〜６３は、ＤＰを含む。
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む。
ＶＳＸスカラの符号付き整数ダブルワードの浮動小数点フォーマットへの変換および単精度への丸め・ＸＸ２形式（VSX Scalar Convert Signed Integer Doubleword to floating-pointformat and round to Single-Precision XX2-form）
xscvsxdsp    XT,XB    (0xF000_04E0)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２９の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第２のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src ← ConvertSDtoDP(VSR[32×BX+B].doubleword[0])
result ←RoundToSP(RN,src)
VSR[32×TX+T].doubleword[0]← ConvertSPtoSP64(result)
VSR[32×TX+T].doubleword[1]← 0xUUUU_UUUU_UUUU_UUUU
if(xx_flag) then SetFX(XX)
FPRF ←ClassSP(result)
FR ← inc_flag
FI ← xx_flag
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃに、ＶＳＲ［ＸＢ］のダブルワード要素０内の２の補数による整数値を代入する。
ｓｒｃが、浮動小数点フォーマットに変換され、ＲＮによって指定された丸めモードを用いて単精度に丸められる。
結果が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。ＦＲが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。ＦＩが、結果が厳密でないことを示すように設定される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＸＸ
xscvsxdspに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜６３は、ＳＤを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
ＶＳＸスカラの符号なし整数ダブルワードの浮動小数点フォーマットへの変換および単精度への丸め・ＸＸ２形式（VSX Scalar Convert Unsigned Integer Doubleword to floating-pointformat and round to Single-Precision XX2-form）
xscvuxdsp    XT,XB    (0xF000_04A0)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２９の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第２のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src ←ConvertUDtoDP(VSR[32×BX+B].doubleword[0])
result ←RoundToSP(RN,src)
VSR[32×TX+T].doubleword[0]← ConvertSPtoSP64(result)
VSR[32×TX+T].doubleword[1]← 0xUUUU_UUUU_UUUU_UUUU
if(xx_flag) then SetFX(XX)
FPRF ←ClassSP(result)
FR ← inc_flag
FI ← xx_flag
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃに、ＶＳＲ［ＸＢ］のダブルワード要素０内の符号なし整数値を代入する。
ｓｒｃが、浮動小数点フォーマットに変換され、ＲＮによって指定された丸めモードを用いて単精度に丸められる。
結果が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。ＦＲが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。ＦＩが、結果が厳密でないことを示すように設定される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＸＸ
xscvuxdspに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜６３は、ＵＤを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
ＶＳＸスカラの除算・単精度・ＸＸ３形式（VSX Scalar DivideSingle-Precision XX3-form）
xsdivsp    XT,XA,XB    (0xF000_00C0)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src1 ← VSR[32×AX+A].doubleword[0]
src2 ← VSR[32×BX+B].doubleword[0]
v ←DivideDP(src1,src2)
result ←RoundToSP(RN,v)
if(vxsnan_flag) then SetFX(VXSNAN)
if(vxidi_flag) then SetFX(VXIDI)
if(vxzdz_flag) then SetFX(VXZDZ)
if(ox_flag) then SetFX(OX)
if(ux_flag) then SetFX(UX)
if(xx_flag) then SetFX(XX)
if(zx_flag) then SetFX(ZX)
vex_flag ← VE &(vxsnan_flag|vxidi_flag|vxzdz_flag)
zex_flag ← ZE &zx_flag
if( 〜vex_flag &〜zex_flag ) then do
VSR[32×TX+T].doubleword[0] ←ConvertSPtoSP64(result)
VSR[32×TX+T].doubleword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassSP(result)
FR ← inc_flag
FI ← xx_flag
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＡに、Ａと連結された値ＡＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃ１に、ＶＳＲ［ＸＡ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃ２に、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃ１がｓｒｃ２で除算され、限界のない範囲および精度を有する商をもたらす。浮動小数点の除算は、指数の減算および仮数の除算に基づく。
商が、正規化される。浮動小数点の正規化は、最上位ビットが１になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、ＲＮによって指定された丸めモードを使用して単精度に丸められる。
結果が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。ＦＲが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。ＦＩが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外またはトラップ可能なゼロ除算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されず、ＦＲおよびＦＩが０に設定される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＯＸ    ＵＸ    ＺＸ    ＸＸ
ＶＸＳＮＡＮ    ＶＸＩＤＩ    ＶＸＺＤＺ
xsdivspに関するＶＳＲデータ・レイアウト
src1 = VSR[XA]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
src2 = VSR[XB]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
ＶＳＸスカラの乗算−加算・単精度・ＸＸ３形式（VSX ScalarMultiply-Add Single-Precision XX3-form）
xsmaddasp    XT,XA,XB    (0xF000_0008)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
xsmaddmsp    XT,XA,XB    (0xF000_0048)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
if “xsmaddasp” then do
src1 ← VSR[32×AX+A].doubleword[0]
src2 ← VSR[32×TX+T].doubleword[0]
src3 ← VSR[32×BX+B].doubleword[0]
end
if “xsmaddmsp” then do
src1 ← VSR[32×AX+A].doubleword[0]
src2 ← VSR[32×BX+B].doubleword[0]
src3 ← VSR[32×TX+T].doubleword[0]
end
v ←MultiplyAddDP(src1,src3,src2)
result ← RoundToSP(RN,v)
if(vxsnan_flag) then SetFX(VXSNAN)
if(vximz_flag) then SetFX(VXIMZ)
if(vxisi_flag) then SetFX(VXISI)
if(ox_flag) then SetFX(OX)
if(ux_flag) then SetFX(UX)
if(xx_flag) then SetFX(XX)
vex_flag ← VE &(vxsnan_flag | vximz_flag | vxisi_flag)
if( 〜vex_flag )then do
VSR[32×TX+T].doubleword[0] ←ConvertSPtoSP64(result)
VSR[32×TX+T].doubleword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassSP(result)
FR ← inc_flag
FI ← xx_flag
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＡに、Ａと連結された値ＡＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
xsmaddaspに関しては、以下を実行する。
−  ｓｒｃ１に、ＶＳＲ［ＸＡ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ２に、ＶＳＲ［ＸＴ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ３に、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
xsmaddmspに関しては、以下を実行する。
−  ｓｒｃ１に、ＶＳＲ［ＸＡ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ２に、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ３に、ＶＳＲ［ＸＴ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃ１がｓｒｃ３と乗算され、限界のない範囲および精度を有する積をもたらす。浮動小数点の乗算は、指数の加算および仮数の乗算に基づく。
ｓｒｃ２が積に加算され、限界のない範囲および精度を有する和をもたらす。浮動小数点の加算は、指数の比較および２つの仮数の加算に基づく。２つのオペランドの指数が比較され、より小さな指数に付随する仮数が、２つの指数が等しくなるまで、ビットがシフトされるたびに１ずつその指数が増やされるようにして右シフトされる。次に、２つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の５３ビットすべておよび３つのガード・ビット（Ｇ、Ｒ、およびＸ）すべてが、計算に現れる。
和が、正規化される。浮動小数点の正規化は、最上位ビットが１になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、ＲＮによって指定された丸めモードを使用して単精度に丸められる。
結果が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。ＦＲが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。ＦＩが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されず、ＦＲおよびＦＩが０に設定される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＯＸ    ＵＸ    ＸＸ
ＶＸＳＮＡＮ    ＶＸＩＳＩ    ＶＸＩＭＺ
xsmadd(a|m)spに関するＶＳＲデータ・レイアウト
src1 = VSR[XA]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
src2 = xsmaddasp ? VSR[XT] : VSR[XB]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
src3 = xsmaddasp ? VSR[XB] : VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
ＶＳＸスカラの乗算−減算・単精度・ＸＸ３形式（VSX ScalarMultiply-Subtract Single-Precision XX3-form）
xsmsubasp    XT,XA,XB    (0xF000_0088)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
xsmsubmsp    XT,XA,XB    (0xF000_00C8)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
if “xsmsubasp” then do
src1 ← VSR[32×AX+A].doubleword[0]
src2 ← VSR[32×TX+T].doubleword[0]
src3 ← VSR[32×BX+B].doubleword[0]
end
if “xsmsubmsp” then do
src1 ← VSR[32×AX+A].doubleword[0]
src2 ← VSR[32×BX+B].doubleword[0]
src3 ← VSR[32×TX+T].doubleword[0]
end
v ←MultiplyAddDP(src1,src3,NegateDP(src2))
result ←RoundToSP(RN,v)
if(vxsnan_flag) thenSetFX(VXSNAN)
if(vximz_flag) thenSetFX(VXIMZ)
if(vxisi_flag) thenSetFX(VXISI)
if(ox_flag) thenSetFX(OX)
if(ux_flag) thenSetFX(UX)
if(xx_flag) thenSetFX(XX)
vex_flag ← VE &(vxsnan_flag | vximz_flag | vxisi_flag)
if( 〜vex_flag )then do
VSR[32×TX+T].doubleword[0] ← ConvertSPtoSP64(result)
VSR[32×TX+T].doubleword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassSP(result)
FR ← inc_flag
FI ← xx_flag
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＡに、Ａと連結された値ＡＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
xsmsubaspに関しては、以下を実行する。
−  ｓｒｃ１に、ＶＳＲ［ＸＡ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ２に、ＶＳＲ［ＸＴ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ３に、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
xsmsubmspに関しては、以下を実行する。
−  ｓｒｃ１に、ＶＳＲ［ＸＡ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ２に、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ３に、ＶＳＲ［ＸＴ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃ１がｓｒｃ３と乗算され、限界のない範囲および精度を有する積をもたらす。浮動小数点の乗算は、指数の加算および仮数の乗算に基づく。
ｓｒｃ２が否定を取られ、積に加算され、限界のない範囲および精度を有する和をもたらす。浮動小数点の加算は、指数の比較および２つの仮数の加算に基づく。２つのオペランドの指数が比較され、より小さな指数に付随する仮数が、２つの指数が等しくなるまで、ビットがシフトされるたびに１ずつその指数が増やされるようにして右シフトされる。次に、２つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の５３ビットすべておよび３つのガード・ビット（Ｇ、Ｒ、およびＸ）すべてが、計算に現れる。
限界のない範囲および精度を有する結果が、正規化される。浮動小数点の正規化は、最上位ビットが１になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、ＲＮによって指定された丸めモードを使用して単精度に丸められる。
結果が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。ＦＲが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。ＦＩが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されず、ＦＲおよびＦＩが０に設定される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＯＸ    ＵＸ    ＸＸ
ＶＸＳＮＡＮ    ＶＸＩＳＩ    ＶＸＩＭＺ
xsmsub(a|m)spに関するＶＳＲデータ・レイアウト
src1 = VSR[XA]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
src2 = xsmsubasp ? VSR[XT] : VSR[XB]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
src3 = xsmsubasp ? VSR[XB] : VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
ＶＳＸスカラの乗算・単精度・ＸＸ３形式（VSX Scalar MultiplySingle-Precision XX3-form）
xsmulsp    XT,XA,XB    (0xF000_0080)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src1 ← VSR[32×AX+A].doubleword[0]
src2 ← VSR[32×BX+B].doubleword[0]
v ← MultiplyDP(src1,src2)
result ←RoundToSP(RN,v)
if(vxsnan_flag) then SetFX(VXSNAN)
if(vximz_flag) then SetFX(VXIMZ)
if(ox_flag) then SetFX(OX)
if(ux_flag) then SetFX(UX)
if(xx_flag) then SetFX(XX)
vex_flag ← VE &(vxsnan_flag | vximz_flag)
if( 〜vex_flag )then do
VSR[32×TX+T].doubleword[0]← ConvertSPtoSP64(result)
VSR[32×TX+T].doubleword[1]← 0xUUUU_UUUU_UUUU_UUUU
FPRF ←ClassSP(result)
FR ← inc_flag
FI ← xx_flag
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＡに、Ａと連結された値ＡＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃ１に、ＶＳＲ［ＸＡ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃ２に、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃ１がｓｒｃ２と乗算され、限界のない範囲および精度を有する積をもたらす。浮動小数点の乗算は、指数の加算および仮数の乗算に基づく。
積が、正規化される。浮動小数点の正規化は、最上位ビットが１になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、ＲＮによって指定された丸めモードを使用して単精度に丸められる。
結果が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。ＦＲが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。ＦＩが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されず、ＦＲおよびＦＩが０に設定される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＯＸ    ＵＸ    ＸＸ
ＶＸＳＮＡＮ    ＶＸＩＭＺ
xsmulspに関するＶＳＲデータ・レイアウト
src1 = VSR[XA]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
src2 = VSR[XB]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
ＶＳＸスカラの否定・乗算−加算・単精度・ＸＸ３形式（VSX ScalarNegative Multiply-Add Single-Precision XX3-form）
xsnmaddasp    XT,XA,XB    (0xF000_0408)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
xsnmaddmsp    XT,XA,XB    (0xF000_0448)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
if “xsnmaddasp” then do
src1 ← VSR[32×AX+A].doubleword[0]
src2 ← VSR[32×TX+T].doubleword[0]
src3 ← VSR[32×BX+B].doubleword[0]
end
if “xsnmaddmsp” then do
src1 ← VSR[32×AX+A].doubleword[0]
src2 ← VSR[32×BX+B].doubleword[0]
src3 ← VSR[32×TX+T].doubleword[0]
end
v ← MultiplyAddDP(src1,src3,src2)
result ←NegateSP(RoundToSP(RN,v))
if(vxsnan_flag) then SetFX(VXSNAN)
if(vximz_flag) then SetFX(VXIMZ)
if(vxisi_flag) then SetFX(VXISI)
if(ox_flag) then SetFX(OX)
if(ux_flag) then SetFX(UX)
if(xx_flag) then SetFX(XX)
vex_flag ← VE &(vxsnan_flag | vximz_flag | vxisi_flag)
if( 〜vex_flag )then do
VSR[32×TX+T].doubleword[0] ← ConvertToSP(result)
VSR[32×TX+T].doubleword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassSP(result)
FR ← inc_flag
FI ← xx_flag
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＡに、Ａと連結された値ＡＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
xsnmaddaspに関しては、以下を実行する。
−  ｓｒｃ１に、ＶＳＲ［ＸＡ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ２に、ＶＳＲ［ＸＴ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ３に、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
xsnmaddmspに関しては、以下を実行する。
−  ｓｒｃ１に、ＶＳＲ［ＸＡ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ２に、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ３に、ＶＳＲ［ＸＴ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃ１がｓｒｃ３と乗算され、限界のない範囲および精度を有する積をもたらす。浮動小数点の乗算は、指数の加算および仮数の乗算に基づく。
ｓｒｃ２が積に加算され、限界のない範囲および精度を有する和をもたらす。浮動小数点の加算は、指数の比較および２つの仮数の加算に基づく。２つのオペランドの指数が比較され、より小さな指数に付随する仮数が、２つの指数が等しくなるまで、ビットがシフトされるたびに１ずつその指数が増やされるようにして右シフトされる。次に、２つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の５３ビットすべておよび３つのガード・ビット（Ｇ、Ｒ、およびＸ）すべてが、計算に現れる。
和が、正規化される。浮動小数点の正規化は、最上位ビットが１になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、ＲＮによって指定された丸めモードを使用して単精度に丸められる。
結果が否定を取られ、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。ＦＲが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。ＦＩが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されず、ＦＲおよびＦＩが０に設定される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＯＸ    ＵＸ    ＸＸ
ＶＸＳＮＡＮ    ＶＸＩＳＩ    ＶＸＩＭＺ
xsnmadd(a|m)spに関するＶＳＲデータ・レイアウト
src1 = VSR[XA]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
src2 = xsnmadda(dp|sp) ? VSR[XT] : VSR[XB]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
src3 = xsnmadda(dp|sp) ? VSR[XB] : VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
ＶＳＸスカラの否定・乗算−減算・単精度・ＸＸ３形式（VSX ScalarNegative Multiply-Subtract Single-Precision XX3-form）
xsnmsubasp    XT,XA,XB    (0xF000_0488)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
xsnmsubmsp    XT,XA,XB    (0xF000_04C8)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
if “xsnmsubasp” then do
src1 ← VSR[32×AX+A].doubleword[0]
src2 ← VSR[32×TX+T].doubleword[0]
src3 ← VSR[32×BX+B].doubleword[0]
end
if “xsnmsubmsp” then do
src1 ← VSR[32×AX+A].doubleword[0]
src2 ← VSR[32×BX+B].doubleword[0]
src3 ← VSR[32×TX+T].doubleword[0]
end
v ←MultiplyAddDP(src1,src3,NegateDP(src2)))
result ←NegateSP(RoundToSP(RN,v))
if(vxsnan_flag) thenSetFX(VXSNAN)
if(vximz_flag) thenSetFX(VXIMZ)
if(vxisi_flag) thenSetFX(VXISI)
if(ox_flag) thenSetFX(OX)
if(ux_flag) thenSetFX(UX)
if(xx_flag) thenSetFX(XX)
vex_flag ← VE &(vxsnan_flag | vximz_flag | vxisi_flag)
if( 〜vex_flag )then do
VSR[32×TX+T].doubleword[0] ←ConvertSPtoSP64(result)
VSR[32×TX+T].doubleword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassSP(result)
FR ← inc_flag
FI ← xx_flag
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＡに、Ａと連結された値ＡＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
xsnmsubaspに関しては、以下を実行する。
−  ｓｒｃ１に、ＶＳＲ［ＸＡ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ２に、ＶＳＲ［ＸＴ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ３に、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
xsnmsubmspに関しては、以下を実行する。
−  ｓｒｃ１に、ＶＳＲ［ＸＡ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ２に、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
−  ｓｒｃ３に、ＶＳＲ［ＸＴ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃ１がｓｒｃ３と乗算され、限界のない範囲および精度を有する積をもたらす。浮動小数点の乗算は、指数の加算および仮数の乗算に基づく。
ｓｒｃ２が否定を取られ、積に加算され、限界のない範囲および精度を有する和をもたらす。浮動小数点の加算は、指数の比較および２つの仮数の加算に基づく。２つのオペランドの指数が比較され、より小さな指数に付随する仮数が、２つの指数が等しくなるまで、ビットがシフトされるたびに１ずつその指数が増やされるようにして右シフトされる。次に、２つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の５３ビットすべておよび３つのガード・ビット（Ｇ、Ｒ、およびＸ）すべてが、計算に現れる。
和が、正規化される。浮動小数点の正規化は、最上位ビットが１になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、ＲＮによって指定された丸めモードを使用して単精度に丸められる。
結果が否定を取られ、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。ＦＲが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。ＦＩが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されず、ＦＲおよびＦＩが０に設定される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＯＸ    ＵＸ    ＸＸ
ＶＸＳＮＡＮ    ＶＸＩＳＩ    ＶＸＩＭＺ
xsnmsub(a|m)spに関するＶＳＲデータ・レイアウト
src1 = VSR[XA]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
src2 = xsnmsubasp ? VSR[XT] : VSR[XB]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
src3 = xsnmsubasp ? VSR[XB] : VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
tgt = VSR[XT]
ＶＳＸスカラの逆数の推定・単精度・ＸＸ２形式（VSX ScalarReciprocal Estimate Single-Precision XX2-form）
xsresp    XT,XB    (0xF000_0068)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２９の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第２のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src ← VSR[32×BX+B].doubleword[0]
v ←ReciprocalEstimateDP(src)
result ←RoundToSP(RN,v)
if(vxsnan_flag) then SetFX(VXSNAN)
if(ox_flag) then SetFX(OX)
if(ux_flag) then SetFX(UX)
if(0bU) then SetFX(XX)
if(zx_flag) then SetFX(ZX)
vex_flag ← VE &vxsnan_flag
zex_flag ← ZE &zx_flag
if( 〜vex_flag &〜zex_flag ) then do
VSR[32×TX+T].doubleword[0] ←ConvertSPtoSP64(result)
VSR[32×TX+T].doubleword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassSP(result)
FR ← 0bU
FI ← 0bU
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃに、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃの逆数の倍精度浮動小数点推定値が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ｓｒｃの逆数がゼロ、無限大、またはＱＮａＮでない場合、推定値は、ｓｒｃの逆数の１６３８４分の１以下の精度の相対誤差を有する。つまり、
【数１】
0005963866.tif 000002
オペランドのさまざまな特殊な値を使った演算は、以下のようにまとめられる。
元の値          結果            例外
負の無限大      負のゼロ        なし
負のゼロ        負の無限大１    ＺＸ
正のゼロ        正の無限大１    ＺＸ
ＳＮａＮ          ＱＮａＮ２        ＶＸＳＮＡＮ
ＱＮａＮ          ＱＮａＮ          なし
１．ＺＥ＝１の場合、結果なし
２．ＶＥ＝１の場合、結果なし
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。ＦＲが、未定義値に設定される。ＦＩが、未定義値に設定される。
トラップ可能な無効演算例外またはトラップ可能なゼロ除算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されない。
この命令を実行した結果は、実装によって、および同じ実装における異なる実行によってさまざまであることが許される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ＝０ｂＵ    ＦＩ＝０ｂＵ    ＦＸ    ＯＸ    ＵＸ    ＺＸ
ＸＸ＝０ｂＵ    ＶＸＳＮＡＮ
xsrespに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
ＶＳＸスカラの単精度への丸め・ＸＸ２形式（VSX Scalar Round toSingle-Precision XX2-form）
xsrsp    XT,XB    (0xF000_0464)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２９の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第２のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src ← VSR[32×BX+B].doubleword[0]
result ←RoundToSP(RN,src)
if(vxsnan_flag) then SetFX(VXSNAN)
if(ox_flag) then SetFX(OX)
if(ux_flag) then SetFX(UX)
if(xx_flag) then SetFX(XX)
vex_flag ← VE &vxsnan_flag
if( 〜vex_flag )then do
VSR[32×TX+T].doubleword[0] ←ConvertSPtoSP64(result)
VSR[32×TX+T].doubleword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassSP(result)
FR ← inc_flag
FI ← xx_flag
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃに、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃが、ＦＰＳＣＲの浮動小数点丸め制御フィールドＲＮによって指定された丸めモードを用いて単精度に丸められる。
結果が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されない。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＯＸ    ＵＸ    ＸＸ    ＶＸＳＮＡＮ
xsrspに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
ＶＳＸスカラの単精度への丸め・ＸＸ２形式
xsrsp    XT,XB    (0xF000_0464)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２９の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第２のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src ← VSR[32×BX+B].doubleword[0]
result ←RoundToSP(RN,src)
if(vxsnan_flag) then SetFX(VXSNAN)
if(ox_flag) then SetFX(OX)
if(ux_flag) then SetFX(UX)
if(xx_flag) then SetFX(XX)
vex_flag ← VE &vxsnan_flag
if( 〜vex_flag )then do
VSR[32×TX+T].doubleword[0] ←ConvertSPtoSP64(result)
VSR[32×TX+T].doubleword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassSP(result)
FR ← inc_flag
FI ← xx_flag
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃに、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃが、ＦＰＳＣＲの浮動小数点丸め制御フィールドＲＮによって指定された丸めモードを用いて単精度に丸められる。
結果が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されない。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＯＸ    ＵＸ    ＸＸ    ＶＸＳＮＡＮ
xsrspに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
ＶＳＸスカラの平方根の逆数の推定・単精度・ＸＸ２形式（VSX ScalarReciprocal Square Root Estimate Single-Precision XX2-form）
xsrsqrtesp    XT,XB    (0xF000_0028)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２９の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第２のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src ← VSR[32×BX+B].doubleword[0]
v ←ReciprocalSquareRootEstimateDP(src)
result ←RoundToSP(RN,v)
if(vxsnan_flag) then SetFX(VXSNAN)
if(vxsqrt_flag) then SetFX(VXSQRT)
if(0bU) then SetFX(XX)
if(zx_flag) then SetFX(ZX)
vex_flag ← VE &(vxsnan_flag | vxsqrt_flag)
zex_flag ← ZE &zx_flag
if( 〜vex_flag &〜zex_flag ) then do
VSR[32×TX+T].doubleword[0] ←ConvertSPtoSP64(result)
VSR[32×TX+T].doubleword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassSP(result)
FR ← 0bU
FI ← 0bU
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃに、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃの平方根の逆数の単精度浮動小数点推定値が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ｓｒｃの平方根の逆数がゼロ、無限大、またはＱＮａＮでない場合、推定値は、ｓｒｃの平方根の逆数の１６３８４分の１以下の精度の相対誤差を有する。つまり、
【数２】
0005963866.tif 000003
オペランドのさまざまな特殊な値を使った演算は、以下のようにまとめられる。
元の値          結果            例外
負の無限大      ＱＮａＮ１      ＶＸＳＱＲＴ
負の有限値      ＱＮａＮ１      ＶＸＳＱＲＴ
負のゼロ        無限大２        ＺＸ
正のゼロ        正の無限大２    ＺＸ
ＳＮａＮ        ＱＮａＮ１      ＶＸＳＮＡＮ
ＱＮａＮ        ＱＮａＮ        なし
１．ＶＥ＝１の場合、結果なし
２．ＺＥ＝１の場合、結果なし
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。ＦＲが、未定義値に設定される。ＦＩが、未定義値に設定される。
トラップ可能な無効演算例外またはトラップ可能なゼロ除算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されない。
この命令を実行した結果は、実装によって、および同じ実装における異なる実行によってさまざまであることが許される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ＝０ｂＵ    ＦＩ＝０ｂＵ    ＦＸ    ＺＸ    ＸＸ＝０ｂＵ
ＶＸＳＮＡＮ    ＶＸＳＱＲＴ
xsrsqrtespに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
ＶＳＸスカラの平方根・単精度・ＸＸ形式（VSX Scalar Square RootSingle-Precision XX-form）
xssqrtsp    XT,XB    (0xF000_002C)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２９の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第２のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src ← VSR[32×BX+B].doubleword[0]
v ←SquareRootDP(src)
result ←RoundToSP(RN,v)
if(vxsnan_flag) then SetFX(VXSNAN)
if(vxsqrt_flag) then SetFX(VXSQRT)
if(ox_flag) then SetFX(OX)
if(ux_flag) then SetFX(UX)
if(xx_flag) then SetFX(XX)
vex_flag ← VE &(vxsnan_flag | vxsqrt_flag)
if( 〜vex_flag )then do
VSR[32×TX+T].doubleword[0] ← ConvertToDP(result)
VSR[32×TX+T].doubleword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassSP(result)
FR ← inc_flag
FI ← xx_flag
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃに、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃの限界のない精度の平方根が、生成される。
中間結果が、ＦＰＳＣＲの浮動小数点丸め制御フィールドＲＮによって指定された丸めモードを用いて単精度に丸められる。
結果が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。ＦＲが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。ＦＩが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されず、ＦＲおよびＦＩが０に設定される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＯＸ    ＵＸ    ＸＸ
ＶＸＳＮＡＮ    ＶＸＳＱＲＴ
xssqrtspに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
ＶＳＸスカラの減算・単精度・ＸＸ３形式（VSX Scalar SubtractSingle-Precision XX3-form）
xssubsp    XT,XA,XB    (0xF000_0040)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src1 ← VSR[32×AX+A].doubleword[0]
src2 ← VSR[32×BX+B].doubleword[0]
v ←AddDP(src1,NegateDP(src2))
result ←RoundToSP(RN,v)
if(vxsnan_flag) then SetFX(VXSNAN)
if(vxisi_flag) then SetFX(VXISI)
if(ox_flag) then SetFX(OX)
if(ux_flag) then SetFX(UX)
if(xx_flag) then SetFX(XX)
vex_flag ← VE &(vxsnan_flag | vxisi_flag)
if( 〜vex_flag )then do
VSR[32×TX+T].doubleword[0] ←ConvertSPtoSP64(result)
VSR[32×TX+T].doubleword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassSP(result)
FR ← inc_flag
FI ← xx_flag
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＡに、Ａと連結された値ＡＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃ１に、ＶＳＲ［ＸＡ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃ２に、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃ２が否定を取られ、ｓｒｃ１に加算され、限界のない範囲および精度を有する和ｖをもたらす。浮動小数点の加算は、指数の比較および２つの仮数の加算に基づく。２つのオペランドの指数が比較され、より小さな指数に付随する仮数が、２つの指数が等しくなるまで、ビットがシフトされるたびに１ずつその指数が増やされるようにして右シフトされる。次に、２つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の５３ビットすべておよび３つのガード・ビット（Ｇ、Ｒ、およびＸ）すべてが、計算に現れる。
ｖが正規化され、ＦＰＳＣＲの浮動小数点丸め制御フィールドＲＮによって指定された丸めモードを用いて単精度に丸められる。浮動小数点の正規化は、最上位ビットが１になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
結果が、ＶＳＲ［ＸＴ］のダブルワード要素０に代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、単精度フォーマットで表された結果のクラスおよび符号に設定される。ＦＲが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。ＦＩが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されず、ＦＲおよびＦＩが０に設定される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＯＸ    ＵＸ    ＸＸ
ＶＸＳＮＡＮ    ＶＸＩＳＩ
xssubspに関するＶＳＲデータ・レイアウト
src1 = VSR[XA]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
src2 = VSR[XB]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３は、ＤＰを含む
POWER ISA AS - Book 1 - Chapter 7. Vector-Scalar Floating-Point Operations[Category:VSX]
７．６．２  ＶＳＸ命令記述規約
７．６．２．１  ＶＳＸ命令ＲＴＬ演算子
x{y}
ｘのビットｙを返す。
x{y:z}
ｘのビットｙ：ｚを返す。
x = y
ｙの値がｘに代入される。
x |= y
ｙの値が、値ｘとＯＲ演算され、ｘに代入される。
〜x
ｘの１の補数を返す。
!x
ｘの内容が０に等しい場合は１を返し、それ以外の場合は０を返す。
x || y
ｙの値と連結されたｘの値を返す。例えば、０ｂ０１０｜｜０ｂ１１１は、０ｂ０１０１１１と同じである。
x ^ y
ｙの値と排他的ＯＲ演算されたｘの値を返す。
x ? y : z
ｘの値が真である場合はｙの値を返し、それ以外の場合は値ｚを返す。
x+y
ｘおよびｙは、整数値である。
ｘとｙとの和を返す。
+tea
Power AS ISA参照。
x-y
ｘおよびｙは、整数値である。
ｘとｙとの差を返す。
x!=y
ｘおよびｙは、整数値である。
ｘがｙと等しくない場合は１を返し、それ以外の場合は０を返す。
x<=y
ｘおよびｙは、整数値である。
ｘがｙ以下である場合は１を返し、それ以外の場合は０を返す。
x>=y
ｘおよびｙは、整数値である。
ｘがｙ以上である場合は１を返し、それ以外の場合は０を返す。
７．６．２．２  ＶＳＸ命令ＲＴＬファンクション・コール
AddDP(x,y)
ｘおよびｙは、倍精度浮動小数点値である。
ｘまたはｙがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘが無限大であり、ｙが逆符号の無限大である場合、ｖｘｉｓｉ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｙがＱＮａＮである場合、ｙを返す。
そうではなく、ｙがＳＮａＮである場合、ＱＮａＮとして表されたｙを返す。
そうではなく、ｘおよびｙが逆符号の無限大である場合、標準のＱＮａＮ（standardQNaN）を返す。
それ以外の場合、限界のない範囲および精度を有する、ｘとｙとの正規化された和を返す。
AddSP(x,y)
ｘおよびｙは、単精度浮動小数点値である。
ｘまたはｙがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘが無限大であり、ｙが逆符号の無限大である場合、ｖｘｉｓｉ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｙがＱＮａＮである場合、ｙを返す。
そうではなく、ｙがＳＮａＮである場合、ＱＮａＮとして表されたｙを返す。
そうではなく、ｘおよびｙが逆符号の無限大である場合、標準のＱＮａＮを返す。
それ以外の場合、限界のない範囲および精度を有する、ｙにｘを加算した正規化された和を返す。
ClassDP(x,y)
倍精度浮動小数点数ｘの５ビットの特徴付けを返す。
０ｂ１０００１＝クワイエットＮａＮ
０ｂ０１００１＝負の無限大
０ｂ０１０００＝負の正規化された数
０ｂ１１０００＝負の非正規化された数
０ｂ１００１０＝負のゼロ
０ｂ０００１０＝正のゼロ
０ｂ１０１００＝正の非正規化された数
０ｂ００１００＝正の正規化された数
０ｂ００１０１＝正の無限大
ClassSP(x,y)
単精度浮動小数点数ｘの５ビットの特徴付けを返す。
０ｂ１０００１＝クワイエットＮａＮ
０ｂ０１００１＝負の無限大
０ｂ０１０００＝負の正規化された数
０ｂ１１０００＝負の非正規化された数
０ｂ１００１０＝負のゼロ
０ｂ０００１０＝正のゼロ
０ｂ１０１００＝正の非正規化された数
０ｂ００１００＝正の正規化された数
０ｂ００１０１＝正の無限大
CompareEQDP(x,y)
ｘおよびｙは、倍精度浮動小数点値である。
ｘまたはｙがＮａＮである場合、０を返す。
そうではなく、ｘがｙに等しい場合、１を返す。
それ以外の場合、０を返す。
CompareEQSP(x,y)
ｘおよびｙは、単精度浮動小数点値である。
ｘまたはｙがＮａＮである場合、０を返す。
そうではなく、ｘがｙに等しい場合、１を返す。
それ以外の場合、０を返す。
CompareGTDP(x,y)
ｘおよびｙは、倍精度浮動小数点値である。
ｘまたはｙがＮａＮである場合、０を返す。
そうではなく、ｘがｙよりも大きい場合、１を返す。
それ以外の場合、０を返す。
CompareGTSP(x,y)
ｘおよびｙは、単精度浮動小数点値である。
ｘまたはｙがＮａＮである場合、０を返す。
そうではなく、ｘがｙよりも大きい場合、１を返す。
それ以外の場合、０を返す。
CompareLTDP(x,y)
ｘおよびｙは、倍精度浮動小数点値である。
ｘまたはｙがＮａＮである場合、０を返す。
そうではなく、ｘがｙ未満である場合、１を返す。
それ以外の場合、０を返す。
CompareLTSP(x,y)
ｘおよびｙは、単精度浮動小数点値である。
ｘまたはｙがＮａＮである場合、０を返す。
そうではなく、ｘがｙ未満である場合、１を返す。
それ以外の場合、０を返す。
ConvertDPtoSD(x)
ｘは、倍精度整数値である。
ｘがＮａＮである場合、
０ｘ８０００＿００００＿００００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定され、ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
それ以外の場合、以下を実行する。
ｘが２６３−１よりも大きい場合、０ｘ７ＦＦＦ＿ＦＦＦＦ＿ＦＦＦＦ＿ＦＦＦＦを返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
そうではなく、ｘが−２６３未満である場合、０ｘ８０００＿００００＿００００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
それ以外の場合、値ｘを６４ビット符号付き整数フォーマットで返す。
ConvertDPtoSW(x)
ｘは、倍精度整数値である。
ｘがＮａＮである場合、０ｘ８０００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定され、ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
それ以外の場合、以下を実行する。
ｘが２３１−１よりも大きい場合、０ｘ７ＦＦＦ＿ＦＦＦＦを返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
そうではなく、ｘが−２３１未満である場合、０ｘ８０００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
それ以外の場合、値ｘを３２ビット符号付き整数フォーマットで返す。
ConvertDPtoUD(x)
ｘは、倍精度整数値である。
ｘがＮａＮである場合、０ｘ００００＿００００＿００００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定され、ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
それ以外の場合、以下を実行する。
ｘが２６４−１よりも大きい場合、０ｘＦＦＦＦ＿ＦＦＦＦ＿ＦＦＦＦ＿ＦＦＦＦを返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
そうではなく、ｘが０未満である場合、０ｘ００００＿００００＿００００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
それ以外の場合、値ｘを６４ビット符号なし整数フォーマットで返す。
ConvertDPtoUW(x)
ｘは、倍精度整数値である。
ｘがＮａＮである場合、０ｘ００００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定され、ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
それ以外の場合、以下を実行する。
ｘが２３２−１よりも大きい場合、０ｘＦＦＦＦ＿ＦＦＦＦを返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
そうではなく、ｘが０未満である場合、０ｘ００００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
それ以外の場合、値ｘを３２ビット符号なし整数フォーマットで返す。
ConvertFPtoDP(x)
浮動小数点値ｘをＤＰフォーマットで返す。
ConvertFPtoSP(x)
浮動小数点値ｘを単精度フォーマットで返す。
ConvertSDtoFP(x)
ｘは、６４ビット符号付き整数値である。
限界のない仮数の精度を有する浮動小数点フォーマットに変換された値ｘを返す。
ConvertSP64toSP(x)
ｘは、倍精度フォーマットの単精度浮動小数点値である。
値ｘを単精度フォーマットで返す。ｘは単精度で表現可能でなければならず、またはそうでなければ、返される結果が未定義である。ｘは、非正規化を必要とする可能性がある。丸めは実行されない。ｘは、ＳＮａＮである場合、ｘと同じペイロードを有する単精度のＳＮａＮに変換される。
sign ← x.bit[0]
exp ← x.bit[1:11] -1023
frac ← x.bit[12:63]
if (exp = -1023) & (frac = 0) &(sign=0) then return(0x0000_0000) // 正のゼロ
else if (exp = -1023) & (frac = 0)& (sign=1) then return(0x8000_0000) //
負のゼロ
else if (exp = -1023) & (frac != 0)then return(0xUUUU_UUUU) // DP非正規
else if (exp < -126) then do // 非正規化が必要
msb = 1
do while (exp <-126) // exp=Eminとなるまでオペランドを非正規化する
frac.bit[1:51] ← frac.bit[0:50]
frac.bit[0] ← msb
msb ← 0
exp ← exp + 1
end
if (frac = 0) thenreturn(0xUUUU_UUUU) // SPフォーマットで表現できない値
else do //非正規化されたSPを返す
result.bit[0] ← sign
result.bit[1:8] ← 0
result.bit[9:31] ← frac.bit[0:22]
return(result)
end
end
else if (exp = +1024) & (frac = 0)& (sign=0) then return(0x7F80_0000) // 
正の無限大
else if (exp = +1024) & (frac = 0)& (sign=1) then return(0xFF80_0000) // 
負の無限大
else if (exp = +1024) & (frac != 0)then do // QNaNまたはSNaN
result.bit[0] ← sign
result.bit[1:8] ← 255
result.bit[9:31] ← frac.bit[0:22]
return(result)
end
else if (exp < +1024) & (exp >+126) then return(0xUUUU_UUUU) // オーバーフロー
else do // 正常値
result.bit[0] ← sign
result.bit[1:8] ← exp.bit[4:11] + 127
result.bit[9:31] ← frac.bit[0:22]
return(result)
end
ConvertSPtoDP(x)
ｘは、単精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを倍精度浮動小数点フォーマットで返す。
そうではなく、ｘがＱＮａＮである場合、ｘを倍精度浮動小数点フォーマットで返す。
それ以外の場合、値ｘを倍精度浮動小数点フォーマットで返す。
ConvertSPtoSD(x)
ｘは、単精度整数値である。
ｘがＮａＮである場合、０ｘ８０００＿００００＿００００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定され、ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
それ以外の場合、以下を実行する。
ｘが２６３−１よりも大きい場合、０ｘ７ＦＦＦ＿ＦＦＦＦ＿ＦＦＦＦ＿ＦＦＦＦを返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
そうではなく、ｘが−２６３未満である場合、０ｘ８０００＿００００＿００００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
それ以外の場合、値ｘを６４ビット符号付き整数フォーマットで返す。
ConvertSPtoSP64(x)
ｘは、単精度フォーマットの浮動小数点値である。
値ｘを倍精度フォーマットで返す。ｘは、ＳＮａＮである場合、ｘと同じペイロードを有する倍精度のＳＮａＮに変換される。
sign ← x.bit[0]
exp ← x.bit[1:8] -127
frac ← x.bit[9:31]
if (exp = -127) & (frac != 0) then do// 非正規化された値を正規化する
msb ← frac.bit[0]
frac ← frac << 1
do while (msb = 0)
msb ← frac.bit[0]
frac ← frac << 1
exp ← exp - 1
end
end
else if (exp = -127) & (frac = 0) thenexp ← -1023 // ゼロ値
else if (exp = +128) then exp ← +1024 // 無限大、NaN 
result.bit[0] ←sign
result.bit[1:11] ←exp + 1023
result.bit[12:34] ←frac
result.bit[35:63] ←0
return(result)
ConvertSPtoSW(x)
ｘは、単精度整数値である。
ｘがＮａＮである場合、０ｘ８０００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定され、ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
それ以外の場合、以下を実行する。
ｘが２３１−１よりも大きい場合、０ｘ７ＦＦＦ＿ＦＦＦＦを返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
そうではなく、ｘが−２３１未満である場合、０ｘ８０００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
それ以外の場合、値ｘを３２ビット符号付き整数フォーマットで返す。
ConvertSPtoUD(x)
ｘは、単精度整数値である。
ｘがＮａＮである場合、０ｘ００００＿００００＿００００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定され、ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
それ以外の場合、以下を実行する。
ｘが２６４−１よりも大きい場合、０ｘＦＦＦＦ＿ＦＦＦＦ＿ＦＦＦＦ＿ＦＦＦＦを返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
そうではなく、ｘが０未満である場合、０ｘ００００＿００００＿００００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
それ以外の場合、値ｘを６４ビット符号なし整数フォーマットで返す。
ConvertSPtoUW(x)
ｘは、単精度整数値である。
ｘがＮａＮである場合、０ｘ００００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定され、ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
それ以外の場合、以下を実行する。
ｘが２３２−１よりも大きい場合、０ｘＦＦＦＦ＿ＦＦＦＦを返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
そうではなく、ｘが０未満である場合、０ｘ００００＿００００を返し、ｖｘｃｖｉ＿ｆｌａｇが１に設定される。
それ以外の場合、値ｘを３２ビット符号なし整数フォーマットで返す。
ConvertSWtoFP(x)
ｘは、３２ビット符号付き整数値である。
限界のない仮数の精度を有する浮動小数点フォーマットに変換された値ｘを返す。
ConvertUDtoFP(x)
ｘは、６４ビット符号なし整数値である。
限界のない仮数の精度を有する浮動小数点フォーマットに変換された値ｘを返す。
ConvertUWtoFP(x)
ｘは、３２ビット符号なし整数値である。
限界のない仮数の精度を有する浮動小数点フォーマットに変換された値ｘを返す。
DivideDP(x,y)
ｘおよびｙは、倍精度浮動小数点値である。
ｘまたはｙがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがゼロであり、ｙがゼロである場合、ｖｘｚｄｚ＿ｆｌａｇが１に設定される。
ｘが有限の非ゼロ値であり、ｙがゼロである場合、ｚｘ＿ｆｌａｇが１に設定される。
ｘが無限大であり、ｙが無限大である場合、ｖｘｉｄｉ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｙがＱＮａＮである場合、ｙを返す。
そうではなく、ｙがＳＮａＮである場合、ＱＮａＮとして表されたｙを返す。
そうではなく、ｘがゼロであり、ｙがゼロである場合、標準のＱＮａＮを返す。
そうではなく、ｘが有限の非ゼロ値であり、ｙがｘと同符号のゼロである場合、正の無限大を返す。
そうではなく、ｘが有限の非ゼロ値であり、ｙがｘと逆符号のゼロである場合、負の無限大を返す。
そうではなく、ｘが無限大であり、ｙが無限大である場合、標準のＱＮａＮを返す。
それ以外の場合、限界のない範囲および精度を有する、ｘをｙで割った正規化された商を返す。
DivideSP(x,y)
ｘおよびｙは、単精度浮動小数点値である。
ｘまたはｙがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがゼロであり、ｙがゼロである場合、ｖｘｚｄｚ＿ｆｌａｇが１に設定される。
ｘが有限の非ゼロ値であり、ｙがゼロである場合、ｚｘ＿ｆｌａｇが１に設定される。
ｘが無限大であり、ｙが無限大である場合、ｖｘｉｄｉ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｙがＱＮａＮである場合、ｙを返す。
そうではなく、ｙがＳＮａＮである場合、ＱＮａＮとして表されたｙを返す。
そうではなく、ｘがゼロであり、ｙがゼロである場合、標準のＱＮａＮを返す。
そうではなく、ｘが有限の非ゼロ値であり、ｙがｘと同符号のゼロである場合、正の無限大を返す。
そうではなく、ｘが有限の非ゼロ値であり、ｙがｘと逆符号のゼロである場合、負の無限大を返す。
そうではなく、ｘが無限大であり、ｙが無限大である場合、標準のＱＮａＮを返す。
それ以外の場合、限界のない範囲および精度を有する、ｘをｙで割った正規化された商を返す。
DenormDP(x)
ｘは、限界のない範囲および精度を有する浮動小数点値である。
ｘの仮数を−１０２２とｘのバイアスされていない指数との差に等しいビット数だけ右シフトし、ｘのバイアスされていない指数を−１０２２に設定した値ｘを返す。
DenormSP(x)
ｘは、限界のない範囲および精度を有する浮動小数点値である。
ｘの仮数を−１２６とｘのバイアスされていない指数との差に等しいビット数だけ右シフトし、ｘのバイアスされていない指数を−１２６に設定した値ｘを返す。
IsInf(x)
ｘが無限大である場合は１を返し、それ以外の場合は０を返す。
IsNaN(x)
ｘがＳＮａＮかまたはＱＮａＮかのいずれかである場合は１を返し、それ以外の場合は０を返す。
IsNeg(x)
ｘが負の非ゼロ値である場合は１を返し、それ以外の場合は０を返す。
IsSNaN(x)
ｘがＳＮａＮである場合は１を返し、それ以外の場合は０を返す。
IsZero(x)
ｘがゼロである場合は１を返し、それ以外の場合は０を返す。
MaximumDP(x,y)
ｘおよびｙは、倍精度浮動小数点値である。
ｘまたはｙがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮであり、ｙがＮａＮではない場合、ｙを返す。
そうではなく、ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｙがＱＮａＮである場合、ｘを返す。
そうではなく、ｙがＳＮａＮである場合、ＱＮａＮとして表されたｙを返す。
それ以外の場合、ｘおよびｙのうちの大きい方を返し、＋０は−０よりも大きいと見なされる。
MaximumSP(x,y)
ｘおよびｙは、単精度浮動小数点値である。
ｘまたはｙがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮであり、ｙがＮａＮではない場合、ｙを返す。
そうではなく、ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｙがＱＮａＮである場合、ｘを返す。
そうではなく、ｙがＳＮａＮである場合、ＱＮａＮとして表されたｙを返す。
それ以外の場合、ｘおよびｙのうちの大きい方を返し、＋０は−０よりも大きいと見なされる。
MEM(x,y)
ストレージのｙバイトのシーケンスの内容。シーケンスは、以下のように、ストレージ・アクセスのエンディアンに依存する。
−  ビッグ・エンディアン・ストレージ・アクセスに関しては、シーケンスは、アドレスｘのバイトから始まり、アドレスｘ＋ｙ−１のバイトで終わる。
−  リトル・エンディアン・ストレージ・アクセスに関しては、シーケンスは、アドレスｘ＋ｙ−１のバイトから始まり、アドレスｘのバイトで終わる。
MEMtag(x,y)
ストレージのｙバイトのシーケンスに関連する１つまたは複数のタグ・ビット。
MinimumDP(x,y)
ｘおよびｙは、倍精度浮動小数点値である。
ｘまたはｙがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮであり、ｙがＮａＮではない場合、ｙを返す。
そうではなく、ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｙがＱＮａＮである場合、ｘを返す。
そうではなく、ｙがＳＮａＮである場合、ＱＮａＮとして表されたｙを返す。
それ以外の場合、ｘおよびｙのうちの小さい方を返し、−０は＋０よりも小さいと見なされる。
MinimumSP(x,y)
ｘおよびｙは、単精度浮動小数点値である。
ｘまたはｙがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮであり、ｙがＮａＮではない場合、ｙを返す。
そうではなく、ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｙがＱＮａＮである場合、ｘを返す。
そうではなく、ｙがＳＮａＮである場合、ＱＮａＮとして表されたｙを返す。
それ以外の場合、ｘおよびｙのうちの小さい方を返し、−０は＋０よりも小さいと見なされる。
MultiplyAddDP(x,y,z)
ｘ、ｙ、およびｚは、倍精度浮動小数点値である。
ｘ、ｙ、またはｚがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがゼロであり、ｙが無限大であるか、またはｘが無限大であり、ｙがゼロである場合、ｖｘｉｍｚ＿ｆｌａｇが１に設定される。
ｘとｙとの積が無限大であり、ｚが逆符号の無限大である場合、ｖｘｉｓｉ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｚがＱＮａＮである場合、ｚを返す。
そうではなく、ｚがＳＮａＮである場合、ＱＮａＮとして表されたｚを返す。
そうではなく、ｙがＱＮａＮである場合、ｙを返す。
そうではなく、ｙがＳＮａＮである場合、ＱＮａＮとして表されたｙを返す。
そうではなく、ｘがゼロであり、ｙが無限大であるか、またはｘが無限大であり、ｙがゼロである場合、標準のＱＮａＮを返す。
そうではなく、ｘとｙとの積が無限大であり、ｚが逆符号の無限大である場合、標準のＱＮａＮを返す。
それ以外の場合、限界のない範囲および精度を有する、ｘとｙとの積とｚとの正規化された和を返す。
MultiplyAddSP(x,y,z)
ｘ、ｙ、およびｚは、単精度浮動小数点値である。
ｘ、ｙ、またはｚがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがゼロであり、ｙが無限大であるか、またはｘが無限大であり、ｙがゼロである場合、ｖｘｉｍｚ＿ｆｌａｇが１に設定される。
ｘとｙとの積が無限大であり、ｚが逆符号の無限大である場合、ｖｘｉｓｉ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｚがＱＮａＮである場合、ｚを返す。
そうではなく、ｚがＳＮａＮである場合、ＱＮａＮとして表されたｚを返す。
そうではなく、ｙがＱＮａＮである場合、ｙを返す。
そうではなく、ｙがＳＮａＮである場合、ＱＮａＮとして表されたｙを返す。
そうではなく、ｘがゼロであり、ｙが無限大であるか、またはｘが無限大であり、ｙがゼロである場合、標準のＱＮａＮを返す。
そうではなく、ｘとｙとの積が無限大であり、ｚが逆符号の無限大である場合、標準のＱＮａＮを返す。
それ以外の場合、限界のない範囲および精度を有する、ｘとｙとの積とｚとの正規化された和を返す。
MultiplyDP(x,y)
ｘおよびｙは、倍精度浮動小数点値である。
ｘまたはｙがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがゼロであり、ｙが無限大であるか、またはｘが無限大であり、ｙがゼロである場合、ｖｘｉｍｚ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｙがＱＮａＮである場合、ｙを返す。
そうではなく、ｙがＳＮａＮである場合、ＱＮａＮとして表されたｙを返す。
そうではなく、ｘがゼロであり、ｙが無限大であるか、またはｘが無限大であり、ｙがゼロである場合、標準のＱＮａＮを返す。
それ以外の場合、限界のない範囲および精度を有する、ｘとｙとの正規化された積を返す。
MultiplySP(x,y)
ｘおよびｙは、単精度浮動小数点値である。
ｘまたはｙがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがゼロであり、ｙが無限大であるか、またはｘが無限大であり、ｙがゼロである場合、ｖｘｉｍｚ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｙがＱＮａＮである場合、ｙを返す。
そうではなく、ｙがＳＮａＮである場合、ＱＮａＮとして表されたｙを返す。
そうではなく、ｘがゼロであり、ｙが無限大であるか、またはｘが無限大であり、ｙがゼロである場合、標準のＱＮａＮを返す。
それ以外の場合、限界のない範囲および精度を有する、ｘとｙとの正規化された積を返す。
NegateDP(x)
倍精度浮動小数点値ｘがＮａＮである場合、ｘを返す。
それ以外の場合、ｘの符号ビットを反転（complement）させた倍精度浮動小数点値ｘを返す。
NegateSP(x)
単精度浮動小数点値ｘがＮａＮである場合、ｘを返す。
それ以外の場合、ｘの符号ビットを反転させた単精度浮動小数点値ｘを返す。
ReciprocalEstimateDP(x)
ｘは、倍精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがゼロである場合、ｚｘ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘがゼロである場合、ｘの符号の無限大を返す。
そうではなく、ｘが無限大である場合、ｘの符号のゼロを返す。
それ以外の場合、限界のない指数の範囲を有するｘの逆数の推定値を返す。
ReciprocalEstimateSP(x)
ｘは、単精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがゼロである場合、ｚｘ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘがゼロである場合、ｘの符号の無限大を返す。
そうではなく、ｘが無限大である場合、ｘの符号のゼロを返す。
それ以外の場合、限界のない指数の範囲を有するｘの逆数の推定値を返す。
ReciprocalSquareRootEstimateDP(x)
ｘは、倍精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがゼロである場合、ｚｘ＿ｆｌａｇが１に設定される。
ｘが負の非ゼロ数である場合、ｖｘｓｑｒｔ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘが負の非ゼロ値である場合、デフォルトのＱＮａＮ（defaultQNaN）を返す。
それ以外の場合、限界のない指数の範囲を有するｘの平方根の逆数の推定値を返す。
ReciprocalSquareRootEstimateSP(x)
ｘは、単精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがゼロである場合、ｚｘ＿ｆｌａｇが１に設定される。
ｘが負の非ゼロ数である場合、ｖｘｓｑｒｔ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘが負の非ゼロ値である場合、デフォルトのＱＮａＮを返す。
それ以外の場合、限界のない指数の範囲を有するｘの平方根の逆数の推定値を返す。
reset_xflags()
ｖｘｓｎａｎ＿ｆｌａｇが０に設定される。
ｖｘｉｍｚ＿ｆｌａｇが０に設定される。
ｖｘｉｄｉ＿ｆｌａｇが０に設定される。
ｖｘｉｓｉ＿ｆｌａｇが０に設定される。
ｖｘｚｄｚ＿ｆｌａｇが０に設定される。
ｖｘｓｑｒｔ＿ｆｌａｇが０に設定される。
ｖｘｃｖｉ＿ｆｌａｇが０に設定される。
ｖｘｖｃ＿ｆｌａｇが０に設定される。
ｏｘ＿ｆｌａｇが０に設定される。
ｕｘ＿ｆｌａｇが０に設定される。
ｘｘ＿ｆｌａｇが０に設定される。
ｚｘ＿ｆｌａｇが０に設定される。
RoundToDP(x,y)
ｘは、４つの丸めモードのうちの１つを指定する２ビットの符号なし整数である。
０ｂ００  最近接偶数への丸め
０ｂ０１  ゼロへの丸め
０ｂ１０  正の無限大への丸め
０ｂ１１  負の無限大への丸め
ｙは、限界のない範囲および精度を有する正規化された浮動小数点値である。
ｘによって指定された丸めモードの制御の下で倍精度に丸められた値ｙを返す。
if IsQNaN(y) then return ConvertFPtoDP(y)
if IsInf(y) then return ConvertFPtoDP(y)
if IsZero(y) then return ConvertFPtoDP(y)
if y<Nmin then do
if UE=0 then do
if x=0b00 then r ← RoundToDPNearEven(DenormDP(y) )
if x=0b01 then r ← RoundToDPTrunc( DenormDP(y) )
ifx=0b10 then r ← RoundToDPCeil( DenormDP(y) )
if x=0b11 then r ← RoundToDPFloor( DenormDP(y) )
ux_flag ← xx_flag
return(ConvertFPtoDP(r))
end
else do
y ← Scalb(y,+1536)
ux_flag ← 1
end
end
if x=0b00 then r ←RoundToDPNearEven(y)
if x=0b01 then r ←RoundToDPTrunc(y)
if x=0b10 then r ←RoundToDPCeil(y)
if x=0b11 then r ←RoundToDPFloor(y))
if r>Nmax then do
if OE=0 then do
if x=0b00 then r ← sign ? -Inf : +Inf
if x=0b01 then r ← sign ? -Nmax : +Nmax
if x=0b10 then r ← sign ? -Nmax : +Inf
if x=0b11 then r ← sign ? -Inf : +Nmax
ox_flag ← 0b1
xx_flag ← 0b1
inc_flag ← 0bU
return(ConvertFPtoDP(r))
end
else do
r ← Scalb(r,-1536)
ox_flag ← 1
end
end
return(ConvertFPtoDP(r))
RoundToDPCeil(x)
ｘは、限界のない範囲および精度を有する浮動小数点値である。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
値がｘ以上である、指数の範囲には限界がないが、仮数の精度は倍精度である最小の浮動小数点数を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToDPFloor(x)
ｘは、限界のない範囲および精度を有する浮動小数点値である。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
値がｘ以下である、指数の範囲には限界がないが、仮数の精度は倍精度である最大の浮動小数点数を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToDPIntegerCeil(x)
ｘは、倍精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
値がｘ以上である最小の倍精度浮動小数点整数値を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToDPIntegerFloor(x)
ｘは、倍精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
値がｘ以下である最大の倍精度浮動小数点整数値を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToDPIntegerNearAway(x)
ｘは、倍精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
ｘ＞０である場合、値がｘ＋０．５以下である最大の倍精度浮動小数点整数値を返し、またはｘ＜０である場合、値がｘ−０．５以上である最小の倍精度浮動小数点整数を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToDPIntegerNearEven(x)
ｘは、倍精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
値がｘに最も近い倍精度浮動小数点整数値を返す（近さが同じである場合、最下位ビットが０に等しい倍精度浮動小数点整数値が使用される）。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToDPIntegerTrunc(x)
ｘは、倍精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
ｘ＞０である場合、値がｘ以下である最大の倍精度浮動小数点整数値を返し、またはｘ＜０である場合、値がｘ以上である最小の倍精度浮動小数点整数値を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToDPNearEven(x)
ｘは、限界のない範囲および精度を有する浮動小数点値である。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
値がｘに最も近い、指数の範囲には限界がないが、仮数の精度は倍精度である浮動小数点数を返す（近さが同じである場合、最下位ビットが０に等しい、指数の範囲には限界がないが、仮数の精度は倍精度である浮動小数点数が使用される）。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToDPTrunc(x)
ｘは、限界のない範囲および精度を有する浮動小数点値である。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
ｘ＞０である場合、値がｘ以下である、指数の範囲には限界がないが、仮数の精度は倍精度である最大の浮動小数点数を返し、またはｘ＜０である場合、値がｘ以上である、指数の範囲には限界がないが、仮数の精度は倍精度である最小の浮動小数点数を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToSP(x,y)
ｘは、４つの丸めモードのうちの１つを指定する２ビットの符号なし整数である。
０ｂ００  最近接偶数への丸め
０ｂ０１  ゼロへの丸め
０ｂ１０  正の無限大への丸め
０ｂ１１  負の無限大への丸め
ｙは、限界のない範囲および精度を有する正規化された浮動小数点値である。
ｘによって指定された丸めモードの制御の下で単精度に丸められた値ｙを返す。
if IsQNaN(y) then return ConvertFPtoSP(y)
if IsInf(y) then return ConvertFPtoSP(y)
if IsZero(y) then return ConvertFPtoSP(y)
if y<Nmin then do
if UE=0 then do
if x=0b00 then r ← RoundToSPNearEven(DenormSP(y) )
if x=0b01 then r ← RoundToSPTrunc( DenormSP(y) )
if x=0b10 then r ← RoundToSPCeil( DenormSP(y) )
if x=0b11 then r ← RoundToSPFloor( DenormSP(y) )
ux_flag ← xx_flag
return(ConvertFPtoSP(r))
end
else do
y ← Scalb(y,+192)
ux_flag ← 1
end
end
if x=0b00 then r ←RoundToSPNearEven(y)
if x=0b01 then r ←RoundToSPTrunc(y)
if x=0b10 then r ←RoundToSPCeil(y)
if x=0b11 then r ←RoundToSPFloor(y))
if r>Nmax then do
if OE=0 then do
if x=0b00 then r ← sign ? -Inf : +Inf
if x=0b01 then r ← sign ? -Nmax : +Nmax
if x=0b10 then r ← sign ? -Nmax : +Inf
if x=0b11 then r ← sign ? -Inf : +Nmax
ox_flag ← 0b1
xx_flag ← 0b1
inc_flag ← 0bU
return(ConvertFPtoSP(r))
end
else do
r ← Scalb(r,-192)
ox_flag ← 1
end
end
return(ConvertFPtoSP(r))
RoundToSPCeil(x)
ｘは、限界のない範囲および精度を有する浮動小数点値である。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
値がｘ以上である、指数の範囲には限界がないが、仮数の精度は単精度である最小の浮動小数点数を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToSPFloor(x)
ｘは、限界のない範囲および精度を有する浮動小数点値である。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
値がｘ以下である、指数の範囲には限界がないが、仮数の精度は単精度である最大の浮動小数点数を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToSPIntegerCeil(x)
ｘは、単精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
値がｘ以上である最小の単精度浮動小数点整数値を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToSPIntegerFloor(x)
ｘは、単精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
値がｘ以下である最大の単精度浮動小数点整数値を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToSPIntegerNearAway(x)
ｘは、単精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
ｘが浮動小数点整数である場合はｘを返し、それ以外で、ｘ＞０である場合、値がｘ＋０．５以下である最大の単精度浮動小数点整数値を返し、またはｘ＜０である場合、値がｘ−０．５以上である最小の単精度浮動小数点整数値を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToSPIntegerNearEven(x)
ｘは、単精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
ｘが浮動小数点整数である場合はｘを返し、それ以外の場合、値がｘに最も近い単精度浮動小数点整数値を返す（近さが同じである場合、最下位ビットが０に等しい単精度浮動小数点整数値が使用される）。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToSPIntegerTrunc(x)
ｘは、単精度浮動小数点値である。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返し、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
ｘ＞０である場合、値がｘ以下である最大の単精度浮動小数点整数値を返し、またはｘ＜０である場合、値がｘ以上である最小の単精度浮動小数点整数値を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToSPNearEven(x)
ｘは、限界のない範囲および精度を有する浮動小数点値である。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
値がｘに最も近い、指数の範囲には限界がないが、仮数の精度は単精度である浮動小数点数を返す（近さが同じである場合、最下位ビットが０に等しい、指数の範囲には限界がないが、仮数の精度は単精度である浮動小数点数が使用される）。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
RoundToSPTrunc(x)
ｘは、限界のない範囲および精度を有する浮動小数点値である。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘが無限大である場合、ｘを返す。
それ以外の場合、以下を実行する。
ｘ＞０である場合、値がｘ以下である、指数の範囲には限界がないが、仮数の精度は単精度である最大の浮動小数点数を返し、またはｘ＜０である場合、値がｘ以上である最小の単精度浮動小数点数を返す。
返される値の絶対値がｘよりも大きい場合、ｉｎｃ＿ｆｌａｇが１に設定される。
返される値がｘに等しくない場合、ｘｘ＿ｆｌａｇが１に設定される。
Scalb(x,y)
ｘは、限界のない範囲および精度を有する浮動小数点値である。
ｙは、符号付き整数である。
浮動小数点値ｘに２ｙを掛けた結果。
SetFX(x)
ｘは、ＦＰＳＣＲ内の例外フラグのうちの１つである。
ｘの内容が０である場合、FXおよびｘが１に設定される。
SquareRootDP(x)
ｘは、倍精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘが負の非ゼロ値である場合、ｖｘｓｑｒｔ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘが負の非ゼロ値である場合、デフォルトのＱＮａＮを返す。
それ以外の場合、限界のない範囲および精度を有する、ｘの正規化された平方根を返す。
SquareRootSP(x)
ｘは、単精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘが負の非ゼロ値である場合、ｖｘｓｑｒｔ＿ｆｌａｇが１に設定される。
ｘがＱＮａＮである場合、ｘを返す。
そうではなく、ｘがＳＮａＮである場合、ＱＮａＮとして表されたｘを返す。
そうではなく、ｘが負の非ゼロ値である場合、デフォルトのＱＮａＮを返す。
それ以外の場合、限界のない範囲および精度を有する、ｘの正規化された平方根を返す。
ＶＳＸベクトルの加算・単精度・ＸＸ３形式（VSX Vector AddSingle-Precision XX3-form）
xvaddsp    XT,XA,XB    (0xF000_0200)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
XT ← TX || T
XA ← AX || A
XB ← BX || B
ex_flag ← 0b0
do i=0 to 127 by 32
reset_xflags()
src1 ← VSR[XA]{i:i+31}
src2 ← VSR[XB]{i:i+31}
v{0:inf} ← AddSP(src1,src2)
result{i:i+31} ← RoundToSP(RN,v)
if(vxsnan_flag) thenSetFX(VXSNAN)
if(vxisi_flag) thenSetFX(VXISI)
if(ox_flag) thenSetFX(OX)
if(ux_flag) thenSetFX(UX)
if(xx_flag) thenSetFX(XX)
ex_flag ← ex_flag | (VE & vxsnan_flag)
ex_flag ← ex_flag | (VE & vxisi_flag)
ex_flag ← ex_flag | (OE & ox_flag)
ex_flag ← ex_flag | (UE & ux_flag)
ex_flag ← ex_flag | (XE & xx_flag)
end
if( ex_flag = 0 ) then VSR[XT] ← result
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＡに、Ａと連結された値ＡＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
各ベクトル要素ｉ、０から３までに関して、以下を実行する。
ｓｒｃ１に、ＶＳＲ［ＸＡ］のワード要素ｉ内の単精度浮動小数点オペランドを代入する。
ｓｒｃ２に、ＶＳＲ［ＸＢ］のワード要素ｉ内の単精度浮動小数点オペランドを代入する。
ｓｒｃ２がｓｒｃ１に加算され、限界のない範囲および精度を有する和をもたらす。浮動小数点の加算は、指数の比較および２つの仮数の加算に基づく。２つのオペランドの指数が比較され、より小さな指数に付随する仮数が、２つの指数が等しくなるまで、ビットがシフトされるたびに１ずつその指数が増やされるようにして右シフトされる。次に、２つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の５３ビットすべておよび３つのガード・ビット（Ｇ、Ｒ、およびＸ）すべてが、計算に現れる。
和が、正規化される。浮動小数点の正規化は、最上位ビットが１になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、ＦＰＳＣＲの浮動小数点丸め制御フィールドＲＮによって指定された丸めモードを用いて単精度に丸められる。
結果が、ＶＳＲ［ＸＴ］のワード要素ｉに単精度フォーマットで代入される。
トラップ可能な例外がベクトルのいずれかの要素で発生する場合、結果は、ＶＳＲ［ＸＴ］に書き込まれない。
変更される特殊レジスタ
ＦＸ    ＯＸ    ＵＸ    ＸＸ    ＶＸＳＮＡＮ    ＶＸＩＳＩ
xvaddspに関するＶＳＲデータ・レイアウト
src1 = VSR[XA]
１２８ビットのうちのビット０〜３１、ビット３２〜６３、ビット６４〜９５、およびビット９６〜１２７が、ＳＰを含む
src2 = VSR[XB]
１２８ビットのうちのビット０〜３１、ビット３２〜６３、ビット６４〜９５、およびビット９６〜１２７が、ＳＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜３１、ビット３２〜６３、ビット６４〜９５、およびビット９６〜１２７が、ＳＰを含む
RFC02242.r3: BFP/VSX MiscellaneousOperations
ConvertDPtoSP(x)
ｘは、倍精度浮動小数点値である。
ｘがＳＮａＮである場合、ｖｘｓｎａｎ＿ｆｌａｇが１に設定される。
ｘがＳＮａＮである場合、ＱＮａＮに変換されたｘを単精度浮動小数点フォーマットで返す。
そうではなく、ｘがＱＮａＮ、無限大、またはゼロである場合、ｘを単精度浮動小数点フォーマットで返す。
それ以外の場合、ＲＮで指定された丸めモードを用いて単精度に丸められたｘを単精度浮動小数点フォーマットで返す。
ｘの丸めがオーバーフロー例外を生じた場合、ｏｘ＿ｆｌａｇが１に設定される。
ｘの丸めがアンダーフロー例外を生じた場合、ｕｘ＿ｆｌａｇが１に設定される。
ｘの丸めが厳密ではない結果を返す場合、ｘｘ＿ｆｌａｇが１に設定される。
結果の仮数が丸めの間にインクリメントされた場合、ｉｎｃ＿ｆｌａｇが１に設定される。
ConvertDPtoSP_NS(x)
ｘは、倍精度フォーマットで表された単精度浮動小数点値である。
ｘを単精度フォーマットで返す。
sign ← x.bit[0]
exponent ← x.bit[1:11]
fraction ← 0b1 ⊃ x.bit[12:63]// (さしあたり)隠しビットが
1に設定される
if (exponent == 2047)then// DPの無限大または
NaNのオペランド
exponent ← 0b100_0111_1111// 指数がSP Emax+1=1151に
オーバーライドされる
end
if (exponent == 0) && (fraction !=0) then do // DPの非正規化されたオペランド
exponent ← 0b000_0000_0001// 指数がDP Emin=1に
オーバーライドされる
fraction.bit[0] ← 0// 隠しビットが0に
オーバーライドされる
end
if (exponent < 897) && (fraction!= 0) then do // SPのごく小さなオペランド
do while (exponent< 897)// 指数=SP Eminになるまで
非正規化する
fraction ← 0b0 ⊃ fraction.bit[0:51]
exponent ← exponent + 1
end
exponent ← 0b011_1000_0000// 指数がSP Emin-1=896に
オーバーライドされる
end
return(sign ⊃exponent.bit[0] ⊃ exponent.bit[4:10] ⊃ fraction.bit[1:23])
ｘが単精度で表現できない場合、一部の指数ビットまたは仮数ビットあるいはその両方が破棄され、望ましくない結果をもたらす恐れがある。ｘのバイアスされていない指数が−１２６未満である場合（すなわち、非正規化されている）場合、ｘの仮数の下位２９ビットがさらに破棄される。−１５５未満のバイアスされていない指数を有するｘの有限値は、ゼロの結果を返す。＋１２７を超えるバイアスされていない指数を有するｘの有限値は、指数の有効ビットを破棄する結果となる。仮数の上位２３ビット内に有効ビットを持たないＳＮａＮ入力は、結果として無限大を返す。これらの場合のいずれに関しても、状態は設定されない。
ConvertSPtoDP_NS(x)
ｘは、単精度浮動小数点値である。
ｘを倍精度フォーマットで返す。
sign ← x.bit[0]
exponent ← (x.bit[1] ⊃ ¬x.bit[1] ⊃ ¬x.bit[1] ⊃ ¬x.bit[1] ⊃ x.bit[2:8])
fraction ← 0b0 ⊃ x.bit[9:31] ⊃0b0_0000_0000_0000_0000_0000_0000_0000
if (x.bit[1:8] == 255) then do// 無限大またはNaNのオペランド
exponent ← 2047// 指数をDP Emax+1にオーバーライドする
end
else if (x.bit[1:8] == 0) &&(fraction == 0) then do
// SPのゼロのオペランド
exponent ← 0// 指数をDP Emin-1にオーバーライドする
end
else if (x.bit[1:8] == 0) &&(fraction != 0) then do 
// SPの非正規化されたオペランド
exponent ← 897// 指数をSP Eminにオーバーライドする
do while (fraction.bit[0]== 0) // オペランドを正規化する
fraction ← fraction << 1
exponent ← exponent - 1
end
end
return(sign ⊃exponent ⊃ fraction.bit[1:52])
スカラの倍精度から単精度への丸めおよび単精度フォーマットへの変換（Scalarround Double-Precision to single-precision and Convert to Single-Precisionformat）
xscvdpsp    XT,XB    (0xF000_0424)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２９の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のレジスタを指定する第２のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第２のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src ← VSR[32×BX+B].dword[0]
result ←ConvertDPtoSP(src)
if(vxsnan_flag) then SetFX(VXSNAN)
if(xx_flag) then SetFX(XX)
if(ox_flag) then SetFX(OX)
if(ux_flag) then SetFX(UX)
vex_flag ← VE &vxsnan_flag
if( 〜vex_flag )then do
VSR[32×TX+T].word[0] ← result
VSR[32×TX+T].word[1] ← 0xUUUU_UUUU
VSR[32×TX+T].word[2] ← 0xUUUU_UUUU
VSR[32×TX+T].word[3] ← 0xUUUU_UUUU
FPRF ← ClassSP(result)
FR ← inc_flag
FI ← xx_flag
end
else do
FR ← 0b0
FI ← 0b0
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃに、ＶＳＲ［ＸＢ］のダブルワード要素０内の倍精度浮動小数点値を代入する。
ｓｒｃがＳＮａＮである場合、結果は、ＱＮａＮに変換されたｓｒｃである（すなわち、ｓｒｃのビット１２が１に設定される）。ＶＸＳＮＡＮが１に設定される。
そうではなく、ｓｒｃがＱＮａＮ、無限大、またはゼロである場合、結果はｓｒｃである。
それ以外の場合、結果は、ＲＮによって指定された丸めモードを使用して単精度に丸められたｓｒｃである。
結果が、ＶＳＲ［ＸＴ］のワード要素０に単精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のワード要素１、２、および３の内容は、未定義である。
ＦＰＲＦが、結果のクラスおよび符号に設定される。ＦＲが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。ＦＩが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］およびＦＰＲＦが修正されず、ＦＲおよびＦＩが０に設定される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ    ＦＩ    ＦＸ    ＯＸ    ＵＸ    ＸＸ    ＶＸＳＮＡＮ
xscvdpspに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜６３が、ＤＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜３１が、ＳＰを含む
スカラのスカラ単精度からベクトル単精度フォーマットへの変換・非シグナリング（ScalarConvert Scalar Single-Precision to Vector Single-Precision formatNon-signalling）
xscvdpspn    XT,XB    (0xF000_042C)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２９の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第２のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src ← VSR[32×BX+B].dword[0]
result ←ConvertDPtoSP_NS(src)
VSR[32×TX+T].word[0]← result
VSR[32×TX+T].word[1]← 0xUUUU_UUUU
VSR[32×TX+T].word[2]← 0xUUUU_UUUU
VSR[32×TX+T].word[3]← 0xUUUU_UUUU
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃに、倍精度フォーマットで表されたＶＳＲ［ＸＢ］のダブルワード要素０内の単精度浮動小数点値を代入する。
ｓｒｃが、ＶＳＲ［ＸＴ］のワード要素０に単精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のワード要素１、２、および３の内容は、未定義である。
変更される特殊レジスタ
なし
xscvdpspnに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜６３が、ＳＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜３１が、ＳＰを含む
xscvdpspは、スカラ倍精度値をベクトル単精度フォーマットに変換するために使用されるべきである。
xscvdpspnは、スカラ単精度値をベクトル単精度フォーマットに変換するために使用されるべきである。
スカラの単精度から倍精度フォーマットへの変換（Scalar ConvertSingle-Precision to Double-Precision format）
xscvspdp    XT,XB    (0xF000_0524)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２９の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ｂフィールド）および第２のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src ← VSR[32×BX+B].word[0]
result ←ConvertVectorSPtoScalarSP(src)
if(vxsnan_flag) then SetFX(VXSNAN)
vex_flag ← VE &vxsnan_flag
FR ← 0b0
FI ← 0b0
if( 〜vex_flag )then do
VSR[32×TX+T].dword[0] ← result
VSR[32×TX+T].dword[1] ← 0xUUUU_UUUU_UUUU_UUUU
FPRF ← ClassDP(result)
end
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃに、ＶＳＲ［ＸＢ］のワード要素０内の単精度浮動小数点値を代入する。
ｓｒｃがＳＮａＮである場合、結果は、ＱＮａＮに変換されたｓｒｃである（すなわち、ｓｒｃのビット９が１に設定される）。ＶＸＳＮＡＮが１に設定される。
それ以外の場合、結果はｓｒｃである。
結果が、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
ＦＰＲＦが、結果のクラスおよび符号に設定される。ＦＲが、０に設定される。ＦＩが、０に設定される。
トラップ可能な無効演算例外が発生する場合、ＶＳＲ［ＸＴ］が修正されず、ＦＰＲＦが修正されず、ＦＲが０に設定され、ＦＩが０に設定される。
変更される特殊レジスタ
ＦＰＲＦ    ＦＲ←０ｂ０    ＦＩ←０ｂ０    ＦＸ    ＶＸＳＮＡＮ
xscvspdpに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜３１が、ＳＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３が、ＤＰを含む
スカラの単精度から倍精度フォーマットへの変換・非シグナリング（ScalarConvert Single-Precision to Double-Precision format Non-signalling）
xscvspdpn    XT,XB    (0xF000_052C)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２９の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第２のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
reset_xflags()
src ← VSR[32×BX+B].word[0]
result ← ConvertSPtoDP_NS(src)
VSR[32×TX+T].dword[0]← result
VSR[32×TX+T].dword[1]← 0xUUUU_UUUU_UUUU_UUUU
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ｓｒｃに、ＶＳＲ［ＸＢ］のワード要素０内の単精度浮動小数点値を代入する。
ｓｒｃが、ＶＳＲ［ＸＴ］のダブルワード要素０に倍精度フォーマットで代入される。
ＶＳＲ［ＸＴ］のダブルワード要素１の内容は、未定義である。
変更される特殊レジスタ
なし
xscvspdpnに関するＶＳＲデータ・レイアウト
src = VSR[XB]
１２８ビットのうちのビット０〜３１が、ＳＰを含む
tgt = VSR[XT]
１２８ビットのうちのビット０〜６３が、ＤＰを含む
xscvspdpは、ベクトル単精度浮動小数点値をスカラ倍精度フォーマットに変換するために使用されるべきである。
xscvspdpnは、ベクトル単精度浮動小数点値をスカラ単精度フォーマットに変換するために使用されるべきである。
ＶＳＸ論理的同値（VSX Logical Equivalent）
xxleqv    XT,XA,XB    (0xF000_05D0)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
VSR[32×TX+T] ← VSR[32×AX+A] h VSR[32×BX+B]
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＡに、Ａと連結された値ＡＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ＶＳＲ［ＸＡ］の内容が、ＶＳＲ［ＸＢ］の内容とＸＯＲ演算され、反転された結果が、ＶＳＲ［ＸＴ］に代入される。
変更される特殊レジスタ
なし
ＶＳＸ論理ＮＡＮＤ
xxlnand    XT,XA,XB    (0xF000_0590)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
VSR[32×TX+T] ←¬( VSR[32×AX+A] & VSR[32×BX+B] )
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＡに、Ａと連結された値ＡＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ＶＳＲ［ＸＡ］の内容が、ＶＳＲ［ＸＢ］の内容とＡＮＤ演算され、反転された結果が、ＶＳＲ［ＸＴ］に代入される。
変更される特殊レジスタ
なし
補数とのＶＳＸ論理ＯＲ（VSX Logical OR with Complement）
xxlorc    XT,XA,XB    (0xF000_0550)
一例において、この命令は、命令を特定するためにオペコードを特定する２つのフィールド（例えば、別のフィールド、ビット２１〜２８の拡張されたオペコードと組み合わされる（例えば、連結される）プライマリ・オペコードを有する１つのフィールド、ビット０〜５）と、第１のフィールド（例えば、Ｔフィールド、ビット６〜１０）および第１のビット（例えば、ＴＸフィールド、ビット３１）と、第２のフィールド（例えば、Ａフィールド、ビット１１〜１５）および第２のビット（例えば、ＡＸフィールド、ビット２９）と、第３のフィールド（例えば、Ｂフィールド、ビット１６〜２０）および第３のビット（例えば、ＢＸフィールド、ビット３０）とを含む。
VSR[32×TX+T] ← VSR[32×AX+A] | ¬VSR[32×BX+B]
ＸＴに、Ｔと連結された値ＴＸを代入する。
ＸＡに、Ａと連結された値ＡＸを代入する。
ＸＢに、Ｂと連結された値ＢＸを代入する。
ＶＳＲ［ＸＡ］の内容が、ＶＳＲ［ＸＢ］の内容の補数とＯＲ演算され、結果が、ＶＳＲ［ＸＴ］に代入される。
変更される特殊レジスタ
なし
【図１】
0005963866.tif 000004
【図２】
0005963866.tif 000005
【図３】
0005963866.tif 000006
【図４】
0005963866.tif 000007
【図５】
0005963866.tif 000008
【図６】
0005963866.tif 000009
【図７】
0005963866.tif 000010
【図８】
0005963866.tif 000011
【図９】
0005963866.tif 000012
【図１０】
0005963866.tif 000013
【図１１】
0005963866.tif 000014
【図１２】
0005963866.tif 000015
【図１３】
0005963866.tif 000016