2014-01-09 38 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