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バイト目

  • EVEX.R: REX.r (ModR/Mのregフィールドのビット4に対応)
  • EVEX.X: REX.x (SIBバイトのindexフィールドのビット4などに対応)
  • EVEX.B: REX.b (ModR/Mのr/mフィールドや、SIBのbaseフィールドのビット4に対応)
  • EVEX.R': ModR/Mのregフィールドのビット5に対応
  • EVEX.mm: VEX.mmmmmの下2ビット (上3ビットは未使用であるため)
    • 00: 拡張用の予約 (無効オペコード例外#UD)
    • 01: 0Fがオペコードに前置されるとみなす
    • 10: 0F 38がオペコードに前置されるとみなす
    • 11: 0F 3Aがオペコードに前置されるとみなす

3バイト目

  • EVEX.W: REX.w (1=オペランドサイズを64ビットにする)
  • EVEX.vvvv: NDSレジスター指定の1の補数 (1111で未使用)
  • EVEX.pp: SIMDプリフィクスの同等の機能を提供するオペコード拡張
    • 00: なし
    • 01: 66
    • 10: F3
    • 11: F2

4バイト目

  • EVEX.z: Zeroing/Merging
  • EVEX.L'L: ベクトル長
    • 00: 128ビットベクトルまたは32/64ビットスカラー
    • 01: 256ビットベクトル
    • 10: 512ビットベクトル
    • 11: 予約(#UD)
  • EVEX.b: Broadcast/RC/SAE Context
  • EVEX.V': NDS/VIDXレジスター指定の1の補数の4ビット目 (EVEX.vvvvと組み合わせて用いる)
  • EVEX.aaa: Embedded opmask レジスター指定

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フィールドの種類を表わす。

  • VEX.NDS: VEX.vvvvは、ソースレジスターが保存される命令の場合に、最初のソースレジスターを符号化する
  • VEX.NDD: VEX.vvvvは、ModR/M:regフィールドで符号化できなかったデスティネーションレジスターを符号化する
  • VEX.DDS: VEX.vvvvは、最初のソースレジスターが結果で上書きされる命令を3オペランド命令にする場合に、2番目のソースレジスターを符号化する

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などは、それぞれイミディエイトが続くことを表わす。

  • /ibはバイト、/idはダブルワード、となる。
  • /is4は、8ビットのイミディエイトがあり、うち、imm[7:4]でソースレジスター、imm[3:0]で4ビットの即値を表わす。

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club