EVEXプリフィックス
読み:イーヴィーイーエックス-プリフィックス
外語:EVEX prefix

 Intel AVX-512で採用された、SIMD命令セット拡張に関する命令プリフィックス(接頭辞)。
目次

概要
 従来のIntel AVXに対し、512ビット対応やレジスターの32本対応などのために、新しい命令プリフィックスとして定義された。
 従来のVEXプリフィックスは2バイト長と3バイト長があったが、今回のEVEXプリフィックスは4バイト長として定義されている。
 Intel AVX-512を用いていても、従来のAVX命令相当の範囲内であれば2バイト長または3バイト長のVEXプリフィックスを用いて命令を短く符号化することができ、新しい機能を使う場合のみ4バイト長のEVEXプリフィックスを用いる使い分けが可能である。

符号化

オペコード
 4バイトEVEXは62から始まる。
1バイト目 2バイト目 3バイト目 4バイト目
76543210 76543210 76543210 76543210
01100010 RXBR'00mm Wvvvv1pp zL'LbV'aaa
 2バイト目
 3バイト目
 4バイト目
 EVEX.Xは、VEX.Xやその元祖のREX.xと同様にSIBバイトのindexフィールドを拡張するが、EVEX.Xでは更にSIBバイトが存在しない時にはregまたはr/mを拡張する。

レジスターのアドレス方法
 最大32本のレジスターの指定方法は次の通り。
 GPRは汎用レジスターを意味する。
 ビット4ビット3ビット[2:0]レジスターの種類一般的な用法
REGEVEX.R'REX.RModR/M.regGPR、ベクトルデスティネーションまたはソース
NDS/NDDEVEX.V'EVEX.vvvvGPR、ベクトル2番目のソースまたはデスティネーション
RMEVEX.XEVEX.BModR/M.r/mGPR、ベクトル1番目のソースまたはデスティネーション
BASE0EVEX.BModR/M.r/mGPRメモリーアドレッシング
INDEX0EVEX.XSIB.indexGPRメモリーアドレッシング
VIDXEVEX.V'EVEX.XSIB.indexベクトルVSIBメモリーアドレッシング
IS4imm8[3]imm8[7:4]ベクトル3番目のソース

特徴

オペコード
 元々EVEXプリフィックスの62Hは、32ビット命令ではBOUND命令だった。64ビットでは廃止されオペコードが空いていたため、これをEVEXプリフィックスとして用いている。従って、EVEXプリフィックスは64ビットで使うことが想定されていると思われる。
 VEXプリフィックスは32ビット命令との共存のためにRXBの各ビットは1の補数になっていたが、EVEXプリフィックスでは元のまま符号化されている。

拡張の余地
 2バイト目、R'とmmの間にビットの空きがあり、3バイト目、ppの前に1ビットの空きがある。
 将来的に、R'、mm、pp、あるいは他のビット数が不足して拡張が必要な場合、このビットが融通できる。

表記方法
 使用するレジスターの範囲等によりオペコード自体が変化する。4バイトEVEXの他、3バイトVEX、2バイトVEXで表現できることもあるため、16進形式で書かれることがない。
 命令とオペコードは、例えば次のように書かれる。
 VADDSD xmm1 {k1}{z}, xmm2, xmm3/m64{er}
 EVEX.NDS.LIG.F2.0F.W1 58 /r
 凡例は次の通り。
 EVEX.[NDS/NDD/DDS].[128,256,512,LIG].[66,F2,F3].0F/0F3A/0F38.[W0,W1,WIG] opcode [/r] [ib,/is4]
 EVEXは、4バイトのEVEXプリフィックスを表わす。2または3バイトのVEXプリフィックスは含まれない。
 NDS、NDD、DDSは、レジスターオペランドの符号化のために有効なVEX.vvvvフィールドの種類を表わす。
 NDS、NDD、DDSのいずれも無い場合、EVEX.vvvvは1111b(すなわち、EVEX.vvvvはオペランドを符号化しない)にしなければならない。
 128,256,512は、EVEX.L'Lフィールドの00,01,10を表わす。Lフィールドの解釈は命令によって幾通りかあり、特定のビット長の命令しか定義されていないものもある。
 66,F2,F3は、VEX.ppフィールドの内容を表わす。従来のオペコード形式で、プリフィックスとして66,F2,F3が存在する命令は、このフィールドで表わす。このいずれのプリフィックスもない命令の場合は、VEX.pp=00bとなり、この場合は記述しない。
 0F/0F3A/0F38は、従来のオペコード形式で、どのオペコードで表現されるかを表わし、EVEX.mmフィールドの内容となる。現状は、0F/0F3A/0F38のいずれかであるため、このいずれかを記述することになるが、将来的に命令が拡張された場合にはその命令セットの名前がここに書かれることになるだろう。
 opcodeは、オペコードである。ニーモニックやオペランドに応じた内容となる。
 /rは、ModR/Mバイトである。3オペランド命令の場合、DEST,SRC1,SRC2の場合はDESTとSRC2を表わす。
 /ib,/is4などは、それぞれイミディエイトが続くことを表わす。

再検索