2017-09-09 42 views
5

我們在幾個地方對一個向量進行排列,我們需要使用內置的vec_perm來區分0值。我們一直無法找到vec_zero()或類似的東西,所以我們想知道我們應該如何處理。如何獲得VSX值爲零?

該代碼目前使用兩種策略。第一個策略是一個載體負載:

__attribute__((aligned(16))) 
static const uint8_t z[16] = 
    { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }; 

const uint8x16_p8 zero = vec_ld(0, z); 

第二種策略是使用掩膜我們打算使用XOR:

__attribute__((aligned(16))) 
static const uint8_t m[16] = 
    { 15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0 }; 

const uint8x16_p8 mask = vec_ld(0, m); 
const uint8x16_p8 zero = vec_xor(mask, mask); 

我們還沒開始基準(還),所以我們不知道一個人是否比另一個人好。第一種策略使用VMX負載,可能會很昂貴。第二種策略避免了負載,但引入了數據依賴性。

我們如何獲得VSX值爲零?

+0

如果你只是初始化向量變量爲零通常的方式(請注意,有兩種不同的語法,取決於你使用的是哪種編譯器),那麼編譯器通常會選擇哪種方法更有效地將零矢量化爲矢量。 –

+0

你當然可以使用vec_splat的立即形式來表示零和其他小值。 –

回答

1

我建議讓編譯器爲你處理它。剛剛初始化爲零:

const uint8x16_p8 zero = {0}; 

- 可能編譯爲xor

例如,一個簡單的測試:

vector char foo(void) 
{ 
    const vector char zero = {0}; 
    return zero; 
} 

在我的機器,這編譯爲:

0000000000000000 <foo>: 
    0: d7 14 42 f0  xxlxor vs34,vs34,vs34 
    4: 20 00 80 4e  blr 
    ...