2013-08-19 33 views
1

我想弄清楚如何在ARM霓虹燈中生成條件存儲。我想要做的是相當於這個SSE指令:ARM霓虹燈:有條件的店鋪建議

void _mm_maskmoveu_si128(__ m128i d,__m128i n,char * p);

其中有條件地將d的字節元素存儲到地址p中。選擇器n中每個字節的高位確定是否存儲d中的對應字節。

有關如何使用NEON內在函數執行此操作的任何建議? 謝謝

這是我所做的:

int8x16_t store_mask = {0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; 

int8x16_t tmp_dest = vld1q_u8((int8_t*)p_dest); 
vbslq_u8(source,tmp_dest,store_mask); 
vst1q_u8((int8_t*)p_dest,tmp_dest); 
+0

你需要三個步驟做:首先加載載體,應用口罩,只修改所需要的元素,然後保存修改後的載體回它的原始位置。 –

+0

對不起,但我仍然不清楚。我想要做的是:使用這樣一個向量:mask = {0,0,0,0,0,0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80} ;這是我的「n」參數在_mm_maskmoveu_si128(__ m128i d,__m128i n,char * p);案件。你所說的面罩應該如何構造?我應該做什麼操作?謝謝(我從來沒有用過霓虹燈,所以我有點困惑)。 – user2696208

+0

好的 - 因爲它變得越來越複雜,我在下面的答案中提供了更詳細的解釋。 –

回答

0

假定16×1字節元素的向量,你會設置掩模向量,其中每個元素是全0(0x00)或全1( 0xff)來確定元素是否應該存儲在不。然後,你需要做以下(僞代碼):

init mask vector = 0x00/0xff in each element 
init source vector = data to be selectively stored 
load dest vector from dest location 
apply `vbslq_u8` (`vbit` instruction) with dest vector, source vector and mask vector 
store dest vector back to dest location 
+0

謝謝!我會盡力按照你的解釋來實現它。 – user2696208

+0

我在僞代碼之後實現了它(請參閱編輯的問題)。它是否正確?我有另一個疑問。原始代碼中的掩碼(帶有一些我試圖轉換爲ARM Neon的SSE指令)是這樣的:{0,0,0,0,0,0,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80} ;.是否有一個原因,爲什麼可以使用0x80而不是0xff?謝謝 – user2696208

+0

這只是一個不同的指令集,所以你必須使用可用的工具。如果需要(一條指令),將掩碼在0x80和0xff之間轉換非常容易 - 或者您可以更改生成掩碼的代碼,這樣就不需要了。 –