如何在 MASM/VS15 中使用 AVX2?
How to use AVX2 in MASM/VS15?
问题:我写了这样的东西(在过程中):
.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
内在函数进行快速检查,Intel 表示 应该 生成 vpmovsxbd
,表明 Microsoft 编译器生成它就像上面的序列一样——a vmovdqu
后跟 vpmovsxbd
.
对于第二个,您显然想要 vcvtdq2ps
,但遗漏了 2
。由于汇编程序没有将其识别为一条指令,因此它根本不知道该行应该是什么。
如果您真的关心,它 可能 试图将其解析为如下声明:
my_var dd ?
所以,第一部分(vcvtdqps
)似乎是合法的,但作为一个符号,而不是一个指令。然后它发现 ymm0
而不是 db
、dw
、dq
(等等)并意识到存在错误,因为寄存器名称不是合法的在那里。
问题:我写了这样的东西(在过程中):
.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
内在函数进行快速检查,Intel 表示 应该 生成 vpmovsxbd
,表明 Microsoft 编译器生成它就像上面的序列一样——a vmovdqu
后跟 vpmovsxbd
.
对于第二个,您显然想要 vcvtdq2ps
,但遗漏了 2
。由于汇编程序没有将其识别为一条指令,因此它根本不知道该行应该是什么。
如果您真的关心,它 可能 试图将其解析为如下声明:
my_var dd ?
所以,第一部分(vcvtdqps
)似乎是合法的,但作为一个符号,而不是一个指令。然后它发现 ymm0
而不是 db
、dw
、dq
(等等)并意识到存在错误,因为寄存器名称不是合法的在那里。