7

出于测试目的,我正在使用 Icc 内联汇编器为英特尔的 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 的单个 % 也不起作用。

4

2 回答 2

6

我在英特尔开发者专区http://software.intel.com/en-us/forums/topic/499145#comment-1776563中问了同样的问题,答案是,为了使用 Xeon Phi 上的掩码寄存器在扩展的内联汇编程序中,您必须在掩码寄存器修饰符周围使用双花括号。

vmovapd     %%zmm30,         (%%r15,    %%r10){{%%k1}}
于 2014-01-13T11:32:13.803 回答
0

我认为您需要使用指令的屏蔽变体:VMASKMOVPD

于 2014-01-10T14:28:33.023 回答