X86 屏蔽向量英特尔AVX-512指令的汇编语法
出于测试目的,我正在使用Icc内联汇编程序为Intel的Xeon Phi编写简短的汇编代码段。现在我想使用屏蔽向量指令,但无法将它们提供给内联汇编程序 对于这样的代码:X86 屏蔽向量英特尔AVX-512指令的汇编语法,x86,inline-assembly,icc,intel-mic,X86,Inline Assembly,Icc,Intel Mic,出于测试目的,我正在使用Icc内联汇编程序为Intel的Xeon Phi编写简短的汇编代码段。现在我想使用屏蔽向量指令,但无法将它们提供给内联汇编程序 对于这样的代码: vmovapd -64(%%r14, %%r10), %%zmm0{%%k1} 我收到了错误信息 /tmp/icpc5115IWas_.s: Assembler messages: /tmp/icpc5115IWas_.s:563: Error: junk `%k1' after register 我尝试了很多不同的组合
vmovapd -64(%%r14, %%r10), %%zmm0{%%k1}
我收到了错误信息
/tmp/icpc5115IWas_.s: Assembler messages:
/tmp/icpc5115IWas_.s:563: Error: junk `%k1' after register
我尝试了很多不同的组合,但都不起作用。编译器版本是Linux下的intel64/13.1up03,使用GAS语法
编辑:上面的代码实际上与非扩展汇编程序一起工作。因此:
__asm__("vmovapd -64(%r14, %r10), %zmm0{%k1} ")
有效,但以下情况不起作用:
__asm__("vmovapd -64(%[src], %%r10), %%zmm0{%%k1} "
:
: [src]"r"(src)
:)
我想这和在扩展模式下在寄存器名之前使用双%的必要性有关。但是不,k的单个%也不起作用。我认为您需要使用指令的屏蔽变量:VMASKMOVPD我在英特尔开发人员专区问了同样的问题,答案是,为了在扩展内联汇编程序中使用Xeon Phi上的掩码寄存器,必须在“遮罩寄存器”修改器周围使用双大括号
vmovapd %%zmm30, (%%r15, %%r10){{%%k1}}
VMASKMOVPD仅适用于AVX,不适用于KNI。他们没有包括它,因为有通用的矢量通道屏蔽功能。我不明白你的意思。vmovapd和vmaskmovpd都是AVX512指令。我不知道KNI在这种情况下是什么——我所熟悉的TLA的唯一Intel用途是内核NIC接口。KNI是Knights Corner新指令,即Xeon Phi的向量指令集。AVX512非常相似,这两种指令集将来可能会收敛。GNU C内联asm中的常规大括号用于语法方言替代,如
添加{%0,%1 |%1,%0}
,以编写可与AT&T或Intel一起使用的代码,因此您可以使用或不使用-masm=Intel
编译它,建议的方法是将{
转义为%{
,例如“..%{%%k1%}\n”