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.
第一个错误在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(等),并意识到有一个错误,因为一个寄存器的名字不是有没有合法的事情.
| 归档时间: |
|
| 查看次数: |
465 次 |
| 最近记录: |