ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
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バイト目 | |||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |||
0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | R | X | B | R' | 0 | 0 | mm | W | vvvv | 1 | pp | z | L' | L | b | V' | aaa |
2バイト目
3バイト目
4バイト目
EVEX.Xは、VEX.Xやその元祖のREX.xと同様にSIBバイトのindexフィールドを拡張するが、EVEX.Xでは更にSIBバイトが存在しない時にはregまたはr/mを拡張する。
最大32本のレジスターの指定方法は次の通り。
GPRは汎用レジスターを意味する。
ビット4 | ビット3 | ビット[2:0] | レジスターの種類 | 一般的な用法 | |
---|---|---|---|---|---|
REG | EVEX.R' | REX.R | ModR/M.reg | GPR、ベクトル | デスティネーションまたはソース |
NDS/NDD | EVEX.V' | EVEX.vvvv | GPR、ベクトル | 2番目のソースまたはデスティネーション | |
RM | EVEX.X | EVEX.B | ModR/M.r/m | GPR、ベクトル | 1番目のソースまたはデスティネーション |
BASE | 0 | EVEX.B | ModR/M.r/m | GPR | メモリーアドレッシング |
INDEX | 0 | EVEX.X | SIB.index | GPR | メモリーアドレッシング |
VIDX | EVEX.V' | EVEX.X | SIB.index | ベクトル | VSIBメモリーアドレッシング |
IS4 | imm8[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などは、それぞれイミディエイトが続くことを表わす。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます