【问题标题】:How to use AVX2 in MASM/VS15?如何在 MASM/VS15 中使用 AVX2?
【发布时间】:2015-10-28 15:57:02
【问题描述】:

问题:我写了这样的东西(在 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 编译。

【问题讨论】:

  • 除非您有充分的理由使用 asm,否则请考虑使用内部函数,例如_mm256_cvtepi8_epi32/_mm256_cvtepi32_ps 在这种特殊情况下。
  • @PaulR 好吧,我要写的东西必须专门在 asm 中。
  • 好的 - 那么请原谅。但是请注意,如果这是对性能至关重要的事情,那么您可能希望避免将此类内容放入上述函数中 - 您确实希望尽可能多地内联代码,至少对于最内层的循环。
  • 为什么不用 NASM 而不是 MASM?
  • @PaulR,OP 无法在 Visual Studio 64 位模式下内联汇编。 VS不允许。这就是为什么 MS 如此大力推动内在函数并拥有内在函数来做大多数其他编译器会用内联汇编来做的事情。反对的论点是这就是为什么要使用其他编译器,因为 MS 没有为您从汇编中需要的所有内容创建一个内在函数。

标签: visual-studio assembly masm avx2


【解决方案1】:

第一个错误看起来像是 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(等等)之类的东西,并意识到有一个错误,因为寄存器名称不是合法的。

【讨论】:

  • VEX.256.66.0F38.WIG 21 VPMOVSXBD ymm1, xmm2/m64 RM V/V AVX2 Sign extend 8 packed 8-bit integers in the low 8 bytes of xmm2/m64 to 8 packed 32-bit integers in ymm1 我想使用第二条指令。谢谢 - 第二个是固定的。
  • vmovdqu xmm0, xmmword ptr[rdx] 在我的情况下应该是 vmovdqu xmm0, qword ptr[rdx]
猜你喜欢
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 2015-09-30
  • 2021-03-18
相关资源
最近更新 更多