XOP命令セット

AMDが2009年5月1日に発表したXOP(eXtended Operations [1] )命令セットは、2011年10月12日にリリースされたBulldozerプロセッサコア用のx86およびAMD64命令セットにおける128ビットSSEコア命令の拡張です[ 2 ]しかし AMDZenマイクロアーキテクチャ以降XOPのサポートを廃止しました[3]

XOP命令セットは、もともとSSEのメジャーアップグレードとして意図されていたため、複数の異なるタイプのベクトル命令を含んでいます。命令の大部分は整数命令ですが、浮動小数点置換命令と浮動小数点小数点抽出命令も含まれています。命令タイプのリストについては、インデックスを参照してください。

歴史

XOPは、元々 SSE5として意図されていたものの改訂されたサブセットです。AVXに類似するものの重複しないように変更され、 AVXと重複する部分は削除されるか、 FMA4(浮動小数点ベクトル積和演算)や CVT16IntelによってF16Cとして実装された半精度浮動小数点変換)などの 別の標準に移行されました[1]

Intelが発表したAVXおよびFMA4命令セットの命令と同等または類似するSSE5命令はすべて、 Intelが提案するコーディングを使用するように変更されました。AVXに同等の命令がない整数命令は、XOP拡張として分類されていました。[1] XOP命令のオペコードバイトは8F(16進数)ですが、それ以外は3バイトのVEXプレフィックスを持つAVXとほぼ同じコーディングスキームです。

評論家[4]は、これをインテルがAMDに広大なVEXコーディング空間のいかなる部分も使用させていない証拠だと見ている。AMDは、インテルが開発パイプラインで使用している可能性のあるコードの組み合わせを他の用途に使用することを避けるため、異なるコードを使用することを余儀なくされている。XOPコーディング方式は、AMDのコードが将来のインテルのコードと重複するリスクを負うことなく、技術的に可能な限りVEX方式に近いものとなっている。この推論は推測に過ぎない。なぜなら、この問題に関する両社間の交渉に関する公開情報は入手できないためである。

8Fバイトを使用する場合、既存の命令との重複を避けるため、mビット(VEXコーディング方式を参照)の値は8以上である必要があります。 [注1] VEX方式で使用されるC4バイトにはこのような制限はありません。このため、XOP方式では将来的にmビットを他の目的に使用できなくなる可能性がありますが、VEX方式では使用できなくなります。また、XOP方式ではppビットの値が00であるのに対し、VEX方式では同等のレガシー命令がない命令の場合、ppビットの値が01になるという問題も考えられます。このため、将来的にppビットを他の目的に使用することが困難になる可能性があります。

同様の互換性の問題として、 FMA3命令セットとFMA4命令セットの違いが挙げられます。Intelは当初、AVX/FMA仕様バージョン3でFMA4を提案し、AMDがSSE5で提案した3オペランドFMAを置き換えました。AMDがFMA4を採用した後、IntelはFMA4のサポートを中止し、AVX/FMA仕様バージョン5でFMA3に戻りました(FMAの履歴を参照)。[1] [5] [6]

2015年3月、AMDはGNU Binutilsパッケージのパッチの説明の中で、同社の第3世代x86-64アーキテクチャであるZen (znver1 – Zen、バージョン1)では、 「Bulldozer」ファミリのマイクロアーキテクチャ向けに特別に開発された、、命令をサポートしないことを明確に明らかにした。TBM[ FMA47 XOP] [ 8]LWP

整数ベクトル乗算・累算命令

これらはFMA命令セットの整数バージョンです。これらはすべてFMA4と同様の4つのオペランド命令であり、すべて符号付き整数を演算します。

命令説明[9]操作
VPMACSWW,VPMACSSWW単語間の乗算と累積(飽和あり)2x8ワード(a0-a7b0-b7)+8ワード(c0-c7)→8ワード(r0-r7

r0 = a0 * b0 + c0r1 = a1 * b1 + c1、..

VPMACSWD,VPMACSSWD下位ワードからダブルワードへの乗算累算(飽和あり)2x8ワード(a0-a7b0-b7)+4ダブルワード(c0-c3)→4ダブルワード(r0-r3

r0 = a0 * b0 + c0r1 = a2 * b2 + c1、. [2]

VPMACSDD,VPMACSSDDダブルワードからダブルワードへの乗算累積(飽和あり)2x4 ダブルワード ( a0-a3 , b0-b3 ) + 4 ダブルワード ( c0-c3 ) → 4 ダブルワード ( r0-r3 )

r0 = a0 * b0 + c0r1 = a1 * b1 + c1、..

VPMACSDQL,VPMACSSDQL乗算累積(飽和あり)下位ダブルワードからクワッドワード2x4 ダブルワード ( a0-a3 , b0-b3 ) + 2 クワッドワード ( c0-c1 ) → 2 クワッドワード ( r0-r3 )

r0 = a0 * b0 + c0r1 = a2 * b2 + c1

VPMACSDQH,VPMACSSDQH乗算累積(飽和あり)上位ダブルワードからクワッドワードへ2x4 ダブルワード ( a0-a3 , b0-b3 ) + 2 クワッドワード ( c0-c1 ) → 2 クワッドワード ( r0-r3 )

r0 = a1 * b1 + c0r1 = a3 * b3 + c1

VPMADCSWD,VPMADCSSWDワードからダブルワードへの乗算、加算、累算(飽和あり)2x8ワード(a0-a7b0-b7)+4ダブルワード(c0-c3)→4ダブルワード(r0-r3

r0 = a0 * b0 + a1 * b1 + c0r1 = a2 * b2 + a3 * b3 + c1、..

整数ベクトルの水平加算

水平加算命令は、入力ベクトル内の隣接する値を加算します。以下の命令の出力サイズは、実行される水平加算の幅を表します。例えば、水平方向のバイトからワードへの命令は一度に2バイトを加算し、結果をワードのベクトルとして返しますが、バイトからクワッドワードへの命令は一度に8バイトを加算し、結果をクワッドワードのベクトルとして返します。SSSE3にはさらに6つの水平加算および減算命令があります、これらは2つの入力ベクトルに対して行われ、2対2の演算のみを実行します。

命令説明[9]操作
VPHADDBW,VPHADDUBW水平方向に2つの符号付き/符号なしバイトをワードに加算する16バイト(a0-a15)→8ワード(r0-r7

r0 = a0+a1r1 = a2+a3r2 = a4+a5、...

VPHADDBD,VPHADDUBDダブルワードに4つの符号付き/符号なしバイトを水平に加算する16バイト(a0-a15)→4ダブルワード(r0-r3

r0 = a0+a1+a2+a3r1 = a4+a5+a6+a7、...

VPHADDBQ,VPHADDUBQ8つの符号付き/符号なしバイトをクワッドワードに水平に加算する16バイト ( a0-a15 ) → 2クワッドワード ( r0-r1 )

r0 = a0+a1+a2+a3+a4+a5+a6+a7 , ...

VPHADDWD,VPHADDUWD水平方向に、符号付き/符号なし2つのワードをダブルワードに追加します8つのワード ( a0-a7 ) → 4つのダブルワード ( r0-r3 )

r0 = a0+a1r1 = a2+a3r2 = a4+a5、...

VPHADDWQ,VPHADDUWQ4つの符号付き/符号なしワードをクワッドワードに水平加算する8ワード(a0-a7)→2クワッドワード(r0-r1

r0 = a0+a1+a2+a3r1 = a4+a5+a6+a7

VPHADDDQ,VPHADDUDQ2つの符号付き/符号なしダブルワードをクワッドワードに水平加算する4つのダブルワード(a0-a3)→2つのクワッドワード(r0-r1

r0 = a0+a1r1 = a2+a3

VPHSUBBW水平方向に2つの符号付きバイトを減算してワードにする16バイト(a0-a1 5)→8ワード(r0-r7

r0 = a0-a1r1 = a2-a3r2 = a4-a5、...

VPHSUBWD2つの符号付きワードを水平減算してダブルワードにする8つのワード ( a0-a7 ) → 4つのダブルワード ( r0-r3 )

r0 = a0-a1r1 = a2-a3r2 = a4-a5、...

VPHSUBDQ2つの符号付きダブルワードを水平減算してクワッドワードにする4つのダブルワード(a0-a3)→2つのクワッドワード(r0-r1

r0 = a0-a1r1 = a2-a3

整数ベクトル比較

このベクトル比較命令セットはすべて、即値を追加引数として受け取ります。即値は、どのような比較を実行するかを制御します。各命令には8つの比較が可能です。ベクトルが比較され、真と評価されたすべての比較は、宛先の対応するすべてのビットを1に設定し、偽の比較は、同じビットをすべて0に設定します。この結果は、ベクトル化された条件付き移動のVPCMOV命令で直接使用できます

命令説明[9]
VPCOMBベクトル符号付きバイトの比較
VPCOMWベクトル符号付き単語の比較
VPCOMDベクトル符号付きダブルワードの比較
VPCOMQベクトル符号付きクワッドワードの比較
VPCOMUBベクトル符号なしバイトの比較
VPCOMUWベクトル符号なしワードの比較
VPCOMUDベクトル符号なしダブルワードの比較
VPCOMUQベクトル符号なしクワッドワードの比較
即時比較
000未満
001以下
010より大きい
011以上
100等しい
101等しくない
110
111

ベクトル条件付き移動

VPCMOVSSE4のブレンド命令のビット単位の変形として機能します。AVX命令VPBLENDVBと同様に、3つのソースオペランドと1つのデスティネーションを持つ4オペランド命令です。3番目のオペランド(セレクターとして機能)の各ビットについて、1は最初のソースの同じビットを選択し、0は2番目のソースの同じビットを選択します。上記のXOPベクトル比較命令と組み合わせて使用​​すると、ベクトル化された3項移動を実装できます。また、2番目の入力がデスティネーションと同じ場合は条件付き移動(CMOV) を実装できます

命令説明[9]
VPCMOVベクトル条件付き移動

整数ベクトルのシフトと回転命令

ここでのシフト命令は、パックされた符号付き整数として解釈されるベクトルレジスタを使用して、各ユニットを異なる量でシフトできるという点で、 SSE2のシフト命令とは異なります。符号はシフトまたは回転の方向を示し、正の値は左シフト、負の値は右シフトになります。[10] IntelはAVX2で、互換性のない異なる可変ベクトルシフト命令セットを指定しています。[11]

命令説明[9]
VPROTBパック回転バイト
VPROTWパック回転ワード
VPROTDパック回転ダブルワード
VPROTQパック回転クワッドワード
VPSHABパックシフト算術バイト
VPSHAWパックシフト算術ワード
VPSHADパックシフト算術ダブルワード
VPSHAQパックシフト算術クワッドワード
VPSHLBパックシフト論理バイト
VPSHLWパックシフト論理語
VPSHLDパックシフト論理ダブルワード
VPSHLQパックシフト論理クワッドワード

ベクトル置換

VPPERMSSSE3命令のPALIGNRとPSHUFBを組み合わせた単一の命令で、両方にさらに多くの機能を追加します。Altivec命令VPERM比較する人もいます。[12]入力として3つのレジスタを取り、最初の2つはソースレジスタ、3つ目はセレクタレジスタです。セレクタ内の各バイトは、2つの入力レジスタのいずれかのバイトを出力用に選択します。セレクタは、選択したバイトに0を設定したり、ビット順序を反転したり、最上位ビットを繰り返したりするなどの効果を適用することもできます。さらに、入力の効果すべてを反転することもできます

および命令はVPERMIL2PDAVXのおよび 命令VPERMIL2PSの 2 つのソース バージョンであり、2 つの入力の任意のフィールドから出力を選択できることを意味します。VPERMILPDVPERMILPSVPPERM

命令説明[9]
VPPERMパックされた並べ替えバイト
VPERMIL2PD2つのソースの倍精度浮動小数点数を並べ替える
VPERMIL2PS2つのソースの単精度浮動小数点数を並べ替える

浮動小数点小数点抽出

これらの命令は、浮動小数点数の小数部、つまり整数への変換で失われる部分を抽出します

命令説明[9]
VFRCZPDパックされた倍精度浮動小数点数から小数点数を抽出する
VFRCZPSパックされた単精度浮動小数点数の小数点抽出
VFRCZSD分数スカラー倍精度浮動小数点抽出
VFRCZSS分数スカラー単精度浮動小数点の抽出

XOP搭載CPU

関連項目

  1. ^ バイト値0x8Fは、POP命令の既存のオペコードです。この命令は、オペコードに続くModR/Mバイトを使用しますが、ビット3~5の「reg」(レジスタ)フィールドは使用しません。「reg」を使用しない一部のオペコードは、これらのビットを使用して8つの異なる命令(0x80~0x83、0xD0~0xDFなど)を示すことで命令を多重化しますが、0x8Fはそうではありません。つまり、標準的なPOP命令では、ビット3~5は常に0である必要があります。mビットはビット0~4であるため、8以上の値を要求すると、0x8Fに続くバイトのビット3が設定されます

参考文献

  1. ^ abcd Dave Christie (2009-05-07)、「Striking a balance」、AMD Developer blogs、2013年11月4日時点のオリジナルからアーカイブ、 2013年11月4日取得
  2. ^ ab AMD64アーキテクチャプログラマーズマニュアル第6巻:128ビットおよび256ビットXOP、FMA4、CVT16命令(PDF)AMD、2009年5月1日
  3. ^ Michael Larabel (2017年3月3日). 「GCC ZenコンパイラのチューニングがAMD Ryzenのパフォーマンスに与える影響」. Phoronix .しかし、Zenはクリーンシート設計であるため、Bulldozerプロセッサには存在する命令セット拡張のうち、Zen/znver1には存在しないものがいくつかあります。FMA4とXOPは、現在では存在しません。
  4. ^ Agner Fog (2009 年 12 月 5 日)、命令セット戦争を停止する
  5. ^ Intel AVXプログラミング・リファレンス、2008年3月、オリジナル(PDF)から2011年8月7日にアーカイブ、 2012年1月17日取得
  6. ^ Intel Advanced Vector Extensions Programming Reference、2009年1月、2012年2月29日時点のオリジナルよりアーカイブ、 2012年1月17日取得
  7. ^ Ganesh Gopalasubramanian (2015年3月10日). 「[PATCH] znver1プロセッサを追加」. [email protected] (メーリングリスト).
  8. ^ Amit Pawar (2015年8月7日). 「[PATCH] Znver1 CPUフラグからCpuFMA4を削除」. [email protected] (メーリングリスト).
  9. ^ abcdefg 「AMD64アーキテクチャプログラマーズマニュアル、第4巻:128ビットおよび256ビットメディア命令」(PDF)AMD . 2014年1月13日閲覧
  10. ^ 「新しい「ブルドーザー」および「パイルドライバー」の説明書」(PDF)AMD2014年1月13日閲覧
  11. ^ 「Intelアーキテクチャ命令セット拡張プログラミング・リファレンス」。Intel . 2014年2月1日時点のオリジナル(PDF)からアーカイブ。 2014年1月29日閲覧
  12. ^ “Buldozer x264 の最適化”. 2014年1月15日時点のオリジナルよりアーカイブ2014年1月13日閲覧。
  13. ^ Dave Christie (2009-05-07), Striking a balance, AMD Developer blogs, 2013-11-09 にオリジナルからアーカイブ, 2012-01-17に取得
  14. ^ 新しい「ブルドーザー」と「パイルドライバー」の説明書(PDF)、AMD、2012年10月
Retrieved from "https://en.wikipedia.org/w/index.php?title=XOP_instruction_set&oldid=1305277142"