【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】
オペランドのさまざまな特殊な値を使った演算は、以下のようにまとめられる。
元の値 結果 例外
負の無限大 負のゼロ なし
負のゼロ 負の無限大
1 ZX
正のゼロ 正の無限大
1 ZX
SNaN QNaN
2 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
1 VXSQRT
負の有限値 QNaN
1 VXSQRT
負のゼロ 無限大
2 ZX
正のゼロ 正の無限大
2 ZX
SNaN QNaN
1 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が2
63−1よりも大きい場合、0x7FFF_FFFF_FFFF_FFFFを返し、vxcvi_flagが1に設定される。
そうではなく、xが−2
63未満である場合、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が2
31−1よりも大きい場合、0x7FFF_FFFFを返し、vxcvi_flagが1に設定される。
そうではなく、xが−2
31未満である場合、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が2
64−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が2
32−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が2
63−1よりも大きい場合、0x7FFF_FFFF_FFFF_FFFFを返し、vxcvi_flagが1に設定される。
そうではなく、xが−2
63未満である場合、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が2
31−1よりも大きい場合、0x7FFF_FFFFを返し、vxcvi_flagが1に設定される。
そうではなく、xが−2
31未満である場合、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が2
64−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が2
32−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]に代入される。
変更される特殊レジスタ
なし