XOPプリフィックス
読み:エックスオウピー-プリフィックス
外語:XOP prefix
AMDのXOPで採用されているSIMD命令セット拡張に関する命令プリフィックス(接頭辞)。
概要
AMDがIntel AVXで不足するSIMD命令(かつてSSE5として計画されていた)を追加するにあたり、独自の拡張命令を符号化するために設計したプリフィックス。
Intel AVXで使われるVEXプリフィックスを参考に、Intelのそれとオペコードが重複しないように実装された。
そもそもIntel AVXは、拡張に次ぐ拡張で複雑化したSSEのオペコードをシンプルな構造に整理し、これにより処理の高速化や更なる拡張性の確保を目指したものである。このために使われるのがVEXプリフィックスである。
XOPで使われるXOPプリフィックスも、発想はVEXプリフィックスとほぼ同じである。命令のデコーダー回路も多くを共用可能とし、無理のない実装を実現させた。
特徴
オペコード
XOPのオペコードは、VEXプリフィックスと発想ならびに構造的にはほぼ同じである。
XOPは、8Fhに続く2バイト目をModR/Mとみなし、regフィールドが0ならPOP命令、それ以外の未定義命令だったものをXOPプリフィックスとみなす。
2バイト目はMSBから順に、R/X/B/mmmmmとなり、2バイト目の下位5ビットを命令を識別するmmmmmフィールドとする。
1バイト目 | | 2バイト目 | | 3バイト目 |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
8F | | R | X | B | mmmmm | | W | vvvv | L | pp |
4バイト目に命令を表わす1バイト、5バイト目にModR/M、6バイト目以降に必要に応じてイミディエイトが付く。
- R: REX.rの1の補数
- 1: REX.r=0
- 0: REX.r=1 (64ビットモードのみ)
- X: REX.xの1の補数
- 1: REX.x=0
- 0: REX.x=1 (64ビットモードのみ)
- B: REX.bの1の補数
- 1: REX.b=0
- 0: REX.b=1 (64ビットモードのみ)
- W: REX.w
- mmmmm:
- 00xxx: 従来の命令との互換用に予約
- 01000: イミディエイトバイト付き命令
- 01001: イミディエイト無し命令
- それ以外: 拡張用の予約 (無効オペコード例外#UD)
- vvvv: レジスター指定の1の補数 (1111で未使用)
- L: ベクトル長
- 0: 128ビットベクトル(XMM)
- 1: 256ビットベクトル(YMM)
- pp: SIMDプリフィクスの同等の機能を提供するオペコード拡張
- 00: なし
- 01: 66
- 10: F3
- 11: F2
2バイト目
mmmmmフィールドの頭2ビットが00となるもの(0から7までの8通り)は従来のPOP命令になるため利用できないが、8から31までの24通りが拡張命令として利用できる。
R/X/Bは、それぞれREXプリフィックスの各ビット機能と同様であるが、VEXプリフィックスと同様にビット反転された1の補数となっている。反転させずとも従来命令との衝突は無いが、VEXと命令デコード回路の共通化などが目的と思われる。
2バイト目 | 従来命令 | AMD XOP |
xx000xxx | POP m16 / POP m32 |
xx001xxx | (#UD) | B = 0, mmmmm = 8‐15 |
xx010xxx | (#UD) | B = 0, mmmmm = 16‐23 |
xx011xxx | (#UD) | B = 0, mmmmm = 24‐31 |
xx100xxx | (#UD) |
xx101xxx | (#UD) | B = 1, mmmmm = 8‐15 |
xx110xxx | (#UD) | B = 1, mmmmm = 16‐23 |
xx111xxx | (#UD) | B = 1, mmmmm = 24‐31 |
実際の命令は4バイト目の1バイトで表わすため、都合、24×256=6,144種類の命令が符号化できることになる。
再検索