10. AVX2 指令一览


Intel 近来在指令集方面的动作真快,AVX2 规范已经出来了。AVX2 是 AVX 指令集的扩展,和 AVX 同样的使用环境。

AVX2 最大的扩展就是引进了 256 位的整数处理指令,而 AVX 是停留在 128 位的整数处理。

10.1 通用指令集的增强

AVX2 引入了 VEX 编码版的通用指令,分为三类:

  1. 整数的位操作指令包括:
  2. 增加的整数乘法指令
  3. 管理 processor context IDs 指令

其中 LZCNTTZCNT 以及 INVPCID 是非 VEX 编码版本,其它的通用指令均使用了 VEX 编码。

下面这条指令是例子:

andn rax, rbx, rax

它的编码是:C4 E2 E0 F2 C0

C4  E2  E0  F2  C0
    --  --  --  --
    |   |   |   |
    |   |   |   |
    +---+---+---+----------------> 111 00010
        |   |   |                  --- -----
        |   |   |                  RXB mmmmm
        |   |   |
        +---+---+----------------> 1 1100 0 00
            |   |                  - ---- - --
            |   |                  W vvvv L pp
            |   |
            +---+----------------> opcode
                |
                |
                +----------------> 11 000 000
                                   -- --- ---
                                  mod reg r/m

 

operand1: VEX.R + ModRM.reg = 1000(rax 寄存器)
operand2: VEX.vvvv = 1100(rbx 寄存器)
operand3: VEX.B + ModRM.r/m = 1000(rax 寄存器)

在 VEX 编码的通用指令中:

10.2 检测硬件的支持

AVX2 需要在 CPUID.(EAX=07H, ECX=0H):EBX.AVX2[bit 5] 里检测:

mov eax, 1
cpuid
bt ecx, 27                            ; check OSXSAVE enable
jnc no_support
bt ecx, 28                            ; check AVX support
jnc no_support

mov eax, 7
mov ecx, 0
cpuid
bt ebx, 5                             ; check AVX2 support
jnc no_support

mov ecx, 0
xgetbv
and eax, 6
cmp eax, 6                            ; check XCR0.SSE and XCR0.YMM
jne no_supoort

关于这些检测的详细说明,请浏览:http://www.mouseos.com/x64/SIMD/AVX_enable.html 这里不重复说明了。

10.2.1 检测 VEX 版本的通用指令

除了检测上述的 AVX2 指令外,还要分别检测:

mov eax, 7
mov ecx, 0
and ebx, 0528H                       ; bit3 for BMI1
                                     ; bit5 for AVX2
                                     ; bit8 for BMI2
                                     ; bit10 for INVPCID
cmp ebx, 0528H
jne no_support

mov eax, 80000000H
cpuid                                ; check extended function
cmp eax, 80000000H
jl no_support

mov eax, 80000001H
cpuid
bt ecx, 5                            ; check LZCNT support
jnc no_support

 

 


版权所有 mik 2009-2011