2014-07-21 135 views
3

比較操作我有下面的代碼使用NEON指令

if (i < 0) { 
    i = i + 1 
} 

使用NEON矢量指令,我需要進行上述操作。如何將NEON寄存器值與0進行比較並執行上述計算?

回答

3

你不需要很多說明。單vsra指令會做(向量右移累加):

vsra.u32 q0, q0, #31 // i += ((unsigned int) i) >> 31; 

請注意,這是u32的目的,而不是s32

NEON很容易學習,但很難掌握,因爲您需要了解許多位侵入相關技術,才能編寫像這樣的高效代碼,比傳統的if-else方法快許多倍。

+0

非常好 - 一條指令而不是我的兩條。 –

1

你可以做一個比較,然後減去的結果,因爲true比較結果等於-1:

const int32x4_t vk0 = { 0 }; 

uint32x4_t vcmp = vcltq_s32(va, vk0); // a < 0 ? 
va = vsubq_s32(va, (int32x4_t)vcmp); // subtract -1 (i.e. add 1) for 
             // each element where a < 0 

如果你想在彙編級別要做到這一點,那麼你可以只使用以下說明:

+0

謝謝保羅!我同意上述是做必要的一種方法。有沒有其他方式使用NEON彙編指令來做同樣的事情?例如,是否可以在NEON中使用條件指令? – mario

+0

好的 - 我現在已經更新了這個問題,列出了您需要的兩條指令。 –

+0

謝謝保羅!這工作..只是一個小的更正vcltq_s32 == VCLT.S32。 – mario