【发布时间】:2019-07-29 13:34:55
【问题描述】:
我想用 zmm1 对 zmm0 进行 bit-wisr xor。 我在互联网上阅读并尝试过:
asm volatile(
"vmovdqa64 (%0),%%zmm0;\n"
"vmovdqa64 (%1),%%zmm1;\n"
"vpxorq %%zmm1, %%zmm0;\n"
"vmovdqa64 %%zmm0,(%0);\n"
:: "r"(p_dst), "r" (p_src)
: );
但是编译器给出“错误:‘vpxorq’的操作数数量不匹配”。
我做错了什么?
【问题讨论】:
-
内联 asm 毫无意义 (gcc.gnu.org/wiki/DontUseInlineAsm),即使您通过添加第三个操作数修复了语法错误,您的代码也不安全且效率低下。使用内部
_mm512_xor_epi64( __m512i a, __m512i b);,如intel 的asm 手册中pxor中所述:felixcloutier.com/x86/pxor。如果您想了解它是如何完成的,请查看编译器生成的 asm。 -
不安全,因为你没有
"memory"clobber 告诉编译器你读/写内存,并且你没有在 zmm0 或 zmm1 上声明 clobber。由于许多原因效率低下,包括强制寻址模式和不使用内存源操作数。并且不让编译器选择要使用的寄存器。
标签: c++ gcc inline-assembly avx512