2017-10-04 74 views
2

我有兩個浮點操作數的比較結果比較如下;我需要的是基於比較的結果做需要執行以下操作:即:NEON包裝矢量比較結果到位圖中

neon_gt_res = vcgtq_f32(temp1, temp2); 
if(neon_gt_res[0]) array[0] |= (unsigned char)0x01; 
if(neon_gt_res[1]) array[0] |= (unsigned char)0x02; 
if(neon_gt_res[2]) array[0] |= (unsigned char)0x04; 
if(neon_gt_res[3]) array[0] |= (unsigned char)0x08; 

但寫這樣再次相當於多重比較。我如何在霓虹C內在函數中最優化地編寫它。

在x86上,這將是array[0] |= _mm_movemask_ps(cmp_gt_res);

+0

什麼類型是'陣列[]'?我假設它是一個字節數組,但你的C類意味着什麼。你會想要一個'1 2 4 8'的向量,你可以用比較結果進行掩碼。但是,我認爲,您需要進行洗牌以將結果打包到NEON寄存器的低4字節中。我不太瞭解NEON,但是如果你能做到這一點,那麼你會想要做一個32位的陣列負載,做一個打包的OR,然後存儲。 –

+0

array []是unsigned char類型。比較結果是int32x4_t類型,因此我不能使用該掩碼。有沒有其他方法可以幫助我使用這個 – Lakshmi

+0

但是NEON是否有任何可以用來從比較結果的每個元素打包1個字節的字節洗牌指令? –

回答

3
vmov.i32 qmask, #1 
vand qres, qmask, qres 
vsra.u64 qres, qres, #30 
vsli.64 dres_bottom, dres_top, #2 

而且你有你需要在qres的四個最低顯著位的位。

////////////////////////編輯

的上述的改進版本:

vshr.u64 qres, qres, #31 
vsli.64 dres_bot, dres_top, #2 
// the four LSBs already contain the bitmap, the rest is optional: 
vbic.i16 dres_bot, #0xf0 
// you can now use byte 0 of dres_bot as the result.