我正在试图弄清楚如何在ARM neon中生成条件存储。我想做的是相当于这个SSE指令:
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)
假设16 x 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