如何在MASM/VS15中使用AVX2?

Dan*_* M. 3 assembly masm visual-studio avx2

问题:我写了这样的东西(内部proc):

.CODE
myProc PROC
    vpmovsxbd ymm0, qword ptr [rdx] ; rdx is ptr to array of 8 bytes
    vcvtdqps ymm0, ymm0
    ret
myProc ENDP
Run Code Online (Sandbox Code Playgroud)

和masm一起抱怨invalid instruction operands第一次和syntax error : ymm0第二次.我正在使用VS15社区版编译x64.

Jer*_*fin 5

第一个错误在MASM中看起来像一个问题 - 它只是拒绝接受该指令的那种形式(即使英特尔文档说它存在).

我能找到的最接近的解决方法是:

vmovdqu xmm0, xmmword ptr[rdx]
vpmovsxbd ymm0, xmm0
Run Code Online (Sandbox Code Playgroud)

......但是相比之下这显然有点笨拙(因为它破坏了一些xmm寄存器,显然需要解码指令指令等)另一方面,它通常不会对速度产生太大影响(因为在任何情况下,速度通常都由存储器读取时间决定).

作为旁注,MS编译器似乎有大致相同的问题.使用_mm256_cvtepi8_epi32英特尔称生成的内在函数进行快速检查vpmovsxbd,表明Microsoft编译器生成的内容类似于上面的序列 - a vmovdqu后跟a vpmovsxbd.

对于第二个,你显然想要vcvtdq2ps,但遗漏了2.由于汇编程序没有将其识别为指令,因此它对该行应该是什么感到困惑.

如果您真正关心,它可能会尝试将其解析为如下声明:

my_var dd ?
Run Code Online (Sandbox Code Playgroud)

所以,第一部分(vcvtdqps)似乎是合法的,但作为一个符号,而不是一个指令.然后,它发现ymm0的,而不是像db,dw,dq(等),并意识到有一个错误,因为一个寄存器的名字不是有没有合法的事情.