SIMD拡張

そしてSPARC64 VIII fxでは、XARレジスタのSIMDビットが"1"の場合は、2つの演算パイプラインが並列に動くSIMD動作を行う。この2つの演算器の一方をBasic側(B側)、他方をExtended側(E側)と呼ぶ。なお、SPARCアーキテクチャでは、浮動小数点レジスタの番号は単精度の場合は0、1、2、3、…となっているが、倍精度の場合は、0、2、4、6、…と1つ置きに使用するので、命令で指定したレジスタ番号を2nとすると、B側の演算器は256個の浮動小数点レジスタの前半のf2nのレジスタを使い、E側の演算器は自動的に後半のf[2n+256]を使い、両方の演算器は同じ演算を行う。

しかし、前半と後半のデータを演算したい場合があり、そのために、FMA系の命令([rs1]*[rs2]+[rs3]→rdの演算で、積と和の符号が異なる4種のバリエーションがある)の場合だけは、rs1とrs2として前半だけでなく、後半の256~510を指定することができる。その場合、E側ではf[2n-256]のレジスタが使用される。しかし、rs3とrdは0~254の値しか取らないので、拡張指定のうちの最上位の1ビットは不要なので別の用途に使っている。rs3指定の最上位ビットが"1"の場合は、E側のrs1にもB側と同じレジスタを用いるc指定となる。またrd指定の最上位ビットが"1"の場合は、E側の乗算結果の符合を反転させてから加算を行うn指定となる。

複素数の乗算

複素数の乗算は、(a1+ib1)*(a2+ib2)=(a1*a2-b1*b2)+i(a1*b2+b1*a2)である。なお、ここでiは虚数部(Imaginary)を意味する。この複素数の実数部をB側、虚数部をE側として、f[0]にa1、f[256]にb1、f[2]にa2、f[258]にb2を格納しておく。また、積はf[4]とf[260]に格納するものとして、最初はこれらのレジスタはゼロクリアしておく。

そして、fnmadd、snc f[256]、f[258]、f[4]、f[4]命令で、B側は-b1*b2-f[4]を計算してf[4]に格納する。一方、E側はnc指定で、rs1としてB側と同じレジスタを用い、かつ乗算の符号を反転して、b1*a2-f[260]を計算してf[260]に格納する。そして、次のfmadd、sc f[0]、f[2]、f[4]、f[4]命令で、B側はa1*a2+f[4]、E側はc指定でrs1はB側と同じものを使いa1*b2+f[260]を計算する。その結果、f[4]にはa1*a2-b1*b2が入り、f[260]にはa1*b2+a2*b1が格納されることになり、2命令で複素数の乗算が実行できる。

また、ロード、ストア命令もB側とE側が並列に動作するSIMD動作が可能である。この場合は、レジスタ指定の不要なビットを利用して、ハードウェアプリフェッチを行うかどうかや、後述のセクタキャッシュの使用セクタ番号を指定する。