特許第5963866号(P5963866)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ インターナショナル・ビジネス・マシーンズ・コーポレーションの特許一覧

特許5963866機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換)
<>
  • 特許5963866-機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換) 図000004
  • 特許5963866-機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換) 図000005
  • 特許5963866-機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換) 図000006
  • 特許5963866-機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換) 図000007
  • 特許5963866-機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換) 図000008
  • 特許5963866-機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換) 図000009
  • 特許5963866-機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換) 図000010
  • 特許5963866-機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換) 図000011
  • 特許5963866-機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換) 図000012
  • 特許5963866-機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換) 図000013
  • 特許5963866-機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換) 図000014
  • 特許5963866-機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換) 図000015
  • 特許5963866-機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換) 図000016
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】5963866
(24)【登録日】2016年7月8日
(45)【発行日】2016年8月3日
(54)【発明の名称】機械命令を実行するコンピュータ・プログラム(製品)、コンピュータ・システム、および方法、ならびに命令を処理するためのコンピュータ・プログラム(製品)(複数アドレス指定可能なレジスタ・ファイルおよびそれに関連するフォーマット変換)
(51)【国際特許分類】
   G06F 9/30 20060101AFI20160721BHJP
   G06F 9/34 20060101ALI20160721BHJP
   G06F 17/16 20060101ALI20160721BHJP
   G06F 7/499 20060101ALI20160721BHJP
【FI】
   G06F9/30 350A
   G06F9/34 330
   G06F17/16 D
   G06F17/16 F
   G06F17/16 S
   G06F7/499 101
【請求項の数】21
【全頁数】93
(21)【出願番号】特願2014-530347(P2014-530347)
(86)(22)【出願日】2012年9月5日
(65)【公表番号】特表2014-533390(P2014-533390A)
(43)【公表日】2014年12月11日
(86)【国際出願番号】IB2012054582
(87)【国際公開番号】WO2013038302
(87)【国際公開日】20130321
【審査請求日】2014年12月24日
(31)【優先権主張番号】13/234,520
(32)【優先日】2011年9月16日
(33)【優先権主張国】US
(73)【特許権者】
【識別番号】390009531
【氏名又は名称】インターナショナル・ビジネス・マシーンズ・コーポレーション
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MACHINES CORPORATION
(74)【代理人】
【識別番号】100108501
【弁理士】
【氏名又は名称】上野 剛史
(74)【代理人】
【識別番号】100112690
【弁理士】
【氏名又は名称】太佐 種一
(72)【発明者】
【氏名】グシュヴィント、マイケル、カール
(72)【発明者】
【氏名】オルソン、ブレット
【審査官】 清木 泰
(56)【参考文献】
【文献】 米国特許出願公開第2009/0198977(US,A1)
【文献】 米国特許出願公開第2009/0198966(US,A1)
【文献】 特開昭62−249230(JP,A)
【文献】 特開2005−174298(JP,A)
【文献】 特表2002−517037(JP,A)
【文献】 Power ISA Version 2.06 Revision B,[online],IBM, www.power.org,2010年 7月23日,Pages:123-126,URL,https://www.power.org/wp-content/uploads/2012/07/PowerISA_V2.06B_V2_PUBLIC.pdf
【文献】 IEEE Computer Society,IEEE Standard for Floating-Point Arithmetic (IEEE Std 754-2008),IEEE,2008年 8月29日,Pages:7-9,14
【文献】 Motorola Inc.,MC68040ユーザーズ・マニュアル,CQ出版株式会社,1997年 5月20日,第1版第4刷,Pages:17-18,27-28,35-37
【文献】 鷺島敬之,外2名,並列図形処理,株式会社コロナ社,1991年 8月15日,初版第1刷,Pages:141-143
【文献】 Norman P. Jouppi, et al.,A Unified Vector/Scalar Floating-Point Architecture,Proceedings of the third International conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS-III),ACM,1989年,Pages:134-143
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/30− 9/42
G06F17/10−17/18
G06F15/80
G06F 7/00
G06F 7/38− 7/537
G06F 7/57− 7/575
G06F 7/74− 7/78
(57)【特許請求の範囲】
【請求項1】
機械命令を実行するためのコンピュータ・プログラムであって、
コンピュータ・アーキテクチャに応じたコンピュータの実行のために定義される機械命令を、実行するためにプロセッサによって取得するステップであって、前記機械命令が、
変換命令を特定する少なくとも1つのオペコード・フィールド、
第1のレジスタを指定するために使用される少なくとも1つのフィールド、および 第2のレジスタを指定するために使用される少なくとも1つのその他のフィールドを含む、前記取得するステップと、
前記機械命令を前記プロセッサによって実行するステップであって、
第1のフォーマットの第1の表現の単精度バイナリ浮動小数点データを前記第1のレジスタから取得するサブステップ、
前記第1のフォーマットの前記第1の表現の前記単精度バイナリ浮動小数点データを、第2のフォーマットの第2の表現の変換された単精度バイナリ浮動小数点データに変換するサブステップ、および
前記変換された単精度バイナリ浮動小数点データを前記第2のレジスタに代入するサブステップを含む、前記実行するステップと
を含む方法を実行するための処理回路による実行のための、コンピュータ・プログラム。
【請求項2】
前記第1のフォーマットの前記第1の表現の前記単精度バイナリ浮動小数点データが、前記第2のフォーマットの前記第2の表現の単精度バイナリ浮動小数点データに変換されるべきであると判定するステップと、
判定する前記ステップにより変換されるべきであると判定した場合に、前記変換命令を決定するステップと
前記方法はさらに含む、請求項1に記載のコンピュータ・プログラム。
【請求項3】
判定する前記ステップが、前記プロセッサまたは別のプロセッサで実行されるコンパイラによって実行される、請求項2に記載のコンピュータ・プログラム。
【請求項4】
前記第1のレジスタおよび前記第2のレジスタのうちの少なくとも一方が、複数アドレス指定可能なレジスタ・ファイルのレジスタである、請求項1に記載のコンピュータ・プログラム。
【請求項5】
前記複数アドレス指定可能なレジスタ・ファイルが、複数のレジスタを含み、前記複数のレジスタのうちのレジスタの第1のサブレンジが、1つのフォーマットのデータのために定義され、前記複数のレジスタのうちのレジスタの第2のサブレンジが、別のフォーマットのデータのために定義され、前記複数のレジスタが、少なくとも1つのさらなるフォーマットのデータのために定義される、請求項4に記載のコンピュータ・プログラム。
【請求項6】
前記複数のレジスタのそれぞれが、64ビットスカラ単精度浮動小数点データまたは32ビットベクトル単精度浮動小数点データを含むように定義される、請求項5に記載のコンピュータ・プログラム。
【請求項7】
前記機械命令が、第1の命令と第2の命令との間に挿入され、前記第2の命令が、前記第1の命令に依存し、前記第1の命令が、前記第2の命令によって使用されるフォーマットとは異なるフォーマットを有するデータを生成するためのものである、請求項1に記載のコンピュータ・プログラム。
【請求項8】
前記第1のレジスタが、変換されるべき前記第1の命令のデータを含む、請求項7に記載のコンピュータ・プログラム。
【請求項9】
前記第1の表現がベクトル表現を含み、前記第1のフォーマットが32ビットを含み、前記第2の表現がスカラ表現を含み、前記第2のフォーマットが64ビットを含むか、または前記第1の表現がスカラ表現を含み、前記第1のフォーマットが64ビットを含み、前記第2の表現がベクトル表現を含み、前記第2のフォーマットが32ビットを含む、請求項1に記載のコンピュータ・プログラム。
【請求項10】
前記変換が、単精度のベクトル要素から単精度のスカラ要素への変換、または、単精度のスカラ要素から単精度のベクトル要素への変換である、請求項1に記載のコンピュータ・プログラム。
【請求項11】
前記変換された単精度バイナリ浮動小数点データが、シグナリング非数(NaN)を含む場合に、前記シグナリングNaNが、前記第2のレジスタでシグナリングNaNとして保存される、請求項1に記載のコンピュータ・プログラム。
【請求項12】
機械命令を実行するためのコンピュータ・システムであって、
メモリと、
前記メモリと通信するプロセッサとを含み、
コンピュータ・アーキテクチャに応じたコンピュータの実行のために定義される機械命令を、実行するためにプロセッサによって取得するステップであって、前記機械命令が、
変換命令を特定する少なくとも1つのオペコード・フィールド、
第1のレジスタを指定するために使用される少なくとも1つのフィールド、および 第2のレジスタを指定するために使用される少なくとも1つのその他のフィールドを含む、前記取得するステップと、
前記機械命令を前記プロセッサによって実行するステップであって、
第1のフォーマットの第1の表現の単精度バイナリ浮動小数点データを前記第1のレジスタから取得するサブステップ、
前記第1のフォーマットの前記第1の表現の前記単精度バイナリ浮動小数点データを、第2のフォーマットの第2の表現の変換された単精度バイナリ浮動小数点データに変換するサブステップ、および
前記変換された単精度バイナリ浮動小数点データを前記第2のレジスタに代入するサブステップを含む、前記実行するステップと
を含む方法を実行するように構成される、コンピュータ・システム。
【請求項13】
前記第1のフォーマットの前記第1の表現の前記単精度バイナリ浮動小数点データが、前記第2のフォーマットの前記第2の表現の単精度バイナリ浮動小数点データに変換されるべきであると判定するステップと、
判定する前記ステップにより変換されるべきであると判定した場合に、前記変換命令を決定するステップと
前記方法はさらに含む、請求項12に記載のコンピュータ・システム。
【請求項14】
前記第1のレジスタおよび前記第2のレジスタのうちの少なくとも一方が、複数アドレス指定可能なレジスタ・ファイルのレジスタであり、前記複数アドレス指定可能なレジスタ・ファイルが、複数のレジスタを含み、前記複数のレジスタのうちのレジスタの第1のサブレンジが、1つのフォーマットのデータのために定義され、前記複数のレジスタのうちのレジスタの第2のサブレンジが、別のフォーマットのデータのために定義され、前記複数のレジスタが、少なくとも1つのさらなるフォーマットのデータのために定義される、請求項12に記載のコンピュータ・システム。
【請求項15】
前記複数のレジスタのそれぞれが、64ビットスカラ単精度浮動小数点データまたは32ビットベクトル単精度浮動小数点データを含むように定義される、請求項14に記載のコンピュータ・システム。
【請求項16】
前記機械命令が、第1の命令と第2の命令との間に挿入され、前記第2の命令が、前記第1の命令に依存し、前記第1の命令が、前記第2の命令によって使用されるフォーマットとは異なるフォーマットを有するデータを生成するためのものである、請求項12に記載のコンピュータ・システム。
【請求項17】
前記第1の表現がベクトル表現を含み、前記第1のフォーマットが32ビットを含み、前記第2の表現がスカラ表現を含み、前記第2のフォーマットが64ビットを含むか、または前記第1の表現がスカラ表現を含み、前記第1のフォーマットが64ビットを含み、前記第2の表現がベクトル表現を含み、前記第2のフォーマットが32ビットを含む、請求項12に記載のコンピュータ・システム。
【請求項18】
機械命令を実行する方法であって、
コンピュータ・アーキテクチャに応じたコンピュータの実行のために定義される機械命令を、実行するためにプロセッサによって取得するステップであって、前記機械命令が、
変換命令を特定する少なくとも1つのオペコード・フィールド、
第1のレジスタを指定するために使用される少なくとも1つのフィールド、および
第2のレジスタを指定するために使用される少なくとも1つのその他のフィールドを含む、前記取得するステップと、
前記機械命令を前記プロセッサによって実行するステップであって、
第1のフォーマットの第1の表現の単精度バイナリ浮動小数点データを前記第1のレジスタから取得するサブステップ、
前記第1のフォーマットの前記第1の表現の前記単精度バイナリ浮動小数点データを、第2のフォーマットの第2の表現の変換された単精度バイナリ浮動小数点データに変換するサブステップ、および
前記変換された単精度バイナリ浮動小数点データを前記第2のレジスタに代入するサブステップを含む、前記実行するステップと
を含む、方法。
【請求項19】
前記第1のレジスタおよび前記第2のレジスタのうちの少なくとも一方が、複数アドレス指定可能なレジスタ・ファイルのレジスタであり、前記複数アドレス指定可能なレジスタ・ファイルが、複数のレジスタを含み、前記複数のレジスタのうちのレジスタの第1のサブレンジが、1つのフォーマットのデータのために定義され、前記複数のレジスタのうちのレジスタの第2のサブレンジが、別のフォーマットのデータのために定義され、前記複数のレジスタが、少なくとも1つのさらなるフォーマットのデータのために定義される、請求項18に記載の方法。
【請求項20】
前記機械命令が、第1の命令と第2の命令との間に挿入され、前記第2の命令が、前記第1の命令に依存し、前記第1の命令が、前記第2の命令によって使用されるフォーマットとは異なるフォーマットを有するデータを生成するためのものである、請求項18に記載の方法。
【請求項21】
命令を処理するための、データ処理システムにおけるコンピュータ・プログラムであって、
受信された命令のタイプを判定するステップと、
前記命令のタイプに基づいて複数アドレス指定可能なレジスタ・ファイルにアクセスするステップと、
前記複数アドレス指定可能なレジスタ・ファイルにアクセスする前記ステップの結果に基づいて、前記データ処理システムの少なくとも1つの機能ユニットを使用して前記命令を処理するステップであって、前記複数アドレス指定可能なレジスタ・ファイルが、第1の命令のタイプの第1の命令に関連するレジスタの第1のサブセット、および第2の命令のタイプの第2の命令に関連するレジスタの第2のサブセットを含み、第3の命令のタイプの第3の命令および第4の命令のタイプの第4の命令が、レジスタの前記第1のサブセット内のレジスタおよびレジスタの前記第2のサブセット内のレジスタを含む、前記複数アドレス指定可能なレジスタ・ファイルのレジスタの組全体の中のレジスタにアクセスするためのものであり、前記第1の命令のタイプがスカラ命令タイプであり、前記第2の命令のタイプが浮動小数点命令タイプであり、前記第3の命令のタイプが64ビット単精度浮動小数点命令タイプであり、前記第4の命令のタイプが32ビット・ベクトル単精度浮動小数点命令タイプである、前記処理するステップと
を含む方法を実行するための処理回路による実行のための、コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本出願の1つまたは複数の態様は、全体的に、データ処理に関し、詳細には、複数アドレス指定可能なレジスタ・ファイルおよびそれに関連する処理に関する。
【背景技術】
【0002】
高性能なプロセッサは、プログラムにおいて命令レベルの並列化を利用するために単一命令複数データ(SIMD:single instruction multiple data)技術を使用するマルチメディア処理をサポートする。つまり、SIMD技術は、2つ以上の演算を同時に実行するために使用される。これらのプロセッサは、複数の機能ユニットを含み、それらの複数の機能ユニットの一部は、スカラ・データの実行を対象とし、それらの複数の機能ユニットの一部は、構造化されたSIMDのベクトル・データの処理のためにグループ化される。SIMDのデータ・ストリームは、構造化されたデータ・タイプで赤、緑、および青成分をエンコードすることによって、例えばRGBフォーマットを使用する色情報を表すか、または位置を4つ組み(x,y,z,w)としてエンコードすることによって座標情報を表すなど、マルチメディア・データ・タイプを表すために使用される。
【0003】
マルチメディア・データを処理するために設計されたプロセッサは、例えば、SIMDユニットを追加することによって既存のスカラ・プロセッサの実装を拡張することによって実装されており、SIMDユニット自体は、スカラ・データ・タイプの処理のために利用可能なリソースをミラーリングし、SIMDアーキテクチャによってサポートされるべき構造化された要素の数に合わせてそれぞれの機能ユニットのタイプを複製する複数の機能ユニット(すなわち、固定小数点ユニットおよび浮動小数点ユニット)を含む。
【0004】
マルチメディア処理およびその他の処理をサポートするプロセッサは、異なるタイプのデータを処理する可能性がある。しかし、そのような処理を管理するための機能が与えられなければならない。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】米国公開第2009/0198966A1号
【特許文献2】米国特許第7,877,582号
【特許文献3】米国特許第6,839,828号
【非特許文献】
【0006】
【非特許文献1】RFC02182.r6: VSX ScalarSingle-Precision
【非特許文献2】"Power ISATMVersion 2.05," International Business Machines Corporation, October 23,2007
【非特許文献3】"Power ISATMVersion 2.06 Revision B", International Business Machines Corporation,July 23, 2010
【非特許文献4】Chapter 7: Vector-Scalar FloatingPoint Operations [Category: VSX]
【非特許文献5】RFC02242.r3: BFP/VSX MiscellaneousOperations
【発明の概要】
【発明が解決しようとする課題】
【0007】
本発明の目的は、従来技術における課題を解決することにある。
【課題を解決するための手段】
【0008】
機械命令を実行するためのコンピュータ・プログラム(製品)を提供することによって、従来技術の欠点が克服され、さらなる利点が与えられる。コンピュータ・プログラム(製品)は、処理回路によって読み取り可能であり、方法を実行するための処理回路による実行のための命令を記憶する記憶媒体を含む。例えば、方法は、コンピュータ・アーキテクチャに応じたコンピュータの実行のために定義される機械命令を、実行するためにプロセッサによって取得するステップであって、機械命令は、例えば、変換命令を特定する少なくとも1つのオペコード・フィールド、第1のレジスタを指定するために使用される少なくとも1つのフィールド、および第2のレジスタを指定するために使用される少なくとも1つのその他のフィールドを含む、ステップと、機械命令をプロセッサによって実行するステップであって、例えば、第1のフォーマットの第1の表現の単精度バイナリ浮動小数点データを第1のレジスタから取得するサブステップ、第1のフォーマットの第1の表現の単精度バイナリ浮動小数点データを、第2のフォーマットの第2の表現の変換された単精度バイナリ浮動小数点データに変換するサブステップ、および変換された単精度バイナリ浮動小数点データを第2のレジスタに代入するサブステップを含む、ステップとを含む。
【0009】
本発明の1つまたは複数の態様に関連する方法およびシステムも、本明細書において説明され、特許請求される。さらに、本発明の1つまたは複数の態様に関連するサービスも、本明細書において説明され、特許請求される可能性がある。
【0010】
さらなる特徴および利点が、本発明の1つまたは複数の態様の技術によって実現される。本発明のその他の実施形態および態様が、本明細書において詳細に説明され、特許請求される発明の一部と見なされる。
【0011】
本発明の1つまたは複数の態様が、特に取り上げられ、本明細書の終わりの特許請求の範囲において例としてはっきりと特許請求される。本発明の1つまたは複数の態様の上述のおよびその他の目的、特徴、および利点は、添付の図面と関連してなされる以下の詳細な説明から明らかである。
【図面の簡単な説明】
【0012】
図1】スカラ処理ユニットと構造化されたデータ・タイプを処理するためのSIMDユニットとを両方含むプロセッサの一例を示す構成図である。
図2】例示的な実施形態の1つまたは複数の態様が実装され得るデータ処理システムの一例の図である。
図3】スカラとベクトルとの両方のデータおよびアドレス情報を記憶するレジスタ・ファイルを使用してスカラ命令とベクトル命令とを両方とも実行するように設計されたプロセッサの一例の図である。
図4】プロセッサの分岐ユニットおよびロード/ストア・ユニットによって使用され得る、情報としてスカラ・データを選択するより柔軟な手法を示す図である。
図5】1つの例示的な実施形態による、複数アドレス指定可能なレジスタ・ファイルが利用されるプロセッサの一例の図である。
図6】1つの例示的な実施形態による、ベクトル−スカラ拡張(VSX:Vector-ScalarExtension)レジスタ・ファイルの一例の図である。
図7】1つの例示的な実施形態による、全体的なデコード操作の概要を示す論理の一例を示す図である。
図8】1つの例示的な実施形態による、デコード操作の概要を示す論理の一例を提供する図である。
図9】1つの例示的な実施形態による、デコード操作の概要を示す論理の一例を提供する図である。
図10】例示的な実施形態による、変換命令を命令ストリームに挿入するために使用される論理の一例を示す図である。
図11】例示的な実施形態による、ベクトル要素をスカラに変換するために使用されることになる変換命令を選択するために使用される論理の一例を示す図である。
図12】例示的な実施形態による、スカラ・データをベクトル要素に変換するために使用されることになる変換命令を選択するために使用される論理の一例を示す図である。
図13】本発明の1つまたは複数の態様を組み込むコンピュータ・プログラム(製品)の一実施形態を示す図である。
【発明を実施するための形態】
【0013】
本発明の一態様によれば、スカラ・データおよびベクトル・データに関連する処理が容易にされる。一態様においては、レジスタ・ファイルの各レジスタが64ビット(b)単精度浮動小数点スカラ・データまたは32b単精度ベクトル・データおよびその他のデータ・フォーマットを含み得るレジスタ・ファイルが提供される。さらに、一態様においては、1つの単精度浮動小数点フォーマットから別の単精度浮動小数点フォーマットに変換するための変換技術が提供される。一例において、変換は、設計された命令を使用して、例外をシグナリングすることなしに実行される。
【0014】
上で検討され、さらにはそれぞれが参照によりその全体が本明細書に組み込まれている、本発明の譲受人に譲渡された、2009年8月6日に公開された「Multi-Addressable Register File」と題されたGschwindらによる米国公開第2009/0198966A1号および2011年1月25日に発行された「Multi-Addressable Register File」と題されたGschwindらによる米国特許第7,877,582号で検討されたように、概して、マルチメディア・データを処理するために設計されたプロセッサは、例えば、SIMDユニットを追加することによって既存のスカラ・プロセッサの実装を拡張することによって実装されており、SIMDユニット自体は、スカラ・データ・タイプの処理のために利用可能なリソースをミラーリングし、SIMDアーキテクチャによってサポートされるべき構造化された要素の数に合わせてそれぞれの機能ユニットのタイプを複製する複数の機能ユニット(すなわち、固定小数点ユニットおよび浮動小数点ユニット)を含む。多くの場合、スカラ処理ユニットとSIMD処理ユニットとの間で共有される唯一のユニットは発行論理であり、発行論理は、スカラ処理ブロックかまたはSIMD処理ブロックかのどちらかと、メモリ・サブシステムへのアクセスを管理するロード/ストア・ユニット(LSU)とに命令を発行する。レジスタ・ファイルを含むすべてのその他のユニットは、典型的には、別々に保有される。
【0015】
図1は、スカラ処理ユニットと構造化されたデータ・タイプを処理するためのSIMDユニットとを両方含み、SIMDユニットが構造化されたデータ・タイプの各要素のための複数の処理ユニットを備える従来技術のプロセッサの一例を示す構成図である。概して、別々のスカラ・プロセッサおよびSIMDプロセッサを使用することは、構成がいくつかの冗長な機能ユニットおよびデータ・パスを含むという点で非効率的で高価である。さらに、そのような実装は、スカラ・ユニットまたはSIMDユニットのどちらかがデータを処理している間、概して、他方のユニットがアイドル状態で何もしておらず、そのユニットの次の命令を待っているが、その間ずっとシステムの電力は消費するので、望ましくない量の電力消費を生じる。
【0016】
図1のシステムの動作中、命令が、命令フェッチ・ユニット100によってフェッチされ、命令デコード・ユニット102に供給される。デコードされた命令は、発行/分岐ユニット104に渡され、そこで、分岐命令が解決され、その他の命令は、それらのその他の命令がプロセッサの機能ユニットのうちの1つで実行可能になるまで発行/分岐ユニット104の命令発行ユニット(図示せず)に記憶され得る。命令発行ユニットは、予測論理、命令リオーダ論理、命令発行バッファ、および命令の高性能な発行をサポートするその他の論理を含み得る。
【0017】
命令は、発行/分岐ユニット104によって、ロード/ストア・ユニット106、固定小数点ユニット(FXU)108、浮動小数点ユニット(FPU)110、またはSIMDマルチメディア処理ブロック112のうちの1つまたは複数に発行される。命令が処理ユニットのうちの1つまたは複数によって処理され得るよりも前に、通常、1回または複数回のレジスタ・アクセスが、レジスタ・ファイル、例えば、整数レジスタ・ファイル114、浮動小数点レジスタ・ファイル116、または多くの最近のプロセッサで見られるSIMDマルチメディア拡張の一部であるベクタ・レジスタ・ファイル118で必要とされる。
【0018】
典型的には、SIMDマルチメディア処理ブロック112は、構造化されたデータ(通常は、4つの要素を有するベクトル)を記憶するためのベクトル・レジスタ・ファイル118を含む。ベクトル・レジスタ・ファイル118は、構造化されたデータの単一のフィールドをそれぞれが記憶する4つのサブレジスタ・ファイルにセグメント分けされ得る。SIMDマルチメディア処理ブロック112は、機能ユニットのいくつかのタイプを含む可能性があり、それぞれのタイプは、マルチメディア拡張によってサポートされる構造化されたデータ・タイプの要素の数に合わせて複製される。図1においては、PowerPC(R)VMXマルチメディア拡張で見られ得るように、それぞれが1つの構造の要素を処理するように4つ複製された固定小数点ユニット119および浮動小数点ユニット120が示されている。
【0019】
スカラ命令の実行とSIMD命令の実行とが両方行われる場合、通常は、CPUが対処する可能性があるさまざまなタイプの命令について別々にアドレス指定可能なレジスタ・ファイルが必要とされることが理解され得る。例えば、図1に示されるように、別々の整数レジスタ・ファイル114、浮動小数点レジスタ・ファイル116、およびベクトル・レジスタ・ファイル118が設けられている。このように別々のレジスタ・ファイルを持つことは、オーバーヘッドおよび電力消費の点で高価である。複数のレジスタ・ファイルを持つことは、コードが実行されるときに、コードがさまざまなレジスタ・ファイルを切り替えるか、またはさまざまなレジスタ・ファイルの間を移動することになることを意味する。これは、コード生成を、さまざまなレジスタ・ファイルの間の移動に関連するオーバーヘッドのために高価にする。さらに、コードのコンパイラが、レジスタ・ファイルに関連するリソースのさまざまな組をよりいっそう多く必要とし、レジスタ・ファイルのフラグメンテーションにつながる可能性がある。さらに、CPUのマイクロアーキテクチャ内に別々のリソースを持つことは、CPUの製造に関連するコストと、電力消費、放熱などに関連するコストとを上昇させる。
【0020】
上述のプロセッサの実装は、従来技術のシステム一例であり、一部の実装においては、例えば、統合された整数および浮動小数点レジスタ・ファイルなどの一部のレジスタ・ファイルが共有される可能性があり、または比較結果のための条件レジスタ・ファイル(condition register file)もしくは述語レジスタ・ファイル(predicateregister file)などのさらなるレジスタ・ファイルが存在する可能性がある。参照によりその全体が本明細書に組み込まれている、2004年1月4日に発行された「SIMD Datapath Coupled to Scalar/Vector/Address/Conditional DataRegister File with Selective Subpath Scalar Processing Mode」と題されたGschwindらによる米国特許第6,839,828号に記載された1つの特定の例においては、統合されたスカラ/ベクトル・アドレス指定可能レジスタ・ファイルが、ベクトル命令およびスカラ命令を処理するための複数のモードで動作するように設計されたプロセッサとともに説明されている。レジスタ・ファイルに結合された並列ベクトル・ユニット(parallel vector unit)が、ベクトル演算モードおよびスカラ演算モードで動作するように構成可能な機能ユニットを含む。ベクトル・ユニットは、現在の命令によって指定された演算を実行するための機能ユニットを密結合するための装置を含む。ベクトル演算モードの下では、ベクトル・ユニットは、単一のベクトル演算を複数のデータ要素に対して並列に実行する。複数のデータ要素に対して実行される演算は、ベクトル・ユニットの異なる機能ユニットでそれぞれ実行される。スカラ演算モードの下では、ベクトル・ユニットは、ベクトル・ユニット内の機能ユニットでレジスタ・ファイルから受け取られたデータ要素に対してスカラ演算を実行する。
【0021】
米国特許第6,839,828号のメカニズムは、レジスタ・ファイルに異なるタイプの命令/データを記憶する能力を提供するが、この能力を実現するために、第’828号特許は、新しいアーキテクチャを示す。しかし、この新しいアーキテクチャは、複数アドレス指定を可能にしない、つまり、命令のタイプ、例えば、レガシーのスカラ、レガシーのベクトル、または新しい命令のタイプに基づいてレジスタ・ファイル内のレジスタをアドレス指定する異なる方法を提供しない。
【0022】
本明細書に記載の1つまたは複数の例示的な実施形態および米国特許第7,877,582号は、複数アドレス指定可能なレジスタ・ファイルを提供する。そのような複数アドレス指定可能なレジスタ・ファイルは、データ処理システムのプロセッサに実装され得る。そのようなデータ処理システムは、1つまたは複数のプロセッサを有する可能性があり、各プロセッサまたはプロセッサのサブセットが、例示的な実施形態の複数アドレス指定可能なレジスタ・ファイルを実装することができる。プロセッサが1つまたは複数の例示的な実施形態による複数アドレス指定可能なレジスタ・ファイルを有するデータ処理システムのタイプは、非常に多岐にわたる可能性があり、したがって、この説明は、そのようなあり得るプロセッサ・アーキテクチャをそれぞれ扱うことはできない。しかし、例示を目的として、1つまたは複数の例示的な実施形態の複数アドレス指定可能なレジスタ・ファイルが実装され得るデータ処理システムの1つのタイプの一例として図2が与えられる。
【0023】
ここで図2を参照すると、1つまたは複数の例示的な実施形態の態様が実装され得る例示的なデータ処理システムの構成図が示されている。データ処理システム200は、本発明の1つまたは複数の例示的な実施形態に関するプロセスを実装するコンピュータが使用可能なコードまたは命令が配置され得るコンピュータの一例である。
【0024】
示された例において、データ処理システム200は、ノース・ブリッジおよびメモリ・コントローラ・ハブ(NB/MCH)202ならびにサウス・ブリッジおよび入力/出力(I/O)コントローラ・ハブ(SB/ICH)204を含むハブ・アーキテクチャを採用する。処理ユニット206、メイン・メモリ208、およびグラフィックス・プロセッサ210が、NB/MCH202に接続されている。グラフィックス・プロセッサ210は、アクセラレーテッド・グラフィックス・ポート(AGP)を通じてNB/MCH202に接続され得る。
【0025】
示された例においては、ローカル・エリア・ネットワーク(LAN)アダプタ212が、SB/ICH204に接続する。オーディオ・アダプタ216、キーボードおよびマウス・アダプタ220、モデム222、読み出し専用メモリ(ROM)224、ハード・ディスク・ドライブ(HDD)226、CD−ROMドライブ230、ユニバーサル・シリアル・バス(USB)ポートおよびその他の通信ポート232、ならびにPCI/PCIeデバイス234が、バス238およびバス240を通じてSB/ICH204に接続する。PCI/PCIeデバイスは、例えば、イーサネット(R)・アダプタ、アドイン・カード、およびノートブック・コンピュータ用のPCカードなどを含み得る。PCIがカード・バス・コントローラを使用する一方、PCIeは使用しない。ROM224は、例えば、フラッシュ・バイナリ入力/出力システム(BIOS:binary input/output system)である可能性がある。
【0026】
HDD226およびCD−ROMドライブ230は、バス240を通じてSB/ICH204に接続する。HDD226およびCD−ROMドライブ230は、例えば、インテグレーテッド・デバイス・エレクトロニクス(IDE:integrated drive electronics)またはシリアル・アドバンスド・テクノロジー・アタッチメント(SATA:serial advanced technology attachment)インターフェースを使用する可能性がある。スーパーI/O(SIO)デバイス236が、SB/ICH204に接続される可能性がある。
【0027】
オペレーティング・システムが、処理ユニット206で実行される。オペレーティング・システムは、図2のデータ処理システム200内のさまざまなコンポーネントを調整し、制御する。クライアントとしては、Microsoft(R)Windows(R)XP(MicrosoftおよびWindowsは、米国、その他の国、もしくはそれらの両方におけるマイクロソフトの商標である)またはLinux(R)オペレーティング・システム(Linuxは、米国、その他の国、もしくはそれらの両方におけるLinus Torvaldsの商標である)などの市販のオペレーティング・システムである可能性がある。Java(商標)プログラミング・システムなどのオブジェクト指向プログラミング・システムが、オペレーティング・システムと連携して実行される可能性があり、データ処理システム200で実行されるJava(商標)プログラムまたはアプリケーションからオペレーティング・システムに対する呼び出しを行う(Javaは、米国、その他の国、もしくはそれらの両方におけるサン・マイクロシステムズの商標である)。
【0028】
サーバとしては、データ処理システム200は、例えば、Advanced Interactive Executive(AIX(R))オペレーティング・システムまたはLinux(R)オペレーティング・システムを実行するIBM(R)eServer(商標)System p(R)コンピュータ・システムである可能性がある(eServer、System p(R)およびAIXは、米国、その他の国、もしくはそれらの両方におけるIBMの商標である)。データ処理システム200は、処理ユニット206に、ニューヨーク州アーモンクのIBMから入手可能なPOWER(R)プロセッサなどの複数のプロセッサを含む対称型マルチプロセッサ(SMP)システムである可能性がある。あるいは、単一プロセッサ・システムが使用される可能性がある。
【0029】
オペレーティング・システム、オブジェクト指向プログラミング・システム、およびアプリケーションまたはプログラムに関する命令は、HDD226などのストレージ・デバイスに置かれており、処理ユニット206によって実行するためにメイン・メモリ208にロードされ得る。1つまたは複数の例示的な実施形態に関する処理は、例えば、メイン・メモリ208、ROM224などのメモリ、または、例えば、1つもしくは複数の周辺デバイス226および230に置かれる可能性があるコンピュータが使用可能なプログラム・コードを使用して処理ユニット206によって実行され得る。
【0030】
図2に示されるバス238またはバス240などのバス・システムは、1つまたは複数のバスで構成される可能性がある。言うまでもなく、バス・システムは、ファブリックまたはアーキテクチャに接続された異なるコンポーネントまたはデバイス間のデータの転送を行う任意のタイプの通信ファブリックまたはアーキテクチャを使用して実装される可能性がある。図2のモデム222またはネットワーク・アダプタ212などの通信ユニットは、データを送受信するために使用される1つまたは複数のデバイスを含み得る。メモリは、例えば、メイン・メモリ208、ROM224、または図2のNB/MCH202に見られるようなキャッシュである可能性がある。
【0031】
当業者は、図1〜2のハードウェアが実装に応じて変わり得ることを理解するであろう。フラッシュ・メモリ、等価な不揮発性メモリ、または光ディスク・ドライブなどのその他の内部ハードウェアまたは周辺デバイスが、図1〜2に示されたハードウェアに加えて、またはそれらのハードウェアの代わりに使用される可能性がある。また、1つまたは複数の例示的な実施形態のプロセスは、本発明の1つまたは複数の態様の精神および範囲から逸脱することなく、上述のSMPシステム以外のマルチプロセッサ・データ処理システムに適用され得る。
【0032】
さらに、データ処理システム200は、クライアント・コンピューティング・デバイス、サーバ・コンピューティング・デバイス、タブレット・コンピュータ、ラップトップ・コンピュータ、電話またはその他の通信デバイス、携帯情報端末(PDA)などを含むいくつかの異なるデータ処理システムのいずれかの形態を取る可能性がある。一部の例示的な例において、データ処理システム200は、例えば、オペレーティング・システム・ファイルまたはユーザが作成したデータあるいはその両方を記憶するための不揮発性メモリを提供するためのフラッシュ・メモリを用いて構成されるポータブル・コンピューティング・デバイスである可能性がある。基本的に、データ処理システム200は、アーキテクチャの制約なしに、任意の知られているまたは将来開発されるデータ処理システムである可能性がある。
【0033】
上で検討されたように、1つまたは複数の例示的な実施形態は、複数アドレス指定可能なレジスタ・ファイルを提供する。1つまたは複数の例示的な実施形態は、多数のレジスタを設け、命令の第1の組でレジスタの第1のサブセットをアドレス指定し、命令の第2の組でレジスタの第2のサブセットをアドレス指定し、少なくとも命令の第3の組でレジスタ・ファイル全体をアドレス指定する能力を提供することによってレジスタ・ファイルの性能を向上させることによって知られているレジスタ・ファイルを改良する。1つまたは複数の例示的な実施形態によれば、レジスタの第1のサブセットおよび第2のサブセットは、重なり合っておらず、「タイプ1の命令用のレジスタ」および「タイプ2の命令用のレジスタ」のように別個のレジスタ・ファイル領域を指す。タイプ1の命令に対応するサブセット内に含まれるレジスタは、タイプ2の命令によってアクセス不可能であり、逆も同様である。1つの例示的な実施形態において、タイプ1の命令は、IBM Power ArchitectureのFPUまたはレガシーの浮動小数点命令に対応し、タイプ2の命令は、IBM Power ArchitectureのレガシーのVMX命令に対応し、タイプ3の命令は、IBM Power ArchitectureのVSX命令に対応する。
【0034】
1つまたは複数の例示的な実施形態のメカニズムは、知られているクラスタ化されたレジスタ・ファイル、レジスタ・ファイル内のオペランドのサブレンジ(subrange)、「レジスタ・ファイル間移動」命令を有するプロセッサ、および不連続なレジスタ指定子を用いるサブレンジの形態を使用するVMX128のレジスタ・ファイルとは異なる。オペランドのサブレンジを用いる場合、典型的には、1つのサブレンジは、1つのオペランドのみ、すなわち、1つのタイプの命令のためにのみ存在する。レジスタ・ファイル内のすべてのレジスタをアドレス指定し得る別の形態を有するその他の命令のタイプは存在せず、別のタイプの命令のためのレジスタのその他の範囲は存在せず、すなわち、複数アドレス指定が可能な機能は存在しない。クラスタ化されたレジスタ・ファイルは、異なる命令によってアドレス指定可能なサブレンジを有する大きなレジスタ・ファイルを含むが、レジスタ・ファイル内のレジスタのすべてをアドレス指定し得る命令のタイプは存在しない。それどころか、演算がレジスタの組全体で実行されなければならない場合、移動/コピー操作がレジスタ・ファイルで実行されなければならない。移動/コピー操作は、通常、特殊なスケジューリング・メカニズムを必要とする可能性がある比較的低速な操作である。
【0035】
対照的に、1つまたは複数の例示的な実施形態は、命令のタイプ、例えば、レガシーの浮動小数点、レガシーのスカラ、ベクトル−スカラ、拡張または拡大されたベクトル−スカラなどに基づいて複数アドレス指定可能なレジスタ・ファイルのレジスタにアクセスできるようにする。1つのオペランドのタイプに関連するレジスタの1つのサブセットではなく、1つまたは複数の例示的な実施形態の複数アドレス指定可能なレジスタ・ファイルは、レジスタの複数のばらばらのサブセットを提供する。さまざまなタイプの命令に関連する、複数アドレス指定可能なレジスタ・ファイル内のレジスタの複数のサブセットは、レジスタの連続的な範囲である。さらに、1つまたは複数の例示的な実施形態を用いると、異なるタイプの命令が、複数アドレス指定可能なレジスタ・ファイル内のレジスタの重なり合わないサブセットにアクセスすることができるが、少なくとも1つのタイプの命令が、複数アドレス指定可能なレジスタ・ファイル内のレジスタのすべてにアクセスすることもできる。
【0036】
1つの特定の実施形態においては、本発明の一態様によれば、異なるタイプの命令が、複数アドレス指定可能なレジスタ・ファイル内のレジスタの重なり合わないサブセットにアクセスすることができ、複数のタイプの命令(例えば、64bスカラ単精度浮動小数点命令および32bベクトル単精度浮動小数点命令)が、複数アドレス指定可能なレジスタ・ファイル内のレジスタのすべてにアクセスすることができる。
【0037】
本発明の別の態様においては、1つまたは複数の例示的な実施形態が、アクセスされるべきレジスタ・ファイルの部分が実行されている命令のタイプに基づいて動的に決定されるようにして、同じレジスタ・ファイルを使用してスカラ、ベクトル、および浮動小数点命令を実行する能力を含めることによって、知られているスカラ/ベクトル・レジスタ・ファイルを拡張する。1つまたは複数の例示的な実施形態は、知られているスカラ/ベクトル・レジスタ・ファイルと、そのようなスカラ/ベクトル・レジスタ・ファイルを使用するプロセッサとを改良するので、そのようなプロセッサおよびスカラ/ベクトル・レジスタ・ファイルの基本的な動作の理解が与えられる。図3および4の以下の説明は、そのような知られているスカラ/ベクトル・レジスタ・ファイルおよびプロセッサの一例として、本発明の譲受人に譲渡された米国特許第6,839,828号を参照する。
【0038】
図3は、米国特許第6,839,828号による、スカラとベクトルとの両方のデータおよびアドレス情報を記憶するレジスタ・ファイルを使用してスカラ命令とベクトル命令とを両方とも実行するように設計されたプロセッサの1つの例示的な図である。図3に示されたプロセッサにおいては、スカラ・データ・パス処理機能とSIMDデータ・パス処理機能とが、今やスカラ処理を包含するSIMDベクトル・データ・パスによって統合されている。スカラ処理は、ベクトル・データ・タイプの1つの要素を処理するために使用されるユニットのうちの1つで行われる。このデータ・ユニットは、以下で説明されるように、「優先スロット(preferred slot)」に指定され、分岐ユニットおよびロード/ストア・ユニットにアドレスを提供する。簡単にするために、図3の統一されたプロセッサの図は、データ・フローの接続のみを含み、制御信号の接続および外部システム・インターフェース、例えば、アドレス線、メモリとの接続などを含まない。後者の接続は、当然存在すると想定される。
【0039】
図3の統一されたプロセッサは、命令フェッチ・ユニット300を含み、命令フェッチ・ユニット300は、フェッチ・ユニットのプログラム・カウンタの値に基づいてシステムのメモリ階層(図示せず)から命令およびデータをフェッチする。フェッチされた命令は、命令フェッチ・ユニット300によって命令デコード・ユニット302に与えられ、そこでデコードされ、下流のユニットを制御するための適切な制御信号へと展開される。展開された命令は、発行/分岐ユニット304に渡され、そこで、命令キューに入れられて、処理のための適切な機能ユニットが利用可能になるのを待つ。命令が分岐である場合、制御が命令フェッチ・ユニット300に戻され、命令フェッチ・ユニット300が分岐先の命令をフェッチし、上述のプロセスが繰り返される。
【0040】
スカラ演算の場合で、1つの機能ユニット(すなわち、固定小数点ユニットまたは浮動小数点ユニット)が利用可能になるとき、またはベクトル演算の場合で、複数の機能ユニットが利用可能になるとき、発行/分岐ユニット304が、1つまたは複数の機能ユニットに命令を発行する。計算が実行され得るよりも前に、元のオペランド・データが、スカラ−ベクトル・レジスタ・ファイル(SVRF)310にアクセスすることによって取得される。通常、複数のタイプの機能ユニット、例えば、固定小数点ユニット、浮動小数点ユニット、およびロード/ストア・ユニット(LSU)306が設けられ、最後のユニットは、現在の命令によって特定されたデータをメモリ階層からフェッチし、メモリ階層に記憶する。LSU306は、反対に、統合されたSVRF310に、メモリ・アクセスの結果をバス308を介して記憶する。この実施形態において、SVRF310は、4つのスカラ・データ・ワードからなるデータ線を収容し、各線は、4つのデータ・ワードのそれぞれが異なる機能ユニットのペア(または組)311〜314に関連付けられるように分割され、それぞれの機能ユニットのペアは、示されるように、固定小数点ユニットおよび浮動小数点ユニットを含む。機能ユニットのペアは、本明細書においては並列ベクトル・ユニットと呼ばれるものを構成する。
【0041】
発行論理が、処理のために、機能ユニットの各組の中の適切な機能ユニットにデータ線の内容を渡すようにSVRF310に指示する。固定小数点ユニット、浮動小数点ユニット、比較ユニット、論理演算ユニット、シフト・ユニットなどを含むがこれらに限定されない、発行スロット(issue slot)に関連する任意の数およびタイプの機能ユニットが存在する可能性がある。データ・ワードを使用することになる組の中の特定の機能ユニットは、実行されるべき命令に依存し、発行/分岐ユニット304からの信号によって制御される。したがって、命令がデータに対して演算を行うように固定小数点ユニットに要求する場合、データは、線315〜318を介して固定小数点ユニット319〜322に渡される。命令が浮動小数点ユニット327〜330を必要とする場合、データは、線323〜326を介して渡される。その他の機能ユニットのタイプが存在するとすれば、データは、同様にしてそれらの機能ユニットに渡されることになる。それぞれの指定された機能ユニットは、入力データに対してその機能ユニットの演算を実行し終えたとき、結果をSVRF310に戻し、そこで、結果は、LSU306によって要求されるかまたはさらなる操作のために機能ユニットに渡されるまで記憶される。
【0042】
機能ユニットによって実行されるべき演算およびそれらの演算を実行するための機能ユニットは、発行/分岐ユニット304によって与えられる制御信号によって決定される。操作がSVRF310からデータを読むようにLSU306に指示するとき、データが、データ・バス332を介して渡される。加えて、データがメモリ内で記憶されるべきアドレスが、アドレス・バス331を介してLSU306に渡される。図3の実施形態においては、アドレス・バス331が、機能ユニットのペア314(このペアは、後で説明するように、優先スロットに指定されている)に関連付けられているSVRF310のセグメント(D)からの情報を渡す。優先スロットは、機能ユニットを優先スロットとして定義するか、または制御レジスタの設定か、命令ワードでのスロットの指定か、もしくは例えば発行時間(issue time)において発行ユニットによって任意のその他の手段を用いてそれを決定することかのいずれかによって優先スロットを動的に決定することによるかのどちらかにより機能ユニットのいずれかになる可能性がある。優先スロットを指定することによって、機能ユニットの電力を選択的に切ることを可能にし、その結果、電力が節約される。
【0043】
ここまでのところ、統一されたプロセッサの説明された動作は、スカラ演算とベクトル演算との両方に適用されてきた。つまり、実行されるべき演算がスカラ演算であり、したがって、1つの機能ユニットのペアだけの動作および出力を必要とする場合、残りの機能ユニットのペアは、それにもかかわらず、スカラ・ベクトル・レジスタ・ファイルからそれらの残りの機能ユニットのペアに渡されたデータに対して同じ演算を実行するように指示される可能性がある。異なる機能ユニットが異なる演算を同時に実行することを要求することは、必ず、複雑な設計上の配慮を生じるので、そのような手法は、設計の単純化を可能にする。同様に、ベクトル演算に関して、それぞれの機能ユニットのペアは、入力データに対して同じ演算(または密結合動作(tightly coupled operation)の一部、または単一の命令で指定された密結合動作の組み合わせの一部としての実質的に同じ演算)を実行する。
【0044】
スカラ演算とベクトル演算とは、演算の解釈にしたがって、関連するアドレス情報が使用される方法により区別される。演算の解釈は、その演算の演算コードの直接的な結果である可能性があり、つまり、異なる演算コードが、異なる命令(例えば、「スカラ・バイトをロード」、「スカラ・ワードをロード」、「スカラ・ベクトルをロード」)に関して利用可能である可能性があり、またはシステムの別の部分、例えば、単一の「ロード」オペコードを解釈するためのモード・タグ・ビット(mode tag bit)に応じて決まる可能性がある。スカラ・データでさえも(ベクトルよりは少ないバイト数であるが)バイトのアドレスの範囲(address range of bytes)に広がり、ロード/ストアが動作し得る方法もさまざまである。
【0045】
SVRF310内の特定のスロットに通常割り振られるその他の機能ユニットと異なり、LSU306は、SVRF310に含まれるデータの線全体またはそのサブセットに対して動作する。LSU306は、発行/分岐ユニット304によって発行された命令に応じて、ロード動作モードまたはストア動作モードのどちらかで動作する。ロード・モードにおいて、LSU306は、アドレス・バス331を用いてSVRF310の優先スロットからアドレス情報を受け取り、指定されたアドレスからデータをロードする。ロード・ベクトル命令が実行されているときは、ロード動作が、バス308を用いてメモリからSVRF310にデータの線全体をロードする。ロード・スカラ動作が指定されるとき、ロード動作は、少なくとも、スカラ・タイプのサイズ(典型的には、バイト、半ワード、ワードなど)に対応するビット数をロードする。追加のビットが、実装上の選択にしたがってロードされる可能性があり、または無効なデータ、もしくはデフォルト値(「0」など、ただし、これに限定されない)に初期化されたデータが、要求されたデータ・タイプの範囲外のそれらのビットに与えられる可能性がある。一実施形態においては、「ロード・スカラ」動作は、要求されたスカラ値が、SVRF310に記憶される前に、優先スロットにおいてアラインされるアラインメント・ステップを含む。別の実施形態においては、アラインメントは、一連の1つまたは複数の命令を用いてプログラムによって実行される。
【0046】
ストア動作モードにおいて、LSU306は、データ・バス332によってSVRF310から記憶されるべきデータを受け取り、アドレス・バス331を用いてSVRF310の優先スロットからアドレス情報を受け取り、指定されたアドレスにデータを記憶する。
【0047】
図4は、米国特許第6,839,828号による、分岐ユニットおよびLSUによって使用され得る、情報としてスカラ・データを選択するより柔軟な手法を示す。この実施形態によれば、SVRF310のさまざまなセグメントが、(典型的には、実行されるべき命令の命令ワード内のフィールドから来る可能性がある)発行/分岐ユニット304からの線334を介した制御入力によって制御され得るマルチプレクサ333によって選択され得る。代替的な実施形態は、マルチプレクサの制御入力を与えるためのソフトウェアで制御される専用のレジスタまたはブート時パラメータを含み得るがこれに限定されない。
【0048】
図4に示された実施形態は、以下のように動作する。スカラ・データ値が、操作のためのメモリ・アドレスを供給するためにロード/ストア・ユニットによって必要とされるか、または例えば分岐先アドレスもしくは分岐条件を与えるために分岐ユニットによって必要とされるか、またはすべての要素に適用されるべき単一のシフト回数を必要とするシフト・ユニットによって必要とされるか、またはスカラ・データ値をそのユニットの入力として必要とする可能性がある任意のその他のユニットによって必要とされるかのいずれかのときに、マルチプレクサ333は、動作のためのスカラ入力としてスロットA、B、C、またはDのうちの1つを選択するための制御入力によって操作される。したがって、この実施形態によれば、機能ユニットのペアのいずれもが、「優先スロット」として選択される可能性があり、処理動作のバランスを取ることを可能にし、複数のスロットの間の転送操作の必要性を減らし、スカラ値が記憶され得るスロットの数を増やすことができる。
【0049】
したがって、米国特許第6,839,828号は、スカラ処理のための優先スロットの2つの異なる実装を記載している。第1は、優先スロットが設計段階で選択されるハードウェア組み込み式の実装であり、第2は、優先スロットが実行中にオン・ザ・フライで選択され得る可変の手法である。第’828号特許で述べられているように、設計時に優先スロットを指定することは、上述の選択が行われる必要がないという点で実装を簡単にすることができる。さらに、同一の機能ユニットのペアを使用することは、優先スロットに関しては使われることがない無駄な回路を持つというわずかなオーバーヘッドのコストがかかるものの、より効率的である可能性がある。
【0050】
米国特許第6,839,828号のレジスタ・ファイルのメカニズムおよびその他のレジスタ・ファイルのメカニズムは、単一のレジスタ・ファイルがスカラ演算とベクトル演算との両方のために使用されることを可能にするが、これらのレジスタ・ファイルのメカニズムは、複数アドレス指定を可能にせず、単一のレジスタ・ファイルに異なるタイプの命令/データを記憶する能力を提供するだけである。単一のレジスタ・ファイルで異なるタイプの命令/データを扱うために、複雑なアーキテクチャまたは動作あるいはその両方が提供されている。
【0051】
対照的に、1つまたは複数の例示的な実施形態は、レガシーの命令と1つまたは複数の新しいまたは拡張されたタイプの命令との両方が複数アドレス指定可能なレジスタ・ファイルのレジスタにアクセスすることを可能にする複数アドレス指定可能なレジスタ・ファイルを提供する。1つまたは複数の例示的な実施形態のメカニズムを用いると、単一のレジスタ・ファイルが、スカラ命令と単一命令複数データ(SIMD)またはベクトル命令との両方を使用してアドレス指定され得る。つまり、1つまたは複数の例示的な実施形態による複数アドレス指定可能なレジスタ・ファイル内のレジスタのサブセットが、異なる命令の形態、例えば、スカラ命令、SIMDまたはベクトル命令などでアドレス指定可能である一方、レジスタの組全体は、本明細書においてはベクトル−スカラ拡張(VSX)命令と呼ばれるさらに別の形態の命令でアドレス指定され得る。VSX命令の形態を用いてレジスタの組全体に対して実行され得る操作のタイプ、すなわち、操作セット(operation set)は、レジスタのサブセットの操作セットと実質的に同様である。
【0052】
1つまたは複数の例示的な実施形態の複数アドレス指定可能なレジスタ・ファイルは、レガシーの命令が複数アドレス指定可能なレジスタ・ファイル内のレジスタのサブセットにアクセスすることを可能にし、一方、新しいまたは拡張された命令、例えば、VSX命令は、複数アドレス指定可能なレジスタ・ファイル内のレジスタの範囲全体にアクセスすることができる。さらに、レガシーの命令のデータ・フォーマットは、VSX命令のデータ・フォーマットと互換性がある。したがって、レガシーの命令によって生成されたデータが、VSX命令によって処理される可能性があり、その逆も同様である。
【0053】
例えば、1つまたは複数の例示的な実施形態は、レガシーの浮動小数点命令(スカラ演算)がレジスタ・ファイルのレジスタの第1のサブセット、例えば、VSXレジスタ0〜31に記憶された値に作用することを可能にし、レガシーのVMX命令(ベクトル演算)がレジスタ・ファイル内のレジスタの第2のサブセット、例えば、(実際の命令ではレジスタ0から31を参照し続けるが)VSXレジスタ32から63に作用することを可能にし、VSX命令(ベクトル−スカラ演算)がレジスタ・ファイルのレジスタのすべて、例えば、VSXレジスタ0から63に対して演算を行うことを可能にする。例示的な実施形態のうちの1つまたは複数は、さらに、異なるタイプの命令が、レジスタのさまざまなサブセットと、レジスタ・ファイルのレジスタのすべてにアクセスするVSX命令の能力とを使用してデータを共有することを可能にする。例えば、データは、VSXレジスタ0から31にデータを記憶し、アクセスすることによって、VSX命令とレガシーの浮動小数点命令との間で共有され得る。同様に、1つまたは複数の例示的な実施形態は、いかなる修正もなしにレガシーの浮動小数点命令およびレガシーのVMX命令のどちらか一方または両方を使用するプログラムを実行し続けながら、データがVSXレジスタ32および63においてレガシーのVMX命令とVSX命令との間で共有されることを可能にする。さらに、1つまたは複数の例示的な実施形態は、いかなる修正もなしにレガシーの浮動小数点命令およびレガシーのVMX命令のどちらか一方または両方を使用するコード・モジュールを、新しいVSX命令を使用するコード・モジュールにリンクすることを可能にし、レガシーの命令で計算するコード・モジュールとVSX命令を使用するコード・モジュールとの間でデータを共有する。
【0054】
1つの特定の実施形態においては、本発明の一態様によれば、VSX命令は、64bスカラ単精度浮動小数点命令および32bベクトル単精度浮動小数点命令、ならびに場合によってはその他の命令を含む。64bスカラ単精度浮動小数点命令の例は、この「発明を実施するための形態」の一部として含まれるRFC02182.r6: VSX Scalar Single-Precisionに記載されている。
【0055】
図5は、1つの例示的な実施形態による、複数アドレス指定可能なレジスタ・ファイルが利用されるプロセッサの図の一例である。図5に示されるように、プロセッサ400は、レジスタ・ファイル440の構成および利用を除いて図3のプロセッサと構成が同様である。命令フェッチ・ユニット410、発行/分岐ユニット430、機能ユニットのペア(または組)482〜488の機能ユニット450〜480、およびロード/ストア・ユニット490はすべて、図3に関連して上で説明されたのと同様の方法で動作する。命令デコード・ユニット420は、3つの異なるタイプ、すなわち、ベクトル、スカラ、およびベクトル−スカラ命令タイプの命令をデコードするために使用される、以降で説明される追加の論理を有する。1つの例示的な実施形態において、これらの3つの異なるタイプの命令は、ベクトル・マルチメディア拡張(VMX:vector multimedia extension)命令、浮動小数点(FP)命令、およびベクトル−スカラ拡張(VSX)命令である。FP演算は、当技術分野で広く知られている。VMX命令は、ニューヨーク州アーモンクのIBMから入手可能なPOWER6プロセッサで使用され、複数のデータ要素に対して演算を行う単一の命令を提供する。VSX命令は、以降でさらに詳細に説明される。
【0056】
デコードされた命令に基づいて、命令は、レジスタ・ファイル440のサブレンジか、またはレジスタ・ファイル440内のレジスタの範囲全体かのどちらかにアクセスする。命令が命令デコード・ユニット420によってレガシーの浮動小数点命令であると判定される場合、レジスタ・ファイル440の第1のサブレンジ442がアクセスされ、データが、処理のために適切な機能ユニット450〜480に与えられる。命令が命令デコード・ユニット420によってレガシーのVMXベクトル命令であると判定される場合、レジスタ・ファイル440の第2のサブレンジ444がアクセスされ、やはり、データが、処理のために適切な機能ユニット450〜480に与えられる。命令が命令デコード・ユニット420によってVSX命令であると判定される場合、レジスタ・ファイル440の範囲全体446がアクセスされる可能性があり、データが、処理のために適切な機能ユニット450〜480に与えられる。実行される特定のVSX命令に応じて、レジスタ・ファイル440の範囲全体446のうちのいずれかにアクセスするVSX命令は、入力データを得るためにレジスタの幅全体を使用する(VSXベクトル命令に対応し、命令のオペランドの位置のそれぞれでレジスタ・ファイル440の範囲全体446にアクセスできるようにする)か、またはレジスタの幅の一部を使用する(VSXスカラ命令に対応し、命令のオペランドの位置のそれぞれでレジスタ・ファイル440の範囲全体446にアクセスできるようにするが、そこに含まれるビットのサブセットだけを使用する)かのどちらかである可能性がある。
【0057】
第1のサブレンジ442は、レジスタ・ファイル440内のレジスタの第1の組のビットの第1の範囲を含む。第2のサブレンジ444は、レジスタ・ファイル内のレジスタの第2の組のビットの第2の範囲を含む。レジスタ・ファイル440の範囲全体446は、レジスタ・ファイル440内のレジスタの組全体のビットの範囲全体を含む。このようにして、単一のレジスタ・ファイル440は、レガシーのスカラ命令とレガシーのベクトル命令との両方、および本明細書においてはVSX命令と呼ばれるベクトル−スカラ命令の統合された組を処理するために使用され得る。
【0058】
VSX命令は、レジスタ・ファイル440のレジスタの組全体にアクセスすることができる命令である。VSX命令セットは、レジスタ・ファイル440全体の各レジスタの32ビットのサブレンジにアクセスする単精度スカラ浮動小数点命令と、レジスタ・ファイル440全体の各レジスタの64ビットのサブレンジにアクセスする単精度スカラ浮動小数点命令と、レジスタ・ファイル440全体の各レジスタの64ビットのサブレンジにアクセスする倍精度スカラ浮動小数点命令と、レジスタ・ファイル440全体の中のビットの範囲全体にアクセスするベクトル命令とを含む命令のいくつかのクラスを含む。VSX命令は、選択されたタイプのレジスタ指定子、例えば、レガシーのスカラ命令およびレガシーのベクトル命令によって使用されるレガシーの5ビットの指定子とは対照的な6ビットのレジスタ指定子を使用する。
【0059】
したがって、1つまたは複数の例示的な実施形態は、別々のスカラ・レジスタ・ファイルおよびベクトル・レジスタ・ファイルを有するレガシーのアーキテクチャと互換性のあるレジスタ・ファイルの単一のスカラ/ベクトル・アーキテクチャを提供する。1つまたは複数の例示的な実施形態は、さらに、チップ領域の拡大をもたらすことなく、レガシーのレジスタ・ファイルと拡張されたベクトル−スカラ・レジスタ・ファイルとの間でプロセッサのストレージ空間を共有することを可能にする。その上、1つまたは複数の例示的な実施形態は、レガシーの命令を使用するレガシーのプログラムおよびライブラリと、(レガシーの命令かまたは新しい/拡張された命令かのどちらかを使用する)プログラムおよびライブラリとの間でデータを共有することと、コードの相互運用とを可能にし、それによって、レガシーのアプリケーションのコード・チューニングにかけた労力が無駄にならず、新しい/拡張された命令が最も有利な場合に新しい/拡張された命令が使用されることを可能にしながら、新しい/拡張された命令を使用するようにすべてのアプリケーションをコーディングし直す必要が回避される。結果として、スカラ、およびベクトル、例えば単一命令複数データ(SIMD)命令に対して別々のレジスタ・ファイルを利用する知られているプロセッサ・アーキテクチャが被る高価なオーバーヘッドと、単一のレジスタ・ファイルを使用してスカラ命令とベクトル命令とを両方とも処理するための複雑な新しいアーキテクチャに関連する追加コストとが、回避される可能性がある。
【0060】
レジスタ・ファイル440は、複数のベクトル−スカラ・レジスタ(VSR:vector-scalarregister)で構成され、それぞれのVSRは、複数のビットを有する。例えば、レジスタ・ファイル440は、VSR[0]からVSR[63]までの番号を振られた64個のVSRで構成される可能性があり、それぞれのVSRは、0から127までの番号を振られた128ビットを有する。説明を目的として、VSRがレジスタ・ファイル440の上から下に向かって連続的に番号を振られ、ビットがレジスタ・ファイル440の左から右に向かって連続的に番号を振られると仮定される。これが、以降で検討される図6に示される。
【0061】
図6は、1つの例示的な実施形態によるベクトル−スカラ拡張(VSX)レジスタ・ファイルの例示的な図である。図6のVSXレジスタ・ファイル500は、例えば、レジスタ・ファイル440として利用され得る。図6に示されるように、VSXレジスタ・ファイル500は、VSR[0]からVSR[63]までの番号を振られた複数のベクトル−スカラ・レジスタ(VSR)510を含む。VSR510のそれぞれは、設定され得る所定の数のビットを有する。示された例においては、各VSR510が、パラメータの受け渡しのためなど、命令に対応するデータを記憶するための、0から127までの番号を振られた128ビットを有する。
【0062】
レジスタ・ファイル500のレジスタの第1の組530内のビットの第1のサブレンジ520は、スカラ命令または浮動小数点命令などの第1のタイプの命令に関連付けられる。レジスタ・ファイル500のレジスタの第2の組550内のビットの第2のサブレンジ540は、ベクトル、SIMD、またはVMX命令などの第2のタイプの命令に関連付けられる。レジスタ・ファイル500のレジスタの組全体570内のビットの第3の範囲560は、VSX命令などの第3のタイプの命令に関連付けられる。
【0063】
VSXレジスタ・ファイル500は、関連するレジスタの範囲およびレジスタ内のビット幅に基づいて3つの異なるタイプの命令がVSXレジスタ・ファイル500のレジスタにアクセスすることを可能にすることによってその他のシステムのその他のレジスタ・ファイルとは異なることが、図6から理解され得る。その他のレジスタ・ファイルは、特定の命令のタイプのすべてのオペランドに対応するレジスタのサブセットに対してではなく、レジスタの組全体570に対してアクセスされるべきレジスタを指定することによって、すべてのタイプの命令に関して同じ方法でレジスタ・ファイル全体がアクセスされることを必要とする。
【0064】
VSXレジスタ・ファイル500を用いると、レガシーのスカラ演算がVSXレジスタ・ファイル500からデータを読み出すこと/にデータを書き込むことになるとき、1つの例示的な実施形態においては、スカラ・データ値が、レジスタの幅の左側、すなわち、レジスタVSR[0]からVSR[31]のビット0から63まで、例えば、第1のサブレンジ520から読み出され/に書き込まれる。例示的な実施形態によって実現され得る、ベクトル−スカラ・レジスタ(VSR)へのスカラ値の書き込みのいくつかの方法が存在する。1つの例示的な実施形態においては、VSRのビットのすべては、スカラ命令によって指定されたレジスタにおいて、スカラ・データ値に対応しないビットに対してベクトル計算が実行された結果に対応する値がビット64から127までに書き込まれる一方、スカラ値がビット0から63までに書き込まれるようにして書き込まれる可能性がある。例えば、レジスタF0およびF1のデータ値が足されてレジスタF3に結果を与える場合、VSR3のビット64から127までの値が、あたかもVSR0およびVSR1のビット64から127までに対してベクトル演算が実行されたかのように対応する可能性がある。
【0065】
別の例示的な実施形態においては、ビット0から63までに書き込まれることになるスカラ値が、ビット64から127までに複製される可能性がある。この手法は、例えば、スカラ浮動小数点値が後でベクトル値と組み合わされるべきであるとき、例えば、ベクトルにスカラ値を乗算するときに有用である可能性がある。通常、スカラ値は、初めに、VMXまたはVSX命令セットの「splat」命令などによってレジスタ全体にわたって複製されなければならない。この手法は、スカラ値が既に複製済みであるので、「splat」命令を実行する必要をなくす。
【0066】
さらに別の例示的な実施形態においては、スカラ値は、ビット64から127までに存在していたいかなる値も変更されずに残ることができる一方、レジスタのビット0から63までに書き込まれる可能性がある。そのような手法は、ベクトル演算が一連のスカラ演算に分解される必要がある可能性があり、それぞれのスカラの結果が特定のベクトル要素に挿入され、最終的に、複数のスカラの結果からベクトルの結果を生成する可能性があるときに使用され得る。これは、レジスタに何も書き込まれる必要がないときは何も書き込まれないので、最小電力の実施形態である。しかし、このとき、レジスタ全体に存在する値が、スカラの結果が書き込まれる前にレジスタ・ファイルにどんな値が存在したかに依存する可能性があるので、その手法は、不確定性をもたらす可能性がある。これは、リネーム・レジスタに存在する値が極めて予測しにくいレジスタ・リネーミングを用いるアーキテクチャにとって特に問題となる。
【0067】
別の例示的な実施形態においては、スカラ値は、レジスタのビット0から63までに書き込まれる可能性がある一方、残りのビット64から127がデフォルト値、例えばゼロで埋められる可能性がある。そのような手法は、ベクトル演算が一連のスカラ演算に分解される必要がある可能性があり、複数のスカラの結果がシフトし、OR演算でまとめられてベクトルの結果を形成するときに使用され得る。この手法は、予測可能な値をもたらし、したがって、何も書き込まないことに関連する問題が回避される。さらに、このオプションは、(負荷を2倍にする、レジスタ内の2つの位置にその値を与えることを必要としないので)値を複製するよりも結果バスに対して少ない負荷を示す。
【0068】
レガシーのベクトル、SIMD、またはVMX命令に関して、データ値は、VSR[32]から[63]の第2の組のビット0から127までの範囲全体から読み出され/に書き込まれる。新しいVSX命令に関して、データ値は、VSR[0]から[63]の組全体のビット0から127までの範囲全体から読み出され/に書き込まれる。これらのVSX命令によって、スカラ値は、レジスタの左側のビット0から63までに書き込まれ、一方、ベクトル値は、ビット0から127までのすべてにわたって書き込まれる。
【0069】
したがって、1つまたは複数の例示的な実施形態のメカニズムを用いると、命令をデコードするとき、実際には、デコードされるべき命令の2つの特徴が存在する。第1は、データ・アクセスの幅、すなわち、アクセス幅の指定であり、第2は、レジスタ指定子である。アクセス幅の指定は、レジスタのどのビットが読み出される/書き込まれるべきであるかを特定する。レジスタ指定子は、読み出される/書き込まれるべき、複数アドレス指定可能なレジスタ・ファイル内のレジスタのサブセットまたはレジスタの組全体を特定する。命令のデコードに関する第1の要件は、ベクトル−スカラ・レジスタ・ファイル上にレガシーのより小さなレジスタ・ファイルをオーバーレイ(overlay)する複数アドレス指定を可能にする態様がストレージを共有することを認めることを可能にするレジスタ指定子である。
【0070】
再び図5を参照すると、上で検討されたように、デコード論理が、例示的な実施形態の単一のレジスタ・ファイルを使用する3つのタイプの命令を扱うためにプロセッサ400の命令デコード・ユニット420に追加されている。デコード論理は、命令のタイプを判定し、命令のタイプに基づいて、命令によってアクセスされ得るレジスタ・ファイル440内のレジスタのビット幅を指定するための幅指定子を生成する。次に、レジスタの幅全体に対する完全な指定子(full specifier)が、命令のタイプおよび幅指定子に基づいて生成され、そして、レジスタ・ファイル440内のレジスタの対応するサブセット442〜446内のレジスタが、完全な指定子を用いてアドレス指定される。次に、演算の結果が、完全な指定子を使用したレジスタのサブセット442〜446のアドレス指定に基づいて計算され、レジスタ・ファイル440内のレジスタのサブセット442〜446に書き戻される。
【0071】
1つの例示的な実施形態によれば、少なくとも、それぞれが参照によりその全体が本明細書に組み込まれている米国特許第7,877,582号(米国公開第2009/0198966A1号)に含まれる付録と、この「発明を実施するための形態」の一部である文献と、以下の刊行物、すなわち、それぞれが参照によりその全体が本明細書に組み込まれている"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とに示された仕様による「カテゴリ:浮動小数点」(FPUまたはレガシーのFPU)の命令の第1のセットと、「カテゴリ:ベクトル」(VMX)の命令の第2のセットと、「カテゴリ:VSX」の命令の第3のセットを含むPower Architecture(「PowerPC(R)」および「Power ISA(商標)」の名前でも知られる)の実装が提供される。"Power ISATM Version 2.05", InternationalBusiness Machines Corporation, October 23, 2007および"PowerISATM Version 2.06 Revision B", International Business MachinesCorporation, July 23, 2010のそれぞれは、参照によりその全体が本明細書に組み込まれている。
【0072】
浮動小数点プロセッサ機能に関する詳細な情報は、「Power ISATMVersion 2.05 - Chapter 4 - Floating-Point Processor [Category: Floating-Point]」で与えられている。VMXプロセッサ機能に関する詳細な情報は、「Power ISATM Version 2.05 - Chapter 6 - Vector Processor[Category: Vector]」で与えられている。VSXプロセッサ機能に関する詳細な情報は、参照によりその全体が本明細書に組み込まれている「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]」で与えられている。1つの例示的な実施形態によれば、「カテゴリ:10進浮動小数点」などの追加の命令のセットが、参照によりその全体が本明細書に組み込まれている「Power ISATM Version 2.05 - Chapter 5 - DecimalFloating-Point [Category: Decimal Floating-Point]」で詳細に説明されているように存在する可能性がある。
【0073】
本発明の一態様によれば、本明細書とともに含まれるRFC02182.r6およびChapter 7は、既に与えられていた32bスカラ命令とは異なる64b単精度スカラ命令を含む新しいVSX命令のセットを記載する。64bスカラ演算を設けたことは、同様に64bであるレガシーのスカラ演算とのさらなる互換性をもたらす。
【0074】
図7〜9は、1つまたは複数の例示的な実施形態の命令デコード・ユニットのデコード論理で実施され得る例示的なデコード操作の概要を示す流れ図である。流れ図の各ブロック、および流れ図のブロックの組み合わせは、コンピュータ・プログラム命令によって実装され得ることが理解されるであろう。これらのコンピュータ・プログラム命令は、プロセッサまたはその他のプログラム可能なデータ処理装置で実行される命令が流れ図の1つのブロックまたは複数のブロックで規定された機能を実施するための手段をもたらすように、プロセッサ、またはマシンを生産するためのその他のプログラム可能なデータ処理装置に与えられる可能性がある。これらのコンピュータ・プログラム命令は、コンピュータ可読メモリまたはストレージ媒体に記憶された命令が、流れ図の1つのブロックまたは複数のブロックで規定された機能を実施する命令手段を含む製品をもたらすように、プロセッサまたはその他のプログラム可能なデータ処理装置を特定の方法で機能させることができるコンピュータ可読メモリまたはストレージ媒体に記憶される可能性もある。
【0075】
したがって、流れ図のブロックは、規定された機能を実行するための手段の組み合わせ、規定された機能を実行するためのステップの組み合わせ、および規定された機能を実行するためのプログラム命令手段をサポートする。流れ図の各ブロック、および流れ図のブロックの組み合わせは、規定された機能もしくはステップを実行する専用のハードウェアに基づくコンピュータ・システムによって、または専用のハードウェアとコンピュータ命令との組み合わせによって実施され得ることも理解されるであろう。
【0076】
さらに、流れ図は、例示的な実施形態内で実行される操作を説明するために与えられる。流れ図は、特定の操作、またはより詳細には操作の順番に関する限定を示すかまたは示唆するように意図されていない。流れ図の操作は、本発明の精神および範囲から逸脱することなく特定の実装に合うように修正され得る。
【0077】
図7は、1つの例示的な実施形態による全体的なデコード操作の概要を示す流れ図である。図7に示されるように、操作は、命令フェッチ・ユニットからフェッチされた命令を受け取ることから始まる(STEP610)。フェッチされた命令のオペコードに基づいて、デコード論理が、フェッチされた命令がVSX命令であるかどうかを判定する(STEP615)。オペコードが命令がVSX命令(またはその他の選択されたタイプの命令)であると特定する場合、完全なレジスタ指定子(full register specifier)が、命令エンコーディングの1つまたは複数のフィールドから抽出される(STEP620)。命令は、いくつかのフィールドを有する命令ワードによって規定される。これらのフィールドは、例えば、オペコード・フィールド、いくつかのレジスタ指定子フィールド、およびセカンダリ・オペコード・フィールドを含む可能性がある。命令に対処するとき、命令デコーダは、どのタイプの命令に対処するかを判定する(これは、オペコードおよびセカンダリ・オペコード・フィールドを分析することによって行われる)可能性があり、通常は、レジスタのどのビットを使用すべきか(例えば、サブレンジ520、540、560を使用すべきであること)も示す。レジスタ指定子フィールドは、530、550、または570のうちのどのレジスタにアクセスすべきかを指定する。一実施形態において、レジスタ指定子フィールドのそれぞれは、5ビットの指定子、すなわち、狭い指定子(narrow specifier)を与える可能性がある。レジスタ・ファイルの64個のVSRレジスタのうちの1つを指定するための6ビットを与える追加のビットを提供するために、命令ワードに拡張フィールドが設けられる可能性がある。
【0078】
レジスタ・ファイル内の対応するレジスタが、それらのレジスタのデータ値を、処理のために適切な計算または機能ユニットに提供するようにアドレス指定され、すなわち、選択される(STEP625)。つまり、完全なレジスタ指定子がレジスタ・ファイルに与えられ、その結果、レジスタ・ファイルが、レジスタの組全体570のうちのどれを読み出すまたは書き込むべきかを知る。レジスタ指定子は、レジスタを特定するストレージ・アレイ内の「アドレス」である。
【0079】
オペランド・データ値が、計算/機能ユニットによって処理され(STEP630)、次に、計算または機能ユニットによる処理の結果が、レジスタ・ファイル内の対応するレジスタに書き戻される(STEP635)。書き戻すべき特定のレジスタは、やはり、レジスタ指定子によって指定される。
【0080】
フェッチされた命令のオペコードが命令がVSX命令(またはその他のタイプの命令)ではないことを示す場合(STEP615)、命令で使用するためのレジスタのサブセットと、場合によってはレジスタの幅全体の中のビットとを特定する狭いレジスタ指定子(narrow register specifier)が抽出される(STEP640)。そして、レジスタのビットの範囲全体に関する完全なレジスタ指定子が、命令のタイプおよび狭いビット範囲指定子(narrow bit range specifier)に基づいて生成される(STEP645)。つまり、1つまたは複数のビットが、完全なレジスタ指定子を生成するために狭いレジスタ指定子に追加される。追加されるべきビットは、レジスタ・ファイルのサブレンジと、それらがどのように定義されたかとに応じて決まる。例えば、レガシーのスカラ命令に関しては、5ビットのオペランド指定子、すなわち、狭いビット範囲指定子が、命令エンコーディングの各オペランドに対して与えられる。完全なレジスタ指定子は、例えば、示された例においては、頭に0を追加して、VSR0〜31にアクセスできるようにする6ビットの指定子を生成することによって生成される可能性がある。レガシーのベクトル命令に関しては、5ビットのオペランド指定子、すなわち、狭いレジスタ指定子が、命令エンコーディングの各オペランドに対して与えられる。完全なレジスタ指定子は、例えば、頭に1を追加して、VSR32〜63にアクセスできるようにする6ビットの指定子を生成することによって生成される可能性がある。VSX命令に関しては、6ビットのオペランド指定子、すなわち、完全なビット範囲指定子(full bit range specifier)が、命令エンコーディングの各オペランドに対して与えられ、したがって、レジスタ・ファイル内のVSRのすべてにアクセスするために修正は必要とされない。
【0081】
例示的な実施形態のうちの1つまたは複数の狭いレジスタ指定子および完全なレジスタ指定子は、レジスタ・ファイルの「複数アドレス指定可能な」性質をもたらし、「複数アドレス指定可能な」性質とは、異なる命令が実際に異なるアドレスを含み、デコードがレジスタ・ファイルの共有されたアドレス指定をオーバーレイし、使用するようにそれらの命令を適合させるという事実を指す。したがって、例えば、6ビットを有するVSXレジスタの完全なレジスタ指定子000000は、VSXレジスタ0を指す。5ビットの狭いレジスタ指定子00000を有するレガシーの浮動小数点命令は、VSRレジスタの初めの32個のレジスタをオーバーレイし、5ビットの狭いレジスタ指定子に「0」を加え、この特定の例においては000000を与えることによって得られるので、同じレジスタを指す。一方、5ビットのレガシーのVMXの狭いレジスタ指定子00000は、レジスタ32(VSR32から63の範囲内の最初のレジスタ)を指し、5ビットの指定子に「1」を加え、特定の例においては100000を与えることによって得られる。
【0082】
完全なレジスタ指定子が得られると、オペコードによって特定された命令のタイプに関連するレジスタのサブセット内のレジスタが、完全なレジスタ指定子に基づいてアドレス指定される(STEP650)。任意で、ビット幅が、レジスタのビットの第1の組が1つの命令のタイプ、例えば、レガシーのスカラ命令に関連付けられ、レジスタのビットの別の組が別の命令のタイプ、例えば、レガシーのベクトル命令に関連付けられるように、命令のタイプに基づいて決定される可能性がある。この機能は、上で説明されており、特定の実装に対して任意である。この機能は任意であるので、図7には明示されていない。
【0083】
次に、操作は、STEP630へと続き、アドレス指定されたレジスタからのデータ値、例えば、オペランド値が、処理のために計算/機能ユニットに与えられ(STEP630)、結果が、完全なレジスタ指定子を使用してレジスタのサブセット内のレジスタに書き戻される(STEP635)。そして、操作は終了する。
【0084】
図8および9は、1つの例示的な実施形態による1つの実装に関するデコード操作の一例の概要を示す流れ図を示す。図8および9に示されるように、操作は、やはり、命令フェッチ・ユニットからフェッチされた命令を受け取ることから始まる(STEP710)。フェッチされた命令のオペコードに基づいて、デコード論理が、フェッチされた命令がVSX命令(またはその他の選択されたタイプの命令)であるかどうかを判定する(INQUIRY715)。オペコードが命令がVSX命令であると特定する場合、広いビット範囲指定子(wide bit range specifier)が抽出される(STEP720)。広いビット範囲指定子は、レジスタの組全体570のうちのいずれもアドレス指定することができ、すなわち、レジスタ・ファイル全体がアドレス指定され、広いビット範囲指定子は、それらのレジスタ内のすべてのビットもアドレス指定することができる(STEP725)。対応するレジスタは、レジスタ・ファイル全体の中の任意のレジスタである可能性がある。次に、命令が、レジスタからのデータを使用して計算され、計算は、任意の入力および出力レジスタのペアに対して行われる(STEP730)。言い換えると、VSX命令は、レジスタ・ファイル内のレジスタのいずれかに対して作用し、レジスタの特定のサブレンジに限定されない。そして、計算の結果が、レジスタ・ファイル内の適切なレジスタに書き戻される(STEP735)。
【0085】
命令のオペコードが命令がVSX命令ではないことを示す場合(INQUIRY715)、デコード論理が、命令のオペコードが命令がスカラ命令、例えば、浮動小数点命令などであると特定するかどうかを判定する(INQUIRY740)(図9)。命令のオペコードが命令をスカラ命令として特定する場合、レジスタ・ファイル内のレジスタのサブセットと、任意で、レジスタのサブセットのレジスタ内のビットのサブセットとを特定する狭いビット範囲指定子が抽出される(STEP745)。完全なビット範囲指定子が、命令のタイプおよび狭いビット範囲指定子に基づいて生成される(STEP750)。狭いビット範囲指定子を用いてオペコードによって指定された命令のタイプに関連するレジスタのサブセット、例えば、レジスタのスカラのサブセットからデータが抽出される(STEP755)。データが、レジスタ・ファイル内のレジスタのスカラのサブセットに対応する入力および出力レジスタに基づいて結果を計算する計算/機能ユニットに与えられる(STEP760)。そして、計算の結果が、この命令のタイプのためのレジスタのサブセット、例えば、スカラのレジスタのサブセット内の適切なレジスタに書き戻される(STEP765)。
【0086】
命令のオペコードが命令がスカラ命令ではないことを示す場合(INQUIRY715)、やはり、レジスタ・ファイル内のレジスタのサブセットと、任意で、これらのレジスタ内のビットの別のサブセットとを示す狭いビット範囲指定子が抽出される(STEP770)。完全なビット範囲指定子が、命令のタイプ、例えば、ベクトル、SIMD、またはVMX命令と、狭いビット範囲指定子とに基づいて生成される(STEP775)。完全なビット範囲指定子を用いてオペコードによって指定された命令のタイプに関連するレジスタのサブセット、例えば、レジスタのベクトルのサブセットからデータが抽出される(STEP780)。データが、レジスタ・ファイル内のレジスタのベクトルのサブセットに対応する入力および出力レジスタに基づいて結果を計算する計算/機能ユニットに与えられる(STEP785)。そして、計算の結果が、この命令のタイプのためのレジスタのサブセット、例えば、ベクトルのレジスタのサブセット内の適切なレジスタに書き戻される(STEP790)。そして、操作は終了する。
【0087】
1つまたは複数の例示的な実施形態は複数の異なるタイプのアドレス指定モードを可能にするレジスタ・ファイルおよびデコード方法を提供することが、上述の説明から理解され得る。例えば、第1のアドレス指定モードにおいては、第1の命令のタイプ、例えば、VSX命令タイプに基づいてレジスタ・ファイル内のレジスタの組全体からすべてのオペランド・レジスタを選択するために不連続なエンコーディングが使用される。第2のアドレス指定モードにおいては、連続的なエンコーディングが使用され、レジスタ・ファイル内のレジスタの組全体のアドレス指定可能なオペランド・レジスタの第1の範囲が、第2の命令のタイプ、例えば、スカラ命令タイプに基づいて選択される。命令に関するオペランドのすべてが、アドレス指定可能なオペランド・レジスタの第1の範囲から得られるように、レジスタのアドレスが、オペランドのそれぞれに関して構築される。
【0088】
第3のアドレス指定モードにおいては、やはり、連続的なエンコーディングが使用され、アドレス指定可能なオペランド・レジスタの第2の範囲が、第3の命令のタイプ、例えば、ベクトル命令タイプに基づいてレジスタ・ファイル内のレジスタの組全体から選択される。命令に関するオペランドが、アドレス指定可能なオペランド・レジスタの第2の範囲から得られるように、レジスタのアドレスが、オペランドのそれぞれに関して構築される。一例において、オペランド・レジスタのこの第2の範囲は、オペランド・レジスタの第1の範囲とは異なり、したがって、第1の範囲内のレジスタは、オペランド・レジスタの第2の範囲内にない。
【0089】
1つまたは複数の例示的な実施形態は、単一のレジスタ・ファイルがレガシーのスカラ命令、レガシーのベクトル命令、およびベクトル−スカラ命令の処理で使用されることを可能にすることによって、知られているシステムおよびプロセッサのレジスタ・ファイルのアーキテクチャならびに命令デコード方法を改善する。このように、レガシーのスカラおよびベクトル命令が、ベクトル−スカラ命令に加えて処理される可能性があり、データ・フォーマットが、さまざまな命令のタイプの間で互換性を持つ。さらに、単一のレジスタ・ファイルが利用されているので、別々のレジスタ・ファイルの間の切り替えに関連するオーバーヘッドが回避される。1つまたは複数の例示的な実施形態によるレジスタの共有は、レジスタ・ファイルのチップ領域を小さくし、別々のレガシーのレジスタ・ファイルを構築することなく、レガシーのコードを維持しながら、統一されたレジスタ・ファイルが利用されることを可能にする。1つまたは複数の例示的な実施形態は、レガシーの命令と新しい/拡張された命令との間でデータを共有することを可能にし、すなわち、レガシーの命令はレジスタの第1の組530またはレジスタの第2の組550のうちの一方に書き込むことができ、VSX命令はレジスタの組全体570のうちのいずれかまたはすべてからの値を組み合わせることができる。
【0090】
本発明のさらなる態様においては、異なる表現の間の変換のための機能が与えられる。例として、プロデューサ命令(producer instruction)が1つのフォーマットであり、異なるフォーマットのコンシューマ命令(consumer instruction)によって消費されることになる結果を生成するとき、変換が行われる。1つの特定の態様においては、プロセッサで実行されるコンパイラが、図10を参照して説明されるように、プロデューサ命令とコンシューマ命令との間の不一致を判定し、適切な変換命令を挿入する。一例として、図10は、変換が必要であるか望ましいと判定し、変換命令を選択し、挿入するための論理の一実施形態を示す。一例において、それは、この論理を実行するコンパイラである。しかし、その他の実施形態においては、それは、プロセッサの、またはプロセッサで実行されるその他のコンポーネントまたはエンティティである可能性がある。
【0091】
図10を参照すると、最初に、複数の表現を有するデータ・タイプを用いる2つの命令の間の依存関係が選択される(STEP800)。つまり、互いに依存関係にある2つの命令(例えば、1つの命令が別の命令によって与えられる値または結果を使用することになる)が、処理のために選択される。選択された命令(例えば、プロデューサ命令およびコンシューマ命令)が同じ表現に対応するかどうかについての判定が行われる(INQUIRY802)。両方の命令が同じまたは互換性のある表現を有する場合、処理すべきさらなる依存関係が存在するかどうかについてさらに判定が行われる(INQUIRY804)。存在する場合、処理はSTEP800で継続する。
【0092】
INQUIRY802に戻って、プロデューサ命令およびコンシューマ命令が同じまたは互換性のある表現に対応しない場合、変換命令が、命令ストリームにおいて2つの命令の間に挿入される(STEP806)。変換命令は、命令のうちの一方(例えば、プロデューサ命令)のデータを他方の命令(例えば、コンシューマ命令)と互換性のあるフォーマットに変換するために使用される。一例において、変換されるべきデータは、(変換命令で特定される)複数アドレス指定可能なレジスタ・ファイルの1つのレジスタ内にあり、変換されたデータは、(やはり変換命令で示される)複数アドレス指定可能なレジスタ・ファイルの別のレジスタ(または同じレジスタ)に代入される。データを使用することになる命令は、そのレジスタから変換されたデータを取得する。一例においては、コンパイラが、プロデューサ命令およびコンシューマ命令に基づいて、変換命令によって使用されるべきレジスタを決定する。プロデューサ命令は、翻訳または変換されるべきデータを有するレジスタを示し、コンシューマ命令は、そのコンシューマ命令がデータを取得するために使用するレジスタを示す。処理は、INQUIRY804で継続する。
【0093】
一実施形態において、挿入される変換命令は、図11および12を参照してさらに詳細に説明されるように、1つまたは複数の基準に応じて決まる。図11は、ベクトルからスカラへの変換に関し、図12は、スカラからベクトルへの変換に関する。これらの技術のうちの1つが、変換のタイプ(例えば、ベクトル−スカラまたはスカラ−ベクトル)に応じて選択される。図11および12の論理を含むこの論理は、一例においては、コンパイラによって実行される。
【0094】
初めに図11を参照すると、所望のフォーマット変換が単精度のベクトル要素を単精度のスカラに変換することであるかどうかについての判定が行われる(INQUIRY900)。所望のフォーマット変換が単純なコピーであり、変換が単精度のベクトル要素から単精度のスカラへのものである場合、本明細書においてはXSCVSPDPNと呼ばれる変換命令が使用される(STEP902)。この命令は、単精度のベクトル要素(32ビット浮動小数点レジスタ・フォーマット)を単精度のスカラ(64ビット浮動小数点レジスタ・フォーマット)に変換する。この変換は、物理的なフォーマット変更とだけ見なされ、論理的な変更とは見なされず、したがって、例外が検出またはシグナリングされず、シグナリング非数(SNaN:signaling Not-a-Number)入力は、返される結果においてSNaNとして保存される。つまり、コンパイラの外のあらゆるエンティティまたはコンポーネントに対して透過的な変換が行われる。例外が生じない(すなわち検出またはシグナリングあるいはその両方が起こらない)ので、変換は、例外と無関係に(すなわち、例外がないときに、または例外がなくても)実行されると言われる。
【0095】
しかし、INQUIRY900に戻って、所望のフォーマット変換が単精度のベクトル要素を単精度のスカラ要素に変換することではない場合、本明細書においてはXSCVSPDP命令と呼ばれる異なる命令がこの実施形態において使用される(STEP904)。この命令は、単精度のベクトル要素(32ビット浮動小数点レジスタ・フォーマット)を倍精度のスカラ(64ビット浮動小数点レジスタ・フォーマット)に変換する。これは、真の論理的なフォーマット変更および物理的なフォーマット変更であると見なされ、したがって、無効演算例外(invalid operation exception)が検出され、シグナリングNaN(非数)としてシグナリングされる。SNaN値は、返される結果においてQNaN(クワイエットNaN(quiet NaN))に変換される。
【0096】
図12を参照すると、さらなる実施形態において、望まれているフォーマット変換が単精度のスカラ・データを単精度のベクトル要素に変換することであるかどうかについての判定が行われる(INQUIRY1000)。所望の変換が単純なコピーであり、単精度のスカラが単精度のベクトル要素に変換されるべきである場合、値のコピーのベクトルが生成されるべきかどうかについてのさらなる判定が行われる(INQUIRY1002)。値のコピーのベクトルが生成されるべきでない場合、本明細書においてはXSCVDPSPNと呼ばれる命令が使用され、この命令は、単精度のスカラ(64ビット浮動小数点レジスタ・フォーマット)を単精度のベクトル要素(32ビット浮動小数点レジスタ・フォーマット)に変換する(STEP1004)。これは、物理的なフォーマット変更とだけ見なされ、論理的な変更とは見なされず、したがって、例外が検出またはシグナリングされず、SNaN値は、返される結果においてSNaNとして保存される。やはり、変換は、透過的であり、例外とは無関係に実行される。しかし、INQUIRY1002に戻って、値のコピーのベクトルが生成されるべきである場合(INQUIRY1002)、本明細書においてはXSCVSSPVSPSPLTと呼ばれる命令が使用される(STEP1006)。これは、単精度のスカラ(64ビット浮動小数点レジスタ・フォーマット)を単精度のベクトル要素(32ビット浮動小数点レジスタ・フォーマット)に変換し、4つのベクトル要素すべてに複製する。やはり、これは、物理的なフォーマット変更とだけ見なされ、例外が検出またはシグナリングされず、SNaN入力は、返される結果においてSNaNとして保存される。
【0097】
INQUIRY1000に戻ると、所望のフォーマット変換が単精度のスカラの単精度のベクトル要素への変換ではない場合、本明細書においてはXSCVDPSPと呼ばれる命令が使用される(STEP1008)。この命令は、倍精度のスカラ(64ビット浮動小数点レジスタ・フォーマット)を単精度のベクトル要素(32ビット浮動小数点レジスタ・フォーマット)に変換する。この場合、変換は、真の論理的なフォーマット変更および物理的なフォーマット変更であると見なされ、したがって、無効演算例外が検出され、シグナリング非数オペランドとしてシグナリングされる。SNaN値は、返される結果においてQNaNに変換される。
【0098】
1つまたは複数の実施形態で使用され得るいくつかの変換命令が、上で説明された。これらの命令に関するさらなる詳細は、以下に、およびこの説明の一部として含まれる「RFC02242.r3: BFP/VSX Miscellaneous Operations」に記載されている。
【0099】
まず、XSCVSPDPN命令に関するさらなる詳細が与えられる。一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールドの拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド)と、第1のレジスタを指定する第1のフィールド(例えば、Tフィールド)および第1のビット(例えば、TXフィールド、連結される)と、第2のレジスタを指定する第2のフィールド(例えば、Bフィールド)および第2のビット(例えば、BXフィールド、連結される)とを含む。サンプルの擬似コードは、以下のようになる。
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
【0100】
XTに、Tと連結された値TXを代入する。
【0101】
XBに、Bと連結された値BXを代入する。
【0102】
srcに、VSR[XB]のワード要素0内の単精度浮動小数点値を代入する。
【0103】
srcが、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。SNaN値のエンコーディングは、保存される(すなわち、QNaNに変換されない)。
【0104】
VSR[XT]のダブルワード要素1の内容は、未定義である。
【0105】
変更される特殊レジスタ
なし
【0106】
XSCVSPDPNに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜31が、SPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63が、DPを含む
【0107】
さらに、32ビット単精度ベクトル要素を64ビット単精度スカラに変換するためのコード・スニペットの例が、以下に与えられる。
【0108】
Cソース
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
【0109】
さらに、XSCVSPDP命令に関する詳細が、以下で説明される。一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールドの拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド)と、第1のレジスタを指定する第1のフィールドおよび(例えば、連結される)第1のビットと、第2のレジスタを指定する第2のフィールドおよび(例えば、連結される)第2のビットとを含む。サンプルの擬似コードは、以下のようになる。
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
【0110】
XTに、Tと連結された値TXを代入する。
【0111】
XBに、Bと連結された値BXを代入する。
【0112】
srcに、VSR[XB]のワード要素0内の単精度浮動小数点値を代入する。
【0113】
srcがSNaNである場合、結果は、QNaNに変換されたsrcである(すなわち、srcのビット9が1に設定される)。VXSNANが、1に設定される。
【0114】
それ以外の場合、結果はsrcである。
【0115】
結果が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
【0116】
VSR[XT]のダブルワード要素1の内容は、未定義である。
【0117】
FPRFが、結果のクラスおよび符号に設定される。FRが、0に設定される。FIが、0に設定される。
【0118】
トラップ可能な無効演算例外が発生する場合、VSR[XT]が修正されず、FPRFが修正されず、FRが0に設定され、FIが0に設定される。
【0119】
変更される特殊レジスタ
【0120】
FPRF FR←0b0 FI←0b0 FX VXSNAN
【0121】
XSCVSPDPに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜31が、SPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜64が、DPを含む
【0122】
さらに、XSCVDPSPN命令に関する詳細が、以下で説明される。一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールドの拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド)と、第1のレジスタを指定する第1のフィールドおよび(例えば、連結される)第1のビットと、第2のレジスタを指定する第2のフィールドおよび(例えば、連結される)第2のビットとを含む。サンプルの擬似コードは、以下のようになる。
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
【0123】
XTに、Tと連結された値TXを代入する。
【0124】
XBに、Bと連結された値BXを代入する。
【0125】
srcに、倍精度フォーマットで表されたVSR[XB]のダブルワード要素0内の単精度浮動小数点値を代入する。
【0126】
srcが、VSR[XT]のワード要素0に単精度フォーマットで代入される。SNaN値のエンコーディングは、保存される(すなわち、QNaNに変換されない)。
【0127】
VSR[XT]のワード要素1、2、および3の内容は、未定義である。
【0128】
変更される特殊レジスタ
なし
【0129】
xscvdpspnに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜63が、SPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜31が、SPを含む
【0130】
さらに、XSCVSSPVSPSPLT命令に関する詳細が、以下で説明される。一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールドの拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド)と、第1のレジスタを指定する第1のフィールド(例えば、Tフィールド)および第1のビット(例えば、TXビット、連結される)と、第2のレジスタを指定する第2のフィールド(例えば、Bフィールド)および第2のビット(例えば、BXビット、連結される)とを含む。サンプルの擬似コードは、以下のようになる。
reset_xflags()
src ←VSR[32xBX+B].dword[0]
result ←ConvertDPtoSP_NS(src)
do i = 0 to 3
VSR[32xTX+T].word[i] ← result
end
【0131】
XTに、Tと連結された値TXを代入する。
【0132】
XBに、Bと連結された値BXを代入する。
【0133】
srcに、倍精度フォーマットで表されたVSR[XB]のダブルワード要素0内の単精度浮動小数点値を代入する。SNaN値のエンコーディングは、保存される(すなわち、QNaNに変換されない)。
【0134】
srcが、VSR[XT]の各ワード要素に単精度フォーマットで代入される。
【0135】
変更される特殊レジスタ
【0136】
なし
【0137】
xscvsspvspspltに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜63が、SPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜31、ビット32〜63、ビット64〜96、およびビット97〜127が、SPを含む
【0138】
さらに、複製(splat)を用いて64ビット単精度スカラを32ビット単精度ベクトル要素に変換するためのコード・スニペットの例が、以下で説明される。
【0139】
Cソース
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
【0140】
さらに、XSCVDPSPに関する詳細が、以下に与えられる。一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールドの拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド)と、第1のレジスタを指定する第1のフィールド(例えば、Tフィールド)および第1のビット(例えば、TXビット、連結される)と、第2のレジスタを指定する第2のフィールド(例えば、Bフィールド)および第2のビット(例えば、BXビット、連結される)とを含む。サンプルの擬似コードは、以下のようになる。
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
【0141】
XTに、Tと連結された値TXを代入する。
【0142】
XBに、Bと連結された値BXを代入する。
【0143】
srcに、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
【0144】
srcがSNaNである場合、結果は、QNaNに変換されたsrcである(すなわち、srcのビット12が1に設定される)。VXSNANが、1に設定される。
【0145】
そうではなく、srcがQNaN、無限大、またはゼロである場合、結果はsrcである。
【0146】
それ以外の場合、結果は、RNによって指定された丸めモードを使用して単精度に丸められたsrcである。
【0147】
結果が、VSR[XT]のワード要素0に単精度フォーマットで代入される。
【0148】
VSR[XT]のワード要素1、2、および3の内容は、未定義である。
【0149】
FPRFが、結果のクラスおよび符号に設定される。FRが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。FIが、結果が厳密でないことを示すように設定される。
【0150】
トラップ可能な無効演算例外が発生する場合、VSR[XT]およびFPRFが修正されず、FRおよびFIが0に設定される。
【0151】
変更される特殊レジスタ
【0152】
FPRF FR FI FX OX UX XX VXSNAN
【0153】
xscvdpspに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜63が、DPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜31が、SPを含む
【0154】
64ビット表現を使用するスカラ単精度数に対する計算を行う命令および32ビット表現を使用するベクトル単精度数に対する計算を行う命令をサポートする拡張されたVSX機能が、本明細書において詳細に説明される。第1の表現から第2の表現への翻訳を行うための機能が、さらに提供される。第1の実施形態においては、64ビット演算から32ビット演算へ、および32ビット演算から64ビット演算への明示的な変換が使用される。第2の実施形態においては、倍精度/単精度変換を使用して単精度数の32ビット表現と64ビット表現との間の変換を行うことによって単精度表現の間の変換を行うための命令が使用され、単精度数の64ビット表現は倍精度演算と同様の形態である。さらなる実施形態においては、変換操作が、32ビット単精度値が複数の要素の位置に複製されるsplat機能も提供する。一実施形態において、変換操作は、32ビット単精度値が位置インジケータによって複数の要素の位置から選択される選択機能も提供する。
【0155】
1つまたは複数の態様によれば、複数の設計された表現が使用される。演算の第1のモードにおいて64ビット単精度数を含め、特定し、演算の第2のモードにおいて32ビット単精度数を含め、特定するための機能が提供される。第1および第2のエンコーディングを表す第1および第2のレガシーのエンコーディングと互換性がある形で相互運用するために必要とされる演算のタイプに基づいて第1および第2の演算を特定するための機能が提供される。第1の表現と第2の表現との間の翻訳を行う技術が、提供される。
【0156】
1つの表現と別の表現との間の変換を行うことにより、境界条件を調べる必要をなくすことによって、実行の複雑性が削減され得る。さらに、1つのデータ表現を別のデータ表現に変換するための変換命令を挿入することによって、エンコードされるべき命令の数、デコード論理、および実装のコストが削減される。
【0157】
1つまたは複数の態様によれば、ベクトル計算のために使用される32ビット単精度表現とスカラ計算を使用する単精度浮動小数点の64ビット表現との混合が可能にされる。新しい単精度から単精度へのフォーマット変換命令が、1つの64ビット・フォーマットから別の32ビット・フォーマットに変換するため、またはその逆の変換を行うために提供される。さらに、64ビット単精度から32ビット単精度に変換する変換命令と、ベクトル−スカラ計算でよくある操作である、同じ値がレジスタで4回複製される複製とが、提供される。このタイプの変換は計算命令ではないので、変換は、シグナリングの特徴とは無関係に実行される。
【0158】
さらに、同じ32ビット単精度浮動小数点データ・タイプに関して2つの異なる浮動小数点表現を使用する計算を容易にするためのコンパイラ技術が、提供される。コンパイラは、データが使用されるときに、そのデータがさまざまな表現のうちのどれかである可能性があり、使用されるデータが命令によって使用される適切なフォーマットであることを保証するためのチェックが実行されるべきであると認識するように拡張される。これは、各命令をデータ・タイプに関連付けることによって実現され、結果を生成する命令のデータ・タイプは、結果を使用する命令のデータ・タイプと同じでなくてはならない。そうではない場合、変換が挿入される。フォーマット変換は、例外を設定せずにレジスタからレジスタへ直接実行される。
【0159】
一態様においては、各浮動小数点数の2つの異なる表現を含むことができる浮動小数点レジスタが、使用される。命令は、どのタイプの浮動小数点数が命令のオペランドとして使用されるべきかを指定し、存在する場合、表現のうちの選択された1つからオペランドを取得/記憶する。また、コンパイラは、浮動小数点レジスタを知っており、浮動小数点レジスタが誤った表現を含むとき、必要に応じて変換命令を挿入する。
【0160】
1つの特定の例においては、(複数アドレス指定可能なレジスタ・ファイルである可能性がある)あるレジスタ・クラスのレジスタ内の第1の設計されたフォーマット(例えば、Power ISAの定義によるSP64 64ビット幅単精度バイナリ浮動小数点フォーマット)からレジスタ・ファイル・フォーマットに関する第2の設計されたフォーマット(例えば、IEEE 754メモリ・フォーマットの定義および同様のPower ISAの定義によるSP32 32ビット幅単精度バイナリ浮動小数点フォーマット)に変換する命令が、提供される。
【0161】
SP64からSP32への変換は、例えば、アーキテクチャの定義にしたがってコンパイラによって異なる内部フォーマットを維持することに対応するために使用され、それぞれの数は、例えば、厳密に一致する(SP64からSP32へのフォーマット変換)。これは、ユーザ定義の操作であるDP(倍精度)からSPへの変換とは異なる。
【0162】
例えば、DPからSPへの変換は、SPフォーマットの表現を持たないDPの数に関してさえも、DPの数をSPの数にマッピングする必要がある。DPからSPへの変換は、(切り捨て、0への丸め、負の無限大への丸め、正の無限大への丸め、ゼロから遠ざける丸め、偶数への丸め、奇数への丸め、その他多数などの多くの可能な丸めモードのうちの1つによる)余分な仮数ビットの丸めと、DPでは表現できるが、SPでは表現できない小さな数のゼロへのフラッシュ(flush)と、DPでは表現できるが、SPでは表現できない大きな数の正の無限大または負の無限大への飽和とを実行することによってこれを行うことができる。それに比べて、SP64からSP32への変換は、一例においては、SPの数に対してのみ作用し、したがって、少なくとも1つの実施形態において、SP64からSP32への変換の操作は、入力が、表現可能なIEEE SP浮動小数点の範囲内にないとき、未定義である。準拠したハードウェアは、この実施形態の一態様によれば、選択したことを何でも行うことができ、範囲外の(不正な)SP64ビット入力を、あたかもその入力がDPの数であるかのように扱い、その入力を丸めることを選択する可能性があり、範囲外の数に対して規定の割り込み(specification interrupt)を起こすことを選択する可能性があり、ランダムな結果を生成することを選択する可能性があり、または結果をまったく生成しない可能性がある。
【0163】
別の例として、DPからSPへの変換は、データ・タイプ変換のためのユーザ指定の命令であり、このユーザ指定の命令の定義にしたがって、SNaN(すなわち、シグナリングNaN、ここで、NaNは、IEEE規格による非数の指示である)が例外を発生させるべきである。また、一実施形態において、このユーザ指定の命令は、数の変換中に算術的な条件(例えば、アンダーフローまたはオーバーフロー)に対して例外を設定するように定義される可能性がある。それに比べて、SP64からSP32への変換は、ハードウェアを利用する、コンパイラの内部動作に対応するフォーマット変換である。一例において、SP64ビット・フォーマットのそれぞれの有効なデータ点(data point)は、SP32フォーマットの1つのデータ点に厳密に対応する。任意のそのようなデータ点が入力として与えられる(そしてSNaNを明確に含む)とき、データ点は、1つのフォーマットの表現から第2の表現にマッピングされ、割り込みを生じない。
【0164】
一実施形態において、適切な単精度数は、第1の設計されたレジスタ・フォーマットから第2のレジスタ・フォーマットに直接変換され、命令が完了され、変換された結果が、IEEE単精度浮動小数点数または非数入力に対する目標レジスタに書き込まれる。一例において、シグナリングNaNは、目標レジスタにおいてシグナリングNaNとして保存される。
【0165】
当業者に理解されるであろうように、本発明の1つまたは複数の態様は、システム、方法、またはコンピュータ・プログラム製品として具現化され得る。したがって、本発明の1つまたは複数の態様は、すべてハードウェアの実施形態、すべてソフトウェアの実施形態(ファームウェア、常駐ソフトウェア、マイクロコードなどを含む)、またはすべてが概して本明細書において「回路」、「モジュール」、もしくは「システム」と呼ばれることがあるソフトウェアの態様とハードウェアの態様とを組み合わせる実施形態の形態をとる可能性がある。さらに、本発明の1つまたは複数の態様は、コンピュータ可読プログラム・コードを具現化する1つまたは複数のコンピュータ可読媒体で具現化されたコンピュータ・プログラム製品の形態をとる可能性がある。
【0166】
1つまたは複数のコンピュータ可読媒体の任意の組み合わせが、利用される可能性がある。コンピュータ可読媒体は、コンピュータ可読ストレージ媒体である可能性がある。コンピュータ可読ストレージ媒体は、例えば、電子、磁気、光、電磁、赤外線、または半導体システム、装置、もしくはデバイス、あるいはこれらの任意の好適な組み合わせである可能性があるが、これらに限定されない。コンピュータ可読ストレージ媒体のより詳細な例(非網羅的なリスト)には、以下、すなわち、1つもしくは複数の配線を有する電気的な接続、ポータブル・コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ(RAM)、読み出し専用メモリ(ROM)、消去可能プログラマブル読み出し専用メモリ(EPROMもしくはフラッシュ・メモリ)、光ファイバ、ポータブル・コンパクト・ディスク読み出し専用メモリ(CD−ROM)、光ストレージ・デバイス、磁気ストレージ・デバイス、またはこれらの任意の好適な組み合わせが含まれる。本明細書の文脈において、コンピュータ可読ストレージ媒体は、命令実行システム、装置、もしくはデバイスによって、または命令実行システム、装置、もしくはデバイスに関連して使用するためのプログラムを含むまたは記憶することができる任意の有形の媒体である可能性がある。
【0167】
ここで図13を参照すると、一例において、コンピュータ・プログラム製品1100が、例えば、本発明の1つまたは複数の態様を提供し、助けるために、コンピュータ可読プログラム・コード手段または論理1104を記憶するための1つまたは複数の非一時的コンピュータ可読ストレージ媒体1102を含む。
【0168】
コンピュータ可読媒体上に具現化されるプログラム・コードは、無線、有線、光ファイバ・ケーブル、RFなど、またはこれらの任意の好適な組み合わせを含むがこれらに限定されない任意の適切な媒体を用いて送信される可能性がある。
【0169】
本発明の1つまたは複数の態様の動作を実行するためのコンピュータ・プログラム・コードは、Java(R)、Smalltalk、C++などのオブジェクト指向プログラミング言語と、「C」プログラミング言語、アセンブラ、または同様のプログラミング言語などの通常の手続き型プログラミング言語とを含む1つまたは複数のプログラミング言語の任意の組み合わせで記述され得る。プログラム・コードは、すべてユーザのコンピュータ上で、スタンドアロンのソフトウェア・パッケージとしてユーザのコンピュータ上で部分的に、ユーザのコンピュータ上で部分的にかつ遠隔のコンピュータ上で部分的に、またはすべて遠隔のコンピュータもしくはサーバ上で実行され得る。最後の場合では、遠隔のコンピュータが、ローカル・エリア・ネットワーク(LAN)もしくは広域ネットワーク(WAN)を含む任意の種類のネットワークを介してユーザのコンピュータに接続され得るか、または外部コンピュータへの接続が(例えば、インターネット・サービス・プロバイダを使用してインターネットを介して)行われ得る。
【0170】
本発明の1つまたは複数の態様が、本発明の実施形態による方法、装置(システム)、およびコンピュータ・プログラム製品の流れ図または構成図あるいはその両方を参照して、本明細書において説明されている。流れ図または構成図あるいはその両方の各ブロック、および流れ図または構成図あるいはその両方のブロックの組み合わせは、コンピュータ・プログラム命令によって実装され得ることが理解されるであろう。これらのコンピュータ・プログラム命令は、コンピュータまたはその他のプログラム可能なデータ処理装置のプロセッサによって実行される命令が、流れ図または構成図あるいはその両方の1つのブロックまたは複数のブロックで規定された機能/動作を実施するための手段をもたらすように、多目的コンピュータ、専用コンピュータ、またはマシンを生産するためのその他のプログラム可能なデータ処理装置のプロセッサに与えられる可能性がある。
【0171】
これらのコンピュータ・プログラム命令は、コンピュータ可読媒体に記憶された命令が、流れ図または構成図あるいはその両方の1つのブロックまたは複数のブロックで規定された機能/動作を実施する命令を含む製品をもたらすように、コンピュータ、その他のプログラム可能なデータ処理装置、またはその他のデバイスを特定の方法で機能させることができるコンピュータ可読媒体に記憶される可能性もある。
【0172】
コンピュータ・プログラム命令は、コンピュータまたはその他のプログラム可能な装置で実行される命令が、流れ図または構成図あるいはその両方の1つのブロックまたは複数のブロックで規定された機能/動作を実施するためのプロセスを提供するように、コンピュータで実施されるプロセスを生成するために一連の操作のステップがコンピュータ、その他のプログラム可能な装置、またはその他のデバイスで実行されるようにするために、コンピュータ、その他のプログラム可能なデータ処理装置、またはその他のデバイスにロードされる可能性もある。
【0173】
図面の流れ図および構成図は、本発明の1つまたは複数の態様のさまざまな実施形態によるシステム、方法、およびコンピュータ・プログラム製品のあり得る実装のアーキテクチャ、機能、および動作を示す。これに関連して、流れ図または構成図の各ブロックは、(1つまたは複数の)規定された論理的な機能を実装するための1つまたは複数の実行可能命令を含むモジュール、セグメント、またはコードの一部を表す可能性がある。一部の代替的な実装においては、ブロックで示された機能が、図面に示された順序とは異なる順序で行われる可能性があることにも留意されたい。例えば、連続で示された2つのブロックが、実際には実質的に同時に実行される可能性があり、またはそれらのブロックが、関連する機能に応じて逆順に実行されることもあり得る。構成図または流れ図あるいはその両方の各ブロックと、構成図または流れ図あるいはその両方のブロックの組み合わせとは、規定された機能もしくは動作を実行する専用のハードウェアに基づくシステム、または専用のハードウェアとコンピュータ命令との組み合わせによって実装され得ることも認められるであろう。
【0174】
上記に加えて、本発明の1つまたは複数の態様は、顧客の環境の管理を請け負うサービス・プロバイダによって与えられ、提供され、配置され、管理され、サービスを提供される可能性などもある。例えば、サービス・プロバイダは、1人または複数の顧客のために本発明の1つまたは複数の態様を実行するコンピュータ・コードまたはコンピュータ・インフラストラクチャあるいはその両方を作成し、保守し、サポートする可能性などもある。その見返りに、サービス・プロバイダは、例として、加入または料金あるいはその両方の取り決めの下で顧客から支払いを受ける可能性がある。追加的にまたは代替的に、サービス・プロバイダは、1つまたは複数の第三者への広告コンテンツの販売から支払いを得る可能性がある。
【0175】
本発明の一態様においては、本発明の1つまたは複数の態様を実行するためのアプリケーションが配置される可能性がある。一例として、アプリケーションの配置は、本発明の1つまたは複数の態様を実行するように動作可能なコンピュータ・インフラストラクチャを提供することを含む。
【0176】
本発明のさらなる態様として、コンピュータ可読コードをコンピューティング・システムに統合することを含むコンピューティング・インフラストラクチャが配置される可能性があり、コードは、コンピューティング・システムと一緒に、本発明の1つまたは複数の態様を実行することができる。
【0177】
本発明のさらなる態様として、コンピュータ可読コードをコンピュータ・システムに統合することを含むコンピューティング・インフラストラクチャを統合するためのプロセスが、提供される可能性がある。コンピュータ・システムは、コンピュータ可読媒体を含み、コンピュータ媒体は、本発明の1つまたは複数の態様を含む。コードは、コンピュータ・システムと一緒に、本発明の1つまたは複数の態様を実行することができる。
【0178】
さまざまな実施形態が上に記載されているが、これらは例であるに過ぎない。例えば、その他のアーキテクチャのコンピューティング環境が、本発明の1つまたは複数の態様を組み込み、使用することができる。さらに、本発明の1つまたは複数の態様は、複数の表現を有する任意のフォーマットに当てはまる。1つの具体的な例として、1つまたは複数の態様は、64ビット倍精度フォーマットと128ビット倍精度フォーマットとの両方をサポートする4倍精度(128ビット)浮動小数点拡張の定義に当てはまる可能性がある。1つまたは複数の態様は、データ・タイプに関して異なるフォーマットの定義をサポートする複数の拡張を1つにまとめることに当てはまる可能性がある。さらには、その他の命令が、本発明の精神から逸脱することなく使用され得る。
【0179】
さらに、その他の種類のコンピューティング環境が、本発明の1つまたは複数の態様から恩恵を受ける可能性がある。例として、環境がエミュレータ(例えば、ソフトウェアまたはその他のエミュレーション・メカニズム)を含む可能性があり、(例えば、命令の実行、アドレス変換などの設計された機能、および設計されたレジスタを含む)特定のアーキテクチャまたはそのアーキテクチャのサブセットが(例えば、プロセッサおよびメモリを有するネイティブのコンピュータ・システム上で)エミュレートされる。そのような環境においては、エミュレータを実行するコンピュータが、エミュレートされている機能とは異なるアーキテクチャを有する可能性があるとしても、エミュレータの1つまたは複数のエミュレーション機能が、本発明の1つまたは複数の態様を実施することができる。一例として、エミュレーション・モードにおいては、エミュレートされている特定の命令または操作が、デコードされ、適切なエミュレーション機能が、個々の命令または操作を実施するために構築される。
【0180】
エミュレーション環境においては、ホスト・コンピュータが、例えば、命令およびデータを記憶するためのメモリと、メモリから命令をフェッチし、任意で、フェッチされた命令に関するローカルのバッファリングを行うための命令フェッチ・ユニットと、フェッチされた命令を受け取り、フェッチされた命令のタイプを判定するための命令デコード・ユニットと、命令を実行するための命令実行ユニットとを含む。実行は、デコード・ユニットによって判定されたように、メモリからレジスタにデータをロードすること、逆にレジスタからメモリにデータを記憶すること、または何らかのタイプの算術もしくは論理演算を実行することを含む可能性がある。一例において、各ユニットは、ソフトウェアで実装される。例えば、ユニットによって実行される操作は、エミュレータ・ソフトウェア内の1つまたは複数のサブルーチンとして実装される。
【0181】
さらなる例として、システム・バスを通じてメモリ要素に直接的または間接的に結合された少なくとも1つのプロセッサを含む、プログラム・コードの記憶または実行あるいはその両方に好適なデータ処理システムが、使用可能である。メモリ要素は、例えば、プログラム・コードの実際の実行中に使用されるローカル・メモリと、大容量ストレージと、実行中に大容量ストレージからコードが取得されなければならない回数を減らすために少なくとも一部のプログラム・コードの一時的な記憶を行うキャッシュ・メモリとを含む。
【0182】
(キーボード、ディスプレイ、ポインティング・デバイス、DASD、テープ、CD、DVD、サム・ドライブ、およびその他のメモリ媒体などを含むがこれらに限定されない)入力/出力またはI/Oデバイスが、直接か、または介在するI/Oコントローラを通じてかのどちらかでシステムに結合される可能性がある。介在するプライベートまたはパブリック・ネットワークを通じてデータ処理システムがその他のデータ処理システムまたは遠隔のプリンタもしくはストレージ・デバイスに結合されるようになることを可能にするために、ネットワーク・アダプタもシステムに結合される可能性がある。モデム、ケーブル・モデム、およびイーサネット(R)・カードは、利用可能なタイプのネットワーク・アダプタのほんの一部である。
【0183】
本明細書で使用された用語は、特定の実施形態を説明することのみを目的としており、本発明を限定するように意図されていない。本明細書において使用されるとき、単数形「a」、「an」、および「the」は、文脈がそうでないことをはっきりと示さない限り複数形も含むように意図される。用語「含む(comprises)」または「含む(comprising)」あるいはその両方は、本明細書において使用されるとき、言及された特徴、整数(integer)、ステップ、操作、要素、またはコンポーネントあるいはこれらすべての存在を指定するが、1つまたは複数のその他の特徴、整数、ステップ、操作、要素、コンポーネント、またはこれらのグループあるいはその両方の存在または追加を除外しないことがさらに理解されよう。
【0184】
以下の特許請求の範囲のすべてのミーンズまたはステップ・プラス・ファンクション要素(meansor step plus function element)の対応する構造、材料、動作、および等価なものは、もしあれば、明確に特許請求されたその他の特許請求された要素と組み合わせて機能を実行するための任意の構造、材料、または動作を含むように意図される。本発明の説明が、例示および説明を目的として示されたが、網羅的であるように、または開示された形態の本発明に限定されるように意図されていない。多くの修正および変更が、本発明の範囲および精神から逸脱することなく当業者に明らかになる。実施形態は、本発明の原理および実際の応用を最もよく説明し、考えられる特定の用途に適するさまざまな修正を加えたさまざまな実施形態に関して当業者が本発明を理解することを可能にするために選択され、説明された。
RFC02182.r6 - VSX Scalar Single-Precision
スカラ倍精度浮動小数点データは、VSRおよびストレージ内で倍精度フォーマットで表現される。
ベクトル倍精度浮動小数点データは、VSRおよびストレージ内で倍精度フォーマットで表現される。
スカラ単精度浮動小数点データは、VSR内では倍精度フォーマットで表現され、ストレージ内では単精度フォーマットで表現される。
ベクトル単精度浮動小数点データは、VSRおよびストレージ内で単精度フォーマットで表現される。
倍精度のオペランドが、倍精度スカラ算術演算のための入力として使用され得る。
倍精度のオペランドが、オーバーフローおよびアンダーフロー例外のトラップが無効化されるときに単精度スカラ算術演算のための入力として使用され得る。
単精度のオペランドが、倍精度および単精度スカラ算術演算のための入力として使用され得る。
倍精度のオペランドが、倍精度ベクトル算術演算のための入力として使用され得る。
単精度のオペランドが、単精度ベクトル算術演算のための入力として使用され得る。
倍精度または単精度を必要としない操作のための命令も、提供される。加えて、VSR内の整数表現にアクセスするための命令が、提供される。
単精度スカラ・データに関して、単精度フォーマットから倍精度フォーマットへの変換が、ストレージからVSRへのロードのときに実行され、倍精度フォーマットから単精度フォーマットへの変換が、VSRからストレージへの記憶のときに実行される。浮動小数点例外は、これらの命令によって引き起こされない。
VSR内のスカラおよびベクトル・データに関して単精度フォーマットと倍精度フォーマットとの間の変換を行うための命令が、提供される。
VSR内の倍精度フォーマットのオペランドを単精度に明示的に変換するための命令が、提供される。スカラ単精度浮動小数点は、6つのタイプの命令で有効化される。
1.スカラをロード・単精度
この形態の命令は、ストレージ内の単精度フォーマットの浮動小数点オペランドにアクセスし、それを倍精度フォーマットに変換し、それをVSRにロードする。浮動小数点例外は、これらの命令によって引き起こされない。
2.スカラの単精度への丸め
xsrspは、倍精度のオペランドを単精度に丸め、単精度の範囲に関して指数を調べ、それぞれの有効化ビットにしたがって任意の例外を処理し、そのオペランドをVSRに倍精度フォーマットで代入する。単精度の計算命令、単精度のロード、およびxsrspのその他の場合によって生成された結果に関して、xsrspは値を変更しない。オーバーフローが有効化されている(OE=1である)ときに絶対値が2319を超える値は、正規化された範囲に尺度を戻すことができないので、未定義の結果を生じる。アンダーフローが有効化されている(UE=1である)ときに絶対値が2−318よりも小さい値は、正規化された範囲に尺度を戻すことができないので、未定義の結果を生じる。
3.スカラの単精度から倍精度への変換
xscvspdpは、変換元VSRのワード要素0からの単精度フォーマットの浮動小数点オペランドにアクセスし、それを倍精度フォーマットに変換し、それを変換先VSRのダブルワード要素0に代入する。
4.スカラの倍精度から単精度への変換
xscvdpspは、変換元VSRのダブルワード要素0内の倍精度浮動小数点値を単精度に丸め、結果を、変換先VSRのワード要素0に単精度フォーマットで代入する。この機能は、スカラ浮動小数点データを、単精度ベクトル演算と互換性のあるフォーマットに移植するために使用される。オーバーフローが有効化されている(OE=1である)ときに絶対値が2319を超える値は、正規化された範囲に尺度を戻すことができないので、未定義の結果を生じる。アンダーフローが有効化されている(UE=1である)ときに絶対値が2−318よりも小さい値は、正規化された範囲に尺度を戻すことができないので、未定義の結果を生じる。
5.VSXスカラの単精度の計算
この形態の命令は、倍精度フォーマットのVSRからのオペランドを取得し、あたかも演算が無限の精度および限界のない指数範囲を有する中間結果を生成するかのように演算を実行し、それから、この中間結果を強制的に単精度フォーマットに合わせる。FPSCRと、任意で、条件レジスタとの状態ビットが、単精度の結果を反映するように設定される。次に、結果が、変換先VSRに倍精度フォーマットで入れられる。結果は、単精度フォーマットによってサポートされる範囲内にある。
何らかの入力値が単精度フォーマットで表現できず、OE=1であるか、またはUE=1である場合、変換先VSRに入れられる結果と、FPSCRの状態ビットの設定とは、未定義である。
xsrespまたはxsrsqrtespの入力値が単精度フォーマットで表現できない場合、変換先VSRに入れられる結果と、FPSCRの状態ビットの設定とは、未定義である。
6.VSXスカラを記憶・単精度
stxsspxは、倍精度フォーマットである単精度値を単精度フォーマットに変換し、そのオペランドをストレージに記憶する。浮動小数点例外は、stxsspxによって引き起こされない。(記憶される値は、実際には、前の5つのタイプのうちの1つの命令の結果であると想定される。)
VSXスカラをロード・単精度(lxsspx)、VSXスカラの単精度への丸め(xsrsp)、またはVSXスカラの単精度の計算[1](VSX ScalarSingle-Precision Arithmetic[1])命令の結果がVSRに記憶されるとき、FRACTIONの下位29ビットはゼロである。VSXスカラの単精度の計算命令:xsaddsp、xsdivsp、xsmulsp、xsresp、xssubsp、xsmaddasp、xsmaddmsp、xsmsubasp、xsmsubmsp、xsnmaddasp、xsnmaddmsp、xsnmsubasp、xsnmsubmsp。
VSXスカラの単精度への丸め(xsrsp)が、適切な例外の検査および丸めをともなう倍精度から単精度への値の変換を可能にするために提供される。xsrspは、倍精度浮動小数点値を単精度フォーマットのストレージ要素に記憶する前、または倍精度浮動小数点値を単精度の計算命令のオペランドとして使用する前に、それらの倍精度浮動小数点値を単精度値に変換するために使用されるべきである。単精度ロードおよび計算命令によって生成された値は、既に単精度の値であり、記憶または計算命令の前のxsrspなしに、単精度フォーマットのストレージ要素に直接記憶されるか、または単精度の計算命令のオペランドとして直接使用され得る。
単精度値は、倍精度スカラ算術演算で使用され得る。xsrespまたはxsrsqrtespを除いて、どの倍精度値も、OE=0およびUE=0であるとき、単精度スカラ算術演算で使用され得る。OE=1またはUE=1であるとき、あるいは命令がxsrespまたはxsrsqrtespである場合、元のオペランドは、単精度フォーマットで表現できなければならない。
一部の実装は、倍精度の計算命令よりも高速に単精度の計算命令を実行することができる。したがって、倍精度の精度が必要とされない場合、単精度データおよび命令が使用されるべきである。
整数値を取るオペランド
浮動小数点オペランドを浮動小数点フォーマットの整数値に丸めるための命令が、提供される。浮動小数点処理と整数処理との間のデータの交換を容易にするために、VSRにおいて浮動小数点倍精度および単精度フォーマットと整数ワードおよびダブルワード・フォーマットとの間の変換を行うための命令が、提供される。整数値を取るオペランドに対する計算は、必要とされる精度の計算命令を使用して実行され得る。(結果は、整数値ではない可能性がある。)特に整数値を取るオペランドをサポートするために提供される命令の3つのグループが、以下で説明される。
1.浮動小数点整数への丸め
VSXスカラの倍精度整数への丸め命令は、倍精度のオペランドを倍精度フォーマットの整数値に丸める。VSXスカラの倍精度整数への丸め命令:xsrdpi、xsrdpip、xsrdpim、xsrdpiz、xsrdpic。
VSXベクトルの倍精度整数への丸め命令は、それぞれの倍精度のベクトル・オペランドの要素を倍精度フォーマットの整数値に丸める。VSXベクトルの倍精度整数への丸め命令:xvrdpi、xvrdpip、xvrdpim、xvrdpiz、xvrdpic。
VSXベクトルの単精度整数への丸め命令は、それぞれの単精度のベクトル・オペランドの要素を単精度フォーマットの整数値に丸める。VSXベクトルの単精度整数への丸め命令:xvrspi、xvrspip、xvrspim、xvrspiz、xvrspic。
xsrdpic、xvrdpic、およびxvrspicを除いて、丸めは、オペコードによって指定された丸めモードを用いて実行される。xsrdpic、xvrdpic、およびxvrspicに関しては、丸めは、RNによって指定された丸めモードを用いて実行される。
浮動小数点整数へのVSX丸め命令は、無効演算(VXSNAN)例外を起こす可能性がある。浮動小数点整数へのVSX丸め命令:xsrdpi、xsrdpip、xsrdpim、xsrdpiz、xsrdpic、xvrdpi、xvrdpip、xvrdpim、xvrdpiz、xvrdpic、xvrspi、xvrspip、xvrspim、xvrspiz、およびxvrspic。
xsrdpic、xvrdpic、およびxvrspicは、不正確例外(Inexact exception)も起こす可能性がある。
2.浮動小数点フォーマットから整数フォーマットへの変換
VSXスカラの倍精度から整数フォーマットへの変換命令は、倍精度のオペランドを32ビットかまたは64ビットかのどちらかの符号付きまたは符号なし整数フォーマットに変換する。VSXスカラの倍精度から整数フォーマットへの変換命令:xscvdpsxds、xscvdpsxws、xscvdpuxds、xscvdpuxws。
VSXベクトルの倍精度から整数フォーマットへの変換命令は、倍精度のベクトル・オペランドの要素を32ビットかまたは64ビットかのどちらかの符号付きまたは符号なし整数フォーマットに変換する。VSXベクトルの倍精度から整数フォーマットへの変換命令:xvcvdpsxds、xvcvdpsxws、xvcvdpuxds、xvcvdpuxws。
VSXベクトルの単精度から整数ダブルワード・フォーマットへの変換命令は、変換元ベクトル・オペランドのそれぞれの奇数番のワード要素の単精度値を64ビット符号付きまたは符号なし整数フォーマットに変換する。VSXベクトルの単精度から整数ダブルワード・フォーマットへの変換命令:xvcvspsxds、xvcvspuxds。
VSXベクトルの単精度から整数ワード・フォーマットへの変換命令は、変換元ベクトル・オペランドのそれぞれのワード要素の単精度値を32ビット符号付きかまたは符号なしかのどちらかの整数フォーマットに変換する。VSXベクトルの単精度から整数ワード・フォーマットへの変換命令:xvcvspsxws、xvcvspuxws。
丸めは、「ゼロへの丸め」丸めモードを使用して実行される。これらの命令は、無効演算(VXSNAN、VXCVI)例外および不正確例外を起こす可能性がある。
3.整数フォーマットから浮動小数点フォーマットへの変換
VSXスカラの整数ダブルワードから倍精度フォーマットへの変換命令は、64ビット符号付きまたは符号なし整数を倍精度浮動小数点値に変換し、結果を倍精度フォーマットで返す。VSXスカラの整数ダブルワードから倍精度フォーマットへの変換命令:xscvsxddp、xscvuxddp。
VSXスカラの整数ダブルワードから単精度フォーマットへの変換命令は、64ビット符号付きまたは符号なし整数を単精度浮動小数点値に変換し、結果を倍精度フォーマットで返す。VSXスカラの整数ダブルワードから単精度フォーマットへの変換命令:xscvsxdsp、xscvuxdsp。
VSXベクトルの整数ダブルワードから倍精度フォーマットへの変換命令は、変換元ベクトル・オペランドのそれぞれのダブルワード要素の64ビット符号付きまたは符号なし整数を倍精度浮動小数点フォーマットに変換する。VSXベクトルの整数ダブルワードから倍精度フォーマットへの変換命令:xscvsxddp、xscvuxddp。
VSXベクトルの整数ワードから倍精度フォーマットへの変換命令は、変換元ベクトル・オペランドのそれぞれの奇数番のワード要素の32ビット符号付きまたは符号なし整数を倍精度浮動小数点フォーマットに変換する。VSXベクトルの整数ワードから倍精度フォーマットへの変換命令:xscvsxwdp、xscvuxwdp。
VSXベクトルの整数ダブルワードから単精度フォーマットへの変換命令は、変換元ベクトル・オペランドのそれぞれのダブルワード要素の64ビット符号付きまたは符号なし整数を単精度浮動小数点フォーマットに変換する。VSXベクトルの整数ダブルワードから単精度フォーマットへの変換命令:xscvsxdsp、xscvuxdsp。
VSXベクトルの整数ワードから単精度フォーマットへの変換命令は、変換元ベクトル・オペランドのそれぞれのワード要素の32ビット符号付きまたは符号なし整数を単精度浮動小数点フォーマットに変換する。VSXベクトルの整数ワードから単精度フォーマットへの変換命令:xscvsxwsp、xscvuxwsp。
丸めは、RNで指定された丸めモードを用いて実行される。変換元のフォーマットの制限のために、不正確例外のみが生成される可能性がある。
ConvertSP64toSP(x)
xは、倍精度フォーマットの単精度浮動小数点値である。
値xを単精度フォーマットで返す。xは単精度で表現可能でなければならず、またはそうでなければ、返される結果が未定義である。xは、非正規化を必要とする可能性がある。丸めは実行されない。xは、SNaNである場合、xと同じペイロードを有する単精度のSNaNに変換される。
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)
xは、単精度フォーマットの浮動小数点値である。
値xを倍精度フォーマットで返す。xは、SNaNである場合、xと同じペイロードを有する倍精度のSNaNに変換される。
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)
VSXスカラを整数ワードとしてロード・代数・インデックス付き・XX1形式(LoadVSX Scalar as Integer Word Algebraic Indexed XX1-form)
lxsiwax XT,RA,RB (0x7C00_0098)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜30の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、RA、ビット11〜15)と、第3のフィールド(例えば、RB、ビット16〜20)とを含む。
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
XTに、Tと連結された値TXを代入する。
EAに、GPR[RA]の内容、またはRAが0に等しい場合は0と、GPR[RB]の内容との合計を代入する。
ストレージのアドレスEAにあるワード内の32ビット符号付き整数値が、ダブルワードに符号拡張され、VSR[XT]のダブルワード要素0に代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
EAがワード・アラインされていない(つまり、EAのビット62:63が0でない)場合、ストレージへのアクセスを実行する代わりに、システム・アラインメント・エラー・ハンドラの呼び出しが許可される。
変更される特殊レジスタ
なし
lxsiwaxに関するVSRデータ・レイアウト
tgt = VSR[XT]
128ビットのうちのビット0〜63は、SDを含む。
VSXスカラを整数ワードとしてロードおよびゼロ・インデックス付き・XX1形式(LoadVSX Scalar as Integer Word and Zero Indexed XX1-form)
lxsiwzx XT,RA,RB (0x7C00_0018)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜30の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、RA、ビット11〜15)と、第3のフィールド(例えば、RB、ビット16〜20)とを含む。
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
XTに、Tと連結された値TXを代入する。
EAに、GPR[RA]の内容、またはRAが0に等しい場合は0と、GPR[RB]の内容との合計を代入する。
ストレージのアドレスEAにあるワード内の32ビット符号なし整数値が、ダブルワードにゼロ拡張され、VSR[XT]のダブルワード要素0に代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
EAがワード・アラインされていない(つまり、EAのビット62:63が0でない)場合、ストレージへのアクセスを実行する代わりに、システム・アラインメント・エラー・ハンドラの呼び出しが許可される。
変更される特殊レジスタ
なし
lxsiwzxに関するVSRデータ・レイアウト
tgt = VSR[XT]
128ビットのうちのビット0〜63は、UDを含む。
VSXスカラをロード・単精度・インデックス付き・XX1形式(Load VSXScalar Single-Precision Indexed XX1-form)
lxsspx XT,RA,RB (0x7C00_0418)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜30の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、RA、ビット11〜15)と、第3のフィールド(例えば、RB、ビット16〜20)とを含む。
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
XTに、Tと連結された値TXを代入する。
EAに、GPR[RA]の内容、またはRAが0に等しい場合は0と、GPR[RB]の内容との合計を代入する。
ストレージのアドレスEAにあるワード内の単精度浮動小数点値が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
EAがワード・アラインされていない(つまり、EAのビット62:63が0でない)場合、ストレージへのアクセスを実行する代わりに、システム・アラインメント・エラー・ハンドラの呼び出しが許可される。
変更される特殊レジスタ
なし
lxsspxに関するVSRデータ・レイアウト
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む。
VSXスカラを整数ワードとして記憶・インデックス付き・XX1形式(Store VSXScalar as Integer Word Indexed XX1-form)
stxsiwx XS,RA,RB (0x7C00_0118)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜30の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Sフィールド、ビット6〜10)および第1のビット(例えば、SXフィールド、ビット31)と、第2のフィールド(例えば、RA、ビット11〜15)と、第3のフィールド(例えば、RB、ビット16〜20)とを含む。
EA ← ( (RA=0) ? 0 :GPR[RA] ) +tea GPR[RB]
MEM(EA,4) ← VSR[32×SX+S].word[1]
MEMtag(EA,4) ← 0
XSに、Sと連結された値SXを代入する。
EAに、GPR[RA]の内容、またはRAが0に等しい場合は0と、GPR[RB]の内容との合計を代入する。
VSR[XS]のワード要素1の内容が、ストレージのアドレスEAにあるワードに単精度フォーマットで代入される。
EAがワード・アラインされていない(つまり、EAのビット62:63が0でない)場合、ストレージへのアクセスを実行する代わりに、システム・アラインメント・エラー・ハンドラの呼び出しが許可される。
変更される特殊レジスタ
なし
stxsiwxに関するVSRデータ・レイアウト
src = VSR[XS]
128ビットのうちのビット32〜63は、SW/UWを含む。
VSXスカラを記憶・単精度・インデックス付き・XX1形式(Store VSXScalar Single-Precision Indexed XX1-form)
stxsspx XS,RA,RB (0x7C00_0518)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜30の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Sフィールド、ビット6〜10)および第1のビット(例えば、SXフィールド、ビット31)と、第2のフィールド(例えば、RA、ビット11〜15)と、第3のフィールド(例えば、RB、ビット16〜20)とを含む。
EA ← ( (RA=0) ? 0 :GPR[RA] ) +tea GPR[RB]
MEM(EA,4) ←ConvertSP64toSP(VSR[32×SX+S].doubleword[0])
MEMtag(EA,4) ← 0
XSに、Sと連結された値SXを代入する。
EAに、GPR[RA]の内容、またはRAが0に等しい場合は0と、GPR[RB]の内容との合計を代入する。
VSR[XS]のダブルワード要素0の倍精度浮動小数点フォーマットの単精度値が、ストレージのアドレスEAにあるワードに単精度フォーマットで代入される。
EAがワード・アラインされていない(つまり、EAのビット62:63が0でない)場合、ストレージへのアクセスを実行する代わりに、システム・アラインメント・エラー・ハンドラの呼び出しが許可される。
変更される特殊レジスタ
なし
stxsspxに関するVSRデータ・レイアウト
src = VSR[XS]
128ビットのうちのビット0〜63は、DPを含む。
VSXスカラの加算・単精度・XX3形式(VSX Scalar AddSingle-Precision XX3-form)
xsaddsp XT,XA,XB (0xF000_0000)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XAに、Aと連結された値AXを代入する。
XBに、Bと連結された値BXを代入する。
src1に、VSR[XA]のダブルワード要素0内の倍精度浮動小数点値を代入する。
src2に、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
src2がsrc1に加算され、限界のない範囲および精度を有する和をもたらす。浮動小数点の加算は、指数の比較および2つの仮数の加算に基づく。2つのオペランドの指数が比較され、より小さな指数に付随する仮数が、2つの指数が等しくなるまで、ビットがシフトされるたびに1ずつその指数が増やされるようにして右シフトされる。次に、2つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の53ビットすべておよび3つのガード・ビット(G、R、およびX)すべてが、計算に現れる。
和が、正規化される。浮動小数点の正規化は、最上位ビットが1になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、RNによって指定された丸めモードを使用して単精度に丸められる。
結果が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。FRが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。FIが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、VSR[XT]およびFPRFが修正されず、FRおよびFIが0に設定される。
変更される特殊レジスタ
FPRF FR FI FX OX UX XX
VXSNAN VXISI
xsaddspに関するVSRデータ・レイアウト
src1 = VSR[XA]
128ビットのうちのビット0〜63は、DPを含む。
src2 = VSR[XB]
128ビットのうちのビット0〜63は、DPを含む。
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む。
VSXスカラの符号付き整数ダブルワードの浮動小数点フォーマットへの変換および単精度への丸め・XX2形式(VSX Scalar Convert Signed Integer Doubleword to floating-pointformat and round to Single-Precision XX2-form)
xscvsxdsp XT,XB (0xF000_04E0)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜29の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Bフィールド、ビット16〜20)および第2のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XBに、Bと連結された値BXを代入する。
srcに、VSR[XB]のダブルワード要素0内の2の補数による整数値を代入する。
srcが、浮動小数点フォーマットに変換され、RNによって指定された丸めモードを用いて単精度に丸められる。
結果が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。FRが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。FIが、結果が厳密でないことを示すように設定される。
変更される特殊レジスタ
FPRF FR FI FX XX
xscvsxdspに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜63は、SDを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
VSXスカラの符号なし整数ダブルワードの浮動小数点フォーマットへの変換および単精度への丸め・XX2形式(VSX Scalar Convert Unsigned Integer Doubleword to floating-pointformat and round to Single-Precision XX2-form)
xscvuxdsp XT,XB (0xF000_04A0)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜29の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Bフィールド、ビット16〜20)および第2のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XBに、Bと連結された値BXを代入する。
srcに、VSR[XB]のダブルワード要素0内の符号なし整数値を代入する。
srcが、浮動小数点フォーマットに変換され、RNによって指定された丸めモードを用いて単精度に丸められる。
結果が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。FRが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。FIが、結果が厳密でないことを示すように設定される。
変更される特殊レジスタ
FPRF FR FI FX XX
xscvuxdspに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜63は、UDを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
VSXスカラの除算・単精度・XX3形式(VSX Scalar DivideSingle-Precision XX3-form)
xsdivsp XT,XA,XB (0xF000_00C0)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XAに、Aと連結された値AXを代入する。
XBに、Bと連結された値BXを代入する。
src1に、VSR[XA]のダブルワード要素0内の倍精度浮動小数点値を代入する。
src2に、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
src1がsrc2で除算され、限界のない範囲および精度を有する商をもたらす。浮動小数点の除算は、指数の減算および仮数の除算に基づく。
商が、正規化される。浮動小数点の正規化は、最上位ビットが1になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、RNによって指定された丸めモードを使用して単精度に丸められる。
結果が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。FRが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。FIが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外またはトラップ可能なゼロ除算例外が発生する場合、VSR[XT]およびFPRFが修正されず、FRおよびFIが0に設定される。
変更される特殊レジスタ
FPRF FR FI FX OX UX ZX XX
VXSNAN VXIDI VXZDZ
xsdivspに関するVSRデータ・レイアウト
src1 = VSR[XA]
128ビットのうちのビット0〜63は、DPを含む
src2 = VSR[XB]
128ビットのうちのビット0〜63は、DPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
VSXスカラの乗算−加算・単精度・XX3形式(VSX ScalarMultiply-Add Single-Precision XX3-form)
xsmaddasp XT,XA,XB (0xF000_0008)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
xsmaddmsp XT,XA,XB (0xF000_0048)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XAに、Aと連結された値AXを代入する。
XBに、Bと連結された値BXを代入する。
xsmaddaspに関しては、以下を実行する。
− src1に、VSR[XA]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src2に、VSR[XT]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src3に、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
xsmaddmspに関しては、以下を実行する。
− src1に、VSR[XA]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src2に、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src3に、VSR[XT]のダブルワード要素0内の倍精度浮動小数点値を代入する。
src1がsrc3と乗算され、限界のない範囲および精度を有する積をもたらす。浮動小数点の乗算は、指数の加算および仮数の乗算に基づく。
src2が積に加算され、限界のない範囲および精度を有する和をもたらす。浮動小数点の加算は、指数の比較および2つの仮数の加算に基づく。2つのオペランドの指数が比較され、より小さな指数に付随する仮数が、2つの指数が等しくなるまで、ビットがシフトされるたびに1ずつその指数が増やされるようにして右シフトされる。次に、2つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の53ビットすべておよび3つのガード・ビット(G、R、およびX)すべてが、計算に現れる。
和が、正規化される。浮動小数点の正規化は、最上位ビットが1になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、RNによって指定された丸めモードを使用して単精度に丸められる。
結果が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。FRが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。FIが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、VSR[XT]およびFPRFが修正されず、FRおよびFIが0に設定される。
変更される特殊レジスタ
FPRF FR FI FX OX UX XX
VXSNAN VXISI VXIMZ
xsmadd(a|m)spに関するVSRデータ・レイアウト
src1 = VSR[XA]
128ビットのうちのビット0〜63は、DPを含む
src2 = xsmaddasp ? VSR[XT] : VSR[XB]
128ビットのうちのビット0〜63は、DPを含む
src3 = xsmaddasp ? VSR[XB] : VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
VSXスカラの乗算−減算・単精度・XX3形式(VSX ScalarMultiply-Subtract Single-Precision XX3-form)
xsmsubasp XT,XA,XB (0xF000_0088)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
xsmsubmsp XT,XA,XB (0xF000_00C8)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XAに、Aと連結された値AXを代入する。
XBに、Bと連結された値BXを代入する。
xsmsubaspに関しては、以下を実行する。
− src1に、VSR[XA]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src2に、VSR[XT]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src3に、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
xsmsubmspに関しては、以下を実行する。
− src1に、VSR[XA]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src2に、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src3に、VSR[XT]のダブルワード要素0内の倍精度浮動小数点値を代入する。
src1がsrc3と乗算され、限界のない範囲および精度を有する積をもたらす。浮動小数点の乗算は、指数の加算および仮数の乗算に基づく。
src2が否定を取られ、積に加算され、限界のない範囲および精度を有する和をもたらす。浮動小数点の加算は、指数の比較および2つの仮数の加算に基づく。2つのオペランドの指数が比較され、より小さな指数に付随する仮数が、2つの指数が等しくなるまで、ビットがシフトされるたびに1ずつその指数が増やされるようにして右シフトされる。次に、2つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の53ビットすべておよび3つのガード・ビット(G、R、およびX)すべてが、計算に現れる。
限界のない範囲および精度を有する結果が、正規化される。浮動小数点の正規化は、最上位ビットが1になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、RNによって指定された丸めモードを使用して単精度に丸められる。
結果が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。FRが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。FIが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、VSR[XT]およびFPRFが修正されず、FRおよびFIが0に設定される。
変更される特殊レジスタ
FPRF FR FI FX OX UX XX
VXSNAN VXISI VXIMZ
xsmsub(a|m)spに関するVSRデータ・レイアウト
src1 = VSR[XA]
128ビットのうちのビット0〜63は、DPを含む
src2 = xsmsubasp ? VSR[XT] : VSR[XB]
128ビットのうちのビット0〜63は、DPを含む
src3 = xsmsubasp ? VSR[XB] : VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
VSXスカラの乗算・単精度・XX3形式(VSX Scalar MultiplySingle-Precision XX3-form)
xsmulsp XT,XA,XB (0xF000_0080)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XAに、Aと連結された値AXを代入する。
XBに、Bと連結された値BXを代入する。
src1に、VSR[XA]のダブルワード要素0内の倍精度浮動小数点値を代入する。
src2に、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
src1がsrc2と乗算され、限界のない範囲および精度を有する積をもたらす。浮動小数点の乗算は、指数の加算および仮数の乗算に基づく。
積が、正規化される。浮動小数点の正規化は、最上位ビットが1になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、RNによって指定された丸めモードを使用して単精度に丸められる。
結果が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。FRが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。FIが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、VSR[XT]およびFPRFが修正されず、FRおよびFIが0に設定される。
変更される特殊レジスタ
FPRF FR FI FX OX UX XX
VXSNAN VXIMZ
xsmulspに関するVSRデータ・レイアウト
src1 = VSR[XA]
128ビットのうちのビット0〜63は、DPを含む
src2 = VSR[XB]
128ビットのうちのビット0〜63は、DPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
VSXスカラの否定・乗算−加算・単精度・XX3形式(VSX ScalarNegative Multiply-Add Single-Precision XX3-form)
xsnmaddasp XT,XA,XB (0xF000_0408)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
xsnmaddmsp XT,XA,XB (0xF000_0448)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XAに、Aと連結された値AXを代入する。
XBに、Bと連結された値BXを代入する。
xsnmaddaspに関しては、以下を実行する。
− src1に、VSR[XA]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src2に、VSR[XT]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src3に、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
xsnmaddmspに関しては、以下を実行する。
− src1に、VSR[XA]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src2に、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src3に、VSR[XT]のダブルワード要素0内の倍精度浮動小数点値を代入する。
src1がsrc3と乗算され、限界のない範囲および精度を有する積をもたらす。浮動小数点の乗算は、指数の加算および仮数の乗算に基づく。
src2が積に加算され、限界のない範囲および精度を有する和をもたらす。浮動小数点の加算は、指数の比較および2つの仮数の加算に基づく。2つのオペランドの指数が比較され、より小さな指数に付随する仮数が、2つの指数が等しくなるまで、ビットがシフトされるたびに1ずつその指数が増やされるようにして右シフトされる。次に、2つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の53ビットすべておよび3つのガード・ビット(G、R、およびX)すべてが、計算に現れる。
和が、正規化される。浮動小数点の正規化は、最上位ビットが1になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、RNによって指定された丸めモードを使用して単精度に丸められる。
結果が否定を取られ、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。FRが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。FIが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、VSR[XT]およびFPRFが修正されず、FRおよびFIが0に設定される。
変更される特殊レジスタ
FPRF FR FI FX OX UX XX
VXSNAN VXISI VXIMZ
xsnmadd(a|m)spに関するVSRデータ・レイアウト
src1 = VSR[XA]
128ビットのうちのビット0〜63は、DPを含む
src2 = xsnmadda(dp|sp) ? VSR[XT] : VSR[XB]
128ビットのうちのビット0〜63は、DPを含む
src3 = xsnmadda(dp|sp) ? VSR[XB] : VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
VSXスカラの否定・乗算−減算・単精度・XX3形式(VSX ScalarNegative Multiply-Subtract Single-Precision XX3-form)
xsnmsubasp XT,XA,XB (0xF000_0488)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
xsnmsubmsp XT,XA,XB (0xF000_04C8)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XAに、Aと連結された値AXを代入する。
XBに、Bと連結された値BXを代入する。
xsnmsubaspに関しては、以下を実行する。
− src1に、VSR[XA]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src2に、VSR[XT]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src3に、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
xsnmsubmspに関しては、以下を実行する。
− src1に、VSR[XA]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src2に、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
− src3に、VSR[XT]のダブルワード要素0内の倍精度浮動小数点値を代入する。
src1がsrc3と乗算され、限界のない範囲および精度を有する積をもたらす。浮動小数点の乗算は、指数の加算および仮数の乗算に基づく。
src2が否定を取られ、積に加算され、限界のない範囲および精度を有する和をもたらす。浮動小数点の加算は、指数の比較および2つの仮数の加算に基づく。2つのオペランドの指数が比較され、より小さな指数に付随する仮数が、2つの指数が等しくなるまで、ビットがシフトされるたびに1ずつその指数が増やされるようにして右シフトされる。次に、2つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の53ビットすべておよび3つのガード・ビット(G、R、およびX)すべてが、計算に現れる。
和が、正規化される。浮動小数点の正規化は、最上位ビットが1になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、RNによって指定された丸めモードを使用して単精度に丸められる。
結果が否定を取られ、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。FRが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。FIが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、VSR[XT]およびFPRFが修正されず、FRおよびFIが0に設定される。
変更される特殊レジスタ
FPRF FR FI FX OX UX XX
VXSNAN VXISI VXIMZ
xsnmsub(a|m)spに関するVSRデータ・レイアウト
src1 = VSR[XA]
128ビットのうちのビット0〜63は、DPを含む
src2 = xsnmsubasp ? VSR[XT] : VSR[XB]
128ビットのうちのビット0〜63は、DPを含む
src3 = xsnmsubasp ? VSR[XB] : VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
tgt = VSR[XT]
VSXスカラの逆数の推定・単精度・XX2形式(VSX ScalarReciprocal Estimate Single-Precision XX2-form)
xsresp XT,XB (0xF000_0068)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜29の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Bフィールド、ビット16〜20)および第2のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XBに、Bと連結された値BXを代入する。
srcに、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
srcの逆数の倍精度浮動小数点推定値が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
srcの逆数がゼロ、無限大、またはQNaNでない場合、推定値は、srcの逆数の16384分の1以下の精度の相対誤差を有する。つまり、
【数1】

オペランドのさまざまな特殊な値を使った演算は、以下のようにまとめられる。
元の値 結果 例外
負の無限大 負のゼロ なし
負のゼロ 負の無限大 ZX
正のゼロ 正の無限大 ZX
SNaN QNaN VXSNAN
QNaN QNaN なし
1.ZE=1の場合、結果なし
2.VE=1の場合、結果なし
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。FRが、未定義値に設定される。FIが、未定義値に設定される。
トラップ可能な無効演算例外またはトラップ可能なゼロ除算例外が発生する場合、VSR[XT]およびFPRFが修正されない。
この命令を実行した結果は、実装によって、および同じ実装における異なる実行によってさまざまであることが許される。
変更される特殊レジスタ
FPRF FR=0bU FI=0bU FX OX UX ZX
XX=0bU VXSNAN
xsrespに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜63は、DPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
VSXスカラの単精度への丸め・XX2形式(VSX Scalar Round toSingle-Precision XX2-form)
xsrsp XT,XB (0xF000_0464)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜29の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Bフィールド、ビット16〜20)および第2のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XBに、Bと連結された値BXを代入する。
srcに、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
srcが、FPSCRの浮動小数点丸め制御フィールドRNによって指定された丸めモードを用いて単精度に丸められる。
結果が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。
トラップ可能な無効演算例外が発生する場合、VSR[XT]およびFPRFが修正されない。
変更される特殊レジスタ
FPRF FR FI FX OX UX XX VXSNAN
xsrspに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜63は、DPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
VSXスカラの単精度への丸め・XX2形式
xsrsp XT,XB (0xF000_0464)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜29の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Bフィールド、ビット16〜20)および第2のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XBに、Bと連結された値BXを代入する。
srcに、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
srcが、FPSCRの浮動小数点丸め制御フィールドRNによって指定された丸めモードを用いて単精度に丸められる。
結果が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。
トラップ可能な無効演算例外が発生する場合、VSR[XT]およびFPRFが修正されない。
変更される特殊レジスタ
FPRF FR FI FX OX UX XX VXSNAN
xsrspに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜63は、DPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
VSXスカラの平方根の逆数の推定・単精度・XX2形式(VSX ScalarReciprocal Square Root Estimate Single-Precision XX2-form)
xsrsqrtesp XT,XB (0xF000_0028)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜29の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Bフィールド、ビット16〜20)および第2のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XBに、Bと連結された値BXを代入する。
srcに、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
srcの平方根の逆数の単精度浮動小数点推定値が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
srcの平方根の逆数がゼロ、無限大、またはQNaNでない場合、推定値は、srcの平方根の逆数の16384分の1以下の精度の相対誤差を有する。つまり、
【数2】

オペランドのさまざまな特殊な値を使った演算は、以下のようにまとめられる。
元の値 結果 例外
負の無限大 QNaN VXSQRT
負の有限値 QNaN VXSQRT
負のゼロ 無限大 ZX
正のゼロ 正の無限大 ZX
SNaN QNaN VXSNAN
QNaN QNaN なし
1.VE=1の場合、結果なし
2.ZE=1の場合、結果なし
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。FRが、未定義値に設定される。FIが、未定義値に設定される。
トラップ可能な無効演算例外またはトラップ可能なゼロ除算例外が発生する場合、VSR[XT]およびFPRFが修正されない。
この命令を実行した結果は、実装によって、および同じ実装における異なる実行によってさまざまであることが許される。
変更される特殊レジスタ
FPRF FR=0bU FI=0bU FX ZX XX=0bU
VXSNAN VXSQRT
xsrsqrtespに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜63は、DPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
VSXスカラの平方根・単精度・XX形式(VSX Scalar Square RootSingle-Precision XX-form)
xssqrtsp XT,XB (0xF000_002C)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜29の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Bフィールド、ビット16〜20)および第2のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XBに、Bと連結された値BXを代入する。
srcに、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
srcの限界のない精度の平方根が、生成される。
中間結果が、FPSCRの浮動小数点丸め制御フィールドRNによって指定された丸めモードを用いて単精度に丸められる。
結果が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。FRが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。FIが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、VSR[XT]およびFPRFが修正されず、FRおよびFIが0に設定される。
変更される特殊レジスタ
FPRF FR FI FX OX UX XX
VXSNAN VXSQRT
xssqrtspに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜63は、DPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
VSXスカラの減算・単精度・XX3形式(VSX Scalar SubtractSingle-Precision XX3-form)
xssubsp XT,XA,XB (0xF000_0040)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XAに、Aと連結された値AXを代入する。
XBに、Bと連結された値BXを代入する。
src1に、VSR[XA]のダブルワード要素0内の倍精度浮動小数点値を代入する。
src2に、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
src2が否定を取られ、src1に加算され、限界のない範囲および精度を有する和vをもたらす。浮動小数点の加算は、指数の比較および2つの仮数の加算に基づく。2つのオペランドの指数が比較され、より小さな指数に付随する仮数が、2つの指数が等しくなるまで、ビットがシフトされるたびに1ずつその指数が増やされるようにして右シフトされる。次に、2つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の53ビットすべておよび3つのガード・ビット(G、R、およびX)すべてが、計算に現れる。
vが正規化され、FPSCRの浮動小数点丸め制御フィールドRNによって指定された丸めモードを用いて単精度に丸められる。浮動小数点の正規化は、最上位ビットが1になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
結果が、VSR[XT]のダブルワード要素0に代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、単精度フォーマットで表された結果のクラスおよび符号に設定される。FRが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。FIが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、VSR[XT]およびFPRFが修正されず、FRおよびFIが0に設定される。
変更される特殊レジスタ
FPRF FR FI FX OX UX XX
VXSNAN VXISI
xssubspに関するVSRデータ・レイアウト
src1 = VSR[XA]
128ビットのうちのビット0〜63は、DPを含む
src2 = VSR[XB]
128ビットのうちのビット0〜63は、DPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63は、DPを含む
POWER ISA AS - Book 1 - Chapter 7. Vector-Scalar Floating-Point Operations[Category:VSX]
7.6.2 VSX命令記述規約
7.6.2.1 VSX命令RTL演算子
x{y}
xのビットyを返す。
x{y:z}
xのビットy:zを返す。
x = y
yの値がxに代入される。
x |= y
yの値が、値xとOR演算され、xに代入される。
〜x
xの1の補数を返す。
!x
xの内容が0に等しい場合は1を返し、それ以外の場合は0を返す。
x || y
yの値と連結されたxの値を返す。例えば、0b010||0b111は、0b010111と同じである。
x ^ y
yの値と排他的OR演算されたxの値を返す。
x ? y : z
xの値が真である場合はyの値を返し、それ以外の場合は値zを返す。
x+y
xおよびyは、整数値である。
xとyとの和を返す。
+tea
Power AS ISA参照。
x-y
xおよびyは、整数値である。
xとyとの差を返す。
x!=y
xおよびyは、整数値である。
xがyと等しくない場合は1を返し、それ以外の場合は0を返す。
x<=y
xおよびyは、整数値である。
xがy以下である場合は1を返し、それ以外の場合は0を返す。
x>=y
xおよびyは、整数値である。
xがy以上である場合は1を返し、それ以外の場合は0を返す。
7.6.2.2 VSX命令RTLファンクション・コール
AddDP(x,y)
xおよびyは、倍精度浮動小数点値である。
xまたはyがSNaNである場合、vxsnan_flagが1に設定される。
xが無限大であり、yが逆符号の無限大である場合、vxisi_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、yがQNaNである場合、yを返す。
そうではなく、yがSNaNである場合、QNaNとして表されたyを返す。
そうではなく、xおよびyが逆符号の無限大である場合、標準のQNaN(standardQNaN)を返す。
それ以外の場合、限界のない範囲および精度を有する、xとyとの正規化された和を返す。
AddSP(x,y)
xおよびyは、単精度浮動小数点値である。
xまたはyがSNaNである場合、vxsnan_flagが1に設定される。
xが無限大であり、yが逆符号の無限大である場合、vxisi_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、yがQNaNである場合、yを返す。
そうではなく、yがSNaNである場合、QNaNとして表されたyを返す。
そうではなく、xおよびyが逆符号の無限大である場合、標準のQNaNを返す。
それ以外の場合、限界のない範囲および精度を有する、yにxを加算した正規化された和を返す。
ClassDP(x,y)
倍精度浮動小数点数xの5ビットの特徴付けを返す。
0b10001=クワイエットNaN
0b01001=負の無限大
0b01000=負の正規化された数
0b11000=負の非正規化された数
0b10010=負のゼロ
0b00010=正のゼロ
0b10100=正の非正規化された数
0b00100=正の正規化された数
0b00101=正の無限大
ClassSP(x,y)
単精度浮動小数点数xの5ビットの特徴付けを返す。
0b10001=クワイエットNaN
0b01001=負の無限大
0b01000=負の正規化された数
0b11000=負の非正規化された数
0b10010=負のゼロ
0b00010=正のゼロ
0b10100=正の非正規化された数
0b00100=正の正規化された数
0b00101=正の無限大
CompareEQDP(x,y)
xおよびyは、倍精度浮動小数点値である。
xまたはyがNaNである場合、0を返す。
そうではなく、xがyに等しい場合、1を返す。
それ以外の場合、0を返す。
CompareEQSP(x,y)
xおよびyは、単精度浮動小数点値である。
xまたはyがNaNである場合、0を返す。
そうではなく、xがyに等しい場合、1を返す。
それ以外の場合、0を返す。
CompareGTDP(x,y)
xおよびyは、倍精度浮動小数点値である。
xまたはyがNaNである場合、0を返す。
そうではなく、xがyよりも大きい場合、1を返す。
それ以外の場合、0を返す。
CompareGTSP(x,y)
xおよびyは、単精度浮動小数点値である。
xまたはyがNaNである場合、0を返す。
そうではなく、xがyよりも大きい場合、1を返す。
それ以外の場合、0を返す。
CompareLTDP(x,y)
xおよびyは、倍精度浮動小数点値である。
xまたはyがNaNである場合、0を返す。
そうではなく、xがy未満である場合、1を返す。
それ以外の場合、0を返す。
CompareLTSP(x,y)
xおよびyは、単精度浮動小数点値である。
xまたはyがNaNである場合、0を返す。
そうではなく、xがy未満である場合、1を返す。
それ以外の場合、0を返す。
ConvertDPtoSD(x)
xは、倍精度整数値である。
xがNaNである場合、
0x8000_0000_0000_0000を返し、vxcvi_flagが1に設定され、xがSNaNである場合、vxsnan_flagが1に設定される。
それ以外の場合、以下を実行する。
xが263−1よりも大きい場合、0x7FFF_FFFF_FFFF_FFFFを返し、vxcvi_flagが1に設定される。
そうではなく、xが−263未満である場合、0x8000_0000_0000_0000を返し、vxcvi_flagが1に設定される。
それ以外の場合、値xを64ビット符号付き整数フォーマットで返す。
ConvertDPtoSW(x)
xは、倍精度整数値である。
xがNaNである場合、0x8000_0000を返し、vxcvi_flagが1に設定され、xがSNaNである場合、vxsnan_flagが1に設定される。
それ以外の場合、以下を実行する。
xが231−1よりも大きい場合、0x7FFF_FFFFを返し、vxcvi_flagが1に設定される。
そうではなく、xが−231未満である場合、0x8000_0000を返し、vxcvi_flagが1に設定される。
それ以外の場合、値xを32ビット符号付き整数フォーマットで返す。
ConvertDPtoUD(x)
xは、倍精度整数値である。
xがNaNである場合、0x0000_0000_0000_0000を返し、vxcvi_flagが1に設定され、xがSNaNである場合、vxsnan_flagが1に設定される。
それ以外の場合、以下を実行する。
xが264−1よりも大きい場合、0xFFFF_FFFF_FFFF_FFFFを返し、vxcvi_flagが1に設定される。
そうではなく、xが0未満である場合、0x0000_0000_0000_0000を返し、vxcvi_flagが1に設定される。
それ以外の場合、値xを64ビット符号なし整数フォーマットで返す。
ConvertDPtoUW(x)
xは、倍精度整数値である。
xがNaNである場合、0x0000_0000を返し、vxcvi_flagが1に設定され、xがSNaNである場合、vxsnan_flagが1に設定される。
それ以外の場合、以下を実行する。
xが232−1よりも大きい場合、0xFFFF_FFFFを返し、vxcvi_flagが1に設定される。
そうではなく、xが0未満である場合、0x0000_0000を返し、vxcvi_flagが1に設定される。
それ以外の場合、値xを32ビット符号なし整数フォーマットで返す。
ConvertFPtoDP(x)
浮動小数点値xをDPフォーマットで返す。
ConvertFPtoSP(x)
浮動小数点値xを単精度フォーマットで返す。
ConvertSDtoFP(x)
xは、64ビット符号付き整数値である。
限界のない仮数の精度を有する浮動小数点フォーマットに変換された値xを返す。
ConvertSP64toSP(x)
xは、倍精度フォーマットの単精度浮動小数点値である。
値xを単精度フォーマットで返す。xは単精度で表現可能でなければならず、またはそうでなければ、返される結果が未定義である。xは、非正規化を必要とする可能性がある。丸めは実行されない。xは、SNaNである場合、xと同じペイロードを有する単精度のSNaNに変換される。
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)
xは、単精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがSNaNである場合、QNaNとして表されたxを倍精度浮動小数点フォーマットで返す。
そうではなく、xがQNaNである場合、xを倍精度浮動小数点フォーマットで返す。
それ以外の場合、値xを倍精度浮動小数点フォーマットで返す。
ConvertSPtoSD(x)
xは、単精度整数値である。
xがNaNである場合、0x8000_0000_0000_0000を返し、vxcvi_flagが1に設定され、xがSNaNである場合、vxsnan_flagが1に設定される。
それ以外の場合、以下を実行する。
xが263−1よりも大きい場合、0x7FFF_FFFF_FFFF_FFFFを返し、vxcvi_flagが1に設定される。
そうではなく、xが−263未満である場合、0x8000_0000_0000_0000を返し、vxcvi_flagが1に設定される。
それ以外の場合、値xを64ビット符号付き整数フォーマットで返す。
ConvertSPtoSP64(x)
xは、単精度フォーマットの浮動小数点値である。
値xを倍精度フォーマットで返す。xは、SNaNである場合、xと同じペイロードを有する倍精度のSNaNに変換される。
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)
xは、単精度整数値である。
xがNaNである場合、0x8000_0000を返し、vxcvi_flagが1に設定され、xがSNaNである場合、vxsnan_flagが1に設定される。
それ以外の場合、以下を実行する。
xが231−1よりも大きい場合、0x7FFF_FFFFを返し、vxcvi_flagが1に設定される。
そうではなく、xが−231未満である場合、0x8000_0000を返し、vxcvi_flagが1に設定される。
それ以外の場合、値xを32ビット符号付き整数フォーマットで返す。
ConvertSPtoUD(x)
xは、単精度整数値である。
xがNaNである場合、0x0000_0000_0000_0000を返し、vxcvi_flagが1に設定され、xがSNaNである場合、vxsnan_flagが1に設定される。
それ以外の場合、以下を実行する。
xが264−1よりも大きい場合、0xFFFF_FFFF_FFFF_FFFFを返し、vxcvi_flagが1に設定される。
そうではなく、xが0未満である場合、0x0000_0000_0000_0000を返し、vxcvi_flagが1に設定される。
それ以外の場合、値xを64ビット符号なし整数フォーマットで返す。
ConvertSPtoUW(x)
xは、単精度整数値である。
xがNaNである場合、0x0000_0000を返し、vxcvi_flagが1に設定され、xがSNaNである場合、vxsnan_flagが1に設定される。
それ以外の場合、以下を実行する。
xが232−1よりも大きい場合、0xFFFF_FFFFを返し、vxcvi_flagが1に設定される。
そうではなく、xが0未満である場合、0x0000_0000を返し、vxcvi_flagが1に設定される。
それ以外の場合、値xを32ビット符号なし整数フォーマットで返す。
ConvertSWtoFP(x)
xは、32ビット符号付き整数値である。
限界のない仮数の精度を有する浮動小数点フォーマットに変換された値xを返す。
ConvertUDtoFP(x)
xは、64ビット符号なし整数値である。
限界のない仮数の精度を有する浮動小数点フォーマットに変換された値xを返す。
ConvertUWtoFP(x)
xは、32ビット符号なし整数値である。
限界のない仮数の精度を有する浮動小数点フォーマットに変換された値xを返す。
DivideDP(x,y)
xおよびyは、倍精度浮動小数点値である。
xまたはyがSNaNである場合、vxsnan_flagが1に設定される。
xがゼロであり、yがゼロである場合、vxzdz_flagが1に設定される。
xが有限の非ゼロ値であり、yがゼロである場合、zx_flagが1に設定される。
xが無限大であり、yが無限大である場合、vxidi_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、yがQNaNである場合、yを返す。
そうではなく、yがSNaNである場合、QNaNとして表されたyを返す。
そうではなく、xがゼロであり、yがゼロである場合、標準のQNaNを返す。
そうではなく、xが有限の非ゼロ値であり、yがxと同符号のゼロである場合、正の無限大を返す。
そうではなく、xが有限の非ゼロ値であり、yがxと逆符号のゼロである場合、負の無限大を返す。
そうではなく、xが無限大であり、yが無限大である場合、標準のQNaNを返す。
それ以外の場合、限界のない範囲および精度を有する、xをyで割った正規化された商を返す。
DivideSP(x,y)
xおよびyは、単精度浮動小数点値である。
xまたはyがSNaNである場合、vxsnan_flagが1に設定される。
xがゼロであり、yがゼロである場合、vxzdz_flagが1に設定される。
xが有限の非ゼロ値であり、yがゼロである場合、zx_flagが1に設定される。
xが無限大であり、yが無限大である場合、vxidi_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、yがQNaNである場合、yを返す。
そうではなく、yがSNaNである場合、QNaNとして表されたyを返す。
そうではなく、xがゼロであり、yがゼロである場合、標準のQNaNを返す。
そうではなく、xが有限の非ゼロ値であり、yがxと同符号のゼロである場合、正の無限大を返す。
そうではなく、xが有限の非ゼロ値であり、yがxと逆符号のゼロである場合、負の無限大を返す。
そうではなく、xが無限大であり、yが無限大である場合、標準のQNaNを返す。
それ以外の場合、限界のない範囲および精度を有する、xをyで割った正規化された商を返す。
DenormDP(x)
xは、限界のない範囲および精度を有する浮動小数点値である。
xの仮数を−1022とxのバイアスされていない指数との差に等しいビット数だけ右シフトし、xのバイアスされていない指数を−1022に設定した値xを返す。
DenormSP(x)
xは、限界のない範囲および精度を有する浮動小数点値である。
xの仮数を−126とxのバイアスされていない指数との差に等しいビット数だけ右シフトし、xのバイアスされていない指数を−126に設定した値xを返す。
IsInf(x)
xが無限大である場合は1を返し、それ以外の場合は0を返す。
IsNaN(x)
xがSNaNかまたはQNaNかのいずれかである場合は1を返し、それ以外の場合は0を返す。
IsNeg(x)
xが負の非ゼロ値である場合は1を返し、それ以外の場合は0を返す。
IsSNaN(x)
xがSNaNである場合は1を返し、それ以外の場合は0を返す。
IsZero(x)
xがゼロである場合は1を返し、それ以外の場合は0を返す。
MaximumDP(x,y)
xおよびyは、倍精度浮動小数点値である。
xまたはyがSNaNである場合、vxsnan_flagが1に設定される。
xがQNaNであり、yがNaNではない場合、yを返す。
そうではなく、xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、yがQNaNである場合、xを返す。
そうではなく、yがSNaNである場合、QNaNとして表されたyを返す。
それ以外の場合、xおよびyのうちの大きい方を返し、+0は−0よりも大きいと見なされる。
MaximumSP(x,y)
xおよびyは、単精度浮動小数点値である。
xまたはyがSNaNである場合、vxsnan_flagが1に設定される。
xがQNaNであり、yがNaNではない場合、yを返す。
そうではなく、xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、yがQNaNである場合、xを返す。
そうではなく、yがSNaNである場合、QNaNとして表されたyを返す。
それ以外の場合、xおよびyのうちの大きい方を返し、+0は−0よりも大きいと見なされる。
MEM(x,y)
ストレージのyバイトのシーケンスの内容。シーケンスは、以下のように、ストレージ・アクセスのエンディアンに依存する。
− ビッグ・エンディアン・ストレージ・アクセスに関しては、シーケンスは、アドレスxのバイトから始まり、アドレスx+y−1のバイトで終わる。
− リトル・エンディアン・ストレージ・アクセスに関しては、シーケンスは、アドレスx+y−1のバイトから始まり、アドレスxのバイトで終わる。
MEMtag(x,y)
ストレージのyバイトのシーケンスに関連する1つまたは複数のタグ・ビット。
MinimumDP(x,y)
xおよびyは、倍精度浮動小数点値である。
xまたはyがSNaNである場合、vxsnan_flagが1に設定される。
xがQNaNであり、yがNaNではない場合、yを返す。
そうではなく、xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、yがQNaNである場合、xを返す。
そうではなく、yがSNaNである場合、QNaNとして表されたyを返す。
それ以外の場合、xおよびyのうちの小さい方を返し、−0は+0よりも小さいと見なされる。
MinimumSP(x,y)
xおよびyは、単精度浮動小数点値である。
xまたはyがSNaNである場合、vxsnan_flagが1に設定される。
xがQNaNであり、yがNaNではない場合、yを返す。
そうではなく、xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、yがQNaNである場合、xを返す。
そうではなく、yがSNaNである場合、QNaNとして表されたyを返す。
それ以外の場合、xおよびyのうちの小さい方を返し、−0は+0よりも小さいと見なされる。
MultiplyAddDP(x,y,z)
x、y、およびzは、倍精度浮動小数点値である。
x、y、またはzがSNaNである場合、vxsnan_flagが1に設定される。
xがゼロであり、yが無限大であるか、またはxが無限大であり、yがゼロである場合、vximz_flagが1に設定される。
xとyとの積が無限大であり、zが逆符号の無限大である場合、vxisi_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、zがQNaNである場合、zを返す。
そうではなく、zがSNaNである場合、QNaNとして表されたzを返す。
そうではなく、yがQNaNである場合、yを返す。
そうではなく、yがSNaNである場合、QNaNとして表されたyを返す。
そうではなく、xがゼロであり、yが無限大であるか、またはxが無限大であり、yがゼロである場合、標準のQNaNを返す。
そうではなく、xとyとの積が無限大であり、zが逆符号の無限大である場合、標準のQNaNを返す。
それ以外の場合、限界のない範囲および精度を有する、xとyとの積とzとの正規化された和を返す。
MultiplyAddSP(x,y,z)
x、y、およびzは、単精度浮動小数点値である。
x、y、またはzがSNaNである場合、vxsnan_flagが1に設定される。
xがゼロであり、yが無限大であるか、またはxが無限大であり、yがゼロである場合、vximz_flagが1に設定される。
xとyとの積が無限大であり、zが逆符号の無限大である場合、vxisi_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、zがQNaNである場合、zを返す。
そうではなく、zがSNaNである場合、QNaNとして表されたzを返す。
そうではなく、yがQNaNである場合、yを返す。
そうではなく、yがSNaNである場合、QNaNとして表されたyを返す。
そうではなく、xがゼロであり、yが無限大であるか、またはxが無限大であり、yがゼロである場合、標準のQNaNを返す。
そうではなく、xとyとの積が無限大であり、zが逆符号の無限大である場合、標準のQNaNを返す。
それ以外の場合、限界のない範囲および精度を有する、xとyとの積とzとの正規化された和を返す。
MultiplyDP(x,y)
xおよびyは、倍精度浮動小数点値である。
xまたはyがSNaNである場合、vxsnan_flagが1に設定される。
xがゼロであり、yが無限大であるか、またはxが無限大であり、yがゼロである場合、vximz_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、yがQNaNである場合、yを返す。
そうではなく、yがSNaNである場合、QNaNとして表されたyを返す。
そうではなく、xがゼロであり、yが無限大であるか、またはxが無限大であり、yがゼロである場合、標準のQNaNを返す。
それ以外の場合、限界のない範囲および精度を有する、xとyとの正規化された積を返す。
MultiplySP(x,y)
xおよびyは、単精度浮動小数点値である。
xまたはyがSNaNである場合、vxsnan_flagが1に設定される。
xがゼロであり、yが無限大であるか、またはxが無限大であり、yがゼロである場合、vximz_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、yがQNaNである場合、yを返す。
そうではなく、yがSNaNである場合、QNaNとして表されたyを返す。
そうではなく、xがゼロであり、yが無限大であるか、またはxが無限大であり、yがゼロである場合、標準のQNaNを返す。
それ以外の場合、限界のない範囲および精度を有する、xとyとの正規化された積を返す。
NegateDP(x)
倍精度浮動小数点値xがNaNである場合、xを返す。
それ以外の場合、xの符号ビットを反転(complement)させた倍精度浮動小数点値xを返す。
NegateSP(x)
単精度浮動小数点値xがNaNである場合、xを返す。
それ以外の場合、xの符号ビットを反転させた単精度浮動小数点値xを返す。
ReciprocalEstimateDP(x)
xは、倍精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがゼロである場合、zx_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xがゼロである場合、xの符号の無限大を返す。
そうではなく、xが無限大である場合、xの符号のゼロを返す。
それ以外の場合、限界のない指数の範囲を有するxの逆数の推定値を返す。
ReciprocalEstimateSP(x)
xは、単精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがゼロである場合、zx_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xがゼロである場合、xの符号の無限大を返す。
そうではなく、xが無限大である場合、xの符号のゼロを返す。
それ以外の場合、限界のない指数の範囲を有するxの逆数の推定値を返す。
ReciprocalSquareRootEstimateDP(x)
xは、倍精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがゼロである場合、zx_flagが1に設定される。
xが負の非ゼロ数である場合、vxsqrt_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xが負の非ゼロ値である場合、デフォルトのQNaN(defaultQNaN)を返す。
それ以外の場合、限界のない指数の範囲を有するxの平方根の逆数の推定値を返す。
ReciprocalSquareRootEstimateSP(x)
xは、単精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがゼロである場合、zx_flagが1に設定される。
xが負の非ゼロ数である場合、vxsqrt_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xが負の非ゼロ値である場合、デフォルトのQNaNを返す。
それ以外の場合、限界のない指数の範囲を有するxの平方根の逆数の推定値を返す。
reset_xflags()
vxsnan_flagが0に設定される。
vximz_flagが0に設定される。
vxidi_flagが0に設定される。
vxisi_flagが0に設定される。
vxzdz_flagが0に設定される。
vxsqrt_flagが0に設定される。
vxcvi_flagが0に設定される。
vxvc_flagが0に設定される。
ox_flagが0に設定される。
ux_flagが0に設定される。
xx_flagが0に設定される。
zx_flagが0に設定される。
RoundToDP(x,y)
xは、4つの丸めモードのうちの1つを指定する2ビットの符号なし整数である。
0b00 最近接偶数への丸め
0b01 ゼロへの丸め
0b10 正の無限大への丸め
0b11 負の無限大への丸め
yは、限界のない範囲および精度を有する正規化された浮動小数点値である。
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)
xは、限界のない範囲および精度を有する浮動小数点値である。
xがQNaNである場合、xを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
値がx以上である、指数の範囲には限界がないが、仮数の精度は倍精度である最小の浮動小数点数を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToDPFloor(x)
xは、限界のない範囲および精度を有する浮動小数点値である。
xがQNaNである場合、xを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
値がx以下である、指数の範囲には限界がないが、仮数の精度は倍精度である最大の浮動小数点数を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToDPIntegerCeil(x)
xは、倍精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
値がx以上である最小の倍精度浮動小数点整数値を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToDPIntegerFloor(x)
xは、倍精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
値がx以下である最大の倍精度浮動小数点整数値を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToDPIntegerNearAway(x)
xは、倍精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
x>0である場合、値がx+0.5以下である最大の倍精度浮動小数点整数値を返し、またはx<0である場合、値がx−0.5以上である最小の倍精度浮動小数点整数を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToDPIntegerNearEven(x)
xは、倍精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
値がxに最も近い倍精度浮動小数点整数値を返す(近さが同じである場合、最下位ビットが0に等しい倍精度浮動小数点整数値が使用される)。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToDPIntegerTrunc(x)
xは、倍精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
x>0である場合、値がx以下である最大の倍精度浮動小数点整数値を返し、またはx<0である場合、値がx以上である最小の倍精度浮動小数点整数値を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToDPNearEven(x)
xは、限界のない範囲および精度を有する浮動小数点値である。
xがQNaNである場合、xを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
値がxに最も近い、指数の範囲には限界がないが、仮数の精度は倍精度である浮動小数点数を返す(近さが同じである場合、最下位ビットが0に等しい、指数の範囲には限界がないが、仮数の精度は倍精度である浮動小数点数が使用される)。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToDPTrunc(x)
xは、限界のない範囲および精度を有する浮動小数点値である。
xがQNaNである場合、xを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
x>0である場合、値がx以下である、指数の範囲には限界がないが、仮数の精度は倍精度である最大の浮動小数点数を返し、またはx<0である場合、値がx以上である、指数の範囲には限界がないが、仮数の精度は倍精度である最小の浮動小数点数を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToSP(x,y)
xは、4つの丸めモードのうちの1つを指定する2ビットの符号なし整数である。
0b00 最近接偶数への丸め
0b01 ゼロへの丸め
0b10 正の無限大への丸め
0b11 負の無限大への丸め
yは、限界のない範囲および精度を有する正規化された浮動小数点値である。
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)
xは、限界のない範囲および精度を有する浮動小数点値である。
xがQNaNである場合、xを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
値がx以上である、指数の範囲には限界がないが、仮数の精度は単精度である最小の浮動小数点数を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToSPFloor(x)
xは、限界のない範囲および精度を有する浮動小数点値である。
xがQNaNである場合、xを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
値がx以下である、指数の範囲には限界がないが、仮数の精度は単精度である最大の浮動小数点数を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToSPIntegerCeil(x)
xは、単精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
値がx以上である最小の単精度浮動小数点整数値を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToSPIntegerFloor(x)
xは、単精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
値がx以下である最大の単精度浮動小数点整数値を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToSPIntegerNearAway(x)
xは、単精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
xが浮動小数点整数である場合はxを返し、それ以外で、x>0である場合、値がx+0.5以下である最大の単精度浮動小数点整数値を返し、またはx<0である場合、値がx−0.5以上である最小の単精度浮動小数点整数値を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToSPIntegerNearEven(x)
xは、単精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
xが浮動小数点整数である場合はxを返し、それ以外の場合、値がxに最も近い単精度浮動小数点整数値を返す(近さが同じである場合、最下位ビットが0に等しい単精度浮動小数点整数値が使用される)。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToSPIntegerTrunc(x)
xは、単精度浮動小数点値である。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返し、vxsnan_flagが1に設定される。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
x>0である場合、値がx以下である最大の単精度浮動小数点整数値を返し、またはx<0である場合、値がx以上である最小の単精度浮動小数点整数値を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToSPNearEven(x)
xは、限界のない範囲および精度を有する浮動小数点値である。
xがQNaNである場合、xを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
値がxに最も近い、指数の範囲には限界がないが、仮数の精度は単精度である浮動小数点数を返す(近さが同じである場合、最下位ビットが0に等しい、指数の範囲には限界がないが、仮数の精度は単精度である浮動小数点数が使用される)。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
RoundToSPTrunc(x)
xは、限界のない範囲および精度を有する浮動小数点値である。
xがQNaNである場合、xを返す。
そうではなく、xが無限大である場合、xを返す。
それ以外の場合、以下を実行する。
x>0である場合、値がx以下である、指数の範囲には限界がないが、仮数の精度は単精度である最大の浮動小数点数を返し、またはx<0である場合、値がx以上である最小の単精度浮動小数点数を返す。
返される値の絶対値がxよりも大きい場合、inc_flagが1に設定される。
返される値がxに等しくない場合、xx_flagが1に設定される。
Scalb(x,y)
xは、限界のない範囲および精度を有する浮動小数点値である。
yは、符号付き整数である。
浮動小数点値xに2yを掛けた結果。
SetFX(x)
xは、FPSCR内の例外フラグのうちの1つである。
xの内容が0である場合、FXおよびxが1に設定される。
SquareRootDP(x)
xは、倍精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xが負の非ゼロ値である場合、vxsqrt_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xが負の非ゼロ値である場合、デフォルトのQNaNを返す。
それ以外の場合、限界のない範囲および精度を有する、xの正規化された平方根を返す。
SquareRootSP(x)
xは、単精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xが負の非ゼロ値である場合、vxsqrt_flagが1に設定される。
xがQNaNである場合、xを返す。
そうではなく、xがSNaNである場合、QNaNとして表されたxを返す。
そうではなく、xが負の非ゼロ値である場合、デフォルトのQNaNを返す。
それ以外の場合、限界のない範囲および精度を有する、xの正規化された平方根を返す。
VSXベクトルの加算・単精度・XX3形式(VSX Vector AddSingle-Precision XX3-form)
xvaddsp XT,XA,XB (0xF000_0200)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XAに、Aと連結された値AXを代入する。
XBに、Bと連結された値BXを代入する。
各ベクトル要素i、0から3までに関して、以下を実行する。
src1に、VSR[XA]のワード要素i内の単精度浮動小数点オペランドを代入する。
src2に、VSR[XB]のワード要素i内の単精度浮動小数点オペランドを代入する。
src2がsrc1に加算され、限界のない範囲および精度を有する和をもたらす。浮動小数点の加算は、指数の比較および2つの仮数の加算に基づく。2つのオペランドの指数が比較され、より小さな指数に付随する仮数が、2つの指数が等しくなるまで、ビットがシフトされるたびに1ずつその指数が増やされるようにして右シフトされる。次に、2つの仮数が、オペランドの符号に応じて適切に加算または減算されて、中間的な和を形成する。仮数の53ビットすべておよび3つのガード・ビット(G、R、およびX)すべてが、計算に現れる。
和が、正規化される。浮動小数点の正規化は、最上位ビットが1になるまで仮数を左にシフトし、仮数がシフトされたビット数分だけ指数を減らすことに基づく。
中間結果が、FPSCRの浮動小数点丸め制御フィールドRNによって指定された丸めモードを用いて単精度に丸められる。
結果が、VSR[XT]のワード要素iに単精度フォーマットで代入される。
トラップ可能な例外がベクトルのいずれかの要素で発生する場合、結果は、VSR[XT]に書き込まれない。
変更される特殊レジスタ
FX OX UX XX VXSNAN VXISI
xvaddspに関するVSRデータ・レイアウト
src1 = VSR[XA]
128ビットのうちのビット0〜31、ビット32〜63、ビット64〜95、およびビット96〜127が、SPを含む
src2 = VSR[XB]
128ビットのうちのビット0〜31、ビット32〜63、ビット64〜95、およびビット96〜127が、SPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜31、ビット32〜63、ビット64〜95、およびビット96〜127が、SPを含む
RFC02242.r3: BFP/VSX MiscellaneousOperations
ConvertDPtoSP(x)
xは、倍精度浮動小数点値である。
xがSNaNである場合、vxsnan_flagが1に設定される。
xがSNaNである場合、QNaNに変換されたxを単精度浮動小数点フォーマットで返す。
そうではなく、xがQNaN、無限大、またはゼロである場合、xを単精度浮動小数点フォーマットで返す。
それ以外の場合、RNで指定された丸めモードを用いて単精度に丸められたxを単精度浮動小数点フォーマットで返す。
xの丸めがオーバーフロー例外を生じた場合、ox_flagが1に設定される。
xの丸めがアンダーフロー例外を生じた場合、ux_flagが1に設定される。
xの丸めが厳密ではない結果を返す場合、xx_flagが1に設定される。
結果の仮数が丸めの間にインクリメントされた場合、inc_flagが1に設定される。
ConvertDPtoSP_NS(x)
xは、倍精度フォーマットで表された単精度浮動小数点値である。
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])
xが単精度で表現できない場合、一部の指数ビットまたは仮数ビットあるいはその両方が破棄され、望ましくない結果をもたらす恐れがある。xのバイアスされていない指数が−126未満である場合(すなわち、非正規化されている)場合、xの仮数の下位29ビットがさらに破棄される。−155未満のバイアスされていない指数を有するxの有限値は、ゼロの結果を返す。+127を超えるバイアスされていない指数を有するxの有限値は、指数の有効ビットを破棄する結果となる。仮数の上位23ビット内に有効ビットを持たないSNaN入力は、結果として無限大を返す。これらの場合のいずれに関しても、状態は設定されない。
ConvertSPtoDP_NS(x)
xは、単精度浮動小数点値である。
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)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜29の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のレジスタを指定する第2のフィールド(例えば、Bフィールド、ビット16〜20)および第2のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XBに、Bと連結された値BXを代入する。
srcに、VSR[XB]のダブルワード要素0内の倍精度浮動小数点値を代入する。
srcがSNaNである場合、結果は、QNaNに変換されたsrcである(すなわち、srcのビット12が1に設定される)。VXSNANが1に設定される。
そうではなく、srcがQNaN、無限大、またはゼロである場合、結果はsrcである。
それ以外の場合、結果は、RNによって指定された丸めモードを使用して単精度に丸められたsrcである。
結果が、VSR[XT]のワード要素0に単精度フォーマットで代入される。
VSR[XT]のワード要素1、2、および3の内容は、未定義である。
FPRFが、結果のクラスおよび符号に設定される。FRが、丸められるときに結果がインクリメントされたかどうかを示すように設定される。FIが、結果が厳密でないことを示すように設定される。
トラップ可能な無効演算例外が発生する場合、VSR[XT]およびFPRFが修正されず、FRおよびFIが0に設定される。
変更される特殊レジスタ
FPRF FR FI FX OX UX XX VXSNAN
xscvdpspに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜63が、DPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜31が、SPを含む
スカラのスカラ単精度からベクトル単精度フォーマットへの変換・非シグナリング(ScalarConvert Scalar Single-Precision to Vector Single-Precision formatNon-signalling)
xscvdpspn XT,XB (0xF000_042C)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜29の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Bフィールド、ビット16〜20)および第2のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XBに、Bと連結された値BXを代入する。
srcに、倍精度フォーマットで表されたVSR[XB]のダブルワード要素0内の単精度浮動小数点値を代入する。
srcが、VSR[XT]のワード要素0に単精度フォーマットで代入される。
VSR[XT]のワード要素1、2、および3の内容は、未定義である。
変更される特殊レジスタ
なし
xscvdpspnに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜63が、SPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜31が、SPを含む
xscvdpspは、スカラ倍精度値をベクトル単精度フォーマットに変換するために使用されるべきである。
xscvdpspnは、スカラ単精度値をベクトル単精度フォーマットに変換するために使用されるべきである。
スカラの単精度から倍精度フォーマットへの変換(Scalar ConvertSingle-Precision to Double-Precision format)
xscvspdp XT,XB (0xF000_0524)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜29の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Bフィールド)および第2のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XBに、Bと連結された値BXを代入する。
srcに、VSR[XB]のワード要素0内の単精度浮動小数点値を代入する。
srcがSNaNである場合、結果は、QNaNに変換されたsrcである(すなわち、srcのビット9が1に設定される)。VXSNANが1に設定される。
それ以外の場合、結果はsrcである。
結果が、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
FPRFが、結果のクラスおよび符号に設定される。FRが、0に設定される。FIが、0に設定される。
トラップ可能な無効演算例外が発生する場合、VSR[XT]が修正されず、FPRFが修正されず、FRが0に設定され、FIが0に設定される。
変更される特殊レジスタ
FPRF FR←0b0 FI←0b0 FX VXSNAN
xscvspdpに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜31が、SPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63が、DPを含む
スカラの単精度から倍精度フォーマットへの変換・非シグナリング(ScalarConvert Single-Precision to Double-Precision format Non-signalling)
xscvspdpn XT,XB (0xF000_052C)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜29の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Bフィールド、ビット16〜20)および第2のビット(例えば、BXフィールド、ビット30)とを含む。
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
XTに、Tと連結された値TXを代入する。
XBに、Bと連結された値BXを代入する。
srcに、VSR[XB]のワード要素0内の単精度浮動小数点値を代入する。
srcが、VSR[XT]のダブルワード要素0に倍精度フォーマットで代入される。
VSR[XT]のダブルワード要素1の内容は、未定義である。
変更される特殊レジスタ
なし
xscvspdpnに関するVSRデータ・レイアウト
src = VSR[XB]
128ビットのうちのビット0〜31が、SPを含む
tgt = VSR[XT]
128ビットのうちのビット0〜63が、DPを含む
xscvspdpは、ベクトル単精度浮動小数点値をスカラ倍精度フォーマットに変換するために使用されるべきである。
xscvspdpnは、ベクトル単精度浮動小数点値をスカラ単精度フォーマットに変換するために使用されるべきである。
VSX論理的同値(VSX Logical Equivalent)
xxleqv XT,XA,XB (0xF000_05D0)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
VSR[32×TX+T] ← VSR[32×AX+A] h VSR[32×BX+B]
XTに、Tと連結された値TXを代入する。
XAに、Aと連結された値AXを代入する。
XBに、Bと連結された値BXを代入する。
VSR[XA]の内容が、VSR[XB]の内容とXOR演算され、反転された結果が、VSR[XT]に代入される。
変更される特殊レジスタ
なし
VSX論理NAND
xxlnand XT,XA,XB (0xF000_0590)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
VSR[32×TX+T] ←¬( VSR[32×AX+A] & VSR[32×BX+B] )
XTに、Tと連結された値TXを代入する。
XAに、Aと連結された値AXを代入する。
XBに、Bと連結された値BXを代入する。
VSR[XA]の内容が、VSR[XB]の内容とAND演算され、反転された結果が、VSR[XT]に代入される。
変更される特殊レジスタ
なし
補数とのVSX論理OR(VSX Logical OR with Complement)
xxlorc XT,XA,XB (0xF000_0550)
一例において、この命令は、命令を特定するためにオペコードを特定する2つのフィールド(例えば、別のフィールド、ビット21〜28の拡張されたオペコードと組み合わされる(例えば、連結される)プライマリ・オペコードを有する1つのフィールド、ビット0〜5)と、第1のフィールド(例えば、Tフィールド、ビット6〜10)および第1のビット(例えば、TXフィールド、ビット31)と、第2のフィールド(例えば、Aフィールド、ビット11〜15)および第2のビット(例えば、AXフィールド、ビット29)と、第3のフィールド(例えば、Bフィールド、ビット16〜20)および第3のビット(例えば、BXフィールド、ビット30)とを含む。
VSR[32×TX+T] ← VSR[32×AX+A] | ¬VSR[32×BX+B]
XTに、Tと連結された値TXを代入する。
XAに、Aと連結された値AXを代入する。
XBに、Bと連結された値BXを代入する。
VSR[XA]の内容が、VSR[XB]の内容の補数とOR演算され、結果が、VSR[XT]に代入される。
変更される特殊レジスタ
なし
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13