用于测试目的,我正在为英特尔的Xeon Phi编写短组件片段与ICC内联汇编程序。现在我想使用蒙版矢量指令,但我在将它们喂食到内联汇编程序时。

for代码如下:

vmovapd  -64(%%r14, %%r10), %%zmm0{%%k1} 
.

我收到错误消息

/tmp/icpc5115IWas_.s: Assembler messages:
/tmp/icpc5115IWas_.s:563: Error: junk `%k1' after register
.

我尝试了很多不同的组合,但没有任何工作。编译器版本是Linux下的英特尔64 / 13.1up03,使用GAR Syntax。

编辑:上面的代码实际上适用于非扩展汇编程序。这是:

__asm__("vmovapd  -64(%r14, %r10), %zmm0{%k1} ")
.

工作,虽然以下是:

__asm__("vmovapd  -64(%[src], %%r10), %%zmm0{%%k1} "
    :
    : [src]"r"(src)
    :)
.

我猜它与在扩展模式下使用寄存器名称之前使用双重%的必要性有关。但是,k的单个%不起作用。

有帮助吗?

解决方案

我在英特尔开发人员区域提出了同样的问题 http://software.intel.com/en-us/forums/topic/499145-/topic/4991456/496563 ,答案是,为了在扩展内联汇编程序中使用Xeon Phi上的蒙版寄存器,您必须使用掩模寄存器修饰符周围的双倍卷绕括号。

vmovapd     %%zmm30,         (%%r15,    %%r10){{%%k1}}
.

其他提示

我认为你需要使用指令的蒙版变体:vmaskmovpd

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top