2014-01-09 39 views
0

出于测试目的,我正在为icls内联汇编程序编写用于英特尔至强融核的短汇编代码片段。现在我想使用屏蔽矢量指令,但是我无法将它们馈送到内联汇编程序。屏蔽矢量指令

对于这样的代码:

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) 
    :) 

我quess它有什么做的必要性,扩展模式寄存器名称前使用双重%。但是,不,k的单个百分比不起作用。

回答

0

我认为你需要使用该指令的蒙面变种:VMASKMOVPD

+0

VMASKMOVPD仅适用于AVX,不适用于KNI。他们没有包括它,因为有通用的矢量通道遮罩功能。 – user116429

+0

我不明白你的意思。 vmovapd和vmaskmovpd都是AVX512指令。我不知道在这种情况下KNI是什么 - 我熟悉的这种TLA唯一使用的是内核NIC接口。 – pburka

+0

KNI是骑士角新指令,Xeon Phi的矢量指令集。 AVX512非常相似,两种指令集将来都可能会收敛。 – user116429