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

.CODE
myProc PROC
    vpmovsxbd ymm0, qword ptr [rdx] ; rdx is ptr to array of 8 bytes
    vcvtdqps ymm0, ymm0
    ret
myProc ENDP

和 masm 提示第一个是 invalid instruction operands,第二个是 syntax error : ymm0
我正在使用 VS15 社区版为 x64 进行编译。

最佳答案

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

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

vmovdqu xmm0, xmmword ptr[rdx]
vpmovsxbd ymm0, xmm0

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

作为旁注,MS 编译器似乎有大致相同的问题。使用 _mm256_cvtepi8_epi32 内在函数进行快速检查,英特尔说它应该生成 vpmovsxbd ,表明 Microsoft 编译器像上面的序列一样生成它——一个 vmovdqu 后跟一个 vpmovsxbd

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

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

所以,第一部分( vcvtdqps )似乎是合法的,但作为一个符号,而不是一个指令。然后它找到了 ymm0 而不是 dbdwdq (等等),并意识到有一个错误,因为注册名不是合法的东西。

关于visual-studio - 如何在 MASM/VS15 中使用 AVX2?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33395795/

10-13 06:10