X86 屏蔽向量英特尔AVX-512指令的汇编语法

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 我尝试了很多不同的组合

出于测试目的,我正在使用Icc内联汇编程序为Intel的Xeon Phi编写简短的汇编代码段。现在我想使用屏蔽向量指令,但无法将它们提供给内联汇编程序

对于这样的代码:

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”